はじめに
あまり知られていないことですが、tar はハードリンクを適切に扱えます。
ハードリンクで同じ inode
番号を持つファイルがあったとき、tar はその inode
番号を持つファイルは、同じデータを参照するように格納します。
tar と zip でハードリンクを格納してみる
tar と zip でハードリンクを格納してみて、動作をみてみます。
検証用のデータ作成
はじめに、適当な 100MB のランダムデータをつくり、ハードリンクを張ります。
$ dd if=/dev/urandom of=./test01.bin bs=1M count=100
100+0 レコード入力
100+0 レコード出力
104857600 bytes (105 MB, 100 MiB) copied, 0.234722 s, 447 MB/s
$ ln test01.bin test02.bin
ファイルサイズは 100MB で、同じ inode
番号 102510978
を持っています。
$ ls -lih
合計 201M
102510978 -rw-rw-r-- 2 user user 100M 1月 14 22:25 test01.bin
102510978 -rw-rw-r-- 2 user user 100M 1月 14 22:25 test02.bin
tar archive 作成
圧縮オプション無しで、tar archive を作成します。
$ tar cvf sample.tar *.bin
test01.bin
test02.bin
zip archive 作成
比較用に zip archive も作成します。
$ zip sample.zip *.bin
adding: test01.bin (deflated 0%)
adding: test02.bin (deflated 0%)
archive のサイズ確認
このとき、ファイルサイズがどうなっているかというと、
$ ls -lh sample.tar sample.zip
-rw-rw-r-- 1 user user 101M 1月 14 22:27 sample.tar
-rw-rw-r-- 1 user user 201M 1月 14 22:27 sample.zip
tar が 101MB に対して、zip 圧縮が 201MB になっています。
これは tar が同じ inode
番号のファイルをまとめるのに対して、zip が個別にファイルを圧縮するためです。
ファイルの展開と確認
tar を展開した場合
先程の tar を展開すると、どうなるかというと、
$ mkdir extract-tar
$ tar xvf sample.tar -C ./extract-tar/
test01.bin
test02.bin
$ ls -lih ./extract-tar/
合計 200M
102511042 -rw-rw-r-- 2 user user 100M 1月 14 22:25 test01.bin
102511042 -rw-rw-r-- 2 user user 100M 1月 14 22:25 test02.bin
展開した後も同じ inode
番号を持つファイルとして作成されています。
つまり、ハードリンクが維持された状態で戻されたということです。
zip を展開した場合
一方、zip の場合は、
$ mkdir ./extract-zip
$ unzip sample.zip -d ./extract-zip/
Archive: sample.zip
inflating: ./extract-zip/test01.bin
inflating: ./extract-zip/test02.bin
$ ls -lih ./extract-zip/
合計 200M
102511044 -rw-rw-r-- 1 user user 100M 1月 14 22:25 test01.bin
102511045 -rw-rw-r-- 1 user user 100M 1月 14 22:25 test02.bin
inode
番号が別々のものとなっており、ハードリンクが切れた状態です。
この後は、一方を更新しても、もう一方は更新されない状態になります。
おわりに
tar は歴史的にも Linux のファイルシステムを扱うのに、とても長けています。
tar でまとめた後に、gzip や bzip2、xz で圧縮をかけたりしますが、それは tar に Linux ファイルシステムで保持される情報の大部分を格納することができるためです。
本記事ではまとめませんが、acl や xattr、sparse も扱えます。
/dev
配下のスペシャルデバイスも扱えます。
root 権限でファイルシステムをまとめた場合は、owner や permission がそのままの状態で保持されます。
tar は Linux の root filesystem をそのままバックアップするのに、非常に適したツールだったのです!