Unixには、chmodでファイルにアクセス権を設定しアクセス制御を行う機能がありますが、BSD系のOSには"ファイルフラグ"というものを設定して更に細かくアクセス制御を行う機能があります。ファイルフラグは4.4 BSDに実装され、それ以降のBSD系OSに入っています。ですから、当然、Mac OS Xにも入っている訳ですね。
そのファイルフラグを設定するためのコマンドが、このページで紹介するchflagsです。使い方は、「chflags フラグ ファイル名」です。chflagsのmanページによると、下記のフラグの設定および解除が可能だそうです。
| フラグの設定 | フラグの解除 | フラグの内容 | 必要な権限 |
|---|---|---|---|
| arch | noarch | archived | root |
| opaque | noopaque | opaque | 所有者またはroot |
| nodump | nonodump | nodump | 所有者またはroot |
| sappnd | nosappnd | system append-only | root |
| schg | noschg | system immutable | root |
| sunlnk | nosunlnk | system undeletable | root |
| uappnd | nouappnd | user append-only | 所有者またはroot |
| uchg | nouchg | user immutable | 所有者またはroot |
| uunlnk | nouunlnk | user undeletable | 所有者またはroot |
immutable(変更不可)、immutable(削除不可)は何を意味しているのか分かりますし、nodumpはおそらくバックアップのためのdumpを不可、ということなんだろうと想像はできますが、archived、opaque、append-onlyが果たして何のためにあるフラグなのか、私には分かりません。。。
とりあえず、uchgを実際に使って、ファイルを変更不可にしてみましょう。~/terminaltestにあるoutput.txtというファイルを実験に使います。
| bash(Mac OS X 10.3のデフォルトシェル) |
|---|
PowerBookG4:~ hiro$ cd terminaltest PowerBookG4:~/terminaltest hiro$ ls -l total 8 -rw-r--r-- 1 hiro hiro 992 20 Dec 17:24 output.txt PowerBookG4:~/terminaltest hiro$ chflags uchg output.txt |
| tcsh(Mac OS X 10.2.xまでのデフォルトシェル) |
[PowerBookG4:~] hiro% cd terminaltest [PowerBookG4:~/terminaltest] hiro% ls -l total 8 -rw-r--r-- 1 hiro hiro 992 20 Dec 17:24 output.txt [PowerBookG4:~/terminaltest] hiro% chflags uchg output.txt |
結果の確認には、lsを使います。ls -loとすることで、ファイル一覧中に設定されているフラグを表示させることができます。
| bash(Mac OS X 10.3のデフォルトシェル) |
|---|
PowerBookG4:~/terminaltest hiro$ ls -lo total 8 -rw-r--r-- 1 hiro hiro uchg 992 20 Dec 17:24 output.txt |
| tcsh(Mac OS X 10.2.xまでのデフォルトシェル) |
[PowerBookG4:~/terminaltest] hiro% ls -lo total 8 -rw-r--r-- 1 hiro hiro uchg 992 20 Dec 17:24 output.txt |
所有者とグループ名の後に、uchgと表示されていますね。ちなみに、ファイルフラグを複数設定している場合は、ここにカンマで区切られて表示されます。
では、この状態がFinder上ではどうなっているかと言うと、、、

このように、ファイルがロックされた状態になります。Finder上で普通にロックをかけたのと全く同じ状態です。
解除は、uchgにnoをつけたnouchgです。早速やってみましょう。
| bash(Mac OS X 10.3のデフォルトシェル) |
|---|
PowerBookG4:~/terminaltest hiro$ chflags nouchg output.txt PowerBookG4:~/terminaltest hiro$ ls -lo total 8 -rw-r--r-- 1 hiro hiro - 992 20 Dec 17:24 output.txt |
| tcsh(Mac OS X 10.2.xまでのデフォルトシェル) |
[PowerBookG4:~/terminaltest] hiro% chflags nouchg output.txt [PowerBookG4:~/terminaltest] hiro% ls -lo total 8 -rw-r--r-- 1 hiro hiro - 992 20 Dec 17:24 output.txt |
先ほど設定したuchgが消えていますね。
[注]
schgは安易に設定しない方が良いです。カーネルのセキュリティレベルが1以上で動作している場合(普通にMac OS Xを起動した場合は1です)、schgフラグを消去することは、rootユーザーでもできません。シングルユーザーモードで起動するか、Mac OS 9で起動しないと、どうしようもありません。
chflagsのmanページにはuunlnkの記載があるのですが、実際に使ってみると、「chflags: invalid flag: uunlnk」と言われてしまい、使用できませんでした。