Linux使用hdparm操作硬盘

硬盘加密

检查硬盘状态

首先用 hdparm -I /dev/sdb 命令检查是否满足硬盘加密需求:

[root@localhost ~]# hdparm -I /dev/sdb

/dev/sdb:

ATA device, with non-removable media
...
Security:
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
        not     supported: enhanced erase
        more than 508min for SECURITY ERASE UNIT.

Security 部分必须为 supported,而且必须为 not frozen 状态(如果结果是 frozen,有可能是主机的 BIOS 禁止发送 ATA Security Erase 等指令,需要在 BIOS 中打开这个限制)。

提示

如果主板 BIOS 设置中 SATA 模式不是 AHCI,而是 IDE 或者 Compatible 兼容模式,那么硬盘很可能为 frozen 状态。

对于 SATA 模式正确却仍然为frozen 状态的磁盘,可以运行:

echo -n mem > /sys/power/state

使系统进入睡眠模式,然后重新唤醒,一般可以恢复为 not frozen 状态。

enabled 表示是否已经设定了使用者密码,locked 表示是否为锁定状态,另外对于 SSD 还有 supported: enhanced erase 状态。

设置密码

[root@localhost ~]# hdparm --user-master u --security-set-pass PASS /dev/sdb

hdparm--user-master 参数可以指定为 u(用户密码) 或者 m(管理密码),默认为用户密码。

解锁硬盘

[root@localhost ~]# hdparm --user-master u --security-unlock PASS /dev/sdb
security_password="PASS"

/dev/sdb:
 Issuing SECURITY_UNLOCK command, password="PASS", user=user

清除密码

[root@localhost ~]# hdparm --security-disable PASS /dev/sdb
security_password="PASS"

/dev/sdb:
 Issuing SECURITY_DISABLE command, password="PASS", user=user

安全擦除

注意

安全擦除操作会删除硬盘上所有的数据,而且这些数据不能被恢复。

如果你不幸碰到了的操作系统内核 bug 或 SSD 硬盘的 firmware bug,可能会导致硬盘不可写或操作系统 crash。

[root@localhost ~]# time hdparm --user-master u --security-erase PASS /dev/sdb
security_password="PASS"

/dev/sdb:
 Issuing SECURITY_ERASE command, password="PASS", user=user

real    0m55.408s
user    0m0.000s
sys 0m0.000s

另外安全擦除操作对于非 SSD 硬盘来说可能要花费很长时间,如果硬盘支持 enhanced erase 那也可以使用 --security-erase-enhanced 参数来进行安全擦除。

修改硬盘容量

首先确认硬盘当前的容量(以扇区为单位):

~ # hdparm -N /dev/sdb

/dev/sdb:
 max sectors   = 1953525168/1953525168, HPA is disabled

然后修改为需要的新容量:

~ # hdparm -N p1465149168 --yes-i-know-what-i-am-doing /dev/sdb

/dev/sdb:
 setting max visible sectors to 1465149168 (permanent)
 max sectors   = 1465149168/1953525168, HPA is enabled

此时能看到修改后的容量和实际容量值,参数中的 p 表示 permanent,否则重启之后容量就会恢复。

设置硬盘缓存

查看硬盘当前写缓存是否启用:

~ # hdparm -W /dev/sdb

/dev/sdb:
 write-caching =  1 (on)

关闭及打开硬盘写缓存:

~ # hdparm -W 0 /dev/sdb
~ # hdparm -W 1 /dev/sdb

SCSI 硬盘缓存

SCSI 或者 SAS 等硬盘使用 hdparm 命令很可能会失败,可以使用 sdparm 命令设置缓存。

查看写缓存是否启用:

~ # sdparm --get=WCE /dev/sdb
    /dev/sdb: SEAGATE   ST6000NM0034      E005
WCE         1  [cha: y, def:  1, sav:  0]

关闭及打开 SCSI 硬盘写缓存:

~ # sdparm --clear=WCE /dev/sdb
~ # sdparm --set=WCE /dev/sdb

如果需要保存设置可以增加 --save-S)参数:

~ # sdparm --clear=WCE --save /dev/sdb