Linux 下检测磁盘的各种方式

大概流程

  • 使用dmesg检查是否有关于磁盘错误的信息,如下: end_request: I/O error, dev 03:06 (sda), sector 。
  • 从上面的输出我们判定扇区可能出现了问题,使用badblocks -s -v -o /root/badblocks.log /dev/sda 检查硬盘是否产生坏道并输出到badblocks.log中。log大约是这样的模式:64039224 64039240 64039241 64039242 64039243 64039256 64039257 64039258 64039259 687056
  • 可修复坏道方法:
      1. 使用 badblocks -s -w /dev/sda END START,END代表需要修复的扇区末端,START代表需要修复的扇区起始端。
      1. 使用fsck -a /dev/sda1
  • 磁盘坏道分为三种:0磁道坏道,逻辑坏道,硬盘坏道。其中逻辑坏道可以使用上面的方法修复,0磁道坏道的修复方法是隔离0磁道,使用fdsk划分区的时候从1磁道开始划分区。如果是硬盘坏道的话,只能隔离不能修复。
  • 硬盘坏道的监测方法:使用上述方法检测修复后,再使用badblocks -s -v -o /root/badblocks.log /dev/sda监测看是否还有坏道存在,如果坏道还是存在的话说明坏道属于硬盘坏道。硬盘坏道隔离方法,首先记录监测出的硬盘坏道,然后分区的时候把硬盘坏道所在的扇区分在一个分区(大小一般大于坏扇区大小),划分出的坏道分区不使用即可达到隔离的目的。隔离只是暂时方案,建议尽快更换硬盘,因为坏道会扩散,以免以后出现严重的数据问题。

查看硬盘详细信息

# smartctl的disk路径和名字可以通过命令
[root@localhost ~]# cat /proc/partitions

