0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

tar はハードリンクを適切に扱える

Last updated at Posted at 2025-01-14

はじめに

あまり知られていないことですが、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 をそのままバックアップするのに、非常に適したツールだったのです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?