ACLとは、一般的なUNIXのパーミッション制御をさらに拡張したものである。
FreeBSDのハンドブックは以下の通りであるが、どうも実動作とハンドブックの内容に食い違いがあるようなのでメモ。
https://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/fs-acl.html
https://www.freebsd.org/doc/en/books/handbook/fs-acl.html
ACLはファイルシステムごとに有効/無効を設定できる。
設定変更は、そのファイルシステムをumountするか、リードオンリーの状態でしかできない。
したがって、ルートファイルシステムの設定変更は、通常起動した後ではできない。
ACLの有効/無効化
GENERICカーネルであればACLが使える。
ACLを有効にするには、/etc/fstabの当該ファイルシステムオプションにaclsを追加し、再起動すればよい。
もちろん、ルートファイルシステム以外なら、再起動しないまでも、いったんumount、mountすればよい。
mount -uによる再マウントでは有効にならないので注意
fstab設定例は後述
ACLの有効/無効化のしくみ
ファイルシステムヘッダのスーパーブロックにACLの有効/無効フラグがある。tunefsコマンドでフラグを変更できる。
fstabでaclsが指定されていると、マシン起動時に、tunefsでスーパーブロックを書き換えののち、マウントされる。
注意点(一度ACLを有効にしたら永続…?)
ハンドブックによれば、一度ACLを有効にしたらその設定が永続する、という。
「スーパブロックフラグを設定すると、fstab に記述されていなかったり、デバイスの順番が変わってしまっても、常に ACLs が有効な状態でマウントされます」
※英語版も同じ。
ハンドブックとの違い?
ところが手元のマシンの動作を見ると、tunefsによる設定に関わらず、fstabのオプションしか参照していないようだ。
つまり、fstabでaclsを削ると、ACL無効でマウントされるようだ。
(fstabにaclsが無い場合、tunefs -a disableが実行される?)
それはともかく、上記を踏まえた設定例を示す。
fstabの設定変更
fstabのOptionsのところ、カンマに続けて「acls」と記載。
ルートファイルシステムなら、再起動。
ルートファイルシステム以外なら、umount,mountでよい。
ACLの設定はハンドブック参照。
設定前
# Device Mountpoint FStype Options Dump Pass#
/dev/ada0p2 / ufs rw 1 1
設定後
# Device Mountpoint FStype Options Dump Pass#
/dev/ada0p2 / ufs rw,acls 1 1
以上。tunefsは考えなくてよし。
以下は記録。
tunefsのうごき
tunefs -pでACLの状態を確認できる。
# tunefs -p /dev/ada0p2
tunefs: POSIX.1e ACLs: (-a) disabled
tunefs -a enable/disableでACLの有効、無効を設定できる
# tunefs -a enable /dev/ada0p2
tunefs: POSIX.1e ACLs set
# tunefs -p /dev/ada0p2
tunefs: POSIX.1e ACLs: (-a) enabled
/dev/ada0p2 は、ルートファイルシステムなのだが、そのまま起動すると、あるいは再起動するとtunefs -pの結果がdisabledに戻ってしまう。
さらに分からないのは、fstabにaclsの記載あるなしに関わらずdisabledになること。
実験(fstabしか見ていない…?)
fstabにaclsを記載し、あるファイルにsetfaclでACLを設定する。
ls -laで確認すると以下のように+が付く。
$ setfacl -m u:nobwak:r,o:: file.txt
$ ls -la ./file.txt
-rw-r-----+ 1 doe doe 8 4月 23 13:45 ./file.txt
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates, acls)
その後、fstabからaclsを削除し、再起動したのち、ls -laで確認すると+がない。
$ ls -la ./file.txt
-rw-r----- 1 doe doe 8 4月 23 13:45 ./file.txt
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
なお、上記の再起動前後を通してtunefs -pの結果はdisabled.