TAR vs CPIO arşiv dosyası formatları arasındaki fark nedir?


41

Merak ediyorum ve biraz okuma yaptım ama hala sorularım var.

CPIO'yu TAR'dan farklı kılan nedir? Başka bir soruda tar'ın 1 arşive kadar birçok dosyayı bir araya getirdiği, ardından genellikle gzip'd veya bzip'd olduğu söylendi.

Ayrıca TAR'nın STDOUT'dan sıkıştıramadığı da söylendi. Yedeklemeler için ZFS anlık görüntülerini arşivlemek / sıkıştırmak istiyorum. Bu etkiyi elde etmek için CPIO'yu bzip2 ile birleştirip birleştiremeyeceğimi merak ediyordum.

Yoksa tamamen yanlış fikrim var mı? CPIO'nun amacı bu değil mi?

Bu, okuduktan sonra aldığım komutların türü. Oracle, ZFS anlık görüntülerini yedekleme konusunda dokümanlar yapıyor.

# 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

unutma pax: P
Janus Troelsen

Yanıtlar:


28

Hem tarve cpiotek bir amacı vardır: concatenate birçok ayrı dosyalar tek bir akışa. Veriyi sıkıştırmazlar. (Bu gün taronun göreceli basitliği nedeniyle daha popüler - bunun yerine ile birleştirilebilir zorunda argümanlar olarak girdi dosyalarını alabilir findolarak cpiobulunur.)

Senin durumunda, bu araçlardan hiçbirine ihtiyacınız yok; Çok etkili bir etkisi olmaz çünkü çok fazla ayrı dosyanız yok. zfs sendZaten taryapacağı şeyi yaptım. Yani hiç dosyaınız yok , sadece isimsiz bir akış var.

Anlık görüntüyü sıkıştırmak için yapmanız gereken tek şey zfsçıktıyı bir sıkıştırma programından geçirmektir :

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

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

(Sen yerini alabilir gzipile xzveya bzip2isterseniz veya başka bir akışı sıkıştırma aracı.)


Oh, görüyorum, bu yüzden ZFS çıktım DEĞİLDİR dosya değil, veri akışı mı? Bu nedenle, Oracle örneklerinin neden komutlara TAR içermediğini açıklar.
ianc1215

1
@Solignis: Bunu şu şekilde düşünebilirsiniz: zfs sendZaten aynısını taryapar.
Grawity

62

Yerçekimi ve Paul tarafından daha önce söylenenlere ek olarak :

Tarih

"Eski günlerde" olarak, cpio (seçeneğiyle -ckullanılan) idi o daha taşınabilir ve daha esnek olduğu için diğer UNIX türevleri dosya taşımak geldiğinde kullanmak üzere alet katran . Ancak katran taşınabilirliği maddeleri 1980'lerin sonlarından beri çözülmüş olarak kabul edilebilir.

Maalesef, farklı satıcılar cpio-c formatını düzenlemişlerdi ( GNU cpio ve seçenek için sadece kılavuz sayfasına bakınız ). O sırada tar cpio'dan daha taşınabilir hale geldi ... Farklı UNIX satıcıları bunu çözene kadar neredeyse on yıl sürdü. Having GNU tar ve GNU cpio farklı kaynaklardan gelen bantlar ile uğraşmak zorunda tüm yöneticiler için bir zorunluluk sonra yüklü olmasıyla geri edilmiştir (hatta günümüzde sanırım).-H

Kullanıcı arayüzü

tar , yöneticinin sisteme bağlı teyp sürücülerini yapılandıracağı bir teyp yapılandırma dosyası kullanabilir. Kullanıcı daha sonra, bant için tam cihaz düğümünü hatırlamak yerine "çok fazla kafa karıştırıcı olabilen ve aynı zamanda farklı UNIX platformlarında standardize edilemeyen" bant sürücüsünü 1 alacağım "derdi.

Ancak asıl fark şudur:

tar , dizinleri kendi içinde arayabilir ve komut satırı argümanlarından yedeklenecek dosyaların veya dizinlerin listesini alır.

cpio sadece kendisine söylenen dosyaları veya dizinleri arşivler, fakat alt dizinleri kendi kendine tekrarlı olarak aramaz. Ayrıca cpio stdin'den arşivlenecek öğelerin listesini alır - bu yüzden neredeyse her zaman bul ile birlikte kullanılır .

Bir cpio komutu genellikle tar ile karşılaştırıldığında acemi için korkutucu görünüyor :

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

Bence çoğu insanın arşiv dosyaları oluşturmak için tar kullanmasının asıl nedeni budur : Komple bir dizini birleştirmek gibi basit görevler için kullanımı kolaydır.

Ayrıca GNU tar-z , arşivin anında GNU zip ile sıkıştırılmasına neden olan ve işleri daha da kolaylaştıran bir seçenek sunar .

Diğer yandan, bul & cpio ile şık şeyler yapabilirsiniz . Aslında bu bir daha yaklaşımla UNIX gibi: Neden içine dizin ağacı arama içeren cpio'nun : Zaten aklınıza gelebilecek hemen hemen hepsi bir ilgilenir bir araç varsa bulmak . Akla gelen şeyler, dosyaları yalnızca belirli bir tarihten daha yeni yedeklemektir, dosyaları aynı dosya sisteminde bulunanlarla sınırlandırır ya da grep -vbelirli dosyaları dışlamak için bulma çıktısını filtreler .

GNU katranı halkı, daha önce sadece cpio ile mümkün olan şeylerin çoğunu dahil etmek için çok çalıştılar . Aslında her iki araç da birbirinden öğrendi - ancak sadece cpio tar biçimini okuyabilir - tersi olmaz.

katran ve çıktı işleme

Söylediğin bir şeye son bir not:

