上级入口:知识地图与图谱/知识地图-基础设施云原生与虚拟化 · 知识地图与图谱/知识地图-网络代理与远程接入 · 知识地图与图谱/知识地图-Linux系统与运维
1. 背景
vnstat.conf 是 vnStat 的统一配置文件。它同时影响三个命令:
| 命令 | 角色 | 主要受影响内容 |
|---|---|---|
vnstatd | 后台 daemon | 接口发现、计数器采集、数据库写入、保留策略、日志、SQLite 行为 |
vnstat | 查询 CLI | 默认接口、输出格式、单位、列表长度、JSON/XML/oneline 查询行为 |
vnstati | 图片输出工具 | 图片尺寸、字体、颜色、透明背景、summary/hourly 图形样式 |
本机版本:
vnstat --version
vnStat 2.13 by Teemu Toivola <tst at iki dot fi> (SQLite 3.51.2)
vnstati 在 Fedora 上是单独的子包:
sudo dnf install -y vnstat-vnstati
安装后版本:
vnstati --version
vnStat image output 2.13 by Teemu Toivola <tst at iki dot fi> (SQLite 3.51.2, LibGD 2.3.3)
包内文件:
rpm -ql vnstat-vnstati | sort
/usr/bin/vnstati
/usr/share/licenses/vnstat-vnstati/COPYING
/usr/share/man/man1/vnstati.1.gz
验证图片输出:
mkdir -p /tmp/vnstati-check
vnstati -s -i enp3s0 -o /tmp/vnstati-check/summary.png
file /tmp/vnstati-check/summary.png
ls -lh /tmp/vnstati-check/summary.png
输出:
/tmp/vnstati-check/summary.png: PNG image data, 500 x 200, 8-bit colormap, non-interlaced
-rw-r--r--. 1 dev dev 2.9K May 28 11:03 /tmp/vnstati-check/summary.png
2. 配置文件语法与加载规则
默认配置文件:
/etc/vnstat.conf
man page 说明:如果用户 HOME 下存在 $HOME/.vnstatrc,或命令行通过 --config <file> 指定了配置文件,则可以覆盖默认配置来源。
基本语法:
Keyword value
Keyword "value with spaces"
规则:
#或;开头的行是注释。- 每行是一个 keyword-argument pair。
- 参数可以用双引号包起来。
- 如果配置项不存在、无法解析或超出允许范围,程序会使用硬编码默认值。
- 命令行参数通常优先于配置文件。例如
vnstat -i wg0会覆盖Interface默认接口,vnstat --style 0会覆盖OutputStyle。
配置项分三类:
| 分类 | 影响范围 |
|---|---|
| common keywords | 主要影响 vnstat / vnstati 查询与展示,少数如 DatabaseDir 也影响 vnstatd |
| daemon related keywords | 影响 vnstatd 如何采集、缓存、保存和维护数据库 |
| image output related keywords | 影响 vnstati 图片输出 |
3. 三个命令如何共享配置
3.1 vnstatd
vnstatd 是长期运行的采集进程。它读取接口计数器,计算增量,缓存到内存,并按周期写入 SQLite 数据库。
典型受影响配置:
DatabaseDirUpdateIntervalPollIntervalSaveInterval5MinuteHours/HourlyDays/DailyDaysMaxBandwidth/MaxBW<iface>UseUTCDatabaseWriteAheadLoggingUseLogging
修改 daemon 相关配置后,一般需要重启:
sudo systemctl restart vnstat
journalctl -u vnstat -n 40 --no-pager
3.2 vnstat
vnstat 是查询数据库的命令行前端。它不负责长期采集,只负责读取数据库并输出 summary、days、months、json、xml、live 等结果。
典型受影响配置:
InterfaceUnitModeRateUnitOutputStyleListDays/ListMonths/ListTopQueryModeLocaleEstimateVisible
多数查询展示类配置无需重启 vnstatd,因为每次执行 vnstat 都会重新读取配置。
3.3 vnstati
vnstati 用同一份数据库生成 PNG 图片,适合静态网页或日报。它会读取部分 common 配置,也读取 image output 配置。
典型受影响配置:
HeaderFormatTransparentBgImageScaleLargeFontsCBackground/CRx/CTxSummaryGraphHourlyRate
修改这类配置后,不需要重启 daemon;下一次执行 vnstati 生成图片时生效。
常用输出:
vnstati -s -i enp3s0 -o summary.png
vnstati -d -i enp3s0 -o daily.png
vnstati -m -i enp3s0 -o monthly.png
vnstati -hs -i enp3s0 -o hsummary.png
vnstati -vs -i enp3s0 -o vsummary.png
vnstati 不支持 vnstat -l 这类 live traffic 功能,它面向已经写入数据库的统计结果。
4. common keywords
common 配置主要影响查询和展示,其中 DatabaseDir 也影响 daemon 的数据库位置。
| 配置项 | 默认示例 | 影响命令 | 作用 |
|---|---|---|---|
Interface | "" | vnstat, vnstati | 默认接口。为空时自动选择,数据库查询优先选择总流量最高的接口 |
DatabaseDir | /var/lib/vnstat | 三者 | SQLite 数据库目录。vnstatd 写入,vnstat / vnstati 读取 |
Locale | "-" | vnstat, vnstati | 输出 locale,- 表示使用系统默认 locale |
DayFormat | %Y-%m-%d | vnstat, vnstati | 日统计日期格式 |
MonthFormat | %Y-%m | vnstat, vnstati | 月统计日期格式 |
TopFormat | %Y-%m-%d | vnstat, vnstati | top days 日期格式 |
RXCharacter | % | vnstat | 文本列表中 rx 条形图字符 |
TXCharacter | : | vnstat | 文本列表中 tx 条形图字符 |
RXHourCharacter | r | vnstat | hourly graph 中 rx 字符 |
TXHourCharacter | t | vnstat | hourly graph 中 tx 字符 |
UnitMode | 0 | vnstat, vnstati | 流量单位前缀风格 |
RateUnit | 1 | vnstat, vnstati | 速率单位,0 bytes/s,1 bits/s |
RateUnitMode | 1 | vnstat, vnstati | bit 速率前缀风格,IEC 或 SI |
OutputStyle | 3 | vnstat, vnstati | 输出样式,影响是否显示 bar / rate column |
EstimateBarVisible | 1 | vnstat | OutputStyle 显示 bar 时是否显示 estimated bar |
DefaultDecimals | 2 | vnstat, vnstati | 默认小数位,范围 0..2 |
HourlyDecimals | 1 | vnstat | hourly graph 的小数位 |
HourlySectionStyle | 2 | vnstat | hourly graph 数值区块分隔符 |
Sampletime | 5 | vnstat | vnstat -tr 默认采样秒数 |
LiveSpinner | 1 | vnstat | vnstat -l live mode 是否显示 spinner |
QueryMode | 0 | vnstat | 不带参数执行 vnstat 时的默认查询模式 |
List5Mins | 24 | vnstat, vnstati | 5 分钟列表默认显示条数 |
ListHours | 24 | vnstat, vnstati | 小时列表默认显示条数 |
ListDays | 30 | vnstat, vnstati | 日列表默认显示条数 |
ListMonths | 12 | vnstat, vnstati | 月列表默认显示条数 |
ListYears | 0 | vnstat, vnstati | 年列表默认显示条数,0 表示全部 |
ListTop | 10 | vnstat, vnstati | top days 默认显示条数 |
InterfaceMatchMethod | 3 | vnstat, vnstati | 查询接口名时如何匹配 alias |
EstimateVisible | 1 | vnstat, vnstati | 是否显示 estimate 行,也影响 --alert 的 estimate 条件 |
EstimateText | estimated | vnstat, vnstati | estimate 行显示文本,最长 9 字符 |
InterfaceOrder | 0 | vnstat | 多接口输出排序,按接口名或 alias |
4.1 Interface
Interface ""
为空时,vnstat 会自动选择接口。数据库查询场景下,通常优先选择总流量最大的接口;非数据库查询会先从当前系统可见接口中选择。
如果服务器上有多个接口,建议显式指定查询接口,而不是依赖默认选择:
vnstat -i enp3s0
vnstat -i wg0
如果希望默认总是看某个接口:
Interface "enp3s0"
影响:
vnstat:不带-i时默认查该接口。vnstati:不带-i时默认画该接口。vnstatd:不受这个配置控制,daemon 监控接口由数据库和 daemon 发现逻辑决定。
4.2 DatabaseDir
DatabaseDir "/var/lib/vnstat"
这是最关键的路径配置之一。
影响:
vnstatd在这个目录创建 / 维护vnstat.db。vnstat从这个目录读取数据库。vnstati从这个目录读取数据库并生成图片。
修改时必须同时考虑权限:
ls -ld /var/lib/vnstat
ls -l /var/lib/vnstat/vnstat.db
如果改到自定义目录,vnstatd 运行用户需要有写权限,查询用户需要能读。
4.3 单位相关:UnitMode、RateUnit、RateUnitMode
UnitMode 0
RateUnit 1
RateUnitMode 1
UnitMode 控制流量总量单位:
| 值 | 含义 | 示例 |
|---|---|---|
0 | IEC binary prefix | KiB, MiB, GiB |
1 | old style binary prefix | KB, MB, GB,但按 1024 计算 |
2 | SI decimal prefix | kB, MB, GB,按 1000 计算 |
RateUnit 控制速率显示:
| 值 | 含义 |
|---|---|
0 | bytes/s |
1 | bits/s |
RateUnitMode 只在 RateUnit 1 时影响 bit/s 前缀:
| 值 | 含义 |
|---|---|
0 | IEC,例如 Kibit/s |
1 | SI,例如 kbit/s |
影响:
vnstat文本输出、-tr、-l、summary rate。vnstati图片中的单位。- 不影响
vnstatd存储,数据库里仍保存 bytes。 vnstat --json的 traffic 值默认仍是 bytes,不应被显示单位误导。
4.4 输出样式:OutputStyle 与视觉字符
OutputStyle 3
RXCharacter "%"
TXCharacter ":"
RXHourCharacter "r"
TXHourCharacter "t"
OutputStyle 控制文本输出布局:
| 值 | 行为 |
|---|---|
0 | 最小、窄输出 |
1 | 正常输出,显示 bar column |
2 | 类似 1,summary 中显示 rate |
3 | 支持时显示 rate column |
这些配置只改变展示,不改变采集或数据库。
影响:
vnstat -d/-m/-t等列表输出。vnstat -hghourly graph。vnstati会受OutputStyle的部分语义影响,尤其和BarColumnShowsRate组合时。
4.5 列表长度:List*
List5Mins 24
ListHours 24
ListDays 30
ListMonths 12
ListYears 0
ListTop 10
这些配置控制默认显示多少条,不控制数据库保留多少条。
例如:
ListDays 30
DailyDays 365
含义是:数据库最多保留 365 天日统计,但 vnstat -d 默认只显示最近 30 条。要显示更多:
vnstat -d 365
vnstat -d 0
影响:
vnstat -5/-h/-d/-m/-y/-tvnstati对应列表图- 不影响
vnstatd保留策略
4.6 QueryMode
QueryMode 0
控制不带参数执行 vnstat 时默认显示什么。
常用值:
| 值 | 默认查询 |
|---|---|
0 | summary |
1 | days |
2 | months |
3 | top |
4 | single summary |
5 | short |
7 | hours graph |
8 | xml |
9 | oneline |
10 | json |
11 | hours |
12 | 5 minute |
如果你常用 JSON 自动化,可以设置:
QueryMode 10
但更推荐脚本显式写:
vnstat --json
4.7 InterfaceMatchMethod
InterfaceMatchMethod 3
控制 vnstat -i <name> 如何匹配数据库接口名和 alias。
| 值 | 匹配方式 |
|---|---|
0 | 只允许接口名精确匹配,区分大小写 |
1 | 加上 alias 精确匹配,区分大小写 |
2 | 加上 alias 精确匹配,不区分大小写 |
3 | 加上 alias 前缀匹配,不区分大小写 |
配合别名使用:
sudo vnstat -i enp3s0 --setalias wan
vnstat -i wan
影响:
vnstat查询接口选择。vnstati图片输出接口选择。- 不影响
vnstatd采集哪个接口。
4.8 estimate 相关
EstimateVisible 1
EstimateText "estimated"
EstimateBarVisible 1
影响:
vnstatsummary / list 中是否显示 estimated 行。vnstati图片中是否显示 estimate。vnstat --alert中rx_estimate、tx_estimate、total_estimate条件是否可用。
如果禁用:
EstimateVisible 0
则 estimate 输出消失,基于 estimate 的告警也不可用。
5. daemon related keywords
daemon 配置影响 vnstatd 的采集、接口生命周期、数据库写入和维护。修改后通常需要:
sudo systemctl restart vnstat
5.1 daemon 配置总览
| 配置项 | 默认示例 | 影响 | 作用 |
|---|---|---|---|
DaemonUser | "" | vnstatd | root 启动后切换到指定用户 |
DaemonGroup | "" | vnstatd | root 启动后切换到指定组 |
BandwidthDetection | 1 | vnstatd | 自动检测接口带宽 |
MaxBandwidth | 1000 | vnstatd | 全局最大带宽,用于过滤异常增量 |
MaxBW<iface> | 示例 MaxBWeth0 8 | vnstatd | 单接口最大带宽 |
5MinuteHours | 48 | vnstatd, 查询结果 | 5 分钟粒度保留多少小时 |
HourlyDays | 4 | vnstatd, 查询结果 | 小时粒度保留多少天 |
DailyDays | 62 | vnstatd, 查询结果 | 日粒度保留多少天 |
MonthlyMonths | 25 | vnstatd, 查询结果 | 月粒度保留多少个月 |
YearlyYears | -1 | vnstatd, 查询结果 | 年粒度保留多少年 |
TopDayEntries | 20 | vnstatd, 查询结果 | top days 保留多少条 |
UpdateInterval | 20 | vnstatd | 读取接口计数器周期,秒 |
PollInterval | 5 | vnstatd | 检查接口上下线周期,秒 |
SaveInterval | 5 | vnstatd | 缓存写入数据库周期,分钟 |
OfflineSaveInterval | 30 | vnstatd | 全部接口离线时保存周期,分钟 |
RescanDatabaseOnSave | 1 | vnstatd | 保存时重新扫描数据库新增接口 |
AlwaysAddNewInterfaces | 0 | vnstatd | 自动添加新出现的接口 |
MonthRotate | 1 | vnstatd, 查询结果 | 月统计从每月几号开始 |
MonthRotateAffectsYears | 0 | vnstatd, 查询结果 | MonthRotate 是否影响年统计 |
CheckDiskSpace | 1 | vnstatd | 写数据库前检查磁盘空间 |
BootVariation | 15 | vnstatd | 判断系统启动时间变化的容忍秒数 |
TrafficlessEntries | 1 | vnstatd | 无流量时是否也创建时间段记录 |
TimeSyncWait | 5 | vnstatd | 启动时等待系统时间同步的分钟数 |
BandwidthDetectionInterval | 5 | vnstatd | 自动检测带宽的周期,分钟 |
SaveOnStatusChange | 1 | vnstatd | 接口上下线时强制保存 |
UseLogging | 2 | vnstatd | 日志输出方式 |
CreateDirs | 1 | vnstatd | 目录不存在时自动创建 |
UpdateFileOwner | 1 | vnstatd | 启动时修正数据库 / 日志 / pid 文件属主 |
LogFile | /var/log/vnstat/vnstat.log | vnstatd | 文件日志路径 |
PidFile | /var/run/vnstat/vnstat.pid | vnstatd | pid / lock 文件路径 |
64bitInterfaceCounters | -2 | vnstatd | 接口计数器位宽处理 |
DatabaseWriteAheadLogging | 0 | vnstatd, 查询兼容性 | SQLite WAL 模式 |
DatabaseSynchronous | -1 | vnstatd | SQLite synchronous 策略 |
UseUTC | 0 | vnstatd, 查询结果 | 数据库时间是否使用 UTC |
VacuumOnStartup | 1 | vnstatd | 启动时执行 SQLite VACUUM |
VacuumOnHUPSignal | 1 | vnstatd | 收到 HUP 后执行 VACUUM |
5.2 用户与权限:DaemonUser、DaemonGroup
DaemonUser ""
DaemonGroup ""
这两个配置只在进程以 root 启动时有意义,用于启动后切换到低权限用户 / 组。
发行版 systemd 包通常已经在 unit 文件或打包逻辑里处理了运行用户。本机服务状态显示 daemon 以 uid:958 gid:958 运行:
Info: vnStat daemon 2.13 (pid:306455 uid:958 gid:958 64-bit, SQLite 3.51.2)
影响:
vnstatd的数据库、日志、pid 文件读写权限。- 不影响
vnstat查询命令的执行用户。
5.3 带宽检测与异常过滤
BandwidthDetection 1
MaxBandwidth 1000
#MaxBWeth0 8
BandwidthDetectionInterval 5
vnstatd 通过读取内核接口计数器差值来计算流量。为了避免计数器回绕、接口重建、驱动异常导致的巨大假流量,它会使用最大带宽限制过滤不合理增量。
MaxBandwidth 是全局上限,单位 Mbit。MaxBW<iface> 是单接口上限,例如:
MaxBWenp3s0 1000
MaxBWwg0 1000
MaxBWtun-ext 10000
注意:
BandwidthDetection 1会尝试自动检测接口带宽。- Linux 上 tun 接口带宽检测可能不可靠,man page 提到 tun 接口检测会被特殊处理,因为内核可能报告固定值。
- 设置了
MaxBW<iface>后,该接口不再使用自动检测。
影响:
- 只影响
vnstatd是否接受某个采样周期的增量。 - 间接影响
vnstat/vnstati之后能看到的数据。
5.4 历史数据保留策略
5MinuteHours 2160
HourlyDays 365
DailyDays 365
MonthlyMonths 25
YearlyYears -1
TopDayEntries 20
含义:
| 配置项 | 单位 | -1 | 0 | 影响 |
|---|---|---|---|---|
5MinuteHours | 小时 | 无限保留 | 禁用 5 分钟粒度 | vnstat -5, --95th |
HourlyDays | 天 | 无限保留 | 禁用小时粒度 | vnstat -h, -hg |
DailyDays | 天 | 无限保留 | 禁用日粒度 | vnstat -d |
MonthlyMonths | 月 | 无限保留 | 禁用月粒度 | vnstat -m |
YearlyYears | 年 | 无限保留 | 禁用年粒度 | vnstat -y |
TopDayEntries | 条 | 无限保留 | 禁用 top day | vnstat -t |
本机已把 5 分钟粒度扩展到 90 天,把小时和日统计扩展到 365 天:
5MinuteHours 2160
HourlyDays 365
DailyDays 365
注意:
- 这控制的是数据库保留,不是默认显示条数。
- 已被清理的历史明细无法恢复。
--95th要覆盖整月,5MinuteHours至少需要 744 小时左右的数据窗口。- 保留越久,SQLite 数据库越大,但 vnStat 的数据量通常仍然很小。
验证:
journalctl -u vnstat -n 40 --no-pager
Info: Data retention: 2160 5MinuteHours, 365 HourlyDays, 365 DailyDays, 25 MonthlyMonths, -1 YearlyYears, 20 TopDayEntries
5.5 采集、轮询与保存周期
UpdateInterval 20
PollInterval 5
SaveInterval 5
OfflineSaveInterval 30
这些是 vnstatd 运行行为的核心。
| 配置项 | 单位 | 作用 |
|---|---|---|
UpdateInterval | 秒 | 多久读取一次接口计数器并更新内存缓存 |
PollInterval | 秒 | 多久检查接口可用性变化 |
SaveInterval | 分钟 | 多久把缓存写入 SQLite |
OfflineSaveInterval | 分钟 | 所有接口离线时多久保存一次 |
关系:
PollInterval越短,接口上下线发现越快。UpdateInterval越短,采样越细,但不是数据库分辨率;数据库仍按 5 分钟、小时、天等聚合。SaveInterval越短,异常断电时丢失的缓存越少,但磁盘写入更频繁。
一般服务器保持默认即可。低功耗设备可以适当增大保存周期,高动态接口环境可以保持较短轮询。
5.6 接口发现与数据库同步
RescanDatabaseOnSave 1
AlwaysAddNewInterfaces 0
SaveOnStatusChange 1
vnstatd 监控哪些接口,不是由 Interface 决定,而是由数据库中的 interface 表和 daemon 发现逻辑决定。
RescanDatabaseOnSave 1:
- 当你手动执行
vnstat --add -i <iface>后,daemon 在保存周期会重新扫描数据库并开始监控新接口。 - 关闭后,可能需要重启 daemon。
AlwaysAddNewInterfaces 0:
- 关闭时,daemon 不会在已有数据库情况下自动添加每个新出现接口。
- 开启后,Docker、VPN、临时 veth 等接口可能被自动加进数据库,容易产生噪音。
SaveOnStatusChange 1:
- 接口上线 / 下线时额外保存一次,减少状态变化时数据丢失。
建议:
- 稳定服务器:
AlwaysAddNewInterfaces 0。 - 经常插拔网卡或动态创建接口的测试机:可临时使用
vnstatd --alwaysadd或配置AlwaysAddNewInterfaces 1。
5.7 月份与账单周期
MonthRotate 1
MonthRotateAffectsYears 0
MonthRotate 控制月统计从每月几号切换。默认 1 表示自然月。
如果运营商账单每月 7 日重置:
MonthRotate 7
影响:
vnstat -m的月统计边界。vnstat --alert ... m ...的月度告警判断。- 不会重算已有数据,只影响之后写入的数据归属。
MonthRotateAffectsYears 1 会让这个非自然月边界也影响年统计。多数场景保持默认 0。
5.8 时间与时区
UseUTC 0
TimeSyncWait 5
BootVariation 15
UseUTC 0 表示使用本地时区写入数据库。改成 1 后,新写入数据使用 UTC。
注意:
- 修改
UseUTC不会转换已有历史数据。 - 修改系统时区不会重算旧数据。
- 系统时间回拨时,可能把新流量累加到已经存在的时间段。
TimeSyncWait 适合没有 RTC 的设备,启动时如果数据库最新时间看起来在未来,daemon 会等待系统时间同步。
BootVariation 用于判断系统启动时间变化的容忍范围,辅助处理重启后的计数器同步。
5.9 日志、目录和 pid
UseLogging 2
CreateDirs 1
UpdateFileOwner 1
LogFile "/var/log/vnstat/vnstat.log"
PidFile "/var/run/vnstat/vnstat.pid"
UseLogging:
| 值 | 行为 |
|---|---|
0 | 禁用日志 |
1 | 写入 LogFile |
2 | syslog / journal |
systemd 环境下通常使用 UseLogging 2,日志查看:
journalctl -u vnstat -n 80 --no-pager
注意:当 vnstatd -n / --nodaemon 前台运行时,日志会输出到终端,UseLogging 可能被忽略。
CreateDirs 1 会在目录不存在时尝试创建 DatabaseDir、LogFile、PidFile 所需目录。
UpdateFileOwner 1 会在 daemon 以 root 启动且启用了用户 / 组切换时修正数据库、日志、pid 文件属主。
5.10 SQLite 行为
DatabaseWriteAheadLogging 0
DatabaseSynchronous -1
VacuumOnStartup 1
VacuumOnHUPSignal 1
DatabaseWriteAheadLogging 控制 SQLite WAL 模式:
0:默认 rollback journal 模式。1:启用 WAL,可能改善读写并发,但老 SQLite 只读访问兼容性可能有问题。
DatabaseSynchronous 控制 SQLite 写入同步级别:
| 值 | 含义 |
|---|---|
-1 | 根据 WAL 设置自动选择默认 |
0 | off,交给文件系统,性能好但数据安全弱 |
1 | normal |
2 | full |
3 | extra |
建议:
- 普通服务器保持默认。
- 不要为了微小性能收益随意关闭同步,vnStat 写入频率本来就低。
VacuumOnStartup / VacuumOnHUPSignal 控制是否执行 SQLite VACUUM,用于删除接口或缩短保留策略后压缩数据库文件。
5.11 计数器位宽与无流量记录
64bitInterfaceCounters -2
TrafficlessEntries 1
CheckDiskSpace 1
64bitInterfaceCounters:
| 值 | 行为 |
|---|---|
1 | 强制认为接口使用 64-bit counter |
0 | 强制认为接口使用 32-bit counter |
-1 | 使用旧逻辑 |
-2 | 自动检测 |
高速接口建议保持 -2 自动检测。错误设置可能导致计数器回绕判断不准。
TrafficlessEntries 1 表示即使某个时间段没有流量,也创建记录。这样图表和列表时间轴更连续。
CheckDiskSpace 1 在写数据库前检查磁盘空间,建议保持开启。
6. image output related keywords
这些配置只影响 vnstati 图片输出。本机已安装 vnstat-vnstati,可使用 vnstati 从同一份 /var/lib/vnstat/vnstat.db 生成 PNG 图片。
vnstati --help 的核心输出模式:
| 命令 | 作用 |
|---|---|
vnstati -s / --summary | summary 图片 |
vnstati -5 / --fiveminutes | 5 分钟列表图片 |
vnstati -5g / --fivegraph | 5 分钟柱状图 |
vnstati -h / --hours | 小时列表图片 |
vnstati -hg / --hoursgraph | 小时图 |
vnstati -d / --days | 日统计图片 |
vnstati -m / --months | 月统计图片 |
vnstati -y / --years | 年统计图片 |
vnstati -t / --top | top days 图片 |
vnstati -hs / --hsummary | 横向 summary + graph |
vnstati -vs / --vsummary | 纵向 summary + graph |
vnstati --95th <mode> | 95th percentile 图片,0=rx,1=tx,2=total |
输出文件:
vnstati -s -i enp3s0 -o /tmp/vnstat-summary.png
-o 根据文件扩展名选择图片格式;输出到标准输出时使用 -o -,此时格式限制为 PNG:
vnstati -d -ne -nh -o - > daily.png
缓存输出:
vnstati -h -c 15 -o /tmp/vnstat_h.png
-c 15 表示只有当输出文件超过 15 分钟未更新时才重新生成,适合 cron 或 Web 页面按固定 URL 读取图片的场景。
6.1 图片输出配置总览
| 配置项 | 默认示例 | 作用 |
|---|---|---|
HeaderFormat | %Y-%m-%d %H:%M | 图片标题时间格式 |
HourlyRate | 1 | hourly 图片中显示 rate 而不是流量总量 |
SummaryRate | 1 | summary 图片中显示 rate |
TransparentBg | 0 | 背景是否透明 |
LargeFonts | 0 | 是否使用大字体 |
LineSpacingAdjustment | 0 | 列表行距调整 |
ImageScale | 100 | 图片缩放百分比 |
5MinuteGraphResultCount | 576 | 5 分钟图包含多少个点 |
5MinuteGraphHeight | 300 | 5 分钟图高度 |
HourlyGraphMode | 0 | hourly graph 模式 |
SummaryGraph | 0 | summary 旁边显示小时图还是 5 分钟图 |
EstimateStyle | 1 | estimate bar 样式 |
BarColumnShowsRate | 0 | list bar column 是否表示 rate |
CBackground 等 | 颜色值 | 图片颜色主题 |
命令行参数通常可临时覆盖配置文件。例如:
vnstati -s --scale 150 --transparent 1 -i enp3s0 -o summary.png
vnstati -d -L -i enp3s0 -o daily-large.png
vnstati -hg 1 -i enp3s0 -o hourly-from-midnight.png
含义:
--scale 150覆盖ImageScale。--transparent 1覆盖TransparentBg。-L覆盖LargeFonts。-hg 1覆盖HourlyGraphMode,让小时图从当天 00:00 开始。
6.2 图片尺寸与字体
LargeFonts 0
LineSpacingAdjustment 0
ImageScale 100
影响:
LargeFonts 1提高字体尺寸,适合高 DPI 或大屏展示。LineSpacingAdjustment正数增大行距,负数压缩行距。ImageScale按百分比缩放输出,范围50..500。
如果网页中展示太小:
ImageScale 150
6.3 5 分钟图与小时图
5MinuteGraphResultCount 576
5MinuteGraphHeight 300
HourlyGraphMode 0
SummaryGraph 0
5MinuteGraphResultCount 576 表示图中包含 576 个 5 分钟周期,也就是 48 小时。这个值影响图宽。
也可以用命令行临时覆盖:
vnstati -5g 288 300 -i enp3s0 -o five-minute-24h.png
其中 288 表示 24 小时,因为每小时有 12 个 5 分钟周期;300 表示图高 300 像素。
HourlyGraphMode:
| 值 | 行为 |
|---|---|
0 | 最近 24 小时滑动窗口 |
1 | 从当天 00:00 开始 |
SummaryGraph:
| 值 | summary 图旁边显示 |
|---|---|
0 | hours |
1 | 5 minutes |
6.4 rate 与 estimate 显示
HourlyRate 1
SummaryRate 1
EstimateStyle 1
BarColumnShowsRate 0
HourlyRate 1 表示小时图使用速率视角,而不是只看传输总量。
SummaryRate 1 会在 summary 图片中显示速率信息。
EstimateStyle:
| 值 | 行为 |
|---|---|
0 | 不显示 estimate bar |
1 | estimate 作为现有 bar 的延续 |
2 | estimate 使用独立 bar |
BarColumnShowsRate 1 需要配合 OutputStyle 3。启用后,list 输出中的 bar column 表示 rate;同时会让 EstimateStyle 自动变为 0。
6.5 透明背景与颜色
TransparentBg 0
CBackground "FFFFFF"
CEdge "AEAEAE"
CHeader "606060"
CHeaderTitle "FFFFFF"
CHeaderDate "FFFFFF"
CText "000000"
CLine "B0B0B0"
CLineL "-"
CPercentileLine "CF0045"
CRx "92CF00"
CTx "606060"
CRxD "-"
CTxD "-"
CTotal "0098CF"
颜色使用十六进制 RGB,不带 #。
常用含义:
| 配置项 | 作用 |
|---|---|
CBackground | 背景色 |
CEdge | 边框色 |
CHeader | 头部背景 |
CHeaderTitle | 标题文字 |
CHeaderDate | 日期文字 |
CText | 普通文字 |
CLine | 线条 |
CLineL | 较浅线条,- 表示自动计算 |
CPercentileLine | 95th percentile 线 |
CRx / CRxD | rx 主色 / 深色 |
CTx / CTxD | tx 主色 / 深色 |
CTotal | total 色,主要用于 95th percentile 图 |
透明背景:
TransparentBg 1
适合把 PNG 嵌入深色或自定义背景网页。注意透明背景可能让浅色文字在某些网页背景上不可读,需要同时调整颜色。
6.6 vnstati 的限制
vnstati(1) 有几个使用限制:
- 可输出的图片格式取决于构建时链接的 GD library。本机版本显示
LibGD 2.3.3。 - 输出到 stdout 时只支持 PNG。
- GD 内建字体对 UTF-8 字符支持有限,中文标题或长文本可能显示不完整。
- 日期格式太长可能导致列对齐问题。
- 启用透明背景后再缩放图片,透明效果可能无法保留。
因此,把 vnstati 用在自动化页面时,建议先固定英文或短中文标题、固定输出尺寸,并用浏览器实际检查图片。
7. 配置变更是否需要重启
| 修改类型 | 是否需要重启 vnstatd | 原因 |
|---|---|---|
vnstatd 采集 / 保存 / 保留策略 | 是 | daemon 长期运行,需要重新读取配置 |
vnstat 输出格式 | 否 | 每次执行 vnstat 都会读取配置 |
vnstati 图片样式 | 否 | 每次执行 vnstati 生成图片时读取配置 |
DatabaseDir | 建议重启并谨慎迁移数据 | 三个命令都依赖数据库路径 |
UseUTC / MonthRotate | 是 | 影响后续写入数据的时间归属 |
ListDays / OutputStyle / UnitMode | 否 | 只影响展示 |
重启与验证:
sudo systemctl restart vnstat
systemctl status vnstat --no-pager
journalctl -u vnstat -n 40 --no-pager
查看当前配置:
vnstat --showconfig
8. 常见配置组合
8.1 长期保留细粒度历史
适合做长期流量图、分析每日峰谷:
5MinuteHours 2160
HourlyDays 365
DailyDays 365
MonthlyMonths 36
YearlyYears -1
影响:
vnstat -5能查最近 90 天 5 分钟数据。vnstat -h能查最近 365 天小时数据。- SQLite 文件会增大。
8.2 VPS 按账单周期统计
如果 VPS 每月 7 日重置流量:
MonthRotate 7
影响:
vnstat -m的月份不再是自然月。- 月度
--alert会按新周期判断。 - 已有历史不重算。
8.3 多动态接口环境避免噪音
Docker、VPN、临时 TUN/TAP 较多时:
AlwaysAddNewInterfaces 0
RescanDatabaseOnSave 1
手动添加需要的接口:
sudo vnstat --add -i wg0
sudo vnstat --add -i enp3s0
8.4 嵌入式或低写入设备
如果设备写入寿命敏感:
SaveInterval 10
OfflineSaveInterval 60
VacuumOnStartup 0
取舍:
- 磁盘写入减少。
- 异常断电时可能丢失更多未保存缓存。
9. 排障检查清单
9.1 修改配置后没有生效
检查是否编辑了正确文件:
vnstat --showconfig | head
检查是否存在 $HOME/.vnstatrc 覆盖:
ls -l ~/.vnstatrc
daemon 相关配置修改后重启:
sudo systemctl restart vnstat
9.2 数据库路径或权限错误
grep -n '^DatabaseDir' /etc/vnstat.conf
ls -ld /var/lib/vnstat
ls -l /var/lib/vnstat/vnstat.db
journalctl -u vnstat -n 80 --no-pager
9.3 接口没有被监控
vnstat --iflist
vnstat --dbiflist
sudo vnstat --add -i <iface>
sudo systemctl restart vnstat
注意:Interface 只是查询默认接口,不会让 daemon 自动监控该接口。
9.4 输出条数少于预期
区分两个概念:
DailyDays:数据库最多保留多少天。ListDays:默认显示多少条。
如果 DailyDays 365 但 vnstat -d 只显示 30 条,这是 ListDays 30 的正常行为:
vnstat -d 365
vnstat -d 0
10. 与主笔记的关系
这篇文章专注于配置项行为。安装、常用命令、底层采集原理、SQLite schema 和 Grafana 集成可参考:
11. 参考
man vnstat.confman vnstatman vnstatdman vnstati- 官方 man page:vnstat.conf(5)