每秒无休止地写入新的 ext4 分区。原因和解决方法?

Dan*_* S. 5 partitioning ext4 file-format hard-drive noise

我有一个外部 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]
...
Run Code Online (Sandbox Code Playgroud)

首先,噪音让我发疯。我在一个安静的环境中工作,尽管噪音非常低,但不知何故令人不安。

其次,我认为这些对磁盘的连续写入可能会导致它的使用寿命缩短。这对于 SSD 驱动器尤其重要,其中不存在噪音,但可以观察到相同的行为。此外,我认为写入磁盘应该是不必要的,因为没有用户进程正在访问磁盘,并且操作系统肯定不需要访问外部硬盘来进行操作。

是什么导致这些写访问以及如何阻止它们?

Dan*_* S. 6

有一个简单的解决方案。将磁盘连接到您的 PC 几个小时,噪音会自动停止。所需时间的粗略估计是每 1TB 分区大小 1.5 小时。

这是因为格式化为 ext4 并没有完全初始化文件系统。很多初始化工作委托给jbd2,它负责维护文件系统日志
格式化时,只写入使用磁盘所需的信息。虽然您已经可以使用该磁盘,但 jbd2 会添加其他信息。它以这种方式设计,以便快速格式化。你在格式化后观察的写操作不会影响磁盘的性能,即当你将文件复制到磁盘时,复制过程不会因为jbd2也在写日志而变慢。

jbd2 旨在以延迟的时间间隔完成其工作。因为大部分硬盘都内置了省电机制,可以关闭磁盘或停磁头,所以有可能硬盘检测到空闲,做一些停电等省电操作,然后jbd2立即访问再次移动磁盘,使其再次移动磁头。这是您听到的低噪音。

如果您的硬盘的省电机制可以控制(有些硬盘支持,有些不支持),您可以使用以下命令禁用省电机制,从而在 jbd2 进行初始化时使磁盘静音:

sudo hdparm -B 255 /dev/sdXY
Run Code Online (Sandbox Code Playgroud)

您必须用sdXY硬盘分区的路径替换其中的位置。如果命令失败,则您的硬盘不支持控制节电机制,您无法将其静音。然后,您必须按照本答案顶部的说明进行等待。


Xen*_*050 5

从该man mke2fs页面和此链接看来,格式化 ext4 文件系统的默认设置非常懒惰,并且在第一次安装驱动器留下大量写入工作要完成,并且每次都需要完成,直到工作完成。最烦人的是,它每隔几秒就会非常缓慢地写入驱动器,直到完成。

这对于可能具有非常大的块/页面大小的闪存驱动器(卡/USB 驱动器)尤其不利,因此仅写入几个字节实际上会写入 256k、512k 或 1 兆字节或更多。并且某些闪存驱动器的写入周期可能非常低,只有 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.
Run Code Online (Sandbox Code Playgroud)

因此,如果您可以最初格式化(或重新格式化)文件系统,这应该消除懒惰的慢格式并立即完成所有操作:

mkfs -t ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdxN
Run Code Online (Sandbox Code Playgroud)