Ayrıca TAR'nın STDOUT'dan sıkıştıramadığı da söylendi. Yedeklemeler için ZFS anlık görüntülerini arşivlemek / sıkıştırmak istiyorum. Bu etkiyi elde etmek için CPIO'yu bzip2 ile birleştirip birleştiremeyeceğimi merak ediyordum.

Peki, katranın her bir sürümü (GNU veya değil) bir boruda kullanılabilir. Sadece -arşiv adı olarak bir eksi işareti ( ) kullanın :

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

Ayrıca GNU tar , --to-commandyine de boruyu tercih etmeme rağmen, bir işlem sonrası komutu belirtme seçeneği sunar . Belki bazı donanım aygıtlarına yazarken kullanışlıdır.


'STDİN'den' değil, 'o zamandan' STDOUT'a 'farklı' olmaz mıydı? 'STDOUT'dan' bana hiç mantıklı gelmiyor
Joakim Elofsson 7:11

Ben sadece asıl soruya değiniyordum. Gerçekten - biraz yanlış yazılmış, ama sanırım birileri anlıyor.
ktf

3
"Neredeyse hepsinin çaresine bakacak bir araç varsa, neden dizin ağacı aramasını cpio'ya dahil edersiniz ki " İyi bir soru, ancak daha sonra ayrıca copy ( cp), move ( mv) diff, vb. İçin de sormanız gerekir ; )
Mecki

1
trombonehero söyledi : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. Söylediğin: only cpio may read the format of tar. bu bir çelişki değil mi?
n611x007

6

tar ve cpio temelde aynı fonksiyona sahiptir; bu, birden fazla dosya ve dizin girişinden tek bir bitişik dosya oluşturmaktır. Başlangıçta bu, sonucu bant üzerine koymaktı, ancak bu günlerde genellikle yukarıda olduğu gibi bir sıkıştırma aracına beslemek için kullanılır. Bunun nedeni, tek bir büyük dosyayı sıkıştırmak, çok sayıda küçük dosyayı sıkıştırmaktan daha fazla zaman ve alandır. Birçok resim formatının (png, jpg vb.) Zaten çok sıkıştırıldığını ve bir sıkıştırma yardımcı programından geçirilirse biraz daha büyüyebileceğini unutmayın.

Ne tar ne de cpio herhangi bir sıkıştırma yapmaz. Tar etkili bir biçimde "toplamı", "toplu dosyaları yapmak için ne kullanmalıyız" savaşını kazandı, ancak cpio çeşitli yerlere bakıyor. Birinin diğerine sağladığı faydaların farkında değilim, katran kazancı daha yaygın olarak kullanıldığında kazanır.

tar gerçekten de stdin ve stdout için çıktı alabilir - ki bu sizin ya da benzeri bir şey gibi bzip2'ye aktarılır. "Z" seçeneğiyle çağrılırsa, otomatik olarak çıkışta gzip'i çağırır.


1
Evet ve -jbzip2'yi çağırmak için değil mi?
ianc1215

2
evet, -j bzip2 ve bazı olduğu versiyonları xv olarak -J var GNUtar Thatis için (daha yeniden gönderilmesini?)
Joakim Elofsson

4
GNU tar'nın en yeni sürümleri, -a seçeneğini kullandığınızda, istenen sıkıştırma formatını arşiv dosya adından bile tahmin edebilir. Yani bu: tar -caf myfiles.tar.xz myfiles/kullanarak sıkıştıracak xzve bu tar -caf myfiles.tar.gz myfiles/kullanarak sıkıştıracak gzip.
gerlos

5

HP'de bir teknik destek istedim. 1996 neden kullanmak cpioüzerine tar.

Bantların gerildiği ve yıprandığı söylendi. Zaman tarbandın okunamayan bir bölümüne ulaşacak başarısız ve hata sayısını verir. Ne zaman cpiobir okunamayan bölümünü ulaşır, bu bir sonraki okunabilir bloğuna Resyncs devam eder ve devam eder.

Bunu destekleyecek dokümanları hiç görmedim, fakat her zaman kullandım cpio.


Gönderiye göre, tarronun bitsel zararı, etkilediği alana / dosyalara göre belirlendi, cpio hakkında söylediğiniz gibi. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap

4

Ayrıca kayda değer: açık (en azından) FreeBSD ve Mac OS X'te cpio dosyalarını tar ile değiştirebilirsiniz. BSD tar kaputun altında libarchive kullanır, böylece cpio, pax, shar ...

Bu, cpiokomutun kullanılabilirlik sorunlarının cpio dosyalarıyla etkileşime geçmenizi engellemediği anlamına gelir .


KTF söyledi : only cpio may read the format of tar. Söylediğin: BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. bu bir çelişki değil mi?
n611x007

1
@ n611x007 Bu cevap BSD tar hakkında konuşuyor. Diğeri muhtemelen GNU katran hakkında konuşuyor. Onlar farklı programlardır.
Navin

3

Buradaki cevaplar zaten karşılaştırılırken cpiove tarçok iyi olsa da , dizin yapılarını koruyarak cpioseçici dosyaların kopyalanmasını (yani üzerinden findve filtrelemek) daha verimli hale getiren, boru hattı modu olarak adlandırılan özelliklerinden birini vurgulamak istiyorum . Bu özellik iyi belgelenmiştir ve temel öncüllerinde şöyle görünür:

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

İle eşdeğer tarböyle bir şey içerir:

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

Orada gibi Elbette başka alternatiflerin olan rsyncve cp --parentstartışılan başka bir iş parçacığı , ama hiçbir şey kombinasyonu tarafından sunulan esneklik yaklaşır findve cpio. tarArşiv oluşturmak için her yerde bulunmakla birlikte , hala kullanmamın tek nedeni bu cpio.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.