Sự khác biệt giữa các định dạng tệp lưu trữ TAR so với CPIO là gì?


41

Tôi tò mò và đã đọc một chút nhưng vẫn còn thắc mắc.

Điều gì làm cho CPIO khác với TAR? Tôi đã nói với một câu hỏi khác rằng tar là để tập hợp nhiều tệp vào 1 tệp lưu trữ mà sau đó thường là gzip'd hoặc bzip'd.

Ngoài ra tôi đã nói TAR không thể nén từ STDOUT. Tôi muốn lưu trữ / nén ảnh chụp nhanh ZFS để sao lưu. Tôi đã tự hỏi nếu tôi có thể kết hợp CPIO với bzip2 để có được hiệu ứng này.

Hay tôi có ý tưởng hoàn toàn sai lầm? Đó không phải là mục đích của CPIO sao?

Đây là loại lệnh tôi đã đưa ra sau khi đọc để các tài liệu của Oracle sao lưu các ảnh chụp nhanh 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

đừng quên pax: P
Janus Troelsen

Câu trả lời:


28

Cả hai tarcpiocó một mục đích duy nhất: nối nhiều tệp riêng biệt thành một luồng. Họ không nén dữ liệu. (Ngày nay tarphổ biến hơn do tính đơn giản tương đối của nó - nó có thể lấy các tệp đầu vào làm đối số thay vì phải được ghép với findnhư cpiocó.)

Trong trường hợp của bạn, bạn không cần một trong hai công cụ này; chúng sẽ không có tác dụng hữu ích, vì bạn không có nhiều tệp riêng biệt. zfs sendđã làm điều tương tự tarsẽ làm. Vì vậy, bạn không có bất kỳ tệp nào , chỉ có một luồng không tên.

Để nén ảnh chụp nhanh, tất cả những gì bạn phải làm là chuyển zfsđầu ra thông qua chương trình nén:

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

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

(Bạn có thể thay thế gzipbằng xzhoặc bzip2hoặc bất kỳ công cụ nén luồng nào khác, nếu bạn muốn.)


Ồ tôi hiểu rồi, vậy đầu ra ZFS của tôi KHÔNG phải là một luồng dữ liệu? Vì vậy, điều đó sẽ giải thích tại sao các ví dụ của Oracle không bao gồm TAR trong các lệnh.
ianc1215

1
@Solignis: Bạn có thể nghĩ về nó theo cách này: zfs sendđã làm điều tương tự tarsẽ làm.
grawity

62

Ngoài ra những gì đã được nói trước bởi grawityPaul :

Lịch sử

Trong "ngày xưa", cpio (với tùy chọn -csử dụng) là những công cụ để sử dụng khi nó đến để chuyển file đến derivates UNIX khác vì đó là di động và linh hoạt hơn so với tar . Nhưng tính di động tar có thể được coi là giải quyết từ cuối những năm 1980.

Thật không may, đó là khoảng thời gian mà các nhà cung cấp khác nhau thu thập -cđịnh dạng của cpio (chỉ cần nhìn vào trang hướng dẫn cho GNU cpio và tùy chọn -H). Vào thời điểm đó, tar trở nên dễ mang theo hơn cpio ... Phải mất gần một thập kỷ cho đến khi các nhà cung cấp UNIX khác nhau sắp xếp nó ra. Việc cài đặt GNU tarGNU cpio là điều bắt buộc đối với tất cả các quản trị viên phải xử lý các băng từ các nguồn khác nhau trước đó (ngay cả ngày nay tôi đoán là vậy).

Giao diện người dùng

