[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:14808] tar option --numeric owner (Re: [Q] root owner/user changing while using tar)



佐野@浜松です。

In article <19990421004704V.ishikawa@xxxxxxxxxxx>
 ISHIKAWA Mutsumi <ishikawa@xxxxxxxxxxx> さん writes:

>        --same-owner
>               ア ーカイブ内のファイルのものと同じ所有属性で
>               ファイルを抽出する
> 
> です。元の質問の状況は、この動きをしてるんですよね ?

最初に読んだ時には「元の質問の状況」がよく理解できなかったのですが、
後で追加されていた batt.el のアーカイブの件は、「同じ所有属性」が
「同じ uid/gid (番号)」という意味なら、そのとおり (上の動き) だと思います。

で、ここから先は便乗質問なんで Subject を変更します。

先にむつみさんが <19990419202721X.ishikawa@xxxxxxxxx> に書かれた

  |  tar アーカイブの属性情報には、tar アーカイブを作成した時の
  | owner/group が文字列として認識される形で記録されます(つまり、上の例
  | だと brain/brain だよと記録されている)。ところが、アーカイブ中の個々の
  | ファイルには、uid/gid の番号が記録されているに過ぎません。

この部分についてなのですが、最近の tar では、「アーカイブ中の個々のファイル
には番号が記録されている」という動作ではどうもなくなっているようなのです。

すこし前のバージョン、例えば今、職場にある (もうじき slink に置き換えられる予定の)
ファイルサーバーが Slackware 3.1 ベースで動いているのですが、これに入っている

 $ tar --version; tar --help |grep owner
 GNU tar 1.11.8
       --same-owner             create extracted files with the same ownership 

このバージョンでは --numeric-owner というオプションが無いです。で、動作は
むつみさんが説明されたとおりのようです。

例を挙げると、こんな感じです。

1A) このシステムで tar を使って以下のバックアップを取ります。

   $ tar -czf /tmp/chk3.tgz   chk/
   $ tar -tvzf /tmp/chk3.tgz;      
     drwxr-xr-x samba/samba       0 Apr 22 09:19 1999 chk/
     -rw-r--r-- samba/samba       0 Apr 22 09:19 1999 chk/test1

   $ grep samba /etc/passwd; grep samba /etc/group
   samba:*:998:9998:Samba Windows Server:/Server/samba:/bin/sh
   samba:*:9998:


2A) このアーカイブを別の、対応する uid/gid の無いシステムで復元します。
   ただし root 特権のある状態で (sudo 経由) 実行します。

   $ grep 998 /etc/passwd; grep 9998 /etc/group;
   $ tar -tvzf chk3.tgz
    drwxr-xr-x samba/samba       0 1999-04-22 09:19 chk/
    -rw-r--r-- samba/samba       0 1999-04-22 09:19 chk/test1
   $ sudo tar -xzf chk3.tgz
   $ ls -lsaR chk
   total 2
     1 drwxr-xr-x   2 998      9998         1024 Apr 22 09:19 .
     1 drwxrwxr-x   3 sano     sano         1024 Apr 22 09:27 ..
     0 -rw-r--r--   1 998      9998            0 Apr 22 09:19 test1

この動作は、むつみさんが説明されたものと同じだろうと思います。

ところが、 hamm や slink の tar では、バージョンとオプションが

 $ tar --version;tar --help |grep owner
 tar (GNU tar) 1.12

 Copyright (C) 1988, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 Written by John Gilmore and Jay Fenlason.
       --owner=NAME             force NAME as owner for added files
       --same-owner             try extracting files with the same ownership
       --numeric-owner          always use numbers for user/group names

と表示されますが、この場合、以下のようになります。

1B) このシステムで tar を使って以下のバックアップを取ります。
    ただし --numeric-owner オプションは無しです。

 $ tar -czf /tmp/chk.tgz ./control/
 $ tar -tvzf /tmp/chk.tgz 
  drwxrwxr-x xlj06203/nifty    0 1998-02-20 20:17 ./control/
  -rw-rw-r-- xlj06203/nifty  120 1998-02-20 20:14 ./control/get_bill
  -rw-rw-r-- xlj06203/nifty  180 1998-02-20 20:10 ./control/dir_lib
  -rw-rw-r-- xlj06203/nifty  151 1998-02-20 20:16 ./control/go-library
  -rw-rw-r-- xlj06203/nifty  146 1998-02-20 20:17 ./control/go-mes
 $ grep xlj06203 /etc/passwd; grep nifty /etc/group;
  xlj06203:x:561:6000:Nifty Account:/Home/xlj06203:/bin/bash
  nifty:x:6000:

2B) このアーカイブを別の、対応する uid/gid の無いシステムで復元します。
    ただし root 特権のある状態で実行します。

 $ tar -tvzf chk.tgz
  drwxrwxr-x xlj06203/nifty    0 Feb 20 20:17 1998 ./control/
  -rw-rw-r-- xlj06203/nifty  120 Feb 20 20:14 1998 ./control/get_bill
  -rw-rw-r-- xlj06203/nifty  180 Feb 20 20:10 1998 ./control/dir_lib
  -rw-rw-r-- xlj06203/nifty  151 Feb 20 20:16 1998 ./control/go-library
  -rw-rw-r-- xlj06203/nifty  146 Feb 20 20:17 1998 ./control/go-mes

