かきすて

正しいかどうかよくわからない知識をよくわからないままとりあえず公開してみようというコンセプトで運営しています。

superuser権限でtarコマンドで解凍すると何も考えなくてもパーミッションと所有者が保持される

GNU tarの話です。

tarでパーミッション保持をするのは-pオプションをつければいいのだが、固めるときは勝手に保持しておいてくれるので、これをつけるのは解凍するときだけでいい。ということを最近教えてもらった。そうなんだ。勘違いして固めるときもつけていた。
と思って調べてみたらこんなことが書いてある。

-p, --preserve-permissions, --same-permissions
ファイル属性についての情報を抽出
(superuser では標準)

tar:ファイルやディレクトリの圧縮または展開:具体例未作成 | u-style.info

「superuserでは標準」。
なるほど。
で、試してみたらどうやらsuperuserのときは--same-ownerオプションも標準でつくらしい。
例えばこういうディレクトリをtarで固めて、

$ ls -l tartest
合計 0
-rwxrwxrwx 1 ippan   ippan 0  3月 29 20:03 ippan_777
-rwxrwxrwx 1 root    root    0  3月 29 20:02 root_777

$ tar zcvf tartest.tar.gz tartest/

別サーバでsuperuser権限で解凍するとこういう風になる。

$ sudo tar zxvf tartest.tar.gz
$ ls -l tartest
total 0
-rwxrwxrwx 1  502  502 0 2013-03-29 20:03 ippan_777
-rwxrwxrwx 1 root root 0 2013-03-29 20:02 root_777

-pも--same-ownerもつけてないけど所有者もパーミッションも保持されている。
保持したくないときはオプションで明示しないといけないようだ。

$ sudo tar --no-same-permissions --no-same-owner -zxvf tartest.tar.gz
$ ls -l tartest
total 0
-rwxr-xr-x 1 root root 0 2013-03-29 20:03 ippan_777
-rwxr-xr-x 1 root root 0 2013-03-29 20:02 root_777

逆に一般ユーザで両方保持しようと思ったら--same-ownerが怒られる。
のはこっちの環境もろもろのせいか?
rootでやれば勝手につくわけだし、--same-ownerを使うタイミングって本当にあるのかなと思いつつ。

$ tar --same-owner -zxvpf tartest.tar.gz
tartest/
tartest/ippam_777
tar: tartest/ippan_777: Cannot change ownership to uid 502, gid 502: Operation not permitted
tartest/root_777
tar: tartest/root_777: Cannot change ownership to uid 0, gid 0: Operation not permitted
tar: tartest: Cannot change ownership to uid 0, gid 0: Operation not permitted
tar: Exiting with failure status due to previous errors

svcpropとsvccfg listpropの違い

バイト先で開発環境として使ってるSolaris11のサーバで、memcachedのスレッド数を変更しようとしていて、ふと、「svcpropとsvccfg listpropでは表示される内容が違うなあ」と思った。
正確には下の2つのコマンドの実行結果がわりと違った。

$ svcprop svc:/application/database/memcached:default
$ sudo svccfg -s svc:/application/database/memcached:default listprop

どう違うかと言うといろいろ違うのだが、表示されるプロパティ数がぜんぜん違った。
どういうことだろうと思いいろいろ試しているうちに、listpropのほうではmemcachedで指定した場合と、memcached:defaultで指定した場合でこれまた表示されるプロパティが違うことに気づいた。
svcpropだと同じ。
どういうことだろう。
そもそもFMRIにおける「:」の意味がよく分かっていない。
「:」ってなんだ。
ということで調べてみる。

>SMF の概念 - Oracle Solaris の管理: 一般的なタスク
FMRI には、サービス名とインスタンス名が含まれます。たとえば、rlogin サービスの FMRI は svc:/network/login:rlogin となり、ここでの network/login はサービスを、rlogin はサービスインスタンスをそれぞれ示します。

なるほど。
そういえばApacheの再起動を

$ sudo svcadm restart http

とやってたら、先輩に「それはApacheでなくhttpというサービスを実現するためのものすべてを再起動するという意味になる。今後はapache22を指定しなさい」的なこと(うろおぼえ)を言われた。
その時点では「そうなんだーよくわからん」ぐらいにしか思ってなかったが少し意味が分かった気がする。
さて、表題の件だが、要するにmemcachedにつくプロパティとmemcached:defaultにつくプロパティがあるということだ。たぶん。
memcachedのサービスインスタンスはこのサーバではdefaultしかないのでわかりにくいが、複数あるやつを見ればわかりやすいはず。
例えばこのサーバのpostgresqlは32bit版と64bit版の二つを入れてある(そういえばなぜ二つ入ってるんだろう…)。
これでsvcpropとlistpropを試すと

$ svcprop postgresql_90 | grep start/exec
svc:/application/database/postgresql_90:default_64bit/:properties/start/exec astring /lib/svc/method/postgres_90\ start
svc:/application/database/postgresql_90:default_32bit/:properties/start/exec astring /lib/svc/method/postgres_90\ start

$ svccfg -s postgresql_90 listprop | grep start/exec
start/exec                                                            astring     "/lib/svc/method/postgres_90 start"

という風に、ここであがってるstart/execというプロパティはpostgres_90のサービスインスタンスdefault_32bitとdefault_64bitの両方に適用されており、また、実際にはpostgres_90というサービスについたプロパティだということが分かる。
つまり、svcpropだとサービスインスタンスに適用されているプロパティが一挙に見えていて、svccfgのlistpropだとそのサービスインスタンス固有のプロパティが見えていたということだろう。
ちなみに今回、スレッド数変更のためmemcached:defaultのmemcached/optionsプロパティに「-t 10」といった感じでオプションを加えた。
つまりmemcachedのmemcached/optionsプロパティは変わっていない。

$ svccfg -s memcached listprop | grep options
memcached/options                 astring     "-u" "webservd" "-l" "127.0.0.1" "-p" "11211" "-m" "128m"
$ svccfg -s memcached:default listprop | grep options
memcached/options                 astring     "-u" "webservd" "-l" "127.0.0.1" "-p" "11211" "-m" "128m" "-t" "10"

この通り。
だから、例えばmemcached:hogeとかいうサービスインスタンスを作ったとして、そのmemcached/optionsプロパティを設定しなかったら-tオプションなしで実行されることになる。と思う。
いいのかどうかは正直よく分からない。