Apa perbedaan antara format file arsip TAR vs CPIO?

41

Saya ingin tahu dan melakukan sedikit membaca tetapi masih memiliki pertanyaan.

Apa yang membuat CPIO berbeda dari TAR? Saya diberitahu dalam pertanyaan lain bahwa tar adalah untuk menyatukan banyak file menjadi 1 arsip yang kemudian biasanya gzip atau bzip.

Saya juga diberitahu bahwa TAR tidak dapat mengompres dari STDOUT. Saya ingin mengarsipkan / mengompresi snapshot ZFS untuk cadangan. Saya bertanya-tanya apakah saya bisa menggabungkan CPIO dengan bzip2 untuk mendapatkan efek ini.

Atau apakah saya memiliki ide yang sepenuhnya salah? Bukankah itu tujuan CPIO?

Ini adalah jenis perintah yang saya buat setelah membaca, jadi Oracle docs tentang membackup snapshot ZFS.

# 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
ianc1215
sumber
jangan lupa pax: P
Janus Troelsen

Jawaban:

28

Keduanya tardan cpiomemiliki satu tujuan: menggabungkan banyak file terpisah ke satu aliran. Mereka tidak memampatkan data. (Hari-hari tarini lebih populer karena kesederhanaannya yang relatif - dapat mengambil file input sebagai argumen daripada harus digabungkan dengan findseperti yang cpiotelah.)

Dalam kasus Anda, Anda tidak perlu alat-alat ini; mereka tidak akan memiliki efek yang berguna, karena Anda tidak memiliki banyak file terpisah. zfs sendsudah melakukan hal yang sama yang tarakan dilakukan. Jadi Anda tidak memiliki file apa pun , hanya aliran tanpa nama.

Untuk mengompresi snapshot, yang harus Anda lakukan adalah menyalurkan zfsoutput melalui program kompresi:

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

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

(Anda dapat menggantinya gzipdengan xzatau bzip2atau alat kompresi aliran lainnya, jika Anda mau.)

grawity
sumber
Oh saya mengerti, jadi output ZFS saya BUKAN file dengan aliran data? Jadi itu akan menjelaskan mengapa contoh Oracle tidak memasukkan TAR dalam perintah.
ianc1215
1
@ Solignis: Anda bisa memikirkannya seperti ini: zfs sendsudah melakukan hal yang sama yang tarakan dilakukan.
grawity
62

Selain dari apa yang dikatakan sebelumnya oleh grawity dan Paul :

Sejarah

Dalam "hari tua", cpio (dengan opsi -cdigunakan) adalah yang alat untuk digunakan ketika datang untuk memindahkan file ke turunan lainnya UNIX karena itu lebih portabel dan fleksibel daripada tar . Tapi tar portabilityissues dapat dianggap sebagai diselesaikan sejak akhir 1980-an.

Sayangnya pada saat itu vendor yang berbeda membuat -cformat cpio (lihat saja halaman manual untuk GNU cpio dan opsinya -H). Pada saat itu tar menjadi lebih portabel daripada cpio ... Butuh hampir satu dekade penuh sampai berbagai vendor UNIX menyelesaikannya. Memiliki GNU tar dan GNU cpio diinstal adalah suatu keharusan untuk semua admin yang harus berurusan dengan kaset dari berbagai sumber saat itu (bahkan saat ini saya kira).

Antarmuka pengguna

tar dapat menggunakan file konfigurasi tape di mana administrator akan mengkonfigurasi drive tape yang terhubung ke sistem. Pengguna kemudian hanya akan mengatakan "Yah saya akan mengambil tape drive 1" daripada harus mengingat simpul perangkat yang tepat untuk rekaman itu (yang bisa sangat membingungkan dan juga tidak standar di berbagai platform UNIX.

Tetapi perbedaan utamanya adalah:

tar dapat mencari direktori sendiri dan mengambil daftar file atau direktori yang akan didukung dari argumen baris perintah.

arsip cpio hanya file atau direktori yang diperintahkan, tetapi tidak mencari subdirektori secara sendiri-sendiri. Juga, cpio mendapatkan daftar item yang akan diarsipkan dari stdin - inilah mengapa hampir selalu digunakan bersama dengan find .

Sebuah cpio perintah sering terlihat menakutkan untuk pemula jika dibandingkan dengan tar :

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

Saya pikir itulah alasan utama mengapa kebanyakan orang menggunakan tar untuk membuat file arsip: Untuk tugas-tugas sederhana seperti menggabungkan direktori lengkap, itu lebih mudah digunakan.

Juga GNU tar menawarkan opsi -zyang menyebabkan arsip yang akan dikompresi dengan GNU zip on the fly, membuat hal-hal bahkan lebih mudah.

Di sisi lain orang dapat melakukan hal-hal bagus dengan find & cpio . Sebenarnya ini adalah pendekatan yang lebih mirip UNIX: Mengapa menyertakan pencarian pohon direktori ke cpio jika sudah ada alat yang menangani hampir semua yang dapat dipikirkan orang: find . Hal-hal yang terlintas dalam pikiran adalah hanya membuat cadangan file yang lebih baru dari tanggal tertentu, membatasi file kepada file yang berada di sistem file yang sama atau memfilter hasil-cari dengan grep -vuntuk mengecualikan file tertentu ...

Orang-orang GNU tar menghabiskan banyak pekerjaan untuk memasukkan banyak hal yang sebelumnya hanya mungkin dengan cpio . Sebenarnya kedua alat belajar dari satu sama lain - tetapi hanya cpio yang dapat membaca format tar - bukan sebaliknya.

pemrosesan tar dan output

Satu catatan terakhir untuk sesuatu yang Anda katakan:

Saya juga diberitahu bahwa TAR tidak dapat mengompres dari STDOUT. Saya ingin mengarsipkan / mengompresi snapshot ZFS untuk cadangan. Saya bertanya-tanya apakah saya bisa menggabungkan CPIO dengan bzip2 untuk mendapatkan efek ini.

Nah, setiap versi tar (GNU atau tidak) dapat digunakan dalam sebuah pipa. Cukup gunakan tanda minus ( -) sebagai nama arsip:

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

Juga GNU tar penawaran pilihan --to-commanduntuk menentukan perintah postprocessor - meskipun saya masih lebih suka pipa. Mungkin itu berguna saat menulis ke perangkat perangkat keras tertentu.

ktf
sumber
bukankah 'dari STDIN' yang berbeda, daripada 'ke STDOUT' .. 'dari STDOUT' tidak benar-benar masuk akal bagi saya
Joakim Elofsson
Yah, saya hanya mengutip pertanyaan asli. Ideed - ini agak salah frasa, tapi saya pikir orang mengerti.
ktf
3
"Mengapa menyertakan pencarian pohon direktori ke cpio jika sudah ada alat yang menangani hampir semua orang dapat memikirkan" Pertanyaan bagus, tetapi kemudian Anda juga harus meminta salinannya ( cp), pindah ( mv), pindah ( ) diff,, dll; - )
Mecki
1
trombonehero mengatakan : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. Anda mengatakan: only cpio may read the format of tar. bukankah itu sebuah kontradiksi?
n611x007
6

