Q. /kernel など一部のシステムファイルに対して、削除、上書き、名前の変更を
しようとすると、Operation not permitted といわれてしまいました。
A. まず、Operation not permitted というエラーメッセージが表示される状況に
は二つのケースが考えられます。
1. スティッキービット: sticky(8)
具体的には /tmp ディレクトリなどの様に、ファイルモードの最後が `t' に
なっているディレクトリで、ファイルのオーナとは異なる一般ユーザが rm し
ようとした場合です。スーパユーザにはこの制限はありません。
% ls -ld /tmp
drwxrwxrwt 13 root wheel 1024 Oct 29 22:56 /tmp/
% ls -l /tmp/list
-rw-r--r-- 1 foo wheel 18561 Sep 21 14:58 /tmp/list
% su bar
% rm -f /tmp/list
rm: /tmp/list: Operation not permitted
2. ファイルフラグ: chflags(1)
これはそれらのファイルに schg フラグが設定されているからです。実際に
どのファイルにフラグが設定されているかは、FreeBSD のバージョンにより異
なりますが、このフラグが付いているファイルは、スーパユーザでも変更する
ことができません。フラグを確認するには ls(1) に -lo オプションを付けて
実行します。また、find(1) を使えばファイル一覧を得ることができます。
# ls -lo /kernel
-r-xr-xr-x 1 root wheel schg 2383647 Sep 19 22:30 /kernel*
# find / -flags schg -exec ls -lo {} \;
-r-sr-xr-x 1 root wheel schg 354504 Sep 21 22:05 /bin/rcp
-r-x------ 1 root wheel schg 388072 Sep 21 22:13 /sbin/init
-r-sr-xr-x 1 man wheel schg 28944 Sep 21 22:08 /usr/bin/man
...省略...
これらのファイルを変更するには、例えば
# mv /kernel /kernel.old
mv: rename /kernel to /kernel.old: Operation not permitted
# chflags noschg /kernel
# mv /kernel /kernel.old
と chflags(1) コマンドで schg フラグを消去してから操作します。カーネル
については make installkernel したとき自動的に行われます。注意点として、
カーネルのセキュリティレベルが 1 以上では、chflags でフラグを消去する
ことも禁止されます。この場合、システムをシングルユーザ・モードでブート
し必要な作業を行なってください。securelevel(8), security(7) を参照。
# sysctl kern.securelevel
kern.securelevel: 2
# chflags noschg /kernel
chflags: /kernel: Operation not permitted
グループ名: boot-s