FedoraやCentOSのSELinux環境でファイルやディレクトリのバックアップを取るときにtarコマンドを使うと、contextが引き継がれない(>_<)
pオプションはオーナーやパーミッションを引き継いでくれますが、contextは引き継いでくれないのです(;_;)
展開したディレクトリのcontextになってしまう(ToT)
展開した後にいちいちchconコマンドでcontextを設定しなおすのはめんどくさいなぁ~、と思っていたら、starコマンドが用意されていた。
starコマンドで-H=exustar -xattrオプションをつけて実行すればcontextも保持されてアーカイブされ、解凍したときには保持されたcontextで展開される。
# star cvzpf test.tgz /etc/yum/ -H=exustar -xattr
a /etc/yum/ directory
a /etc/yum/yum-daily.yum 19 bytes, 1 tape blocks
star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
# star xvzpf test.tgz -H=exustar -xattr
Release star 1.5a54 (i386-redhat-linux-gnu)
Archtype exustar
Dumpdate 1177813565.575410 (Sun Apr 29 11:26:05 2007)
Volno 1
Blocksize 20
star: WARNING: skipping leading '/' on filenames.
x etc/yum/ directory
x etc/yum/yum-daily.yum 19 bytes, 1 tape blocks
star: 1 blocks + 0 bytes (total of 10240 bytes = 10.00k).
# ls -laZ etc/yum/
drwxr-xr-x root root system_u:object_r:etc_t .
drwxr-xr-x root root ..
-rw-r--r-- root root system_u:object_r:etc_t yum-daily.yum
starコマンドはtarコマンドとほぼ互換なのでアーカイブのオプションはそのままで良い。これは便利!
というかこういうコマンドないと困るよね。
注意点は、解凍時もオプションをつけてないとcontextが引き継がれないということ。
オプションを付け忘れて展開しなおす時は、一度展開したファイルを削除してから展開しないとcontextが反映されません。なぜ~?
再アーカイブする時もデフォルトでは上書きしないで終了してしまう設定になっているので、再アーカイブする時は古いアーカイブを削除してから実行してください。
他には、cpコマンドもcontextを引き継いだり、設定したりするオプションがある。
cp -cか-preserve=context でコピー元のcontextを引き継ぎます。
これを忘れると設定ファイルのコピーを作って編集してもcontextが異なっていてデーモンが読めなかったりする(>_<)
cp -Z CONTEXTかcp --context=CONTEXTで、コピー時に任意のcontextを設定できます。
例えば、
# cp -Z system_u:object_r:etc_t hoge.conf hoge.conf.new
-pオプションではcontextを引きついてくれないので注意が必要です。
mkdirコマンドも同じように-Zか--context=でディレクトリ作成時に任意のcontextを設定できます。
オプションをつけないとカレントのcontextになります。
一方、mvコマンドはcontextごとファイルを移動するので、何も気にすることなくcontextが引き継がれます。
SELinuxは奥が深い。
[追記 2007.05.01]
> オプションを付け忘れて展開しなおす時は、一度展開したファイルを削除してから展開しないとcontextが反映されません。なぜ~?
理由はデフォルトではファイルの更新日付比較をして新しいファイルだけ展開するから。
無条件に展開したいときは、-Uオプションを付ければ比較せずに上書き展開してくれます。