tar có thể sử dụng tệp cấu hình băng trong đó người quản trị sẽ định cấu hình các ổ băng được kết nối với hệ thống. Sau đó, người dùng sẽ chỉ nói "Vâng, tôi sẽ lấy ổ đĩa băng 1" thay vì phải nhớ nút thiết bị chính xác cho băng (có thể rất khó hiểu và cũng không được đặt trên các nền tảng UNIX khác nhau.

Nhưng sự khác biệt chính là:

tar có thể tự tìm kiếm các thư mục và lấy danh sách các tệp hoặc thư mục được sao lưu từ các đối số dòng lệnh.

cpio chỉ lưu trữ các tệp hoặc thư mục mà nó được bảo, nhưng không tìm kiếm các thư mục con theo cách đệ quy. Ngoài ra cpio có danh sách các mục được lưu trữ từ stdin - đây là lý do tại sao nó hầu như luôn được sử dụng kết hợp với find .

Một lệnh cpio thường trông đáng sợ đối với người mới bắt đầu nếu so với tar :

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

Tôi nghĩ đó là lý do chính tại sao hầu hết mọi người sử dụng tar để tạo tệp lưu trữ: Đối với các tác vụ đơn giản như đóng gói một thư mục hoàn chỉnh, nó chỉ dễ sử dụng hơn.

Ngoài ra GNU tar cung cấp tùy chọn -zkhiến cho kho lưu trữ được nén bằng GNU zip khi đang di chuyển, làm cho mọi thứ trở nên dễ dàng hơn.

Mặt khác, người ta có thể làm những điều tiện lợi với find & cpio . Trong thực tế, đó là một cách tiếp cận giống UNIX hơn: Tại sao lại bao gồm tìm kiếm cây thư mục vào cpio nếu đã có một công cụ chăm sóc hầu hết tất cả mọi người có thể nghĩ đến: find . Những điều xuất hiện trong đầu chỉ là sao lưu các tệp mới hơn một ngày nhất định, giới hạn các tệp trong những tệp nằm trong cùng hệ thống tệp hoặc lọc kết quả tìm kiếm grep -vđể loại trừ các tệp nhất định ...

Những người của GNU tar đã dành rất nhiều công việc để bao gồm rất nhiều những điều mà trước đây chỉ có thể có với cpio . Trong thực tế cả hai công cụ học hỏi lẫn nhau - nhưng chỉ cpio có thể đọc định dạng tar - không phải là cách khác.

tar và xử lý đầu ra

Một lưu ý cuối cùng cho điều bạn nói:

Ngoài ra tôi đã nói TAR không thể nén từ STDOUT. Tôi muốn lưu trữ / nén ảnh chụp nhanh ZFS để sao lưu. Tôi đã tự hỏi nếu tôi có thể kết hợp CPIO với bzip2 để có được hiệu ứng này.

Vâng, mọi phiên bản tar (GNU hoặc không) có thể được sử dụng trong một đường ống. Chỉ cần sử dụng dấu trừ ( -) làm tên lưu trữ:

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

Ngoài ra GNU tar cung cấp tùy chọn --to-commandđể chỉ định lệnh hậu xử lý - mặc dù tôi vẫn thích đường ống hơn. Có lẽ nó được sử dụng khi ghi vào một số thiết bị phần cứng.


sẽ không phải là 'từ STDIN' khác, thay vào đó là 'đến STDOUT' .. 'từ STDOUT' không thực sự có ý nghĩa với tôi
Joakim Elofsson

Vâng, tôi chỉ trích dẫn câu hỏi ban đầu. Ý tưởng - nó hơi sai, nhưng tôi nghĩ người ta nhận được điểm.
ktf

3
"Tại sao bao gồm tìm kiếm cây thư mục vào cpio nếu đã có một công cụ chăm sóc gần như tất cả mọi người có thể nghĩ về" Câu hỏi hay, nhưng sau đó bạn cũng sẽ phải yêu cầu nó sao chép ( cp), di chuyển ( mv) diff, v.v .; - - )
Mecki

1
trombonehero nói : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. bạn đã nói : only cpio may read the format of tar. đó không phải là một mâu thuẫn sao?
n611x007

6

tar và cpio về cơ bản có cùng một chức năng, đó là tạo một tệp liền kề từ một đầu vào của nhiều tệp và thư mục. Ban đầu điều này là để đưa kết quả lên băng, nhưng ngày nay nó thường được sử dụng để cung cấp cho một tiện ích nén như bạn có ở trên. Điều này là do việc nén một tệp lớn duy nhất vừa tiết kiệm thời gian và không gian hơn so với nén nhiều tệp nhỏ. Bạn nên lưu ý rằng nhiều định dạng hình ảnh (png, jpg, v.v.) đã được nén rất cao và thực sự có thể lớn hơn một chút nếu đặt qua tiện ích nén.

