2013年9月7日土曜日

あんまり知られてないコマンドオブザイヤー「lsattr」と「chatter」のお話

みんな大好き「chattr」と「lsattr」のお話。このコマンドの話をすると「chattrってなに?」ってリアクションが返ってくることが多いんですが、古くからある割に結構マイナーなコマンドなのかしら?まあ、ext2/3/4なファイルシステムでしか使えないからねぇ。無理もないのかも。

このコマンドは「ext2/3/4なファイルシステム上にあるファイルの属性を変更(chattr)/表示(lsattr)する」という代物。パーミッションで言うところのchmodコマンドとlsコマンドみたいな関係……って覚えとけば当たらずとも遠からずなんじゃないかしら。CentOS 6.x系だとe2fsprogsってパッケージに含まれている。

まず適当なファイルを作ってその属性がどうなっているのかを見てみると……

# touch test.txt
# lsattr
-------------e- ./test.txt

のように表示される。イメージ的には「ls -l」で表示されたものと見た目は似ているよね。

この「-------------e-」の部分に現在の状態が表示されているわけだけど、それぞれ何が対応しているのかについてはchatterのMan pageを見て欲しい……んだけど、実は日本語のMan pageには「e」の説明が含まれてなかったりする。英語のMan pageには含まれてるので下記のようにすればその意味を知ることが出来る。

# LANG=C
# man 1 chattr
(省略)
       The 'e' attribute indicates that the file is using extents for mapping the blocks on disk.  It may not be removed using chattr(1).
(省略)

……うん、なんかext3/4とかを使ってるよ的なアレじゃね?(適当)

で、それはどうでもいいんだけど、個人的に使えるなって思ったのは「i」(変更不可)と「a」(追加のみ可能)ってやつかな……なんて。

まずは「i」の方。下記のような感じで設定する。ちなみに「=」はそれのみの値に変更、「+」は現行の設定に属性を追加、「-」は現行の設定から属性を取り除く……という意味になる。で、どうも「e」が着いている環境で「chattr =i ./test.txt」とかやると「chattr: Clearing extent flag not supported on test.txt」みたいなエラーになって上手くいかないようなので、そこだけ注意されたし。

# lsattr
-------------e- ./test.txt
# chattr +i test.txt
# lsattr
----i--------e- ./test.txt

属性がプラスされたのがわかる。この状態で下記のように追記を試みると……

# cat /dev/null > ./test.txt
-bash: ./test.txt: 許可がありません
# cat /dev/null >> ./test.txt
-bash: ./test.txt: 許可がありません
# echo "test" > ./test.txt
-bash: ./test.txt: 許可がありません
# echo "test" >> ./test.txt
-bash: ./test.txt: 許可がありません

ことごとくお断りされる。この属性を付けるとしたら、コンフィグファイルとか絶対に書き換えないようなファイルにぴったりかもね。あ、あと「rootなのに消さない(つ_T)」ってファイルがあったとしたら、この属性がセットされているかもしれない。セットされてないならSELinuxさんが仕事しているだけなのかもしれない。

続いて「a」の方を試してみましょうか。

# chattr -i test.txt
# chattr +a test.txt
# lsattr
-----a-------e- ./test.txt

ってことで、無事「a」がついたところで同じように試してみます。

# cat /dev/null > ./test.txt
-bash: ./test.txt: 許可されていない操作です
# cat /dev/null >> ./test.txt
# echo "test" > ./test.txt
-bash: ./test.txt: 許可されていない操作です
# echo "test" >> ./test.txt
# cat ./test.txt
test
# rm ./test.txt
rm: remove 通常ファイル `./test.txt'? y
rm: cannot remove `./test.txt': 許可されていない操作です

といった感じですね。「追記はOK」な動きになってるのがわかりますな。たぶんログローテートとか考えなければログファイルとかにはぴったりなんでしょうね。

まあ、使える環境も限られている(といっても大抵のところではext2/3/4を使ってるだろうから使えるとは思うんだけど)し、使いどころに悩む様な気はするけど、覚えておくとちょっとした小細工をしたいときとかに便利じゃないかなって思うのです。

0 件のコメント:

コメントを投稿