รูปแบบไฟล์เก็บถาวร TAR กับ CPIO แตกต่างกันอย่างไร


41

ฉันอยากรู้อยากเห็นและได้อ่านเล็กน้อย แต่ก็ยังมีคำถาม

อะไรทำให้ CPIO แตกต่างจาก TAR ฉันถูกบอกในคำถามอื่นว่า tar สำหรับดึงไฟล์หลาย ๆ ไฟล์รวมกันเป็น 1 ไฟล์เก็บถาวรซึ่งโดยทั่วไปจะเป็น gzip หรือ bzip

นอกจากนี้ฉันก็บอกว่า TAR ไม่สามารถบีบอัดจาก STDOUT ฉันต้องการเก็บถาวร / บีบอัดสแนปชอตของ ZFS สำหรับการสำรองข้อมูล ฉันสงสัยว่าฉันสามารถรวม CPIO กับ bzip2 เพื่อรับผลกระทบนี้ได้หรือไม่

หรือฉันมีความคิดที่ผิดอย่างสมบูรณ์? นั่นไม่ใช่จุดประสงค์ของ CPIO หรือไม่?

นี่เป็นคำสั่งที่ฉันได้อ่านหลังจากอ่านดังนั้นเอกสาร Oracle ในการสำรองสแน็ปช็อต 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

อย่าลืมpax: P
Janus Troelsen

คำตอบ:


28

ทั้งสองtarและcpioมีจุดประสงค์เดียว: เชื่อมต่อไฟล์หลาย ๆ ไฟล์เข้ากับสตรีมเดียว พวกเขาไม่บีบอัดข้อมูล (สมัยนี้tarเป็นที่นิยมมากขึ้นเนื่องจากความเรียบง่ายสัมพัทธ์ของมัน - มันสามารถใช้ไฟล์อินพุตเป็นข้อโต้แย้งแทนที่จะต้องถูกควบคู่ไปกับfindที่cpioมี)

ในกรณีของคุณคุณไม่จำเป็นต้องใช้เครื่องมือเหล่านี้ พวกเขาจะไม่มีผลประโยชน์เพราะคุณไม่มีไฟล์แยกกันมากมาย zfs sendทำสิ่งเดียวกันกับที่tarเคยทำมาแล้ว ดังนั้นคุณไม่มีไฟล์ใด ๆเพียงสตรีมนิรนาม

ในการบีบอัดสแนปชอตสิ่งที่คุณต้องทำก็แค่ไพพ์zfsเอาท์พุทผ่านโปรแกรมบีบอัด:

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

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

(คุณสามารถแทนที่gzipด้วยxzหรือbzip2หรือเครื่องมือการบีบอัดข้อมูลอื่น ๆ ได้หากต้องการ)


โอ้ฉันเห็นแล้วเอาท์พุท ZFS ของฉันไม่ได้เป็นสตรีมข้อมูล? ดังนั้นจะอธิบายว่าทำไมตัวอย่าง Oracle จึงไม่รวม TAR ในคำสั่ง
ianc1215

1
@Solignis: คุณสามารถคิดแบบนี้: zfs sendทำเช่นเดียวกันแล้วที่tarจะทำ
grawity

62

นอกเหนือจากที่กล่าวไว้ก่อนหน้านี้โดยgrawityและPaul :

ประวัติศาสตร์

ใน "วันเก่า" cpio (มีตัวเลือก-cใช้) เป็นเครื่องมือในการใช้งานเมื่อมันมาถึงการย้ายไฟล์ไปยัง derivates UNIX อื่น ๆ เพราะมันเป็นแบบพกพามากขึ้นและมีความยืดหยุ่นกว่าน้ำมันดิน แต่ค่าความสามารถในการพกพาของtarนั้นอาจได้รับการพิจารณาว่าแก้ไขได้ตั้งแต่ปลายทศวรรษ 1980

น่าเสียดายที่ประมาณเวลานั้นที่ผู้ค้าต่าง ๆ จัดการ-cรูปแบบของcpio (ดูที่หน้าคู่มือสำหรับGNU cpioและตัวเลือก-H) ในเวลานั้นtarกลายเป็นแบบพกพามากกว่าcpio ... มันใช้เวลาเกือบสิบปีกว่าที่ผู้ขาย UNIX รายอื่นจะคัดแยกออก การติดตั้งGNU tarและGNU cpioนั้นเป็นสิ่งที่จำเป็นสำหรับผู้ดูแลระบบทุกคนที่ต้องจัดการกับเทปจากแหล่งต่าง ๆ ตั้งแต่นั้นมา (แม้กระทั่งทุกวันนี้ฉันก็เข้าใจ)

หน้าจอผู้ใช้

tarอาจใช้ไฟล์การกำหนดค่าเทปซึ่งผู้ดูแลระบบจะกำหนดค่าเทปไดรฟ์ที่เชื่อมต่อกับระบบ จากนั้นผู้ใช้จะพูดว่า "เอาล่ะฉันจะเอาเทปไดรฟ์ 1" แทนที่จะจำโหนดอุปกรณ์ที่แน่นอนสำหรับเทป (ซึ่งอาจทำให้สับสนมากและจะไม่โดดเด่นในแพลตฟอร์ม UNIX ที่แตกต่างกัน)

