我的笔记本电脑上连接了一个 500GB 的外置硬盘,运行的是 Ubuntu 12.04。我已将外置硬盘格式化为一个 ext4 分区,该分区覆盖整个磁盘。
我的问题是磁盘每秒都会发出噪音,因为磁盘上有写入操作。我没有主动将任何文件写入磁盘或以其他方式使用该磁盘。它只是已安装并且应该处于空闲状态。
使用 iotop,我可以看到插入磁盘后,一些 jbd2 进程会写入磁盘。如果未插入磁盘,此 jbd2 进程不会执行任何操作。如果我取消驱动器的安装但保持插入状态,噪音也会立即停止。
iotop:
Total DISK READ: 0.00 B/s | Total DISK WRITE: 1838.15 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
3727 be/3 root 0.00 B/s 0.00 B/s 0.00 % 0.15 % [jbd2/sdb1-8]
1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
...
首先,噪音让我抓狂。我在一个安静的环境中工作,但这种虽然很低的噪音却让我很烦。
其次,我认为这些对磁盘的连续写入可能会导致其使用寿命缩短。这对于 SSD 驱动器尤其重要,因为 SSD 驱动器没有噪音,但可以观察到相同的行为。此外,我认为对磁盘的写入应该不是必要的,因为没有用户进程访问磁盘,操作系统肯定不需要访问外部 HDD 来运行。
什么原因导致这些写访问以及如何阻止它们?
答案1
有一个简单的解决方案。将磁盘连接到 PC 几个小时,噪音就会自动停止。粗略估计每 1TB 分区大小需要 1.5 小时。
这是因为格式化为 ext4 不会完全初始化文件系统。许多初始化工作委托给 jbd2,它负责维护文件系统日志格式化时,只会写入使用磁盘所需的信息。虽然您已经可以使用磁盘,但 jbd2 会添加其他信息。它以这种方式设计,以便快速格式化。格式化后您观察
到的写入操作不会影响磁盘的性能,即当您将文件复制到磁盘时,复制过程不会因为 jbd2 也会写入日志而变慢。
jbd2 的设计目的是以延迟间隔完成工作。由于大多数硬盘都内置了省电机制,可以关闭磁盘或暂停头,有可能硬盘检测到它处于空闲状态,执行一些省电操作(如停放磁头),然后 jbd2 马上再次访问磁盘,导致它再次移动磁头。这就是您听到的低噪音。
如果您的硬盘的省电机制可控制(有些硬盘支持此功能,有些不支持),您可以使用以下命令禁用省电机制,从而在 jbd2 初始化期间使磁盘保持静音:
sudo hdparm -B 255 /dev/sdXY
您必须sdXY
用硬盘分区的路径替换其中的内容。如果命令失败,则表示您的硬盘不支持控制省电机制,您无法将其静音。然后您必须按照此答案顶部的说明等待。
答案2
从man mke2fs
页面和此链接看来 ext4 文件系统的默认格式化非常懒惰的留下很多写作工作要完成后驱动器首次安装时会进行此操作,之后每次安装时都会进行此操作,直到工作完成。最烦人的是,它会每隔几秒钟非常缓慢地写入驱动器,直到完成。
这对于闪存驱动器(卡/USB 驱动器)来说尤其糟糕,因为闪存驱动器可能具有非常大的块/页面大小,因此仅写入几个字节实际上会写入 256k、512k 或 1 MB 或更多。而且一些闪存驱动器的写入周期可能非常低,只有 1000 次(或者可能是 5000 次或 10,000 次,也可能是 100,000 次)。比硬盘驱动器低得多,甚至硬盘驱动器也可能从一次完成所有写入中受益更多,然后在真正应该空闲时处于空闲状态。而且我不确定它会持续缓慢地写入驱动器多长时间,有些人说可能是几分钟,也可能是几天。这似乎是“格式化”闪存驱动器最糟糕的方式。
手册页摘录:
-E extended-options
Set extended options for the filesystem. Extended options are
comma separated, and may take an argument using the equals ('=')
sign... The following extended options are supported:
...
lazy_itable_init[= <0 to disable, 1 to enable>]
If enabled and the uninit_bg feature is enabled, the inode
table will not be fully initialized by mke2fs. This speeds
up filesystem initialization noticeably, but it requires the
kernel to finish initializing the filesystem in the back‐
ground when the filesystem is first mounted. If the option
value is omitted, it defaults to 1 to enable lazy inode table
zeroing.
lazy_journal_init[= <0 to disable, 1 to enable>]
If enabled, the journal inode will not be fully zeroed out by
mke2fs. This speeds up filesystem initialization noticeably,
but carries some small risk if the system crashes before the
journal has been overwritten entirely one time. If the
option value is omitted, it defaults to 1 to enable lazy
journal inode zeroing.
因此,如果您可以初始格式化(或重新格式化)文件系统,这应该可以消除懒惰的慢速格式化并一次性完成所有操作:
mkfs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdxN