ext4lazyinitの進行状況を測定する方法はありますか?

ext4lazyinitの進行状況を測定する方法はありますか?

ext4lazyinitについて質問しましたここ。私が読んで理解したところによれば、ファイルシステム用のすべてのinodeを作成せずにハードドライブの使用を開始できます。

知っているか測定できる唯一の方法はext4lazyinit監視することですiotop。進行状況をパーセントで確認する方法はありますか?

答え1

ext4lazyinitの進行状況を大まかに把握する方法を見つけたようです。

簡単に言うと:参照スクリプト次のような。

この方法は、パーティションが最初にマウントされてからディスクが切断されたことがなく(システムが再起動されない)、パーティションが使用するのとまったく同じ量のデータをパーティションに書き込むと仮定します。ファイルを修正してください)

ステップ1:fdiskのパーティションサイズ(kiBに変換)をdfに表示されている1Kブロック数と比較します。 (パーティションサイズ(kiB))から(1Kブロック数)を引いて(inodeテーブルのおおよそのサイズ)を取得します。

編集:はい、fdisk:

Sector size (logical/physical): 512 bytes / 4096 bytes
(...omitted...)
Device     Start         End     Sectors  Size Type
/dev/sdd1   2048 11720978398 11720976351  5.5T Linux filesystem

df:

Filesystem              1K-blocks       Used  Available Use% Mounted on
/dev/mapper/workbackup 5813233164 1217095176 4596121604  21% /mnt/backup_work

11720976351セクタ* 512バイト/セクタ/1024 = 5860488175.5kiB(fdiskによると5.5TiBに近い) 5813233164からdfを減算すると、47255011.5kiB(約45GiB)になり、これはinodeテーブルのおおよそのサイズです。

ステップ2:get(パーティションに記録された合計kiB):

awk '{ print $3"\t"$10 }' /proc/diskstats

パーティションに合った行を選択し、それをkiBに変換します。

編集:はい:

sdb     260040
sdb1    260040
sdd     2530109116
sdd1    2530108940

私の場合、sdd1を使用して作成された合計kiB = 2530108940セクタ* 512バイト/セクタ/ 1024 = 1265054470kiB(ほぼ1.2TiB)です。

ステップ3:ファイルシステムにデータを書き込んだ場合にのみ必要です。 (パーティションに書き込まれた合計kiB)から(dfに示されている使用されている1Kブロックの数)を引いて(inodeテーブルに書き込まれたおおよそのkiB)を取得します。

編集:例:inodeテーブルに書き込まれたおおよそのkiB = 1265054470(ステップ2) - 1217095176(ステップ1のdf出力を参照)= 47959294kiB(45.7GiB)

ステップ4:(inodeテーブルに作成されたおおよそのkiB)を(inodeテーブルのおおよそのサイズ(kiB))で除算し、100を掛けて進行をパーセンテージとして取得します。

編集: 例: おおよその進行状況 = 47959294 / 47255011.5 * 100% = 101.5%

スクリプト

または部分スクリプトで作成します(セキュリティ上の理由からfdisk呼び出しスクリプトを拒否します)。

let sectorsize=$(cat /sys/block/sda/queue/hw_sector_size)
let partsize=$2*$sectorsize/1024
let fssize=$(df -- "$3" | tail -n -1 | awk '{print $2}')
let approxinodetablesize=$partsize-$fssize
let tkw=$(awk "/$1/"' {print $10}' /proc/diskstats | head -n 1)*$sectorsize/1024
let used=$(df -- "$3" | tail -n -1 | awk '{print $3}')
let tkw_inodetable=$tkw-$used
echo "Approximate progress: $(bc -l <<< "$tkw_inodetable*100.0/$approxinodetablesize") %"

呼び出し $1 = "パーティション名" (例: sdd1)、 $2 = "fdisk によるパーティションセクタ"、 $3 = "後にスラッシュがないマウントポイント"

試験結果

私の方法は一度だけテストされました。設定:

  • 6TBパーティション

  • cryptsetup を使用した暗号化

  • -m 0以外のデフォルトパラメータを使用して生成されたファイルシステム

  • ext4lazyinit が完了する前に、279 GiB ファイルがパーティションに書き込まれました。

結果:完成後99.7%読み取り:-)

編集:同じディスクにほぼ別のTiBのデータを書き込んだ後、予想収率は101.5%です。役に立つほど正確だと思います。

答え2

(ご存知のように、英語は私の母国語ではありません。)

少なくともUbuntuベースのシステム(私はZorinOS 15を使用しています)では、進行状況を次のように間接的に測定できます。

  1. ext4lazyinitで現在処理中のデバイスとセクタに関する情報を取得できます。

a) したがって、 /proc/sys/vm/block_dump に "1" を書く必要があります。 (重要:機能する準備ができたら、block_dumpをもう一度「0」に設定する必要があります):

   echo 1 > /proc/sys/vm/block_dump

b) 次に、以下を介して情報を取得します。

tail -f /var/log/syslog | grep ext4

出力は次のようになります(ext4lazyinitがデバイスにアクセスするのを待つ必要があるかもしれません)。

May  7 13:19:59 xxx kernel: [ 1130.643118] ext4lazyinit(1070): WRITE block 9235888384 on md0 (2048 sectors)
May  7 13:20:01 xxx kernel: [ 1132.594961] ext4lazyinit(1070): WRITE block 9235890432 on md0 (2048 sectors)
May  7 13:20:01 xxx kernel: [ 1132.632755] ext4lazyinit(1070): WRITE block 9235892480 on md0 (2048 sectors)

ext4lazyinitが実行されている現在のセクター(ブロック9235892480)とデバイス(md0)を表示できます。

  1. デバイスのセクタ数(私の場合は/ dev / md0)に関する情報を取得できます。これは、例えばグラフィカルツール「gparted」を使用するか、または「fdisk -l」コマンドを介して可能です。私:

     sudo fdisk -l /dev/md0
    

出力は次のとおりです。

Festplatte /dev/md0: 5,5 TiB, 5990282952704 Bytes, 11699771392 Sektoren
...
  1. これで、現在処理中のセクタの数とそのセクタのデバイスサイズがわかります。このようにして、ext4lazyinitの進行状況を計算することができます。

  2. block_dumpを再び「0」に設定

    echo 0 > /proc/sys/vm/block_dump
    

また、見ることができます

あなたのために

答え3

これを確認してください修理する議論する。 Lazyinitなしでシステムを初期化できますが、測定することはできません。待つ時間がある場合はお待ちください。ディスカッションでパッチを試してみることはできますが、Patchworkによると「拒否されました」の状態です。

関連情報