Sharing

2012年4月4日 星期三

tar with uid and guid


tar 平常在使用時不需要注意 uid/guid, 解開的檔案預設會把 owner 設定成目前的使用者, 以及當前目錄的權限
但如果是透過 sudo 來執行時, 就要注意了

     -p, --preserve-permissions, --same-permissions
          extract information about file permissions (default for superuser)

      --same-owner
          try extracting files with the same ownership as exists in the archive (default for superuser)

會改成使用 tar 檔內原本的 owner 及 permission, 那可能就要考慮 uid/guid 是否會對應錯誤
尤其是原來的系統和目標的系統內的使用者不是在同樣的 domain 之下, 就要特別注意

http://www.halfgaar.net/backing-up-unix#section-2.1
Ownership information can be stored in two ways: numerically or textually. A lot of backup programs find it user friendly to use textual matches, but for making backups of an entire system, this is very undesirable. It's very likely that you will restore the backup using some kind of live CD, while the original backup was made on the system you're backing up itself. On restoring the backup, files belonging to user bin will be given the ID on the file system based on the /etc/passwd file of the live CD. If this ID is 2 for example, but ID 2 is user daemon on the system you are restoring, all the files that used to belong to bin, now belong to daemon. Therefore, always store owner information numericly. Tar has the --numeric-owner option for that. Rdiff-backup has the --preserve-numerical-idsoption, added to version 1.1.0 per my request. Dar will never support textual matches. I discussed the issue with the author, and he agreed with my reasoning.

根據這篇文章, tar 的預設方式是使用 textual, 也就是原來的 owner 是 "XXX" 時, 解開後, owner 也會是 "XXX" , 而不去參照 uid/guid
以下是我的實驗,

首先準備了兩台機器,
Server A 上面有使用者 pjack(1001)
Server B 上面有使用者 cello(1001)
pjack(1002) (注意: uid 在這兩台機器上面不同)

目標都是把 Server A 上的檔案放到 Server B 去

# 先製造一個檔案是  t.txt
pjack@ubuntu:~/git/demo$ date > t.txt

# owner/group 是  pjack/pjack
pjack@ubuntu:~/git/demo$ ll
-rw-rw-r-- 1 pjack pjack   29 2012-04-05 13:32 t.txt

# pjack 的 id 是 1001
pjack@ubuntu:~/git/demo$ id pjack
uid=1001(pjack) gid=1001(pjack) groups=1001(pjack),112(admin),114(libvirtd)

# 分別就兩種方式壓縮
pjack@ubuntu:~/git/demo$ tar czvf test-textual.tar.gz ./*.txt
pjack@ubuntu:~/git/demo$ tar czvf test-numeric.tar.gz ./*.txt --numeric-owner


接下來把兩個 tar 檔丟到 server B 去

# 先看一下這台 user 的 id
wistor@wistor:~$ id
uid=1000(wistor) gid=1000(wistor) groups=1000(wistor)
wistor@wistor:~$ id pjack
uid=1002(pjack) gid=1002(pjack) groups=1002(pjack)
wistor@wistor:~$ id cello
uid=1001(cello) gid=1001(cello) groups=1001(cello)

wistor@wistor:~$ ll
-rw-rw-r-- 1 wistor wistor  117 2012-04-05 13:38 test-numeric.tar.gz
-rw-rw-r-- 1 wistor wistor  150 2012-04-05 13:38 test-textual.tar.gz

# 解開 test-textual, owner/group 都是目前的使用者
wistor@wistor:~$ tar xzvf test-textual.tar.gz
wistor@wistor:~$ ll *.txt
-rw-rw-r-- 1 wistor wistor 29 2012-04-05 13:32 t.txt

# 解開 test-numeric, owner/group 都是目前的使用者
wistor@wistor:~$ tar xzvf test-numeric.tar.gz
wistor@wistor:~$ ll *.txt
-rw-rw-r-- 1 wistor wistor 29 2012-04-05 13:32 t.txt

# 使用 sudo 解開 test-textual, 發現 owner 是  pjack/pjack
wistor@wistor:~$ sudo tar xzvf test-textual.tar.gz ; ll *.txt
./t.txt
-rw-rw-r-- 1 pjack pjack 29 2012-04-05 13:32 t.txt

# 使用 sudo+numeric-owner 解開 test-textual, 發現 owner 是 cello(1001)/cello(1001)
wistor@wistor:~$ sudo tar xzvf test-textual.tar.gz --numeric-owner; ll *.txt
./t.txt
-rw-rw-r-- 1 cello cello 29 2012-04-05 13:32 t.txt

# 使用 sudo 解開 test-numeric, 發現 owner 是 cello(1001)/cello(1001)
wistor@wistor:~$ sudo tar xzvf test-numeric.tar.gz; ll *.txt
./t.txt
-rw-rw-r-- 1 cello cello 8 2012-04-05 13:35 t.txt


所以一般來說, 使用 textual 是合理的, 可以保証前後機器的使用者不會隨著 uid/guid 的變動而改變
然而, 在某些情況下, 我們需要將整個 root filesystem 壓起來時, 我們用來開機的 OS, 和 filesystem 內的 uid/guid 就已經不 match
ex: 使用 liveCD 開機, 系統的 uid/guid 是光碟片內的, 然而 filesystem 上的 uid/guid 是 local 的,
如果還是用 textual 壓檔案, 就不是那麼適合了, 因為查找的 user name 會是 liveCD 上的 username
這邊有一篇例子

http://pandorawiki.org/How_to_back_up_a_Root_File_System_(on_an_SD_Card)_to_an_SD_Card


其他使用 --numeric-owner 的說明
http://www.noah.org/wiki/tar_notes


還有一些情況是雖然使用 sudo , 但我們不希望保留原來的使用者或權限, 我們可以在解壓縮時使用 --no-same-owner 及 --no-same-permissions

     --no-same-owner
        extract files as yourself (default for ordinary users)

     --no-same-permissions
        apply the user's umask when extracting permissions from the archive (default for ordinary users)

或是在壓縮時就把 owner 設成 nobody (--owner=0 --group=0)

     --owner=NAME
       force NAME as owner for added files
     --group=NAME
       force NAME as group for added files


2012.06.01 補:   簡短版


Server A
        PPP:  1001

Server B
        QQQ: 1001
        PPP: 1002

目標都是把  Server A 上的檔案移轉到 Server B

實驗 1-1:  (no --numeric-owner when zip and extract)
Step1: tar czvf test.tar.gz ./*        
         Step2: sudo tar xzvf test.tar.gz     

   結果:  檔案的 owner   PPP  (使用 textual)

實驗 1-2:  (no --umeric-owner when zip, but turn on when extract)
Step1: tar czvf test.tar.gz ./*
         Step2: sudo tar xzvf test.tar.gz --numeric-owner

   結果:  檔案的 owner QQQ  (使用 numerical)

實驗 2: (turn on --numberic-owner when zip)
Step1: tar czvf test.tar.gz --numeric-owner ./* 
         Step2: sudo tar xzvf test.tar.gz

   結果檔案的 owner QQQ (使用 numerical)



沒有留言: