1.シンボリックリンク

省略

 

2.tar

tarのいろいろなオプション

GNU版 tarのmanだぜちと古いけど

■準備

せ7> cd /tmp/20180204

せ7> pwd
/tmp/20180204

せ7> mkdir -p etc lib bin usr/{var,lib,bin} tmp var/{lib,log,run,tmp}
せ7> ll

total 0
drwxr-xr-x 2 root root  6 Feb  3 07:49 bin
drwxr-xr-x 2 root root  6 Feb  3 07:49 etc
drwxr-xr-x 2 root root  6 Feb  3 07:49 lib
drwxr-xr-x 2 root root  6 Feb  3 07:49 tmp
drwxr-xr-x 5 root root 39 Feb  3 07:49 usr
drwxr-xr-x 6 root root 50 Feb  3 07:49 var

せ7> ls -lR
.:
total 0
drwxr-xr-x 2 root root  6 Feb  3 07:49 bin
drwxr-xr-x 2 root root  6 Feb  3 07:49 etc
drwxr-xr-x 2 root root  6 Feb  3 07:49 lib
drwxr-xr-x 2 root root  6 Feb  3 07:49 tmp
drwxr-xr-x 5 root root 39 Feb  3 07:49 usr
drwxr-xr-x 6 root root 50 Feb  3 07:49 var
./bin:
total 0
./etc:
total 0
./lib:
total 0
./tmp:
total 0
./usr:
total 0
drwxr-xr-x 2 root root 6 Feb  3 07:49 bin
drwxr-xr-x 2 root root 6 Feb  3 07:49 lib
drwxr-xr-x 2 root root 6 Feb  3 07:49 var
./usr/bin:
total 0
./usr/lib:
total 0
./usr/var:
total 0
./var:
total 0
drwxr-xr-x 2 root root 6 Feb  3 07:49 lib
drwxr-xr-x 2 root root 6 Feb  3 07:49 log
drwxr-xr-x 2 root root 6 Feb  3 07:49 run
drwxr-xr-x 2 root root 6 Feb  3 07:49 tmp
./var/lib:
total 0
./var/log:
total 0
./var/run:
total 0
./var/tmp:
total 0

 

■「-C」オプション

【構文】

tar -C 「DIR」 -cf hoge.tar 「アーカイブ元の{ファイル|ディレクトリ}」

→DIRにcdしてから動作を行なう

せ7> pwd
/tmp/20180204

せ7> tar -cf ../unko.tar .

せ7> tar -tf ../unko.tar
./
./etc/
./etc/shadow
./lib/
./bin/
./usr/
./usr/var/
・・・後略・・・

せ7> tar -C . cf ../unko.tar .  
tar: You must specify one of the `-Acdtrux' or `--test-label'  options
Try `tar --help' or `tar --usage' for more information.

←「-C」オプションを使うときは「cf」でなくて「-cf」にしないといけない

せ7> tar -C . -cf ../unko.tar .
せ7> tar -tf ../unko.tar

./
./etc/
./etc/shadow
./lib/
./bin/
./usr/
./usr/var/
・・・後略・・・

→同じ結果

