アーカイブ – TAR と CPIO のアーカイブファイル形式の違いは何ですか?

archiving bzip2 cpio tar zfs

気になって少し読んでみましたが、まだ疑問が残っています

CPIOとTARの違いは何ですか?別の質問で聞いたのですが、tarは多くのファイルを1つのアーカイブにまとめるためのもので、通常はgzipやbzipで圧縮されます

また、tarはstdoutから圧縮できないと言われました。バックアップ用にZFSのスナップショットをアーカイブ/圧縮したい。CPIOとbzip2を組み合わせてこの効果を得られないかと

それとも私の考えが完全に間違っているのでしょうか?CPIOの目的はそこではないのでしょうか?

これは、私はZFSのスナップショットをバックアップする上で、Oracleのドキュメントを読んだ後に出てきたコマンドの種類です

# Backup snapshot to cpio and bzip2 archive
zfs send media/mypictures@20070607 | cpio -o | bzip2 -9c > ~/backups/20070607.bz2

# Restore snapshot from cpio and bzip2 archive
zfs recieve media/mypictures@20070607 | cpio -i | bunzip2 -c ~/backups/20070607.bz2

  43  ianc1215  2011-10-07


ベストアンサー

tarcpio は、どちらも一つの目的を持っています。データを圧縮することはありません。(最近では、tarの方が相対的にシンプルなので、cpioのようにfindと結合しなければならない代わりに、入力ファイルを引数として取ることができるので、tarの方が人気があります)

あなたの場合、これらのツールはどちらも必要ありません。zfs sendはすでにtarと同じことをしています。つまり、あなたは何もファイルを持っておらず、名前のないストリームだけを持っていることになります

スナップショットを圧縮するには、zfsの出力を圧縮プログラムにパイプするだけです

zfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz

gzip -dc ~/backups/20070607.gz | zfs receive media/mypictures@20070607

(gzipxzbzip2などのストリーム圧縮ツールで代用しても構いません)

28  user1686  2011-10-07


前にgrawityとPaulが言っていたことに加えて

History

昔」では、ファイルを他の UNIX 派生のものに移動するときには、 cpio (オプション -c を使用) が tar よりも移植性が高く、柔軟性に優れていたために使用されていました。しかし、tar の移植性の問題は 1980 年代後半から解決されたと考えられます

残念なことに、異なるベンダが cpio の -c 形式をいじくりまわしたのはその頃です (GNU cpio のマニュアルページと -H オプションを見てください)。その頃には、tar は cpio よりも移植性が高くなっていました。異なるUNIXベンダがこの問題を解決するまでには、ほぼ丸10年かかりました。GNU tar と GNU cpio をインストールしておくことは、当時 (今でもそうだと思いますが) 異なるソースからのテープを扱わなければならなかったすべての管理者にとって必須のことでした

User Interface

tar は、管理者がシステムに接続されているテープドライブを設定するテープ設定ファイルを使用することがあります。そうすると、ユーザはテープの正確なデバイスノードを覚えていなくても、「じゃあ、テープドライブ1にします」と言うだけで済むようになります (これは非常に混乱を招く可能性がありますし、異なるUNIXプラットフォーム間で標準化されているわけでもありません)

しかし、主な違いは

tarは自分でディレクトリを検索することができ、コマンドラインの引数からバックアップするファイルやディレクトリのリストを取ります

cpio は指定されたファイルやディレクトリのみをアーカイブしますが、 サブディレクトリを再帰的に検索することはありません。また、cpio は標準入力からアーカイブされる項目のリストを取得します – これが、ほとんどの場合 find と組み合わせて使われる理由です

cpioコマンドは、tarと比較すると初心者には怖そうに見えることが多いです

 $ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz
$ tar czvf myfiles.tar.gz myfiles

これがほとんどの人がアーカイブファイルを作成するのにtarを使う主な理由だと思います。完全なディレクトリを束ねるような単純な作業には、その方が使いやすいからです

また、GNU tar は -z オプションを提供しています。これにより、アーカイブはその場で GNU zip で圧縮され、より簡単になります

