Contents

检查Linux中存储设备的健康

1. 概述

今天,我们所有人都对数据存储的可靠性寄予厚望。这就是为什么许多用户甚至不考虑由于硬件损坏而丢失数据的可能性。但是硬盘故障是一个 有据可查的问题 。在本教程中,我们将了解如何在 Linux 中检查磁盘的健康状况。

我们不会讨论如何 从损坏的磁盘中恢复信息 ,这是一个不同的主题。相反,我们感兴趣的是是否该更换我们的硬盘驱动器,因为它们处于故障前状态或已经发生了一些故障。

2. 如何识别磁盘和分区

一切都是 Unix 及其衍生版本中的文件,例如 Linux。我们所有的硬件组件都对应着设备文件 ,系统通过这些文件与它们进行通信。

大多数设备文件是传统上挂载在*/dev上的虚拟文件系统的一部分。例如,/dev/sda*通常是大多数 Linux 安装中的第一个磁盘。

设备文件还可以匹配设备的特定资源,例如磁盘分区。所以,如果我们的磁盘是*/dev/sda*,它的第一个分区是*/dev/sda1*。

在本教程的其余部分,我们需要知道哪些设备文件可以识别我们的磁盘及其分区。让我们看一些例子:/dev/hd[az] , /dev/sd[az] , /dev/vd[az] , /dev/nst* , /dev/sg* , /dev/twe[0-9]等。

有几种方法可以找到所有存储设备 。首先,让我们识别磁盘:

# <a href="https://linux.die.net/man/1/lshw">lshw</a> -class disk
  *-disk                    
       description: ATA Disk
       product: SanDisk SD8SN8U2
       [...]
       logical name: /dev/sda
       [...]
       size: 238GiB (256GB)
       [...]
  *-disk
       description: ATA Disk
       product: HGST HTS721010A9
       [...]
       logical name: /dev/sdb
       [...]
       size: 931GiB (1TB)
       [...]
  *-disk
       description: SCSI Disk
       product: 024 HN-M101M
       [...]
       logical name: /dev/sdc
       [...]
       size: 931GiB (1TB)
       [...]

在这种情况下,我们有三个磁盘。lshw提供的详细信息有助于我们不要弄错。

然后,对于每个磁盘,我们可以列出它的分区,例如:

$ <a href="https://www.man7.org/linux/man-pages/man8/lsblk.8.html">lsblk</a> /dev/sda -o NAME,KNAME,FSTYPE,MOUNTPOINT,SIZE
NAME                KNAME FSTYPE      MOUNTPOINT   SIZE
sda                 sda                          238,5G
├─sda1              sda1  vfat        /boot/efi    512M
├─sda2              sda2  ext4        /boot        732M
└─sda3              sda3  crypto_LUKS            237,3G
  └─sda3_crypt      dm-0  LVM2_member            237,2G
    ├─vgmint-root   dm-1  ext4        /          236,3G
    └─vgmint-swap_1 dm-2  swap        [SWAP]       976M

在这种情况下,/dev/sda包含一个带有加密 分区的LVM 。这种树状的分区视图非常直观。NAME 和 KNAME 的区别在于前者表示设备名称,而后者表示内部内核设备名称。

3. smartctlgsmartcontrol

磁盘驱动器制造商通过自我监控、分析和报告技术 (SMART)向预测磁盘驱动器的可靠性迈出了一大步,该技术包含在大多数现代 ATA/SATA、SCSI/SAS 和 NVMe 磁盘中。 它的主要功能是检测和报告驱动器可靠性的各种指标,以预测即将发生的硬件故障。它还执行不同类型的驱动器自检。

smartmontools包包含两个实用程序(smartctlsmartd ),用于使用* SMART* 控制和监视存储系统

*我们将重点介绍*smartctl,它用于交互式使用,而smartd是一个持续监控 SMART 的守护进程。 gsmartcontrol 是 smartctl 的图形用户界面

3.1. 带有阈值的 SMART 属性

SMART 技术包括为每个驱动器型号选择的一系列属性或诊断。属性个人主义很重要,因为驱动架构因模型而异。

让我们看一个使用–all*标志的示例,它打印有关物理磁盘的所有 SMART 信息*。在虚拟磁盘上寻找相同的信息是没有意义的,而且是不可能的。

