btrfs:サブボリュームにマウントオプションが適用されないのはなぜですか?

btrfs:サブボリュームにマウントオプションが適用されないのはなぜですか?

openSUSE Tumbleweedを実行していますが、btrfsサブボリュームをマウントするときに奇妙な動作が見つかりました。 btrfsファイルシステムには2つのサブボリュームがあります@media@migration私の/etc/fstab設定は次のとおりです。

UUID=<UUID>       /mnt/media      btrfs   subvol=/@media,noatime,noexec,nodev,nosuid      0       0
UUID=<UUID>       /mnt/migration  btrfs   subvol=/@migration,noatime,noexec,nodev,nosuid  0       0

ただし、実行すると、mount -a次のような結果が表示されます。

/dev/sdb1 on /mnt/media type btrfs (rw,nosuid,nodev,noexec,noatime,space_cache=v2,subvolid=278,subvol=/@media)
/dev/sdb1 on /mnt/migration type btrfs (rw,relatime,space_cache=v2,subvolid=279,subvol=/@migration)

ご覧のとおり、マウントオプションは最初にnosuid,nodev,noexec,noatimeマウントされたサブボリュームにのみ適用されるようです。 2番目だけrelatime

私が試したとき再インストール2番目のサブボリュームは正しく表示されます。

:~> sudo mount -o remount,noatime /dev/sdb1 /mnt/migration
:~> mount | tail -n 2
/dev/sdb1 on /mnt/media type btrfs (rw,nosuid,nodev,noexec,noatime,space_cache=v2,subvolid=278,subvol=/@media)
/dev/sdb1 on /mnt/migration type btrfs (rw,noatime,space_cache=v2,subvolid=279,subvol=/@migration)

だから私の質問は次のようになります

  1. 後続のサブボリュームのマウントオプションは重要ですか? (つまり、これはただの視覚的なエラーですか?)
  2. マウントオプションが実際に適用されているかどうかを確認する方法はありますか?

答え1

サブボリュームのマウントは実際にはnoatimeに従います。これは新しいbtrfsドキュメントに明示的に指定されています(不明ですが)。https://btrfs.readthedocs.io/en/latest/btrfs-subvolume.html#mount-options

(彼らは私が来た目的のnoexecもサポートしています。)

$ sudo mount -o subvolid=257,noatime /dev/sdd1 test
$ touch -a -t 9001010101 test/foo
$ stat test/foo
Access: 1990-01-01 01:01:00.000000000 -0700
$ cat test/foo # noatime: atime unchanged
$ stat test/foo
Access: 1990-01-01 01:01:00.000000000 -0700
$ sudo umount test
$ sudo mount -o subvolid=257 /dev/sdd1 test
$ cat test/foo # default (relatime): atime changed
$ stat test/foo
Access: 2023-09-20 03:50:37.919732794 -0600

(簡潔にするために、statの他の出力ラインは切り捨てられました。)

答え2

私の評判が50未満なので、スクワクルさんのセルフ答弁についてはコメントすることができませんね。しかし、テストには欠陥があります。touch -aAtime は、マウントポイントオプションに関係なく更新されます。

/tmp
 32% ❯ sudo mount -t tmpfs -o noatime none noatime

/tmp
 32% ❯ cd noatime/

/tmp/noatime
 32% ❯ touch banana

/tmp/noatime
 32% ❯ stat banana
  File: banana
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 0,116   Inode: 2           Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/vytautas)   Gid: (  100/   users)
Access: 2022-04-14 00:03:14.714042647 +0300
Modify: 2022-04-14 00:03:14.714042647 +0300
Change: 2022-04-14 00:03:14.714042647 +0300
 Birth: -

/tmp/noatime
 32% ❯ cat banana

/tmp/noatime
 32% ❯ stat banana
  File: banana
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 0,116   Inode: 2           Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/vytautas)   Gid: (  100/   users)
Access: 2022-04-14 00:03:14.714042647 +0300
Modify: 2022-04-14 00:03:14.714042647 +0300
Change: 2022-04-14 00:03:14.714042647 +0300
 Birth: -

/tmp/noatime
 32% ❯ touch -a -t 1212121212 banana

/tmp/noatime
 32% ❯ stat banana
  File: banana
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 0,116   Inode: 2           Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/vytautas)   Gid: (  100/   users)
Access: 2012-12-12 12:12:00.000000000 +0200
Modify: 2022-04-14 00:03:14.714042647 +0300
Change: 2022-04-14 00:03:39.030547903 +0300
 Birth: -

答え3

私はbtrfs wikiといくつかの簡単な実験を使って私の質問に答えました。

後続のサブボリュームのマウントオプションは重要ですか?

いいえ。~によるとウィキペディア:

メモ:ほとんどのマウントオプションはファイルシステム全体に適用され、最初にマウントされたサブボリュームのオプションのみが適用されます。これは実装の欠如によるものであり、今後変更される可能性があります。これは、たとえば、マウントオプションを使用してサブボリュームごとにnodatacow、nodatasum、または圧縮を設定できないことを意味します。この問題は最終的に解決されるべきですが、Linux VFSフレームワーク内で正しく実装するのが難しいことが証明されています。

マウントオプションが実際に適用されているかどうかを確認する方法はありますか?

はい。私はatime/パラメータを使ってnoatimeこれをしました。

  1. atimeオプション1を使用したサブボリュームのマウント
  2. noatimeオプション2を使用したサブボリュームのマウント
  3. サブボリューム2にテストファイルを作成する
  4. atimeを任意の値に設定するために使用されますtouch(例touch -a -t 12121212 test_file:)
  5. atimeがテスト値に設定されていることを確認するls -lu

この実験では、サブボリューム2はこのオプションでマウントされていますが、そのatimeがサブボリューム2で更新されたことを示していますnoatime。これはatime、このオプションを使用してサブボリューム1が最初にマウントされるためです。

関連情報