[root@localhost ~]# smartctl -d ata -a /dev/sda 
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-327.36.3.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     MTFDDAK512MBF-xx
Serial Number:    xxx
LU WWN Device Id: xxx
Firmware Version: xxx
User Capacity:    512,110,190,592 bytes [512 GB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   ACS-3 (unknown minor revision code: 0x011b)
SATA Version is:  SATA >3.1, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Wed Dec  6 10:22:40 2017 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

从Device Model中,可以知道,我的硬盘是MTFDDAK512MBF,在网址google一下,就知道它是Micron产的,具体的内容为了安全考虑,我就不贴出来了。

查看更多硬盘信息

# 查看挂接的分区状态
[root@localhost ~]# fdisk -l |grep Disk
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Disk label type: dos
Disk identifier: 0x00014b65
# 查看硬盘和分区分布
[root@localhost ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk 
├─sda1   8:1    0  300M  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0 97.7G  0 part /
sr0     11:0    1 1024M  0 rom
# 查看硬盘和分区的详细信息
[root@localhost ~]# fdisk -l  

Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x00014b65

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448     4812799     2098176   82  Linux swap / Solaris
/dev/sda3         4812800   209715199   102451200   83  Linux
# 查看挂接的分区状态
[root@localhost ~]# mount | column -t
sysfs        on  /sys                             type  sysfs        (rw,nosuid,nodev,noexec,relatime)
proc         on  /proc                            type  proc         (rw,nosuid,nodev,noexec,relatime)
devtmpfs     on  /dev                             type  devtmpfs     (rw,nosuid,size=916724k,nr_inodes=229181,mode=755)
securityfs   on  /sys/kernel/security             type  securityfs   (rw,nosuid,nodev,noexec,relatime)
tmpfs        on  /dev/shm                         type  tmpfs        (rw,nosuid,nodev)

# 查看挂接的分区状态
[root@localhost ~]# swapon -s 
Filename                                Type            Size    Used    Priority
/dev/sda2                               partition       2098172 112392  -1

# 查看硬盘使用情况
[root@localhost ~]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/sda3      xfs        98G   18G   81G  18% /
devtmpfs       devtmpfs  896M     0  896M   0% /dev
tmpfs          tmpfs     911M   20K  911M   1% /dev/shm
tmpfs          tmpfs     911M   10M  901M   2% /run
tmpfs          tmpfs     911M     0  911M   0% /sys/fs/cgroup
/dev/sda1      xfs       297M  148M  150M  50% /boot
tmpfs          tmpfs     183M     0  183M   0% /run/user/1002

# 或者查看文件 /etc/fstab
[root@localhost ~]# cat  /etc/fstab
查看系统硬件信息

参考:https://www.cnblogs.com/cloudos/p/8416415.html

# 查看服务器型号、序列号
[root@localhost ~]# dmidecode|grep "System Information" -A9|egrep  "Manufacturer|Product|Serial" 
        Manufacturer: VMware, Inc.
        Product Name: VMware Virtual Platform
        Serial Number: VMware-56 4d 70 7a 9e 28 b7 ce-52 ca 33 25 b4 29 83 98
# 查看主板型号
[root@localhost ~]# dmidecode |grep -A16 "System Information$"
System Information
        Manufacturer: VMware, Inc.
        Product Name: VMware Virtual Platform
        Version: None
        Serial Number: VMware-56 4d 70 7a 9e 28 b7 ce-52 ca 33 25 b4 29 83 98
        UUID: 7A704D56-289E-CEB7-52CA-3325B4298398
        Wake-up Type: Power Switch
        SKU Number: Not Specified
        Family: Not Specified

Handle 0x0002, DMI type 2, 15 bytes
Base Board Information
        Manufacturer: Intel Corporation
        Product Name: 440BX Desktop Reference Platform
        Version: None
        Serial Number: None
        Asset Tag: Not Specified
# 查看BIOS信息
[root@localhost ~]# dmidecode -t bios
# dmidecode 3.0
Getting SMBIOS data from sysfs.
SMBIOS 2.7 present.
....
# 查看内存槽及内存条
[root@localhost ~]# dmidecode -t memory | head -45 | tail -23
# 查看网卡信息
[root@localhost ~]# dmesg | grep -i Ethernet
# 查看pci信息,即主板所有硬件槽信息
[root@localhost ~]# lspci | head -10

查看文件系统格式

工具1: linux dmesg

dmesg 可以查看linux 内核信息。
dmesg’命令设备故障的诊断是非常重要的。在‘dmesg’命令的帮助下进行硬件的连接或断开连接操作时,我们可以看到硬件的检测或者断开连接的信息。‘dmesg’命令在多数基于Linux和Unix的操作系统中都可以使用。

1.1 列出加载到内核中的所有驱动

我们可以使用如‘more’。 ‘tail’, ‘less ’或者‘grep’文字处理工具来处理‘dmesg’命令的输出。由于dmesg日志的输出不适合在一页中完全显示,因此我们使用管道(pipe)将其输出送到more或者less命令单页显示。

[root@localhost ~]# dmesg |more  
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[root@localhost ~]# dmesg | less
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
1.2 列出所有被检测到的硬件

要显示所有被内核检测到的硬盘设备,你可以使用‘grep’命令搜索‘sda’关键词,如下

[root@localhost ~]# dmesg |grep sda
[    4.108878] sd 0:0:0:0: [sda] 209715200 512-byte logical blocks: (107 GB/100 GiB)
[    4.108906] sd 0:0:0:0: [sda] Write Protect is off
[    4.108908] sd 0:0:0:0: [sda] Mode Sense: 61 00 00 00
[    4.108964] sd 0:0:0:0: [sda] Cache data unavailable
[    4.108965] sd 0:0:0:0: [sda] Assuming drive cache: write through
[    4.110296]  sda: sda1 sda2 sda3
[    4.110746] sd 0:0:0:0: [sda] Attached SCSI disk
[    5.162611] XFS (sda3): Mounting V5 Filesystem
[    5.423126] XFS (sda3): Ending clean mount
[   16.272858] Adding 2098172k swap on /dev/sda2.  Priority:-1 extents:1 across:2098172k FS
[   16.625149] XFS (sda1): Mounting V5 Filesystem
[   17.373245] XFS (sda1): Ending clean mount

‘sda’表示第一块 SATA硬盘,‘sdb’表示第二块SATA硬盘。若想查看IDE硬盘搜索‘hda’或‘hdb’关键词。

由于‘dmesg’命令的输出实在太长了,在其中搜索某个特定的字符串是非常困难的。因此,有必要过滤出一些包含‘usb’ ‘dma’ ‘tty’ ‘memory’等字符串的日志行。grep 命令 的‘-i’选项表示忽略大小写。

[root@localhost ~]# dmesg | grep -i memory
1.3 实时监控dmesg日志输出
[root@localhost ~]# tail -f /var/log/dmesg

工具2:mcelog

参考:http://www.cnblogs.com/muahao/p/6003910.html

  • mcelog 是 x86 的 Linux 系统上用来 检查硬件错误,特别是内存和CPU错误的工具。

  • 有三种运行的方式,cron,daemon,trigger。

    cron,最老的方式,有确定,定时任务,会丢失一些
    daemon,el7上用这种
    trigger,高级一点的方式,触发的时候,看man mcelog

  • cron是最low的方式,会丢失,trigger是比较高级的方式,触发的。一般我们在el6.el7上都是用daemon的方式。

  • el6上默认应该是使用cron,每小时运行一次,也可以使用daemon守护进程的方式(需要手动执行mcelog --daemon),默认日志打到/var/log/mcelog,和/var/log/message.

  • el7上默认使用mcelog.service启动的,相当于daemon守护进程的方式,但是,默认日志只打到和/var/log/message,然而默认/var/log/mcelog文件不存在,这个需要在启动命令种加上--logfile=/var/log/mcelog才可以。

  • 如何模拟硬件错误验证mcelog是否运行正常?

    • 有一个工具叫:mceinject ,mcetest,参见下文的案例2

可纠正和不可纠正的硬件错误统称为机器检查异常 (MCE)。CPU 自身能够纠正错误,并通知底层操作系统与 CPU 或缓存有关的问题。CPU 本身还能从某些错误中恢复。Oracle Linux 可将 mcelog 用作机器检查的日志子系统。首先,必须使用以下命令在服务器上安装软件包。
安装/启动:

yum install mcelog.x86_64
service mcelogd start
chkconfig mcelogd on

or
mcelog --daemon

or
systemctl restart mcelog.service

mcelog 能捕获两类错误:已纠正的 和未纠正的。已纠正的错误是由 CPU 处理的事件,可用来识别可能预测更大问题的趋势。

未纠正的错误是关键异常,如果 CPU 无法恢复,往往会导致系统上的内核错误。这会导致应用程序重置和中断。对于未纠正的错误,mcelog 捕获错误的能力取决于错误导致热重启还是硬重启。如果是热重启,信息会被 mcelog 捕获,恢复后可看到。硬重启会导致数据丢失,而且 mcelog 可能捕获不到该事件。

为了进行测试和故障排除,可以使用 mce-test 包生成假的硬件 MCE 事件并执行系统测试。

mce-test 软件包含丰富的默认测试,能模拟真实硬件故障,甚至会导致内核错误。需要执行几个配置步骤才能对系统进行此类测试。

首先,需要安装几个支持软件包才能在测试系统上配置 mce-test。使用以下命令:

yum install gcc.x86_64 gcc-c++.x86_64 flex.x86_64 dialog.x86_64 ras-utils.x86_64 git.x86_64
mcelog相关文件

/dev/mcelog 设备文件

/var/log/mcelog messages日志文件

/etc/mcelog/mcelog.conf配置文件

/var/run/mcelog.pid

默认故障日志只记录在/var/log/mcelog,并不记录到系统日志中。
如果需要在系统日志中也体现,需修改/etc/mcelog/mcelog.conf文件,将前面#去掉,并保存。

# log output options
# Log decoded machine checks in syslog (default stdout or syslog for daemon)
#syslog = yes
# Log decoded machine checks in syslog with error level
#syslog-error = yes
# Never log anything to syslog
#no-syslog = yes
# Append log output to logfile instead of stdout. Only when no syslog logging is active
#logfile = filename
查看日志
[root@localhost ~]# mcelog --ascii --file /var/log/mcelog |tail
[root@localhost ~]# tail /var/log/mcelog

工具3:badblock

[root@localhost ~]# badblocks -v /dev/sda1 > badsectors.txt  
Checking blocks 0 to 307199
Checking for bad blocks (read-only test): 
done                                                 
Pass completed, 0 bad blocks found. (0/0/0 errors)

上面的命令中,badblocks 扫描设备/dev/sda10(记得指定你的实际设备),-v选项让它显示操作的详情。另外,这里使用了输出重定向将操作结果重定向到了文件badsectors.txt。

如果你在你的磁盘上发现任何坏道,卸载磁盘并像下面这样让系统不要将数据写入回报的扇区中。

你需要执行e2fsck(针对 ext2/ext3/ext4 文件系统)或fsck命令,命令中还需要用到badsectors.txt文件和设备文件。

-l 选项告诉命令将在指定的文件 badsectors.txt 中列出的扇区号码加入坏块列表。

# 针对 for ext2/ext3/ext4 文件系统
[root@localhost ~]# e2fsck -l badsectors.txt /dev/sda1
e2fsck 1.42.9 (28-Dec-2013)
/dev/sda is in use.
e2fsck: Cannot continue, aborting.

# 针对其它文件系统
[root@localhost ~]# fsck -l badsectors.txt /dev/sda1
fsck from util-linux 2.23.2
If you wish to check the consistency of an XFS filesystem or
repair a damaged filesystem, see xfs_repair(8).

工具4:硬盘检测命令smartctl

[root@localhost ~]# smartctl -a /dev/sda
smartctl 6.5 2016-05-07 r4318 [x86_64-linux-3.10.0-862.el7.x86_64] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Vendor:               VMware,
Product:              VMware Virtual S
Revision:             1.0
User Capacity:        107,374,182,400 bytes [107 GB]
Logical block size:   512 bytes
Device type:          disk
Local Time is:        Sun Mar  3 22:30:34 2019 PST
SMART support is:     Unavailable - device lacks SMART capability.

=== START OF READ SMART DATA SECTION ===
Current Drive Temperature:     0 C
Drive Trip Temperature:        0 C

Error Counter logging not supported

Device does not support Self Test logging

# 参数 -H 或 --health 以显示 SMART 整体健康自我评估测试结果
[root@localhost ~]# smartctl -H /dev/sda1
smartctl 6.5 2016-05-07 r4318 [x86_64-linux-3.10.0-862.el7.x86_64] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Health Status: OK

你可能感兴趣的:(Linux 下检测磁盘的各种方式)