Jast blog Jast blog
首页
  • 《Ambari自定义开发教程》笔记
  • 《CDH教程》笔记
  • 《ClickHouse教程》笔记
  • 《HDFS教程》笔记
  • 《DolphinScheduler教程》笔记
  • 《Hbase教程》笔记
  • 《Iceberg教程》笔记
  • 《Hive教程》笔记
  • 《Flume教程》笔记
  • 《Kafka教程》笔记
  • 《Impala教程》笔记
  • 《Hue教程》笔记
  • 《Spark教程》笔记
  • 《Flink教程》笔记
  • 《Phoenix教程》笔记
  • 《ElasticSearch教程》笔记
  • 《Kylin教程》笔记
  • 《Storm教程》笔记
  • 《Yarn教程》笔记
  • 《Presto教程》笔记
  • 《图数据库教程》笔记
  • 《Kerberos教程》笔记
  • 《Maxwell教程》笔记
  • 《MinIO教程》笔记
  • 《DataX教程》笔记
  • 《Superset教程》笔记
  • 《IOTDB教程》笔记
  • 《大数据相关》笔记
  • 《PaddleNLP教程》笔记
  • 《Nginx教程》笔记
  • 《Java技术文档》
  • 《Maven教程》笔记
  • 《IDEA使用教程》
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档

Jast-zsh

如果你知道你要去哪里,全世界都会给你让路。
首页
  • 《Ambari自定义开发教程》笔记
  • 《CDH教程》笔记
  • 《ClickHouse教程》笔记
  • 《HDFS教程》笔记
  • 《DolphinScheduler教程》笔记
  • 《Hbase教程》笔记
  • 《Iceberg教程》笔记
  • 《Hive教程》笔记
  • 《Flume教程》笔记
  • 《Kafka教程》笔记
  • 《Impala教程》笔记
  • 《Hue教程》笔记
  • 《Spark教程》笔记
  • 《Flink教程》笔记
  • 《Phoenix教程》笔记
  • 《ElasticSearch教程》笔记
  • 《Kylin教程》笔记
  • 《Storm教程》笔记
  • 《Yarn教程》笔记
  • 《Presto教程》笔记
  • 《图数据库教程》笔记
  • 《Kerberos教程》笔记
  • 《Maxwell教程》笔记
  • 《MinIO教程》笔记
  • 《DataX教程》笔记
  • 《Superset教程》笔记
  • 《IOTDB教程》笔记
  • 《大数据相关》笔记
  • 《PaddleNLP教程》笔记
  • 《Nginx教程》笔记
  • 《Java技术文档》
  • 《Maven教程》笔记
  • 《IDEA使用教程》
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • Linux网站汇总
  • Shell使用详解
  • 自动化运维脚本集合
  • 模拟占用磁盘内存CPU
  • Linux释放缓存
  • Linux监控进程磁盘邮件预警
  • 《Nginx教程》笔记
  • Linxu服务器文件双向同步-rsync+sersync
  • Linux文件清空的几种方法
  • Linux日志自动清理方案
  • Linux执行脚本加密
  • Linux安装包制作
  • Crontab详解
  • Linux上传下载百度网盘文件
  • 内网穿透
  • 内网穿透-无需公网服务器
  • 一文搞定Jenkins自动化部署程序
  • Linux配置代理请求
  • Linux监控之夜莺
    • 安装前置依赖
    • 二进制方式部署(推荐)
      • 夜莺日志位置
    • 安装 VictoriaMetrics
      • 打通夜莺和 VictoriaMetrics
    • 安装Categraf
      • 安装依赖
      • 下载命令
      • 部署
      • 修改配置文件
      • 日志目录设置
      • 设置Linux Systemd托管
      • 查看时序指标
      • 多节点监控
    • 配置服务器监控
    • 监控MySQL
      • 修改categraf配置文件
      • 配置仪表盘
    • 监控进程
      • 修改categraf配置文件
    • 告警配置
      • 配置指定机器
      • 给机器配置标签
      • 多台机器告警时显示异常机器
    • 常用命令总结
    • 历史监控内容清除
  • Proxmox安装
  • Proxmox创建CentOS虚拟机
  • Proxmox创建Windows虚拟机
  • Debian系统安装OpenVPN
  • Docker快速部署OpenVPN
  • 用户登录时执行检查脚本
  • 一键配置Linux镜像源
  • RustScan端口扫描
  • 前置机、堡垒机、跳板机区别
  • Linux添加回收站功能
  • Linux系统详细信息监控-Grafana+Prometheus
  • 再见XShell:轻量又高性能的SSH工具AI加持快人一步
  • Unbuntu安装deb文件
  • Ubuntu远程连接时分辨率问题
  • Ubuntu中Clash报错
  • Linux可视化监控
  • Vim复制自动缩进问题处理
  • 无所不能的BusyBox:如何用它打造极小的Linux环境
  • 运维