由于smartctl非常冗长,我们过滤了以下输出以突出显示最相关的信息:

# smartctl --all /dev/sdc
[...]

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Samsung SpinPoint M8 (AF)
Device Model:     ST1000LM024 HN-M101MBB
Serial Number:    S31CJ9DF228176
LU WWN Device Id: 5 0004cf 20c9ecae7
Firmware Version: 2BA30001
User Capacity:    1.000.204.886.016 bytes [1,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5400 rpm
Form Factor:      2.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 6
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Thu May 19 12:15:17 2022 CEST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
 
=== START OF READ SMART DATA SECTION ===
[...]
SMART overall-health self-assessment test result: PASSED
[...]
 
Auto Offline Data Collection: Disabled.
[...]
Short self-test routine 
recommended polling time: 	 (   2) minutes.
Extended self-test routine
recommended polling time: 	 ( 215) minutes.
[...]
 
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   100   100   051    Pre-fail  Always       -       46
  2 Throughput_Performance  0x0026   252   252   000    Old_age   Always       -       0
  3 Spin_Up_Time            0x0023   090   090   025    Pre-fail  Always       -       3158
  4 Start_Stop_Count        0x0032   078   078   000    Old_age   Always       -       22556
  5 Reallocated_Sector_Ct   0x0033   252   252   010    Pre-fail  Always       -       0
[...]

首先,“信息开始部分”告诉我们 SMART 支持可用并已启用。那挺好的。

之后,我们看到**“SMART整体健康自我评估测试结果”为“PASSED”。**没关系,这意味着磁盘仍然可用。

“自动离线数据收集”会定期更新特定的 SMART 属性,但这可能会影响性能。它被禁用了,我们可以保持这种状态。但是,如果我们想启用它,我们可以运行“ smartctl -s on -o on -S on /dev/sdc”

更进一步,我们看到了执行自测的估计时间:短时间为 2 分钟,延长时间为近 4 小时(215 分钟)。

在本教程的后续部分,我们将做一个简短的测试。**我们应该谨慎进行扩展测试,因为它们的持续时间可能会影响磁盘磨损。**在较大的磁盘上,它们可能需要十个小时或更长时间。

“具有阈值的供应商特定 SMART 属性”表让我们回到现实:磁盘很旧并且处于故障前状态

让我们看看第一个属性,“Raw_Read_Error_Rate”。它只出现在传统硬盘驱动器中,因为它不影响现代闪存驱动器。它表示可能导致永久数据丢失的磁盘表面问题。

我们可以参考“ Known ATA SMART attributes ”图表了解更多信息。

3.2. Smartmontools 的数据库

上一节中smartctl报告的“* Vendor Specific SMART Attributes with Thresholds *”表依赖于Smartmontools 的 ATA/SATA 驱动器数据库 。相反,SCSI/SAS 和 NVMe 驱动器不提供类似 ATA/SATA 的 SMART 属性,因此数据库不包含这些驱动器的任何条目。

-P show选项显示驱动器是否在数据库中,如果是,则显示其预设,然后退出:

# smartctl -P show /dev/sdc
smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-110-generic] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org
Drive found in smartmontools Database.  Drive identity strings:
MODEL:              ST1000LM024 HN-M101MBB
FIRMWARE:           2BA30001
match smartmontools Drive Database entry:
MODEL REGEXP:       ST(250|320|500|640|750|1000)LM0[012][124] HN-M[0-9]*MBB|APPLE HDD ST500LM012
FIRMWARE REGEXP:    .*
MODEL FAMILY:       Seagate Samsung SpinPoint M8 (AF)
ATTRIBUTE OPTIONS:  None preset; no -v options are required.

但是,假设我们的 ATA/SATA 驱动器不在数据库中。在这种情况下,ATTRIBUTE_NAME列中显示的属性名称和RAW_VALUE列中显示的原始属性的格式可能不正确。这个问题主要是表面上的。

幸运的是,Smartmontools 的基本驱动器健康监测/测试功能不依赖于数据库。

3.3. 自测

让我们做一个简短的自测。不幸的是,没有办法检查进度,所以我们必须保持命令运行,直到结果出现:

