大容量HDD/SDDを高速にフォーマットする方法

ext4ファイルシステムを高速にフォーマットする方法です

背景

linuxext4でディスクを初期化すると,初期化処理は一瞬で終わるように見えます.

しかし初期化処理はまだ完了していません.真の初期化処理はディスクを mount した時に始まり,その処理はシステムに負荷をかけないように裏でこっそりと時間をかけて実行されます.

その結果,例えば新しいHDDを増設したらHDDのアクセスランプが点灯しっぱなしになった,といった事態が発生します.(裏でゆっくりと初期化処理が進行しているため,数TBのストレージを増設した場合は数時間LEDがチカチカします)

この処理は ext4lazyinit という名前のカーネルスレッドが実行しています.

例えば /usr/sbin/iotop を使って稼働状況を調べると,ext4lazyinit というカーネルスレッドが disk にアクセスしていることがわかります.

$ sudo /usr/sbin/iotop

しかし ext4lazyinit のディスク・アクセスは散発的で,ディスクにはそれほど負荷をかけていません.このように,デフォルトでは [ext4lazyinit] は他の処理の邪魔にならないように低い優先順位で起動され,ゆっくりと初期化処理を進めます.これがLEDがチカチカする原因です.

ext4lazyinit は通常は気にしなくて良い機能ですが,例えば

  • リムーバブルメディアの場合 (hot swap運用のHDDなど)
  • ラズパイで使う sdカード
  • HDD増設後すぐにファイルを大量に書き込む場合

に ext4lazyinit に起因した面倒なことが起こり得ます

高速化する方法

lazyinitを早く完了させるには,以下のどちらかの方法を使います

  • mkfs.ext4 を実行する際にオプションで指定する
  • mount を実行する際にオプションで指定する

mkfs.ext4 を実行する際にオプションで指定する

$ sudo /sbin/mkfs.ext4 -E lazy_itable_init=0  /dev/デバイスファイル

mount を実行する際にオプションで指定する

init_itable=0 をつけます

$ sudo mount -oinit_itable=0  /dev/デバイスファイル    /path/to/マウントポイント
$ sudo /usr/sbin/iotop

[ext4lazyinit] が全力で稼働します

この方法を使うと, ext4lazyinit の処理は8TBのHDDの場合でも 10分もかからず終わります.