Jast-zsh
2023-11-08
目录

Linux监控之夜莺

[toc]

# 安装前置依赖

  • mysql
  • redis

# 二进制方式部署(推荐)

在网站现在最新安装包https://flashcat.cloud/download/nightingale/ (opens new window)

# 下载
wget https://download.flashcat.cloud/n9e-v6.3.1-linux-amd64.tar.gz

# 创建个 n9e 的目录,后面把 n9e 相关的文件解压到这里
mkdir -p /opt/n9e 
mv n9e-v6.3.1-linux-amd64.tar.gz n9e
cd n9e

# 解压
tar -zxvf n9e-v6.3.1-linux-amd64.tar.gz

# 解压缩之后,可以看到 n9e.sql 是建表语句,导入数据库
mysql -uroot -p1234 < n9e.sql

# 启动 n9e,先使用 nohup 简单测试,如果需要 systemd 托管,请自行准备 service 文件
nohup ./n9e &> n9e.log &

# 检查 n9e.log 是否有异常日志,检查端口是否在监听,正常应该监听在 17000
ss -tlnp|grep 17000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

如果日志和端口都没啥问题,恭喜,你完成了夜莺的安装!通过浏览器访问这个机器的 17000,理论上就可以看到登录页面了。

访问http://ip:17000

image-20231018113109193

默认账号密码:root root.2020

image-20231018113202192

# 夜莺日志位置

n9e/n9e.log

# 安装 VictoriaMetrics

VictoriaMetrics 下载地址在 github releases (opens new window) 上,作为技术人员,我想,你应该可以下载的到。我的环境是 x86_64 的 linux,所以选择下载:victoria-metrics-linux-amd64-v1.93.6.tar.gz (撰写这个文档的时候,最新版本是 v1.93.6)。

VictoriaMetrics 解压缩之后,里边就一个二进制:

mkdir victoria
cd victoria
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.93.6/victoria-metrics-linux-amd64-v1.93.6.tar.gz
tar -zxvf victoria-metrics-linux-amd64-v1.93.6.tar.gz 
1
2
3
4

查看解压后文件

# ll
total 32476
-rw-r--r-- 1 root root 11579644 Oct 18 11:44 victoria-metrics-linux-amd64-v1.93.6.tar.gz
-rwxr-xr-x 1 1000 1000 21669672 Oct 17 05:45 victoria-metrics-prod
1
2
3
4

启动

nohup ./victoria-metrics-prod &> stdout.log &
1

查看端口8428

# ss -tlnp|grep 8428
LISTEN     0      32768        *:8428                     *:*                   users:(("victoria-metric",pid=726,fd=7))
1
2

访问接口http://ip:8428

image-20231018114759187

如上,就表示 VictoriaMetrics 安装成功,当然,我仅仅使用 nohup 简单启动的,如果生产环境,建议使用 systemd 托管并设置开机自启动。

# 打通夜莺和 VictoriaMetrics

分两个步骤,首先就类似上面配置 Prometheus 数据源那种方式,在夜莺里配置一个 VictoriaMetrics 的数据源,比如我的配置:

image-20231018114854988

image-20231018114927994

填写信息并保存

image-20231018115156792

进入夜莺的配置目录/opt/n9e/etc

cd /opt/n9e/etc
1

修改配置文件

vim config.toml

# 在 [Pushgw] 下,添加信息
[[Pushgw.Writers]]
Url = "http://172.16.24.214:8428/api/v1/write"
1
2
3
4
5

重启

pkill n9e
nohup ./n9e &> n9e.log &
1
2

# 安装Categraf

在网站https://flashcat.cloud/download/categraf/ (opens new window)下载最新版本

# 安装依赖

sudo yum install -y libpcap
1

# 下载命令

mkdir /opt/categraf && cd  /opt/categraf
wget https://download.flashcat.cloud/categraf-v0.3.32-linux-amd64-with-cgo-plugin.tar.gz
1
2

# 部署

