ディスクを挿入するときに自動的にパーティションにラベルを割り当てたいと思います。私の作業方法は、次のような新しいudevルールを作成することです。
KERNEL=="sd[a-z][0-9]", KERNELS=="ata[12]", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="ext4", ENV{ID_FS_LABEL}=="", ACTION=="add", RUN+="/bin/sh -c 'sudo e2label %E{DEVNAME} TEST_LABEL'"
このルールは、ファイルシステムが認識されext4
、現在e2labelが空であることを確認します""
。 udevルールのすべての条件が満たされると、sudo e2label %E{DEVNAME} TEST_LABEL
コマンドが実行されます。
これはうまくいきます。ほとんど?ディスクを挿入して割り当てタグ検証を使用したときにe2label
すでに割り当てられていることがわかりましたTEST_LABEL
。ちなみにタグを確認してみると、そのlsblk -f
セクションLABEL
は空です。タグを検証する他のudevルールTEST_LABEL
も、優先順位が低い場合でも実行されません。その後、ディスクを取り外して再挿入すると、実行時にラベルが表示され、lsblk -f
他のudevルールが実行されます。
なぜこれですか?私が何を間違っているのか、何を理解していないのですか?
答え1
udevは各ジョブ/ルールのタグを読み取らず、60-persistent-storage.rules
使用時に一度読み取った後、blkid
デバイスが変更されない限り更新しません。したがって、ラベルを変更した後に実行されたルールは、から取得した(現在は使用されていない)値を引き続き使用します60-persistent-storage.rules
。これがlsblk
新しいタグが表示されない理由でもあります。lsblk
udevデータベースを使用してこの情報を取得すると、デバイスは検索されません(これを使用する必要がありますblkid -p
)。したがって、ルールでデバイスを再スキャンするか、ID_FS_LABEL
新しいID_FS_LABEL_ENC
ラベルに設定する必要があります。
ところで。通常、実行するとe2fslabel
udev変更イベントが生成されるため、udevはデバイスを再スキャンします。 udevはinotifyを使用してデバイスのメタデータの変更を監視しますが、ルールに従ってデバイスを変更するとこれは発生しません(そうしないと、次のことが発生する可能性があります)。無限エラー)毎回新しい変更イベントを生成する変更イベントループ)。