Jer*_*den 5 shell-script hard-disk smartctl
我有一个脚本 - 运行cron.daily它从两个相同的 SATA SSD 收集 SMART 统计数据。但是,smartctl -A /dev/sda有时会返回 /dev/sdb 的统计信息 - 如果这样做,则smartctl -A /dev/sdb返回 /dev/sdb 的统计信息。然而,有时它是对的!
系统启动到 M2 nvme0n1 上的 / ,其中一个 SATA SSD 上的 /home 和所有文件系统都使用 UUID 引用通过 fstab 挂载。
我试过插入随机睡眠命令 - 但这没有区别。
的输出smartctl不包括它是什么输出的任何通知 - 示例输出: -
smartctl 6.6 2017-11-05 r4594 [x86_64-linux-5.10.0-0.bpo.5-amd64] (local build)
Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART Attributes Data Structure revision number: 1
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - 0
9 Power_On_Hours 0x0032 099 099 000 Old_age Always - 2396
. . .
Run Code Online (Sandbox Code Playgroud)
uname -a
Linux hal 5.10.0-0.bpo.5-amd64 #1 SMP Debian 5.10.24-1~bpo10+1 (2021-03-29) x86_64 GNU/Linux
这是脚本,它将所有输出作为单个 CSV 行写入日志文件。
#!/bin/sh
# SMART DISK PROCESSING
# =====================
tmpfile=$(mktemp -q)
today=$(date -u +%d-%m-%Y)
smartctl -A /dev/sdb > $tmpfile
# Output log as a single line - note "Unknown_Attribute" is "POR_Recovery_Count" [unexpected shutdown]
echo -n $today ', ' >> /var/log/disk-monitor.d/sdb-errors.csv
awk 'NR>=8 && NR<=21 {print $1,",",$2,",",$10,",";}' $tmpfile | tr -d '\n' | sed 's/Unknown_Attribute/POR_Recovery_Count/;s/\,$/\n/' >> /var/log/disk-monitor.d/sdb-errors.csv
#------------------------------
smartctl -A /dev/sda > $tmpfile
# Output log as a single line - note "Unknown_Attribute" is "POR_Recovery_Count" [unexpected shutdown]
echo -n $today ', ' >> /var/log/disk-monitor.d/sda-errors.csv
awk 'NR>=8 && NR<=21 {print $1,",",$2,",",$10,",";}' $tmpfile | tr -d '\n' | sed 's/Unknown_Attribute/POR_Recovery_Count/;s/\,$/\n/' >> /var/log/disk-monitor.d/sda-errors.csv
exit 0
Run Code Online (Sandbox Code Playgroud)
cas*_*cas 12
不能保证驱动器的设备节点在重新启动时保持一致。它们是在启动时首次看到的基础上分配的。这可能会因硬件更改、内核更改、模块加载顺序、时间上的微小变化等而有所不同。
如果您想要持久的设备节点命名,请使用/dev/disk/*/. 它们将始终指向同一设备的正确设备节点,无论内核以何种顺序找到它。
我更喜欢使用符号链接,/dev/disk/by-id/因为它们提供了设备类型(例如 nvme 或 ata 或 usb)、设备品牌、型号和序列号。我为每个驱动器打印带有序列号的粘性标签,因此如果需要更换,我可以轻松找到一个标签,而不会冒与设备节点名称混淆的风险。
例如,我的一个系统上的一些 SATA SSD(这些分区用于其 zfs rootfs 池):
# ls -lF /dev/disk/by-id/ata-Crucial* | grep -v part
lrwxrwxrwx 1 root root 9 May 9 20:06 /dev/disk/by-id/ata-Crucial_CT275MX300SSD1_163313AAxxx -> ../../sdl
lrwxrwxrwx 1 root root 9 May 9 20:06 /dev/disk/by-id/ata-Crucial_CT275MX300SSD1_163313AAExxx -> ../../sdq
lrwxrwxrwx 1 root root 9 May 9 20:06 /dev/disk/by-id/ata-Crucial_CT275MX300SSD1_163313AAFxxx -> ../../sdo
lrwxrwxrwx 1 root root 9 May 9 20:06 /dev/disk/by-id/ata-Crucial_CT275MX300SSD1_163313AB0xxx -> ../../sdp
# zpool status ganesh
pool: ganesh
state: ONLINE
scan: scrub repaired 0B in 00:22:42 with 0 errors on Sun May 9 00:46:44 2021
config:
NAME STATE READ WRITE CKSUM
ganesh ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
ata-Crucial_CT275MX300SSD1_163313AADxxx-part5 ONLINE 0 0 0
ata-Crucial_CT275MX300SSD1_163313AAExxx-part5 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
ata-Crucial_CT275MX300SSD1_163313AAFxxx-part5 ONLINE 0 0 0
ata-Crucial_CT275MX300SSD1_163313AB0xxx-part5 ONLINE 0 0 0
errors: No known data errors
Run Code Online (Sandbox Code Playgroud)
这些符号链接将在每次重新启动时 100% 保持一致(当然,除非您移除或更换驱动器)。 每当给定驱动器在系统中时,都会创建完全相同的符号链接。还有每个分区的符号链接。
顺便说一句,这些符号链接是由udev规则制定的。在我的 Debian 系统上,/lib/udev/rules.d/60-persistent-storage.rules. 如果您想要自己的命名方案而不是这些规则,或者除了这些规则之外,您可以编写自己的规则。想要这样做的理由并不多,但如果需要,您可以这样做。