tar -zxvf categraf-v0.3.32-linux-amd64-with-cgo-plugin.tar.gz 
cd categraf-v0.3.32-linux-amd64-with-cgo-plugin
mv ./* ..
1
2
3

# 修改配置文件

tip:

安装客户端可以使用这个命令一键替换IP

sed -i 's/127.0.0.1/172.16.24.214/g' /opt/categraf/conf/config.toml
1

修改文件conf/config.toml

[writer_opt]
# default: 2000
batch = 2000
# channel(as queue) size
chan_size = 10000

[[writers]]
# 修改为夜莺n9e安装的服务器IP地址
url = "http://N9E:17000/prometheus/v1/write"

# Basic auth username
basic_auth_user = ""

# Basic auth password
basic_auth_pass = ""

# timeout settings, unit: ms
timeout = 5000
dial_timeout = 2500
max_idle_conns_per_host = 100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 日志目录设置

[log]
# file_name is the file to write logs to
#file_name = "stdout"
file_name = "/opt/test.log"
1
2
3
4
  1. 打开 Categraf 安装目录下的 conf 子目录。

  2. 使用文本编辑器打开 config.toml 文件。

  3. 找到 [log] 部分。

  4. 取消注释 file_name 行(如果已注释),并将其值更改为 /opt/test.log。

  5. 保存对 config.toml 文件的更改。

  6. 重启 Categraf 服务以使新的日志配置生效。

  7. Categraf 的日志就会保存到 /opt 目录下的 test.log 文件中。请确保运行 Categraf 的用户具有对 /opt 目录的写入权限。

# 设置Linux Systemd托管

cp conf/categraf.service /etc/systemd/system
 
sudo systemctl daemon-reload
# 以服务方式启动
systemctl start categraf

# 停止服务
systemctl stop categraf

# 重启服务
systemctl restart categraf

# 查看状态
systemctl status categraf
1
2
3
4
5
6
7
8
9
10
11
12
13
14

启动时可能报错:/opt/categraf/categraf: error while loading shared libraries: libpcap.so.0.8: cannot open shared object file: No such file or directory

没有 libpcap.so.0.8

解决方法

# 安装
sudo yum install libpcap -y
# 查看安装版本
ls -al /usr/lib64/libpcap.so*
# 软连接到需要的版本
ln -s /usr/lib64/libpcap.so.1.5.3 /usr/lib64/libpcap.so.0.8
1
2
3
4
5
6

查看运行状态

# systemctl status categraf
● categraf.service - "Categraf"
   Loaded: loaded (/etc/systemd/system/categraf.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2023-10-18 13:33:22 CST; 3s ago
 Main PID: 2104 (categraf)
   CGroup: /system.slice/categraf.service
           └─2104 /opt/categraf/categraf

Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 metrics_agent.go:299: I! input: local.mem started
Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 metrics_agent.go:299: I! input: local.net started
Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 metrics_agent.go:299: I! input: local.netstat started
Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 metrics_agent.go:299: I! input: local.nfsclient started
Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 metrics_agent.go:299: I! input: local.processes started
Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 metrics_agent.go:299: I! input: local.self_metrics started
Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 metrics_agent.go:299: I! input: local.sockstat started
Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 metrics_agent.go:299: I! input: local.system started
Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 agent.go:47: I! [*agent.MetricsAgent] started
Oct 18 13:33:22 centos7.9-template categraf[2104]: 2023/10/18 13:33:22 agent.go:50: I! agent started
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

安装完成后可以在基础设施中查看到机器的状态

image-20231018134445978

# 查看时序指标

image-20231018141241344

也可以在这个页面快速查看

image-20231018141338727

# 多节点监控

与上面步骤相同,只需要部署多个Categraf即可

# 配置服务器监控

上面步骤我们已经在页面通过Victoria查询出数据,这里我们选择展示仪表盘

image-20231018142404401

选择前三个模板,点击批量导出

image-20231018142426094

选择业务组后点击克隆

image-20231018142440592

在仪表盘->监控仪表盘中可以看到三个仪表盘

image-20231018142519568

点进去后可以看到不同展示监控页面

image-20231018142536458

# 监控MySQL

官方配置说明:https://flashcat.cloud/docs/content/flashcat-monitor/categraf/plugin/mysql/ (opens new window)

# 修改categraf配置文件

vim conf/input.mysql/mysql.toml
1

内容如下(真实监控的配置文件)

# # collect interval
# interval = 15

# [[queries]]
# mesurement = "users"
# metric_fields = [ "total" ]
# label_fields = [ "service" ]
# timeout = "3s"
# request = '''
# select 'n9e' as service, count(*) as total from n9e_v5.users
# '''


[[instances]]
 address = "172.1.2.1:3306"
 username = "root"
 password = "root"

# # set tls=custom to enable tls
 parameters = "tls=false"

 extra_status_metrics = true
 extra_innodb_metrics = false
 gather_processlist_processes_by_state = false
 gather_processlist_processes_by_user = false
 gather_schema_size = true
 gather_table_size = true
 gather_system_table_size = false
 gather_slave_status = true

# # timeout
 timeout_seconds = 3

# # interval = global.interval * interval_times
 interval_times = 1

# important! use global unique string to specify instance
# labels = { instance="n9e-10.2.3.4:3306" }

## Optional TLS Config
# use_tls = false
# tls_min_version = "1.2"
# tls_ca = "/etc/categraf/ca.pem"
# tls_cert = "/etc/categraf/cert.pem"
# tls_key = "/etc/categraf/key.pem"
## Use TLS but skip chain & host verification
# insecure_skip_verify = true

#[[instances.queries]]
# mesurement = "lock_wait"
# metric_fields = [ "total" ]
# timeout = "3s"
# request = '''
#SELECT count(*) as total FROM information_schema.innodb_trx WHERE trx_state='LOCK WAIT'
#'''

# [[instances.queries]]
# mesurement = "users"
# metric_fields = [ "total" ]
# label_fields = [ "service" ]
# # field_to_append = ""
# timeout = "3s"
# request = '''
# select 'n9e' as service, count(*) as total from n9e_v5.users
# '''

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

配置文件说明如下:

# # 定义mysql采集周期
interval = 15

# 定义全局要执行的sql
  [[queries]]
  mesurement = "users"
  metric_fields = [ "total" ]
  label_fields = [ "service" ]
  timeout = "3s"
  request = '''
  select 'n9e' as service, count(*) as total from n9e_v5.users
  '''

# 定义instance, 一个instance对应一个mysql实例
# 指定mysql的地址,用户名,密码
[[instances]]
  address = "127.0.0.1:3306"
  username = "root"
  password = "1234"

# # 是否使用tls 等定制参数
  parameters = "tls=false"

# 通过 show global status监控mysql,默认抓取一些基础指标,
# 如果想抓取更多global status的指标,把下面的配置设置为true
  extra_status_metrics = true

# 通过show global variables监控mysql的全局变量,默认抓取一些常规的
# 常规的基本够用了,扩展的部分,默认不采集,下面的配置设置为false
  extra_innodb_metrics = false

# 监控processlist,关注较少,默认不采集
  gather_processlist_processes_by_state = false
  gather_processlist_processes_by_user = false

# 监控各个数据库的磁盘占用大小
  gather_schema_size = true

# 监控所有的table的磁盘占用大小
  gather_table_size = false

# 是否采集系统表的大小,通常不用,所以默认设置为false
  gather_system_table_size = false

# 通过 show slave status监控slave的情况,比较关键,所以默认采集
  gather_slave_status = true


# # 超时时间
  timeout_seconds = 3

# 采集周期的倍数,比如设置为2,那么采集周期就是 interval * 2
  interval_times = 1

# 为mysql实例附一个instance的标签,因为通过address=127.0.0.1:3306不好区分
  labels = { instance="n9e-10.2.3.4:3306" }

 # # tls相关配置  可选配置
 # Optional TLS Config
  use_tls = false
  tls_min_version = "1.2"
  tls_ca = "/etc/categraf/ca.pem"
  tls_cert = "/etc/categraf/cert.pem"
  tls_key = "/etc/categraf/key.pem"
 # Use TLS but skip chain & host verification
  insecure_skip_verify = true

  # 定义当前instance的sql
 [[instances.queries]]
  mesurement = "lock_wait"
  metric_fields = [ "total" ]
  timeout = "3s"
  request = '''
  SELECT count(*) as total FROM information_schema.innodb_trx WHERE trx_state='LOCK WAIT'
  '''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

# 配置仪表盘

image-20231018151732438

选择克隆

image-20231018151922549

image-20231018151929277

在仪表盘页面进入该监控,可以看到MySQL监控

image-20231018152026903

# 监控进程

官方说明:https://flashcat.cloud/docs/content/flashcat-monitor/categraf/plugin/procstat/ (opens new window)

# 修改categraf配置文件

vim conf/input.procstat/procstat.toml 
1

监控categraf与categraf进程

注意:如果配置多个监控,要将下面每个详细配置都单独配置一遍

# # collect interval
interval = 15
[[instances]]
  search_cmdline_substring ="categraf"
  gather_total = true
	gather_per_pid = false
 	gather_more_metrics = [
     "threads",
     "fd",
     "io",
     "uptime",
     "cpu",
     "mem",
     "limit",
     "jvm"
 	]
[[instances]]
# # executable name (ie, pgrep <search_exec_substring>)
#search_exec_substring = "nginx"

# # pattern as argument for pgrep (ie, pgrep -f <search_cmdline_substring>)
 search_cmdline_substring ="paddlenlp"

# # windows service name
# search_win_service = ""

# # search process with specific user, option with exec_substring or cmdline_substring
# search_user = ""

# # append some labels for series
# labels = { region="cloud", product="n9e" }

# # interval = global.interval * interval_times
# interval_times = 1

# # mode to use when calculating CPU usage. can be one of 'solaris' or 'irix'
# mode = "irix"

# sum of threads/fd/io/cpu/mem, min of uptime/limit
gather_total = true

# will append pid as tag
gather_per_pid = false

#  gather jvm metrics only when jstat is ready
 gather_more_metrics = [
     "threads",
     "fd",
     "io",
     "uptime",
     "cpu",
     "mem",
     "limit",
     "jvm"
 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

去注释版本

interval = 15
[[instances]]
  search_cmdline_substring ="categraf"
  gather_total = true
	gather_per_pid = false
 	gather_more_metrics = [
     "threads",
     "fd",
     "io",
     "uptime",
     "cpu",
     "mem",
     "limit",
     "jvm"
 	]
[[instances]]
search_cmdline_substring ="paddlenlp"
gather_total = true
gather_per_pid = false
gather_more_metrics = [
     "threads",
     "fd",
     "io",
     "uptime",
     "cpu",
     "mem",
     "limit",
     "jvm"
 ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

选择仪表盘

image-20231018173414017

克隆

image-20231018173425439

点击进入可以看到监控状态

image-20231018173510049

# 告警配置

进入 系统配置 -> 通知设置 -> SMTP设置

image-20231018171757953

配置发送预警邮箱

image-20231018171846780

进入告警管理->内置规则

image-20231018171914038

选择 Procstat

image-20231018172008856

选择第二个,并点击克隆,这个选项为当监控进程数为零则认为异常

image-20231018172033428

导入到指定业务组

image-20231018172122355

选择告警管理->告警规则可以看到我们克隆的预警规则

image-20231018172144703

这里我们先设置一下人员组织,设置接收预警的人员

设置用户

image-20231018172554441

添加两个用户,并设置邮箱

image-20231018172719400

设置团队

image-20231018172405896

点击新增、输入名称

image-20231018172425006

新增成员

image-20231018172510271

image-20231018172739711

回到告警管理->告警规则,点击名称进入规则

image-20231018172918233

保存,点击启用

image-20231018172943172

上面我设置监控预警规则为进程数为1 时进行预警,为了测试效果,生产改为0。

过一会在邮件中可以看到预警邮件

image-20231018173159245

# 配置指定机器

上面的预警配置,默认会应用的所有机器,下面介绍如何监控指定的机器进行预警。

# 给机器配置标签

选择基础设置->机器列表

image-20231019100821808

勾选我们需要设置标签的服务器,点击右上角批量操作->绑定标签

image-20231019100900687

输入需要设置的标签名,标签格式需要为key=value这样,key要是使用数字字母开头

image-20231019101809938

这里我设置成ip=xxxx,每台机器都添加一个,方便后面设置区分。我们也可以根据服务器部署服务类型来这是其他的标签如type=开发环境Hadoop集群。

image-20231019102309124

在时序指标->即时查询,搜索我们需要预警的指标

image-20231019143653664

image-20231019143800873

可以看到指标下有具体的参数。

在告警规则中配置告警条件,选择我们刚刚配置的标签

procstat_lookup_count{ip="xxx",search_string="paddlenlp"} == 0 or procstat_lookup_count{ip="xxx",search_string="paddlenlp"} == 0 or procstat_lookup_count{ip="xxx",search_string="paddlenlp"} == 0

image-20231019143906546

保存,这时预警就会根据设置的具体条件进行预警。

# 多台机器告警时显示异常机器

https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v6/usage/alert/alert-rule/ (opens new window)

image-20231019155943036

配置样例:

image-20231022135327727

# 常用命令总结

# 以服务方式启动
systemctl start categraf
# 停止服务
systemctl stop categraf
# 重启服务
systemctl restart categraf
# 查看状态
systemctl status categraf
1
2
3
4
5
6
7
8

# 历史监控内容清除

上次更新: 2024/04/19, 21:00:15
Linux配置代理请求
Proxmox安装

← Linux配置代理请求 Proxmox安装→

最近更新
01
Linux可视化监控
02-26
02
Maven私服搭建
02-26
03
当ElasticSearch时间字段设置多个格式到底是用的哪个?
01-19
更多文章>
Theme by Vdoing | Copyright © 2016-2025 Jast-zsh | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式