/dev/sda **有时** 会被 smartctl 与 /dev/sdb 混淆

/dev/sda **有时** 会被 smartctl 与 /dev/sdb 混淆

我有一个脚本 - 运行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
. . .

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

答案1

不保证驱动器的设备节点在重新启动后保持一致。它们是在启动时按照首次看到的原则进行分配的。这可能会因硬件更改、内核更改、模块加载顺序、时序的微小变化等而有所不同。

如果您想要持久的设备节点命名,请使用 下的符号链接/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

这些符号链接在每次重新启动时都将 100% 一致(当然,除非您删除或更换驱动器)。 每当系统中存在给定的驱动器,将创建完全相同的符号链接。还有每个分区的符号链接。

顺便说一句,这些符号链接是按udev规则创建的。在我的 Debian 系统上,/lib/udev/rules.d/60-persistent-storage.rules.如果您想要自己的命名方案来代替这些方案,或者除了这些方案之外,您可以编写自己的规则。没有太多理由想要这样做,但如果需要,您可以这样做。

答案2

强调@cas 提出的几点

以前,我的所有 PC 都有一两个 SATA/IDE 磁盘,其中一个上有“/”。显然,在这些条件下,在进行正确的 /dev/sdX 标识之前不可能运行作业。

但是,使用包含“/”的单独引导驱动器,尤其是一种不同类型的引导驱动器(NVME)包含不在 /dev/sdX 命名方案中的脚本、程序等,不会受到任何时间限制的限制。

使用/dev/disk/by-id/正确的硬件名称(包括序列号)可以防止由于不正确的识别而引起的问题。遗憾的是磁盘没有易于访问的 UUID(尽管分区有)。

顺便说一句,有很多例子(尤其是在 youtube 上),其中dd if=/dev/sdX...推荐了一些非常危险的命令。也许这些应该更加谨慎对待?

相关内容