tar dan cpio pada dasarnya memiliki fungsi yang sama, yaitu untuk membuat satu file yang berdekatan dari input beberapa file dan direktori. Awalnya ini adalah untuk memasukkan hasilnya ke kaset, tetapi hari ini umumnya digunakan untuk memasukkan ke utilitas kompresi seperti yang Anda miliki di atas. Ini karena mengompresi file besar tunggal lebih menghemat waktu dan ruang daripada mengompresi banyak file kecil. Anda harus mencatat bahwa banyak format gambar (png, jpg dll) sudah sangat terkompresi, dan sebenarnya bisa menjadi sedikit lebih besar jika dimasukkan melalui utilitas kompresi.

Baik tar atau cpio tidak melakukan kompresi sendiri. Tar telah secara efektif "memenangkan" perang "apa yang akan kita gunakan untuk membuat file agregat", tetapi cpio melihat di berbagai tempat. Saya tidak mengetahui adanya manfaat satu di atas yang lain, tar menang karena menjadi lebih umum digunakan.

tar memang dapat mengambil input pada stdin dan output ke stdout - yang kemudian akan disalurkan ke bzip2 seperti yang Anda miliki atau yang serupa. Jika dipanggil dengan opsi "z", maka secara otomatis akan memanggil gzip pada output.

Paul
sumber
1
Ya dan bukan -juntuk memanggil bzip2?
ianc1215
2
ya, -j adalah bzip2 dan beberapa (lebih membenci?) versi mendapat -J sebagai xv, untuk GNUtar thatis
Joakim Elofsson
4
Sebagian besar versi terbaru GNU tar bahkan dapat menebak format kompresi yang diinginkan dari nama file arsip ketika Anda menggunakan opsi -a. Jadi ini: tar -caf myfiles.tar.xz myfiles/akan mengompres menggunakan xzdan ini tar -caf myfiles.tar.gz myfiles/akan mengompres menggunakan gzip.
gerlos
5

Saya meminta dukungan teknis HP dalam ca. 1996 mengapa digunakan cpiolebih tar.

Saya diberi tahu bahwa kaset meregang dan aus. Ketika tarmencapai bagian yang tidak dapat dibaca dari kaset itu gagal dan mengembalikan nomor kesalahan. Ketika cpiomencapai bagian yang tidak dapat dibaca, itu berlanjut ke blok yang dapat dibaca berikutnya, menyinkronkan ulang dan melanjutkan.

Saya belum pernah melihat dokumentasi untuk mendukung ini, tetapi selalu digunakan cpio.

Lynn
sumber
Menurut posting tersebut, kerusakan bitwise dari tar tampaknya dilokalisasi ke area / file yang terpengaruh, sama seperti yang Anda katakan tentang cpio. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap
4

Juga patut dicatat: pada (setidaknya) FreeBSD dan Mac OS X, Anda dapat memanipulasi file cpio dengan tar. Tar BSD menggunakan libarchive di bawah kap, sehingga dapat menangani cpio, pax, shar ...

Ini berarti bahwa masalah kegunaan cpioperintah tidak harus menghentikan Anda berinteraksi dengan file cpio.

trombonehero
sumber
KTF mengatakan : only cpio may read the format of tar. Anda mengatakan: BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. bukankah itu sebuah kontradiksi?
n611x007
1
@ n611x007 Jawaban ini berbicara tentang tar BSD. Yang lain mungkin berbicara tentang tar GNU. Mereka adalah program yang berbeda.
Navin
3

Sementara jawaban di sini sudah membandingkan cpiodan tarsangat baik, saya ingin menyoroti salah satu cpiofitur yang disebut mode pipa yang membuatnya lebih efisien untuk menyalin file selektif (yaitu, melalui finddan filter) sambil menjaga struktur direktori mereka. Fitur ini didokumentasikan dengan baik dan dalam premis dasarnya terlihat seperti ini:

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

Setara dengan tarakan melibatkan sesuatu seperti ini:

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

Tentu saja ada alternatif lain seperti rsyncdan cp --parentsdibahas di utas lain , tetapi tidak ada yang mendekati fleksibilitas yang ditawarkan oleh kombinasi finddan cpio. Dengan tarkeberadaan di mana-mana untuk membuat arsip, ini adalah satu-satunya alasan yang masih saya gunakan cpio.

haridsv
sumber