(この表示は上の例と同じ) 

 $ grep 561 /etc/passwd; grep 6000 /etc/group;
 $ cd chk1
 $ sudo tar -xzf ../chk.tgz
 $ ls -lsaR
total 3
   1 drwxr-xr-x   3 sano     kaiseki      1024 Apr 22 09:16 ./
   1 drwxr-xr-x   4 sano     kaiseki      1024 Apr 22 09:16 ../
   1 drwxr-xr-x   2 root     kaiseki      1024 Feb 20  1998 control/

control:
total 6
   1 drwxr-xr-x   2 root     kaiseki      1024 Feb 20  1998 ./
   1 drwxr-xr-x   3 sano     kaiseki      1024 Apr 22 09:16 ../
   1 -rw-r--r--   1 root     kaiseki       180 Feb 20  1998 dir_lib
   1 -rw-r--r--   1 root     kaiseki       120 Feb 20  1998 get_bill
   1 -rw-r--r--   1 root     kaiseki       151 Feb 20  1998 go-library
   1 -rw-r--r--   1 root     kaiseki       146 Feb 20  1998 go-mes

このように、「番号」が保存されなくなっています。

一方、 --numerc-owner オプションを付けて tar アーカイブを作成すると、
従来とほぼ同様な動作になります。

1C) 新しいほうのシステムで tar を使って上と同じバックアップを取ります。
    ただし --numeric-owner オプションを指定します。

 $ tar --numeric-owner -czf /tmp/chk2.tgz ./control/
 $ tar -tvzf /tmp/chk2.tgz 
  drwxrwxr-x 561/6000          0 1998-02-20 20:17 ./control/
  -rw-rw-r-- 561/6000        120 1998-02-20 20:14 ./control/get_bill
  -rw-rw-r-- 561/6000        180 1998-02-20 20:10 ./control/dir_lib
  -rw-rw-r-- 561/6000        151 1998-02-20 20:16 ./control/go-library
  -rw-rw-r-- 561/6000        146 1998-02-20 20:17 ./control/go-mes


2C) このアーカイブを上と同じく、対応する uid/gid の無い別のシステムで
    復元します。ただし root 特権のある状態で実行します。

 $ tar -tvzf chk2.tgz 
  drwxrwxr-x 561/6000          0 Feb 20 20:17 1998 ./control/
  -rw-rw-r-- 561/6000        120 Feb 20 20:14 1998 ./control/get_bill
  -rw-rw-r-- 561/6000        180 Feb 20 20:10 1998 ./control/dir_lib
  -rw-rw-r-- 561/6000        151 Feb 20 20:16 1998 ./control/go-library
  -rw-rw-r-- 561/6000        146 Feb 20 20:17 1998 ./control/go-mes

 $ grep 561 /etc/passwd; grep 6000 /etc/group;
 $ cd chk2
 $ sudo tar -xzf ../chk2.tgz
 $ ls -lsaR
  total 3
     1 drwxr-xr-x   3 sano     kaiseki      1024 Apr 22 09:16 ./
     1 drwxr-xr-x   4 sano     kaiseki      1024 Apr 22 09:16 ../
     1 drwxrwxr-x   2 561      6000         1024 Feb 20  1998 control/

  control:
  total 6
     1 drwxrwxr-x   2 561      6000         1024 Feb 20  1998 ./
     1 drwxr-xr-x   3 sano     kaiseki      1024 Apr 22 09:16 ../
     1 -rw-rw-r--   1 561      6000          180 Feb 20  1998 dir_lib
     1 -rw-rw-r--   1 561      6000          120 Feb 20  1998 get_bill
     1 -rw-rw-r--   1 561      6000          151 Feb 20  1998 go-library
     1 -rw-rw-r--   1 561      6000          146 Feb 20  1998 go-mes

このように --numeric-option を指定した場合に限って、「番号」が保存される
仕様になっています。

  |  ある環境 で brain(uid=100)/brain(gid=100) が tar アーカイブを作成して、
  | それを別の環境で展開したとしましょう。その環境には uid=100 として
  | ishikawa というユーザが、gid=100 として staff というグループが登録されて
  | いたとします。そうすると、個々のファイルは ishikawa/staff という
  |  owner/group に突如変更されてしまったかのように見えてしまいます。しかし、
  | 実際は uid/gid とユーザ名/グループ名のマッピングが (環境が変わったこと
  | により) 変更されただけで、個々のファイルが持っていた属性中の
  | owner/group の uid/gid は変更されていません。

ということで、元の質問の話題とは離れてしまいましたが、

  |  展開された先の環境に、その uid/gid を持った user/group が存在して
  | いなければ、当然ですが、(ls -l などした場合) uid/gid の番号がそのまま
  | 出ます。

この説明の中に --numeric-owner が出てこなかったので、
ちょっと疑問に思った次第です。 _o_

上記の --numeric-owner の有無とそれによる動作の違いについて、
何か勘違いしていることがあれば御指摘ください。

-- 
     #わたしのおうちは浜松市、「夜のお菓子」で有名さ。
    <xlj06203@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)