一方で、find & cpio を使って気の利いたことができるかもしれません。実際には,よりUNIX的なアプローチです.考えられるほとんどすべてのことを処理してくれるツールがすでにあるのに、なぜ cpio にディレクトリツリー検索を含めるのでしょうか?思いつくのは、ある日付より新しいファイルだけをバックアップしたり、同じファイルシステム内にあるファイルだけに制限したり、grep -v で検索出力をフィルタリングして特定のファイルを除外したり…といったことです

GNU tar の人々は、以前は cpio でしかできなかったことを多くのことができるようにするために多くの努力をしてきました。実際、両方のツールはお互いに学び合いましたが、tar のフォーマットを読めるのは cpio だけで、その逆はありません

タールと出力処理を行います

あなたが言ったことに最後に一言

また、tarはstdoutから圧縮できないと言われました。バックアップ用にZFSのスナップショットをアーカイブ/圧縮したい。CPIOとbzip2を組み合わせてこの効果を得られないかと

まあ、tarのすべてのバージョン(GNUであろうとなかろうと)をパイプで使うことができます。アーカイブ名にはマイナス記号(-)を使えばいいだけです

 $ tar cvf - myfiles | bzip > myfiles.tar.bz

また、GNU tar はポストプロセッサコマンドを指定するためのオプション --to-command を提供しています。特定のハードウェアデバイスに書き込むときに役立つかもしれません

63  ktf  2011-10-07


tar と cpio は基本的には同じ機能を持っており、複数のファイルやディレクトリの入力から連続した一つのファイルを作成します。元々はその結果をテープに貼り付けるためのものでしたが、最近では一般的に上記のように圧縮ユーティリティーに送り込むために使用されています。これは、小さなファイルをたくさん圧縮するよりも、一つの大きなファイルを圧縮する方が時間的にも空間的にも効率的だからです。多くの画像フォーマット(png、jpgなど)はすでに高度に圧縮されているので、圧縮ユーティリティに通すと実際には少し大きくなってしまうことに注意してください

tar も cpio も圧縮はしません。アグリゲートファイルを作るために何を使おうか」という争いには tar が事実上「勝った」のですが、 cpio はいろいろなところで注目されています。私はどちらか一方が他方より優れているということは知らないが、tar はより一般的に使われていることで勝っている

tar は確かに stdin に入力を取り込んで stdout に出力することができます。z” オプションを指定して呼ばれた場合、自動的に gzip が出力されます

6  Paul  2011-10-07


なぜtarよりcpioを使うのか、1996年頃のHPテクニカルサポートに聞いてみました

テープは伸びて消耗すると聞いていました。tarがテープの読めない部分に到達すると失敗してエラー番号を返す。cpioが読めない部分に到達すると、次の読めるブロックに進み、再同期して続行します

これをサポートするドキュメントを見たことがないのですが、いつもcpioを使っていました

5  Lynn  2016-10-15


また、(少なくとも) FreeBSD と Mac OS X では、tar を使って cpio ファイルを操作することができます。BSD tar はフードの下で libarchive を使っているので、 cpio, pax, shar… を扱うことができます

つまり、cpioコマンドの使い勝手の問題でcpioファイルとのやりとりができなくなることはありません

4  trombonehero  2013-10-02


ここでの回答はすでに cpiotar を非常によく比較していますが、私は cpio のパイプラインモードと呼ばれる機能の一つに注目したいと思います。この機能は よくドキュメント化されています そして、その大前提として以下のようになっています

find . <predicates> | cpio -pdmv /destination/dir

tarと同等のものは、次のようなものです

find . <predicates> | tar -T - -cf - | (cd /destination/dir; tar xvf -)

もちろん、別のスレッドで議論されている rsynccp --parents のような代替案もありますが、findcpio の組み合わせによって提供される柔軟性に迫るものはありません。tar がアーカイブを作成するためにどこにでもあるので、これが私が cpio を使い続ける唯一の理由です

3  community wiki  2018-06-21


タイトルとURLをコピーしました