Ubuntu Server 18.04硬盘功耗管理及坏道修复

为了延长硬盘使用寿命,当硬盘不使用时,需要让硬盘休眠,目前有一些软件可以自动做这事,像 hdparm, hd-idle 和 sdparm,具体用哪个取决于控制器和硬盘本身,其实说白了就是一个一个试,哪个有用就用哪个。当然,这里说的都是机械硬盘,固态硬盘没研究过。

注意:不要让机械硬盘频繁地休眠唤醒,这样会给电机和轴承较大负荷,会加剧硬盘损耗. 一般制造商建议的最小休眠时间是 3-5 分钟。参考(http://hd-idle.sourceforge.net/

首先查看硬盘设备名,一般就是/dev/sda,dev/sdb之类的

sudo blkid
//输出示例
/dev/sda1: UUID="b868fd9b-4c87-4c15-bd25-0ebe2dbe73cc" TYPE="ext4" PARTUUID="3ff23fc3-01"
/dev/sda2: UUID="b561d5e0-3cc7-4f8d-b504-cea290326d84" TYPE="swap" PARTUUID="3ff23fc3-02"
/dev/sda3: UUID="551d6b26-dba5-4e7b-96e4-a00941205396" TYPE="ext4" PARTUUID="3ff23fc3-03"

这里是1个硬盘,3个分区,或使用sudo fdisk -l

linux下硬盘的命名:
hda:IDE硬盘
sda:SATA、SCSI、硬RAID卡阵列
md0:软RAID设备

安装和配置hdparm

sudo apt-get install hdparm //ubuntu server 18.04.3已自带
sudo hdparm -y /dev/sdb //-y使硬盘进入省电模式,-Y使硬盘进入睡眠模式
//如输出以下结果,就表示支持
/dev/sdb:
 issuing standby command
//如果看到类似如下输出,就表明不支持,可以跳到 hd-idle 或者 sdparm
/dev/sda:
 issuing standby command
SG_IO: bad/missing sense data, sb[]:  70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
//检查硬盘是否支持写缓存功能
sudo hdparm -I /dev/sdb | grep 'Write cache'
//如果看到 * (星号),表示支持
*    Write cache
//如果没有看到 * (星号),表示不支持
Write cache
//编辑配置文件,spindown_time值乘以 5 得到总的时间(单位秒). 例如想配置成空闲10分钟就休眠,spindown_time = 10 * 60 / 5 = 120;-S standby (spindown) timeout for the drive
sudo vim /etc/hdparm.conf
//在文件末尾加入
/dev/sdb {
write_cache = on
spindown_time = 120
}

如果不支持写缓存,去掉 write_cache = on。重启 hdparm 服务,sudo service hdparm restart
更多hdparm配置可以参考这(http://www.linux-magazine.com/Online/Features/Tune-Your-Hard-Disk-with-hdparm)

-y:强制驱动器立即进入低功耗待机模式,通常会导致驱动器旋转下降。可以使用-c标志检查当前的电源模式状态。
-Y:强制IDE驱动器立即进入最低功耗睡眠模式,导致其完全关闭。在再次访问驱动器之前,需要硬重置或软重置(如果需要,Linux IDE驱动程序将自动处理发出重置)。可以使用-c标志检查当前电源模式状态。

使用sudo hdparm -C /dev/sdb查看硬盘状态

/dev/sda:
 drive state is:  active/idle //表示电源模式设为正常运行.如果驱动器不支持该项功能,那么驱动器状态显示为`unknown`

其他的状态:
issuing standby command:待机模式(硬盘会停转)
issuing sleep command:睡眠模式,当再次需要用硬盘是,Linux将自动启动它

注意:如数据盘不能进入省电状态,检查下是否有某些软件的缓存定位到了数据盘

安装和配置hd-idle

sudo apt-get remove hdparm -y //先删除hdparm
cat /proc/diskstats //hd-idle 使用一个特殊的系统文件来检测磁盘活动, 检测是否支持
//看到类似如下的输出,表示支持;如果提示找不到文件或目录,那就不支持
8 16 sdb 5604 130363 146538 16780 1814 51838 429152 763380 0 18230 780150
8 17 sdb1 5075 130363 139418 15370 8 0 8 10 0 8680 15370
8 18 sdb2 512 0 6984 1290 1805 51838 429144 763360 0 9770 764650
//安装编译环境、下载源码,编译
sudo apt-get install build-essential fakeroot debhelper -y //安装编译环境
wget http://sourceforge.net/projects/hd-idle/files/hd-idle-1.05.tgz //下载源代码
tar -xvf hd-idle-1.05.tgz && cd hd-idle //解压缩并进入目录
dpkg-buildpackage -rfakeroot //编译
sudo dpkg -i ../hd-idle_*.deb //安装
sudo hd-idle -i 0 -a sda -i 300 -d //继续检查硬盘是否支持hd-idle
//类似如下输出
probing sda: reads: 13418, writes: 594344
probing sdb: reads: 146538, writes: 429152
//按 Ctrl+C 停止 hd-idle,编辑配置文件
sudo vim /etc/default/hd-idle
//修改示例
START_HD_IDLE=true  //开启hd-idle
HD_IDLE_OPTS="-i 0 -a sda -i 600" //调整空闲时间为10分钟 (60 秒 * 10)

最后,重启服务sudo service hd-idle restart,如果hd-idle也不支持,可以试下 sdparm

安装和配置sdparm

sudo apt-get remove hdparm -y //删除hdparm
sudo dpkg -r hd-idle //删除hd-idle
sudo apt-get install sdparm -y //安装sdparm
sydo sdparm --flexible --command=stop /dev/sdb //测试sdparm是否支持,停止一切硬盘操作,输入
//看到类似如下的输出,表示支持;
/dev/sdb: SANHO     IUSBPORT          0
//如果需要每隔10分钟休眠硬盘,可以用如下crontab命令
sudo crontab -l | { cat; echo "/10 * * * * sdparm --command=stop /dev/sda"; } | sudo crontab -

安装和配置laptop-mode-tools

sudo apt-get install laptop-mode-tools
sudo vim /etc/laptop-mode/laptop-mode.conf

配置参考:https://www.cnblogs.com/MockingBirdHome/archive/2013/05/02/3054431.html

参考

http://sg.danny.cz/sg/sdparm.html
http://www.nslu2-linux.org/wiki/FAQ/SpinDownUSBHarddisks
http://hd-idle.sourceforge.net/
http://mkitby.com/2016/05/15/raspberry-pi-nas-manage-hdd-power/

硬盘检测

硬盘坏道类型
硬盘坏道分为物理坏道和逻辑坏道。

物理坏道就是硬盘实体有坏的地方,物理坏道推荐换硬盘,当然也有办法重新分区来隔离坏道,不过可能也用不久,所以不推荐。

逻辑坏道是磁盘磁道上面的校验信息(ECC)跟磁道的数据对不上号所致。出现这一故障的原因,通常都是因为一些程序的错误操作或是该处扇区的磁介质开始出现不稳定的先兆。物理坏道也是逻辑坏道产生的一种原因。

dmesg

Linux命令dmesg用来显示开机信息,kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里。

dmesg | more //列出加载到内核中的驱动
dmesg | less
dmesg | grep sda //显示被内核检测到的硬盘设备
dmesg | grep -i usb //显示包含USB字符串的日志行

smartctl

smartctl -t short /dev/sdb //在线快速测试: 大约2分钟
smartctl -t long /dev/sdb //在线长测试: (1T大约4小时)
smartctl -X /dev/sdb //终止正在进行的测试
smartctl -l selftest /dev/sdb //在测试结束后获取测试结果

badblocks

badblocks 可以用来检查硬盘是否有坏道,也可以修复坏道,但仅限于逻辑坏道,物理坏道只能更换硬盘。检查命令:

badblocks -s -v -o /root/bb.log /dev/sda

以上命令检查/dev/sda 整块盘的坏道,结果写入/root/bb.log,输出结果为坏道块号。

当然也可以针对分区单独检查,先使用df -h查看分区,例如:

# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   50G   26G   22G  55% /
tmpfs                          16G   68K   16G   1% /dev/shm
/dev/sda1                     485M   39M  421M   9% /boot
/dev/mapper/VolGroup-lv_home  760G  252G  471G  35% /home

若单独检查 /home 是否有坏道,则命令如下:

badblocks -s -v -o /root/bb-home.log /dev/mapper/VolGroup-lv_home

假设下面是badblocks在/dev/mapper/VolGroup-lv_home分区检查出的坏道列表:

217874591
217874592
217874593
217874594
217874595

1.先备份数据(可选)
若修复的硬盘或分区的重要数据已备份,此部分可以省略

dd if=/dev/mapper/VolGroup-lv_home  skip=217874591 of=/tmp/217874591-217874595.dat count=5

2.修复
硬盘在使用时不能修复,否则可能存在写并发的问题,所以修复前需要umount对应分区(若为系统所在分区就没办法在线修复了,因为无法umount)。

umount /dev/mapper/VolGroup-lv_home

但umount可能出现"Device busy"的错误,是因为有程序在使用这个分区,需要将这些进程都关闭。那么怎么知道哪些进程占用分区呢?使用fuser(命令如下),其中/home是分区对应的挂载目录。

fuser -m /home
fuser -m -v -i -k /home

第一条fuser命令列出使用/home的进程ID,第二条列出PID并kill掉进程(带有提示确认),建议先使用第一条命令列出PID,然后针对查看是哪些类型的进程,不要盲目杀死进程。

umount 分区成功后,修复命令如下,其中-s表示给出进度,-w表示写入修复的,后面是结束(END)和开始(START)块号,注意END在前,START在后。

badblocks -s -w /dev/mapper/VolGroup-lv_home 217874595 217874591
badblocks -s -v /dev/mapper/VolGroup-lv_home 217874595 217874591 //修复后再重新检查下

3.恢复数据(可选)

dd if=/tmp/217874591-217874595.dat of=/dev/mapper/VolGroup-lv_home 

4.重新分区检查

badblocks -s -v -o /root/bb-home.log /dev/mapper/VolGroup-lv_home

若没有坏道说明修复已完成,若有坏道可以尝试重复以上方法。
完成后重新mount分区

mount /dev/mapper/VolGroup-lv_home /home

添加新评论

评论列表