本文地址：blog.lucien.ink/archives/552将下列代码保存为 install.sh，然后 bash install.sh。#!/usr/bin/env bash set -e wget 'https://github.mirrors.lucien.ink/https://github.com/adnanh/webhook/releases/download/2.8.2/webhook-linux-amd64.tar.gz' tar -xzvf webhook-linux-amd64.tar.gz mv webhook-linux-amd64 /usr/local/ cat << EOF > /etc/systemd/system/webhook.service [Unit] Description=Webhook server After=network.target [Service] Type=simple ExecStart=/usr/local/webhook-linux-amd64/webhook \ -nopanic \ -hooks /etc/webhook/hooks.yaml \ -hotreload \ -logfile /var/log/webhook/webhook.log \ -port 9000 Restart=on-failure User=root Group=root [Install] WantedBy=multi-user.target EOF systemctl enable webhook mkdir -p /etc/webhook/scripts cat << EOF > /etc/webhook/hooks.yaml - id: test execute-command: "/etc/webhook/scripts/test.sh" command-working-directory: "/root/" trigger-rule: match: type: value value: Bearer change-this parameter: source: header name: Authorization EOF cat << EOF > /etc/webhook/scripts/test.sh #!/usr/bin/env sh echo foo > bar EOF chmod +x /etc/webhook/scripts/test.sh mkdir -p /var/log/webhook systemctl start webhook curl 'http://localhost:9000/hooks/test' -H 'Authorization: Bearer change-this'
本文地址：blog.lucien.ink/archives/543Ubuntu 22.04 LTS 在安装过程中默认只使用 100G 的硬盘，执行以下命令即可扩容：$ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/ubuntu--vg-ubuntu--lv 100G 11G 89G 11% / $ lvdisplay --- Logical volume --- LV Path /dev/ubuntu-vg/ubuntu-lv LV Name ubuntu-lv VG Name ubuntu-vg LV Write Access read/write LV Creation host, time ubuntu-server, 2023-10-11 10:53:11 +0000 LV Status available # open 1 LV Size 100 GB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 512 Block device 253:0 $ lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv $ resize2fs /dev/ubuntu-vg/ubuntu-lv $ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/ubuntu--vg-ubuntu--lv 3.5T 11G 3.3T 1% /
本文地址：blog.lucien.ink/archives/542发现每次执行 nvidia-smi 都特别慢，发现是需要 nvidia-persistenced 常驻才可以，这个并不会在安装完驱动之后自动配置，需要手动设置一个自启。cat <<EOF >> /etc/systemd/system/nvidia-persistenced.service [Unit] Description=NVIDIA Persistence Daemon Wants=syslog.target [Service] Type=forking ExecStart=/usr/bin/nvidia-persistenced ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start nvidia-persistenced systemctl enable nvidia-persistenced
本文地址：blog.lucien.ink/archives/541以 Debian 11 为例，主要用于备忘。deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-freeapt update && apt install vim curl wget git cifs-utils -y export DOWNLOAD_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce" curl -fsSL https://get.docker.com/ | sh pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple hostnamectl set-hostname your_host hostname your_host /etc/hosts timedatectl set-timezone Asia/Shanghai groupmod -g 3000 foo # 添加用户组 adduser # 添加用户 usermod -aG group_name user_name # 将用户添加至组
本文地址：blog.lucien.ink/archives/540写成了一键脚本，直接执行即可。需要注意的是，挂载的路径和 systemd service 的名字要对应上，比如挂载的路径为 /mnt/nas 那 service 的文件名应为 mnt-nas.service。#!/usr/bin/env bash SERVER="nas.local" USERNAME="foo" PASSWORD="bar" apt install cifs-utils -y groupadd -g 17510 nas cat <<EOF > /etc/systemd/system/dns-ready.service [Unit] Description=Wait for DNS to come up using 'host' After=nss-lookup.target [Service] Type=oneshot ExecStart=/bin/bash -c "until host ${SERVER}; do sleep 1; done" [Install] WantedBy=multi-user.target EOF cat <<EOF > /etc/systemd/system/mnt-nas.mount [Unit] Description=Mount NAS Requires=network-online.target After=network-online.target dns-ready.service [Mount] What=//${SERVER}/Data Where=/mnt/nas Type=cifs Options=username=${USERNAME},password=${PASSWORD},dir_mode=0775,gid=nas,rw,file_mode=0664 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl start dns-ready.service systemctl enable dns-ready.service systemctl start mnt-nas.mount systemctl enable mnt-nas.mount
Linux 删除 N 天前的文件原文地址：https://www.lucien.ink/archives/452/1. 起因我在使用宝塔面板的定时备份的过程中，发现在备份文件目录的时候无法成功清理旧的备份，导致 OSS 的体积暴增 120G ，然而连续额外扣费 4 个月之后我才发现这一问题。钱包表示它瘦了。在宝塔的官方交流群里反馈这个问题，并没有人鸟我，遂自行想办法解决这个问题。2. 解决先将 OSS 挂载到本地，使其成为本地文件系统的一部分，然后用 find 命令找出 N 天前的文件，删除之。比如我每天备份一次，保留近 $7$ 次备份，OSS 的挂载目录是 /oss，于是我添加了一个定时命令：find /oss/bt_backup -mtime +6 -name "*.tar.gz" | xargs -I {} rm -rf {}意思就是删除 /oss/bt_backup 目录下所有最近更改时间超过 $6$ 天的文件。
使用 Prometheus + Grafana + Exporter 监控服务器的运行状态
使用 Prometheus + Grafana + Exporter 监控服务器的运行状态原文地址：https://www.lucien.ink/archives/449/1. 摘要本文主要介绍如何使用 node_exporter 采集 Linux 系统的信息，借助 Prometheus 最终以仪表盘的形式显示在 Grafana 中。2. 效果展示3. 介绍Grafana、Prometheus、Exporter 这三个组件的背景资料我就不介绍了，搜一下就会有很多。这里主要说一下他们三者之间的关系。3.1 前置知识在编写应用程序的时候，通常会记录 Log 以便事后分析，在很多情况下是产生了问题之后，再去查看 Log ，是一种事后的静态分析。在很多时候，我们可能需要了解整个系统在当前，或者某一时刻运行的情况，比如当前系统中对外提供了多少次服务，这些服务的响应时间是多少，随时间变化的情况是什么样的，系统出错的频率是多少。这些动态的准实时信息对于监控整个系统的运行健康状况来说很重要。于是就产生了 metrics 这种数据，它长这样 https://monitor.lucien.ink/metrics 。3.2 关系Exporter 的主要任务是提供 metrics 信息。而 metrics 大多数人是看不懂的，所以 Prometheus 为这种格式的信息提供了 Prometheus Query Language (PromQL) ，可以进行一些类似数据库那样的联合查询、过滤等操作，这样一来就能提炼出我们想要的东西，类似于内存占用、负载等。大致的流程就是：从远端（可以有多个）采集 metrics 信息到本地 $\rightarrow$ 通过各种 QL 提炼信息。虽然 PromQL 非常的强大，但是对于大部分人来说是有很高的学习成本的，所以 Grafana 就将各种 PromQL 封装起来，并将 PromQL 的结果以图表的形式展示出来。大概就是 生产 $\rightarrow$ 加工 $\rightarrow$ 二次加工 这样一种流程。当然了，Prometheus 和 Grafana 的功能远不止如此，更强大的是报警功能，但这不是本文的主题。3.3 Exporter值得一提的是，Exporter 组件是一类组件，它们的主要作用就是提供 metrics 信息以供加工提炼。有的组件会自行提供 metrics 信息，比如 Grafana、Prometheus、Etcd 等等，在本文的 $3.1$ 中给出的 metrics 就是 Grafana 本身产生的。有的组件不会提供 metrics 信息，比如说我们自己写的一些程序。而有的甚至不是组件，比如 Linux 系统本身。4. 部署本文采用的安装方式皆为二进制 + systemd 托管的安装方式，因为 OpenVZ 等架构的 VPS 不能运行 docker，所以选择更普适一些的方法。4.1 下载node_exporter：https://github.com/prometheus/node_exporter/releasesPrometheus：https://github.com/prometheus/prometheus/releasesGrafana（选择 Standalone Linux Binaries 版本）：https://grafana.com/grafana/download4.2 解压、安装新建一个空文件夹，并将下载的 tar.gz 移动至这个空文件夹中。请保证以下目录结构：dir ├── grafana-x.x.x.linux-amd64.tar.gz ├── node_exporter-x.x.x.linux-amd64.tar.gz └── prometheus-x.x.x.linux-amd64.tar.gz然后在文件夹中执行：curl api.pasteme.cn/8413 | bash可以在 https://pasteme.cn/8413 中查看命令详情。至此，所有安装已经完成了，三个组件对应的 systemd 服务名称分别是：grafana-server、prometheus、node_exporter。4.3 验证4.3.1 systemctl status xxx可以用 systemctl status 命令来查看各个组件的运行状态。systemctl status node_exporter systemctl status prometheus systemctl status grafana-server4.3.2 查看 metricsnode_exporter、Prometheus、Grafana 的默认端口分别是 9100、9090、3000 ，我们可以通过以下命令来查看 metrics 信息，有输出就代表正在运行。curl localhost:9100/metrics curl localhost:9090/metrics curl localhost:3000/metrics4.4 开机自启这是 systemd 老生常谈的一个话题了。systemctl enable node_exporter systemctl enable prometheus systemctl enable grafana-server4.5 卸载curl api.pasteme.cn/8414 | bash可以在 https://pasteme.cn/8414 中查看命令详情。5. 配置虽然我们已经完成了三个组件的安装，但此时它们都还是互相独立的三个组件，我们需要对其进行一些配置。5.1 prometheus编辑 /usr/local/prometheus/prometheus.yml我们会看到如下内容：# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090'] # 我们需要修改这里将 targets 所在的那一行修改为以下内容，注意空格缩进，yaml 的格式检查很严格。 - targets: ['localhost:9100']这个修改会让 Prometheus 从 localhost:9100/metrics 进行 metrics 信息的读取，默认的 9090 是 Prometheus 本身的 metrics 信息。保存修改过的文件之后重启一下 prometheus 服务即可。systemctl restart prometheus可以用本文 $4.3$ 提到的方法验证是否启动成功，如果没有的话请检查 yml 文件的格式。5.2 Grafanacd /usr/local/grafana/bin chmod +x grafana-cli ./grafana-cli plugins install grafana-piechart-panel systemctl restart grafana-server这里是为了安装一个 饼图 的插件。然后访问 http://<YOUR_IP>:3000 ，默认的账号密码都是 admin。点击 Add data source。选择 Prometheus。Http $\rightarrow$ URL 中填入 http://localhost:9090 ，也就是 prometheus 提供的接口。然后点击 Save & Test。然后把鼠标挪到左上角的 + 上，注意是挪上去，然后在弹出的菜单中点击 Import。然后我们在这里可以引入各种大神为各种 Exporter 写好的 Dashboard ，可以去 https://grafana.com/dashboards 自行搜寻，在这里我们用一名国人为 node_exporter 写的 Dashboard ，对应的主页为 https://grafana.com/dashboards/8919 。我们在 Grafana.com Dashboard 一栏中填入 8919 ，然后点击一下旁边的空白处。点击空白处之后会自动导入对应的 Dashboard ，此时会让你设置数据来源，在 Options $\rightarrow$ prometheus_111 这里选择我们刚才添加的 Prometheus ，然后点击 Import 就可以了。5.2.3 配置完成至此，我们就成功地将 Grafana、Prometheus、node_exporter 关联起来了。6. 监控多个节点在完成了本文的 $5$、$6$ 部分之后，仅仅是完成了监控本机的过程，如果要监控其它的节点，需在被监控的节点上安装相应的 Exporter，下面以本文中提到的 node_exporter 为例，介绍如何添加节点。6.1 部署6.1.1 下载 Exporternode_exporter：https://github.com/prometheus/node_exporter/releases6.1.2 解压、安装新建一个空文件夹，并将下载的 tar.gz 移动至这个空文件夹中。请保证以下目录结构：dir └── node_exporter-x.x.x.linux-amd64.tar.gz然后在文件夹中执行：curl api.pasteme.cn/8416 | bash可以在 https://pasteme.cn/8416 中查看命令详情。至此，node_exporter 安装已经完成了，对应的 systemd 服务名称分别是 node_exporter。6.1.3 验证参考本文 $4.3$ ，不再赘述。6.1.4 开机自启systemctl enable node_exporter6.1.5 卸载systemctl disable node_exporter systemctl stop node_exporter rm -f /lib/systemd/system/node_exporter.service rm -rf /usr/local/node_exporter6.2 配置 Prometheus在监控节点上编辑 Prometheus 的配置文件 /usr/local/prometheus/prometheus.yml。将 targets 所在的那一行修改为以下内容，注意空格缩进，yaml 的格式检查很严格。 - targets: ['localhost:9100', 'addr:9100']其中 addr 是被监控节点的 IP 或域名。然后重启 Prometheus，在 Grafana 的 Dashboard 中就可以看到新的节点了。systemctl restart prometheus6.2.1 关于 targets 的说明可以观察到，targets 传入的是一个数组，Prometheus 会收集数组中的每个元素的 metrics ，然后 Grafana 再处理这些数据。