1. 前言
最近搞了个nas机箱,里面可以装4块机箱硬盘,J1900u, 虽然有黑群晖系统,但是总感觉不够灵活(对于raid 硬盘模式我是完全用不上,读写速度没需求,数据安全性也没需求,最主要是要灵活),所有最终还是装了ubuntu server。
那么对于机械硬盘,硬盘休眠是我需要研究的。虽然是垃圾硬盘,软件层面上能延长寿命还是尽量延长一下吧。
2. 工具
sudo apt install hdparm
hdparm -h
hdparm - get/set hard disk parameters - version v9.60, by Mark Lord.
Usage: hdparm [options] [device ...]
Options:
-a Get/set fs readahead
-A Get/set the drive look-ahead flag (0/1)
-b Get/set bus state (0 == off, 1 == on, 2 == tristate)
-B Set Advanced Power Management setting (1-255)
-c Get/set IDE 32-bit IO setting
-C Check drive power mode status
-d Get/set using_dma flag
-D Enable/disable drive defect management
-E Set cd/dvd drive speed
-f Flush buffer cache for device on exit
-F Flush drive write cache
-g Display drive geometry
-h Display terse usage information
-H Read temperature from drive (Hitachi only)
-i Display drive identification
-I Detailed/current information directly from drive
-J Get/set Western DIgital "Idle3" timeout for a WDC "Green" drive (DANGEROUS)
-k Get/set keep_settings_over_reset flag (0/1)
-K Set drive keep_features_over_reset flag (0/1)
-L Set drive doorlock (0/1) (removable harddisks only)
-m Get/set multiple sector count
-M Get/set acoustic management (0-254, 128: quiet, 254: fast)
-n Get/set ignore-write-errors flag (0/1)
-N Get/set max visible number of sectors (HPA) (VERY DANGEROUS)
-p Set PIO mode on IDE interface chipset (0,1,2,3,4,...)
-P Set drive prefetch count
-q Change next setting quietly
-Q Get/set DMA queue_depth (if supported)
-r Get/set device readonly flag (DANGEROUS to set)
-R Get/set device write-read-verify flag
-s Set power-up in standby flag (0/1) (DANGEROUS)
-S Set standby (spindown) timeout
-t Perform device read timings
-T Perform cache read timings
-u Get/set unmaskirq flag (0/1)
-U Obsolete
-v Use defaults; same as -acdgkmur for IDE drives
-V Display program version and exit immediately
-w Perform device reset (DANGEROUS)
-W Get/set drive write-caching flag (0/1)
-x Obsolete
-X Set IDE xfer mode (DANGEROUS)
-y Put drive in standby mode
-Y Put drive to sleep
-z Re-read partition table
-Z Disable Seagate auto-powersaving mode
--dco-freeze Freeze/lock current device configuration until next power cycle
--dco-identify Read/dump device configuration identify data
--dco-restore Reset device configuration back to factory defaults
--dco-setmax Use DCO to set maximum addressable sectors
--direct Use O_DIRECT to bypass page cache for timings
--drq-hsm-error Crash system with a "stuck DRQ" error (VERY DANGEROUS)
--fallocate Create a file without writing data to disk
--fibmap Show device extents (and fragmentation) for a file
--fwdownload Download firmware file to drive (EXTREMELY DANGEROUS)
--fwdownload-mode3 Download firmware using min-size segments (EXTREMELY DANGEROUS)
--fwdownload-mode3-max Download firmware using max-size segments (EXTREMELY DANGEROUS)
--fwdownload-mode7 Download firmware using a single segment (EXTREMELY DANGEROUS)
--fwdownload-modee Download firmware using mode E (min-size segments) (EXTREMELY DANGEROUS)
--fwdownload-modee-max Download firmware using mode E (max-size segments) (EXTREMELY DANGEROUS)
--idle-immediate Idle drive immediately
--idle-unload Idle immediately and unload heads
--Iraw filename Write raw binary identify data to the specfied file
--Istdin Read identify data from stdin as ASCII hex
--Istdout Write identify data to stdout as ASCII hex
--make-bad-sector Deliberately corrupt a sector directly on the media (VERY DANGEROUS)
--offset use with -t, to begin timings at given offset (in GiB) from start of drive
--prefer-ata12 Use 12-byte (instead of 16-byte) SAT commands when possible
--read-sector Read and dump (in hex) a sector directly from the media
--repair-sector Alias for the --write-sector option (VERY DANGEROUS)
--sanitize-antifreeze-lock Block sanitize-freeze-lock command until next power cycle
--sanitize-block-erase Start block erase operation
--sanitize-crypto-scramble Change the internal encryption keys that used for used data
--sanitize-freeze-lock Lock drive's sanitize features until next power cycle
--sanitize-overwrite PATTERN Overwrite the internal media with constant PATTERN
--sanitize-status Show sanitize status information
--security-help Display help for ATA security commands
--set-sector-size Change logical sector size of drive
--trim-sector-ranges Tell SSD firmware to discard unneeded data sectors: lba:count ..
--trim-sector-ranges-stdin Same as above, but reads lba:count pairs from stdin
--verbose Display extra diagnostics from some commands
--write-sector Repair/overwrite a (possibly bad) sector directly on the media (VERY DANGEROUS)
3. 使用方式
常用的几个参数:
sudo hdparm -y /dev/sdc #进入待机模式
sudo hdparm -C /dev/sdc #查询当前硬盘状态
sudo hdparm -S 1 /dev/sdc #5s后进入待机,实际乘以5倍
因为我的机械硬盘不支持APM 所有没做过多研究, standby mode已经可以满足我需求了。
修改配置文件:
/etc/hdparm.conf
/dev/sdb {
force_spindown_time = 60
}
/dev/sdc {
force_spindown_time = 60
}
这里配置要注意花括号后面的空格,另外设备支持uuid描述方式,可以参考example
上面的配置相当于 300s (5分钟) 无操作,硬盘自动进入 standy mode
立刻生效配置文件:
/usr/lib/pm-utils/power.d/95hdparm-apm resume
每次电脑重启后 会自动生效配置文件中的配置
4. 解决一个问题
在实际使用过长中,我发现如果在硬盘 standby mode状态下, 连接ssh 会使硬盘 变为active, 这不是我想要的。
sudo chmod -x /etc/update-motd.d/98-fsck-at-reboot
可以解决, 具体和ubuntu 的motd有关,没细研究,可以参考:链接