Cả tar hay cpio đều không tự nén. Tar đã "chiến thắng" một cách hiệu quả "cuộc chiến mà chúng ta sẽ sử dụng để tạo các tập tin tổng hợp", nhưng cpio có một cái nhìn ở nhiều nơi. Tôi không nhận thức được bất kỳ lợi ích của cái này hơn cái kia, tar thắng thông qua việc được sử dụng phổ biến hơn.

tar thực sự có thể đưa đầu vào trên stdin và đầu ra thành thiết bị xuất chuẩn - sau đó sẽ được dẫn vào bzip2 như bạn có hoặc một cái gì đó tương tự. Nếu được gọi với tùy chọn "z", nó sẽ tự động gọi gzip trên đầu ra.


1
Vâng và không -jgọi bzip2?
ianc1215

2
vâng, -j là bzip2 và một số phiên bản (bực bội hơn?) có -J là xv, đối với GNUtar thatis
Joakim Elofsson

4
Hầu hết các phiên bản gần đây của GNU tar thậm chí có thể đoán định dạng nén mong muốn từ tên tệp lưu trữ khi bạn sử dụng tùy chọn -a. Vì vậy, điều này: tar -caf myfiles.tar.xz myfiles/sẽ nén bằng cách sử dụng xzvà điều này tar -caf myfiles.tar.gz myfiles/sẽ nén bằng cách sử dụng gzip.
gerlos

5

Tôi đã hỏi một hỗ trợ kỹ thuật của HP trong ca. 1996 tại sao sử dụng cpiohơn tar.

Tôi đã nói rằng băng kéo dài và hao mòn. Khi tarđạt đến một phần không thể đọc được của băng, nó bị lỗi và trả về số lỗi. Khi cpiođạt đến một phần không thể đọc được, nó tiếp tục đến khối có thể đọc tiếp theo, nối lại và tiếp tục.

Tôi chưa bao giờ thấy tài liệu để hỗ trợ này, nhưng luôn luôn được sử dụng cpio.


Theo bài đăng, thiệt hại bit bit của tar dường như được tập trung vào khu vực / tập tin mà nó ảnh hưởng, giống như bạn đã nói về cpio. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap

4

Cũng đáng chú ý: trên (ít nhất) FreeBSD và Mac OS X, bạn có thể thao tác với các tệp cpio bằng tar. BSD tar sử dụng libarchive dưới mui xe, vì vậy nó có thể xử lý cpio, pax, shar ...

Điều này có nghĩa là các vấn đề về khả năng sử dụng của cpiolệnh không phải ngăn bạn tương tác với các tệp cpio.


ktf nói : only cpio may read the format of tar. bạn đã nói : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. đó không phải là một mâu thuẫn sao?
n611x007

1
@ n611x007 Câu trả lời này nói về BSD tar. Một cái khác có lẽ đang nói về GNU tar. Họ là những chương trình khác nhau.
Navin

3

Mặc dù các câu trả lời ở đây đã so sánh cpiotarrất tốt, tôi muốn làm nổi bật một trong những cpiotính năng được gọi là chế độ đường ống giúp sao chép hiệu quả hơn các tệp chọn lọc (nghĩa là thông qua findvà lọc) trong khi duy trì cấu trúc thư mục của chúng. Tính năng này được ghi lại rõ ràng và trong tiền đề cơ bản của nó trông như thế này:

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

Tương đương với tarsẽ liên quan đến một cái gì đó như thế này:

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

Tất nhiên có những lựa chọn thay thế khác như rsyncvà được cp --parentsthảo luận trong một chủ đề khác , nhưng không có gì đến gần với sự linh hoạt được cung cấp bởi sự kết hợp của findcpio. Với tarviệc có mặt khắp nơi để tạo tài liệu lưu trữ, đây là lý do duy nhất mà tôi vẫn sử dụng cpio.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.