แต่ความแตกต่างที่สำคัญคือ:

tarสามารถค้นหาไดเรกทอรีด้วยตัวเองและนำรายการไฟล์หรือไดเรกทอรีที่จะสำรองจากอาร์กิวเมนต์บรรทัดคำสั่ง

cpioเก็บถาวรเฉพาะไฟล์หรือไดเรกทอรีที่บอก แต่ไม่ค้นหาไดเรกทอรีย่อยซ้ำด้วยตัวมันเอง นอกจากนี้ยังcpioได้รับรายชื่อของรายการที่จะถูกเก็บไว้จากstdin - นี่คือเหตุผลที่มันมักจะใช้ร่วมกับการค้นหา

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ทำได้รวดเร็วยิ่งขึ้น

ในทางกลับกันคนหนึ่งอาจทำสิ่งที่ดีที่มีการค้นหาและcpio ในความเป็นจริงมันเป็นมากขึ้น UNIX เหมือนวิธีการ: ทำไมรวมการค้นหาต้นไม้ไดเรกทอรีเข้าcpioถ้ามีแล้วเครื่องมือที่จะดูแลของเกือบทุกหนึ่งสามารถคิด: การค้นหา สิ่งที่ควรคำนึงถึงคือการแบ็คอัปไฟล์ที่ใหม่กว่าวันที่กำหนด จำกัด ไฟล์ไว้เฉพาะผู้ที่อยู่ในระบบไฟล์เดียวกันหรือกรองการค้นหาเอาท์พุทด้วยgrep -vเพื่อแยกไฟล์บางไฟล์ ...

ผู้คนในGNU tarใช้เวลาทำงานหลายอย่างเพื่อรวมสิ่งต่าง ๆ มากมายที่ก่อนหน้านี้เป็นไปได้กับcpioเท่านั้น ในความเป็นจริงเครื่องมือทั้งสองเรียนรู้จากกันและกัน - แต่มีเพียงcpioเท่านั้นที่สามารถอ่านรูปแบบtarได้ - ไม่ใช่วิธีอื่น

tarและการประมวลผลเอาท์พุท

หมายเหตุสุดท้ายหนึ่งสำหรับสิ่งที่คุณพูด:

นอกจากนี้ฉันก็บอกว่า TAR ไม่สามารถบีบอัดจาก STDOUT ฉันต้องการเก็บถาวร / บีบอัดสแนปชอตของ ZFS สำหรับการสำรองข้อมูล ฉันสงสัยว่าฉันสามารถรวม CPIO กับ bzip2 เพื่อรับผลกระทบนี้ได้หรือไม่

ทว่าtarทุกรุ่น(GNU หรือไม่) อาจใช้ในไพพ์ เพียงใช้เครื่องหมายลบ ( -) เป็นชื่อไฟล์เก็บถาวร:

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

นอกจากนี้GNU tarยังมีตัวเลือก--to-commandในการระบุคำสั่ง postprocessor - แม้ว่าฉันจะยังคงต้องการไพพ์ อาจใช้เมื่อเขียนถึงอุปกรณ์ฮาร์ดแวร์บางอย่าง


คงจะไม่ใช่ 'จาก STDIN' ที่แตกต่างแทนที่จะเป็น 'STDOUT' .. 'จาก STDOUT' ไม่สมเหตุสมผลสำหรับฉันจริงๆ
Joakim Elofsson

ฉันแค่อ้างถึงคำถามเดิม Ideed - มันค่อนข้างจะถูกตีความผิด แต่ฉันคิดว่ามีใครได้คะแนน
ktf

3
"เหตุใดจึงต้องรวมไดเรกทอรีการค้นหาทรีลงใน cpio หากมีเครื่องมือที่ดูแลเกือบทุกคนสามารถคิดว่า"คำถามที่ดี แต่แล้วคุณจะต้องขอสำเนา ( cp) ย้าย ( mv) diffฯลฯ -; )
Mecki

1
trombonehero กล่าวว่าBSD tar uses libarchive under the hood, so it can handle cpio, pax, shar : only cpio may read the format of tarคุณได้กล่าวว่า: มันไม่ได้ขัดแย้งกันเหรอ?
n611x007

6

tar และ cpio มีฟังก์ชั่นเหมือนกันเป็นหลักซึ่งก็คือการสร้างไฟล์ที่ต่อเนื่องกันเพียงไฟล์เดียวจากอินพุตของหลาย ๆ ไฟล์และไดเรกทอรี แต่เดิมนี้จะใส่ผลลัพธ์ลงบนเทป แต่วันนี้มักใช้เพื่อดึงข้อมูลลงในยูทิลิตี้การบีบอัดตามที่คุณมีด้านบน นี่เป็นเพราะการบีบอัดไฟล์ขนาดใหญ่ไฟล์เดียวมีทั้งเวลาและพื้นที่ที่มีประสิทธิภาพมากกว่าการบีบอัดไฟล์ขนาดเล็กจำนวนมาก คุณควรทราบว่ารูปแบบภาพจำนวนมาก (png, jpg และอื่น ๆ ) ได้รับการบีบอัดสูงแล้วและอาจใหญ่ขึ้นเล็กน้อยหากใส่ผ่านยูทิลิตีการบีบอัด