# smartctl -t short /dev/sdc
smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-110-generic] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Thu May 19 12:42:54 2022 CEST
Use smartctl -X to abort test.

大约两分钟后,我们得到了测试结果。将出现两个结果,因为我们之前执行了相同的测试:

# smartctl -l selftest /dev/sdc
smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-110-generic] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%      2575         -
# 2  Short offline       Completed without error       00%      2533         -

好消息是无错误完成状态,但请记住磁盘处于故障前状态。

3.4. gsmartcontrol

我们不会深入研究gsmartcontrol的使用,因为它为我们提供了与smartctl相同的信息和功能。它使用起来更方便,因为它有一个图形界面。但是,我们应该记住以 root 权限运行它。

当我们打开gsmartcontrol时,我们可以选择要分析的磁盘。我们拥有识别磁盘的基本信息以及启用或禁用 SMART 和自动离线数据收集的能力。

在这个例子中,我们选择了我们之前看到的同一个磁盘:

/uploads/storage_device_check_health/1.png

然后让我们看看所有基本的SMART信息:

/uploads/storage_device_check_health/3.png

我们可以注意到 SATA 接口的速度低于预期,如“SATA Version is: SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)”行中所报告的。但是,这不是问题,在这种情况下,考虑到最大“Media to/from Buffer”速度为 145MB/s,如制造商提供的数据表 中所述:

/uploads/storage_device_check_health/5.png

此外,我们可以轻松地运行简短和扩展的测试:

/uploads/storage_device_check_health/7.png

SMART属性也很容易查阅:

/uploads/storage_device_check_health/9.png

正如我们在前面的截图中看到的, gsmartcontrol的最大好处是它可以保护我们不必指定smartctl选项**。在许多情况下,它会很好。但是,gsmartcontrol提供了为smartctl指定自定义选项的能力,如故障排除 页面上所述。

4. Gnome 磁盘工具

我们可以在 Gnome 以外的桌面环境中安装和运行 Gnome Disk Utility ,例如 XFCE、Cinnamon 等。因此,尽管有它的名字,但使用 Gnome 并不是强制性的。让我们记住使用root权限。

它有很多功能。然而,我们感兴趣的是它的健康状况。让我们从左侧的存储设备列表中选择我们要检查的磁盘。Gnome 磁盘工具将显示磁盘的信息、分区和状态。然后,“SMART Data & Self-Tests”在三点菜单按钮中可用。希望“总体评估”报告“磁盘正常”。在这个窗口中,我们可以开始自检:

/uploads/storage_device_check_health/11.png

我们不会进一步详细说明这个工具,因为我们之前所说的关于 SMART 的内容适用。

5. 坏块

并非所有常用设备都提供 SMART 信息。例如,USB 闪存驱动器没有它。

在这种情况下,首先要考虑的是USB 记忆棒等廉价设备不适合永久存储我们的数据。更有可能的是,它们帮助临时将数据从一台计算机交换到另一台计算机,而不声称是耐用设备。事实上,与硬盘相比,它们更容易损坏。在 NAND 存储器达到最大读写限制之前,它们的内部组件很有可能出现故障。

**当没有 SMART 信息时,我们可以使用badblocks *进行设备健康检查。它是e2fsprogs 项目的一部分,也是e2fsck 的一部分,当传递选项-c*以扫描坏块并防止数据存储在其上时。

当作为独立程序运行时,badblocks会给出有问题的块列表(如果有)。可能需要很长时间才能完成。

我们应该记住只在未挂载的分区上执行坏块。需要root权限,-s标志显示进度,-v标志输出检测到的坏扇区:

# badblocks -sv /dev/sdd1
Checking blocks 0 to 15247359
Checking for bad blocks (read-only test):   0.00% done, 0:00 elapsed. (0/0/0 err  0.53% done, 0:04 ela    0.81% done, 0:  1.08% done, 0:08 elapse  1.22% done, 0:09 done

Pass completed, 0 bad blocks found. (0/0/0 errors)

在此示例中,/dev/sdd1是测试 USB 记忆棒上的唯一分区。此检查是只读的。我们可以查阅此文档 来执行可能是破坏性或非破坏性的读写测试。