ループデバイスではWRITE_ZEROESはサポートされていません

ループデバイスではWRITE_ZEROESはサポートされていません

一時ファイルによってバックアップされたループ デバイスで mkfs.ext4 が動作しないという奇妙な問題が発生しました。

tmp_file="$(mktemp)"
fallocate -l 8M "$tmp_file"
loop="$(losetup --show -f "$tmp_file")"
mkfs.ext4 "$loop"

dd if=/dev/zeroも試してみましたtruncate。結果は同じでした。不合理なのは、失敗がアプリケーション層まで伝わらないことです。mkfs プログラムは 0 で終了しますが、出力ファイル システムは基本的に壊れています。おそらく、バッファリングされた/遅延された IO と関係があるのでしょう。

これはやってはいけないことでしょうか? それともバグでしょうか? カーネル コードを読んでさらに調査することはできると思いますが、まずは専門家の意見を聞きたかったのです。

アップデート 申し訳ありません。カーネルバージョン: 5.7.10-201.fc32.x86_64

カーネルメッセージ。

[ 3213.106709] blk_update_request: operation not supported error, dev loop6, sector 16256 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.107013] blk_update_request: operation not supported error, dev loop6, sector 196 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.108396] blk_update_request: operation not supported error, dev loop6, sector 708 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.110006] blk_update_request: operation not supported error, dev loop6, sector 160 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.110158] blk_update_request: operation not supported error, dev loop6, sector 166 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3213.110852] blk_update_request: operation not supported error, dev loop6, sector 710 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.152191] blk_update_request: operation not supported error, dev loop7, sector 16256 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.152619] blk_update_request: operation not supported error, dev loop7, sector 196 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.153694] blk_update_request: operation not supported error, dev loop7, sector 708 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.155495] blk_update_request: operation not supported error, dev loop7, sector 160 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.155670] blk_update_request: operation not supported error, dev loop7, sector 166 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3223.156233] blk_update_request: operation not supported error, dev loop7, sector 710 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.666245] blk_update_request: operation not supported error, dev loop6, sector 16256 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.666543] blk_update_request: operation not supported error, dev loop6, sector 196 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.667546] blk_update_request: operation not supported error, dev loop6, sector 708 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.669204] blk_update_request: operation not supported error, dev loop6, sector 160 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.669380] blk_update_request: operation not supported error, dev loop6, sector 166 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0
[ 3568.669974] blk_update_request: operation not supported error, dev loop6, sector 710 op 0x9:(WRITE_ZEROES) flags 0x1000800 phys_seg 0 prio class 0

前述したように、mkfs は正常に実行されるはずです。エラーは表示されません。

答え1

私も同じ問題に遭遇しました。mktemp 自体ではなく、/tmp が tmpfs ファイルシステムであるのではないかと思います。どうやらtmpfsはサポートしていませんFALLOC_FL_ZERO_RANGE興味深いのは、tmpfs マウント上のファイルに対して mkfs.ext4 を問題なく実行できることです。ただし、同じ tmpfs 上のファイルによってバックアップされたループ デバイスの場合は、問題が発生します。

ゼロ範囲をサポートするファイルシステム (ほとんどの標準ファイルシステム) 上のパスを設定する-pオプションを使用することで、この問題を回避できるはずです。mktempTMPDIR

関連情報