น้ำมันดินหรือ cpio ไม่ทำการบีบอัดใด ๆ ด้วยตนเอง ทาร์ได้อย่างมีประสิทธิภาพ "ชนะ" "สิ่งที่เราจะใช้ในการทำไฟล์รวม" สงคราม แต่ cpio ได้รับ lookin ในสถานที่ต่าง ๆ ฉันไม่ได้ตระหนักถึงผลประโยชน์ใด ๆ ของอีกคนหนึ่ง tar ชนะผ่านการใช้งานบ่อยขึ้น

tar สามารถรับอินพุตบน stdin และส่งออกไปยัง stdout ซึ่งจะถูกส่งไปยัง bzip2 เหมือนที่คุณมีหรือคล้ายกัน หากเรียกด้วยตัวเลือก "z" มันจะเรียก gzip บนเอาต์พุตโดยอัตโนมัติ


1
ใช่และไม่-jต้องเรียก bzip2?
ianc1215

2
ใช่ -j เป็น bzip2 และบางรุ่น (มีปัญหามากกว่านี้) ได้รับ -J เป็น xv สำหรับ GNUtar นั่นคือ
Joakim Elofsson

4
tar รุ่นล่าสุดของ GNU สามารถคาดเดารูปแบบการบีบอัดที่ต้องการจากชื่อไฟล์เก็บถาวรได้เมื่อคุณใช้ตัวเลือก -a ดังนั้นนี้tar -caf myfiles.tar.xz myfiles/จะบีบอัดใช้xzและสิ่งนี้จะบีบอัดโดยใช้tar -caf myfiles.tar.gz myfiles/ gzip
gerlos

5

ฉันถามฝ่ายสนับสนุนด้านเทคนิคของ HP ในแคลิฟอร์เนีย 1996 ทำไมใช้มากกว่าcpiotar

ฉันบอกว่าเทปยืดและเสื่อมสภาพ เมื่อtarถึงส่วนที่ไม่สามารถอ่านได้ของเทปมันล้มเหลวและส่งกลับหมายเลขข้อผิดพลาด เมื่อcpioถึงส่วนที่ไม่สามารถอ่านได้มันจะไปยังบล็อกถัดไปที่สามารถอ่านได้ทำการซิงก์และทำการต่อ

ฉันไม่เคยเห็นเอกสารที่ให้การสนับสนุนนี้ cpioแต่ใช้เสมอ


จากการโพสต์ความเสียหายเล็กน้อยของ tar น้ำมันดินดูเหมือนว่าจะมีการแปลไปยังพื้นที่ / ไฟล์ที่มีผลเช่นเดียวกับที่คุณบอกเกี่ยวกับ cpio oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap

4

นอกจากนี้ยังควรระวัง: ใน (อย่างน้อย) FreeBSD และ Mac OS X คุณสามารถจัดการไฟล์ cpio ด้วย tar BSD tar ใช้ libarchive ภายใต้ประทุนดังนั้นจึงสามารถจัดการ cpio, pax, shar ...

ซึ่งหมายความว่าปัญหาการใช้งานของcpioคำสั่งไม่จำเป็นต้องหยุดคุณจากการโต้ตอบกับไฟล์ cpio


ktf กล่าวว่า : only cpio may read the format of tar. BSD tar uses libarchive under the hood, so it can handle cpio, pax, sharคุณได้กล่าวว่า: มันไม่ได้ขัดแย้งกันเหรอ?
n611x007

1
@ n611x007 คำตอบนี้พูดถึง tar BSD อีกอันหนึ่งอาจพูดถึง GNU tar พวกเขาเป็นโปรแกรมที่แตกต่างกัน
Navin

3

ในขณะที่คำตอบที่นี่เปรียบเทียบแล้วcpioและtarดีมากฉันต้องการเน้นหนึ่งในcpioคุณสมบัติของที่เรียกว่าโหมดไปป์ไลน์ซึ่งทำให้มีประสิทธิภาพมากขึ้นในการคัดลอกไฟล์เลือก (เช่นผ่านfindและกรอง) ในขณะที่รักษาโครงสร้างไดเรกทอรีของพวกเขา คุณสมบัตินี้ได้รับการบันทึกไว้อย่างดีและมีหลักฐานพื้นฐานดังนี้:

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

สิ่งที่เทียบเท่ากับtarจะเกี่ยวข้องกับสิ่งนี้:

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

มีทางเลือกอื่น ๆ เช่นหลักสูตรrsyncและcp --parentsกล่าวถึงในหัวข้ออื่นแต่ไม่มีอะไรมาใกล้เคียงกับความยืดหยุ่นที่นำเสนอโดยการรวมกันของและfind cpioด้วยการเป็นที่แพร่หลายสำหรับการสร้างที่เก็บนี้เป็นเหตุผลเดียวที่ฉันยังคงใช้tarcpio

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.