せ7> tar -cf ../unko.tar /tmp/20180204/*
tar: Removing leading `/' from member names
せ7> tar -tf ../unko.tar
tmp/20180204/bin/
tmp/20180204/etc/
tmp/20180204/etc/shadow

・・・後略・・・

せ7> tar -C . -cf ../unko.tar /tmp/20180204/*
tar: Removing leading `/' from member names   ←勝手に先頭の「/」が取り除かれる
せ7> tar -tf ../unko.tar
tmp/20180204/bin/
tmp/20180204/etc/
tmp/20180204/etc/shadow

・・・後略・・・

→同じ結果

 

■「-P」オプション

ファイル名の先頭の`/'を取り除かない

せ7> pwd
/tmp/20180204

せ7> tar -P -cf ../unko.tar /tmp/20180204/*
せ7> tar -tf ../unko.tar

tar: Removing leading `/' from member names
/tmp/20180204/bin/
/tmp/20180204/etc/
/tmp/20180204/etc/shadow

・・・後略・・・

せ7> tar -P -cf ../unko.tar ./*  ←相対参照
せ7> tar -tf ../unko.tar
./bin/
./etc/
./etc/shadow
./lib/
./tmp/
・・・後略・・・

→相対参照の場合は「-P」オプションの有無で相違なし

 

■「-u」オプション

アーカイブ内の同名のファイルより新しいものだけを追加する

せ7> pwd
/tmp/20180204

せ7> touch a
せ7> ls

a  bin  etc  lib  tmp  usr  var

せ7> tar -uf ../unko.tar a
せ7> tar -tf ../unko.tar

・・・前略・・・
./var/log/
./var/run/
./var/tmp/
a      ←アーカイブ内に追加された

あるいは

せ7> pwd
/tmp/20180204

せ7> touch b

せ7> tar -uf ../unko.tar ./*
せ7> tar -tf ../unko.tar

・・・前略・・・
./var/log/
./var/run/
./var/tmp/
a
./a
./b

 

tar前後のシンボリックリンク

【失敗例1】

せ7> pwd
/tmp/20180204

せ7> ln -s /tmp/20180204/etc/shadow ./tmp/shadow

←シンボリックリンクを移動してもリンク切れにならないようにシンボリックリンクを作る場合リンク元は絶対参照にするのが常套手段だが・・・
せ7> cat ./tmp/shadow
unko

せ7> mkdir ../20180204_2
せ7> tar cf ../unko.tar .
せ7> tar tf ../unko.tar

./
./etc/
./etc/shadow
./lib/
./bin/
./usr/
./usr/var/
./usr/lib/
./usr/bin/
./tmp/
./tmp/shadow
./var/
./var/lib/
./var/log/
./var/run/
./var/tmp/
./a
./b

せ7> tar -C ../20180204_2/ -xf ../unko.tar
せ7> ll ../20180204_2/tmp/shadow

lrwxrwxrwx 1 root root 24 Feb  3 09:35 ../20180204_2/tmp/shadow -> /tmp/20180204/etc/shadow

→シンボリックリンクを絶対参照で作るとtar元にリンクが張られた状態となる

 

 

【成功例】

せ7> cd /tmp/20180204/tmp   ←シンボリックリンクが作られる場所に行く!
せ7> ls
せ7>    ←さっき作ったシンボリックリンクは既に削除済み
せ7> ln -s ../etc/shadow shadow  

←シンボリックリンクが作られる場所を起点とした相対参照でシンボリックリンクを張る!
せ7> ll
total 0
lrwxrwxrwx 1 root root 13 Feb  3 09:48 shadow -> ../etc/shadow

せ7> pwd
/tmp/20180204/tmp
せ7> tar -C /tmp/20180204 -cf ../unko.tar .
tar: ./unko.tar: file is the archive; not dumped

←アーカイブ元の場所に居る状態ではtarアーカイブを作れない

せ7> cd /tmp     ←アーカイブ元の場所から外に出る
せ7> tar -C /tmp/20180204 -cf ../unko.tar .
せ7> tar -C /tmp/20180204 -tf ../unko.tar
./
./etc/
./etc/shadow
./lib/
./bin/
./usr/
./usr/var/
./usr/lib/
./usr/bin/
./tmp/
./tmp/shadow
./var/
./var/lib/
./var/log/
./var/run/
./var/tmp/
./a
./b
./unko.tar

せ7> pwd
/tmp

せ7> tar -C /tmp/20180204_2 -xf ../unko.tar
せ7> ll 20180204_2/tmp/shadow
lrwxrwxrwx 1 root root 13 Feb  3 09:48 20180204_2/tmp/shadow -> ../etc/shadow
←シンボリックリンクの場所からの相対参照でシンボリックリンクが張られている!

せ7> cat 20180204_2/tmp/shadow
unko

※インストールパッケージをtarボールで固めて配布物で提供する場合、インストール場所

(configureの引数なら「--prefix」で指定するパス)を

/optや/usr/localなど、ユーザに任意で選んでもらう場合は、tarアーカイブ内のシンボリックリンクの作り方は上記のようにしないといけない!

 

tar前後のハードリンク

【検証】tarで固めて別ファイルシステム上に展開

tarアーカイブにハードリンクを含めるとどうなるのか?

ハードリンクは同一ファイルシステム内でのみつくれるが、アーカイブ元の同一ファイルシステム内につくられていたハードリンクを、tarで固めて、別のファイルシステムに持って行って展開しても、それらはハードリンクの関係でいられるのか?

 

せ7> ln /tmp/20180204/etc/shadow /tmp/20180204/tmp/shadow
せ7> cat /tmp/20180204/tmp/shadow

unko
せ7> ls -i /tmp/20180204/{tmp,etc}/shadow 
34796738 /tmp/20180204/etc/shadow  34796738 /tmp/20180204/tmp/shadow

せ7> mount /dev/sdb2 /tmp/sdb2   ←違うファイルシステムをマウント
せ7> mkdir /tmp/sdb2/20180204_3
せ7> pwd

/tmp/20180204
せ7> tar -C . -cf ../unko.tar .
せ7> tar -C ../sdb2/20180204_3/ -xf /tmp/unko.tar
せ7> tar -C ../sdb2/20180204_3/ -xf /tmp/unko.tar
せ7> ls -i ../sdb2/20180204_3/{etc,tmp}/shadow

1055553 ../sdb2/20180204_3/etc/shadow  1055553 ../sdb2/20180204_3/tmp/shadow
せ7> cat /tmp/sdb2/20180204_3/etc/shadow
unko

せ7> cat /tmp/sdb2/20180204_3/tmp/shadow
unko

※ハードリンクをtarで固めて別のファイルシステムで展開したら、ハードリンクは保持される!

 

【検証】tarで固めて同じファイルシステム上に展開

せ7> ls -i /tmp/20180204/tmp/shadow /tmp/20180204/etc/shadow
34796738 /tmp/20180204/etc/shadow  34796738 /tmp/20180204/tmp/shadow
せ7> tar -C /tmp/20180204 -cf ../unko.tar .
せ7> tar -C /tmp/20180204_2 -xf ../unko.tar
せ7> ls -i /tmp/20180204_2/{tmp,etc}/shadow

50697931 /tmp/20180204_2/etc/shadow  50697931 /tmp/20180204_2/tmp/shadow
せ7> cat /tmp/20180204_2/{tmp,etc}/shadow
unko
unko

※ハードリンクをtarで固めて同じファイルシステム内で展開したら、ハードリンクは保持される!

【課題】

■ファイルシステムごとの属性の保持

XFS、EXTxファイルシステムでは、ハードリンク、シンボリックリンク、拡張属性など多くが共通していて、tarなどのアーカイバでは、上記のようにアーカイブ前後でこれらの関係や属性は保持されるが、たとえば7zipやラプラスの機能でWindowsのNTFS上でtarボールを作成/展開した場合、アーカイブの中にもしファイルシステム互換のない属性や関係が設定されていた場合、これらが保持(継承)されるかは未調査

※ファイルシステムの種類はOSごとに他にもいっぱいある

■アーカイバ、コピー/移動系コマンドごとの属性の保持、継承

・アーカイバの種類

tar、cpio、zip、rar・・・

・コピー/移動系のコマンド|アプリの種類

cp、mv、dd、dump/restore、・・・

そのほかに、

メールソフトのファイル添付、FTP、HTTP、scp、sftpでのアップロード/ダウンロード

エンコーダ|デコーダ系コマンド、プリンタサーバ、postgreSQLのラージオブジェクトへの出し入れ、ファイルサーバ(nfs、samba、・・・)

※そもそもあるアプリがあるファイルをopenしてwriteしたときに、ファイルシステムのメタ情報をどう扱うのか?

たとえば、

cat hoge1.xls > hoge2.xls

cat fuga.pdf | someapplication > piyo.jpg

など。

・ファイルシステムのメタ情報にどんな属性があるのか

■ファイルの属性(ファイルの種類ごとのファイルフォーマット)

※こちらはの属性は、OS(ファイルシステム)の介在無し。扱う(read/write、encode/decode)アプリ側だけで実装されるって話。

・ファイルシステムのメタ情報の属性じゃなくてファイル自体にもたせてる属性(ファイルフォーマット)にはどんな種類があるのか?

・テキストファイル

文字コード、フォントとの紐づけ、・・・

・ELFとは

・pdfとは

・postscriptとは

・画像ファイル

jpg、png、tif、gif、・・・

・動画/音声ファイル

mpeg、・・・

・圧縮ファイル

zip、gz、bz2、・・・

・アーカイブファイル

・Microsoft officeファイル

・LibreOfficeファイル

※アプリケーションデータの排他制御はアプリ側が実装

※HTMLファイルやxmlファイルはファイルフォーマット上は「ただのテキストファイル」、ようは、バイナリファイルで、テキストデータとメタデータの両方を保持してる形態のファイルフォーマットを問題にしている

※「ファイル」としてどこかのファイルシステムに保存されるデータでは、その「ファイルフォーマット」ごと、ファイルシステムの属性(メタ情報、関係性)ごとに移動やコピーあるいは書き換えや変換に注意が必要ってこと。

■データストリーム

・話を広げると、「ファイル」としてどこかのファイルシステムに保存しないデータ。たとえば、サーバ/クライアントやコマンドのプロセス間通信で「ストリーム」として入出力されるデータの場合は、下記の一連のシーケンスにおいて、

 データの生成→ストリーム化→ストリーム送信→ストリーム受信→データ利用

データの属性(フォーマット)を意識する必要がある

・例えば、TCPソケットからのTCP/IP通信ではネットワークレイヤごとの通信(TCP通信、TLS通信、HTTP通信、・・・)で、通信の各シーケンスごと、レイヤごとに、ヘッダ、データ(なんらかのストリームを経て変換(MIMEなど?)されて分割されてパケットに格納されたもの)、フッターなどがある。言うまでもないが

・上記のようなinetソケット以外のプロセス間通信の場合も同様に

 データの生成→ストリーム化→ストリーム送信→ストリーム受信→データ利用

の各局面を意識しないといけないケースもあるかもしれない

cp前後のシンボリックリンク

LPICレベル1勉強中に思い浮かんだ疑問の消化 その11 ―黒本に落書きした疑問の消化―で検証した通り、

・ファイルのシンボリックリンクのコピーは実ファイルとしてコピーされる

・ディレクトリのシンボリックコピーはシンボリックリンクとしてコピーされる。

 

【課題】

・cp前後のハードリンク

・dump前のシンボリックリンクrestore後のシンボリックリンク

・dump前後のハードリンクrestore後のハードリンク

・rsync前後のシンボリックリンク

・rsync前後のハードリンク

 

【敗走ブログ関連記事】

XFSとEXT4の比較 XFSの理解