Làm thế nào bạn sẽ sử dụng lệnh cpio?


7

Trong khi học bài kiểm tra lpic, tôi đã chạy vào lệnh cpio.

Mô tả của cpio nói:

Cpio ban đầu được thiết kế để lưu trữ tệp lưu trữ sao lưu trên thiết bị băng theo cách liên tục, liên tục. Cpio không nén bất kỳ nội dung nào, nhưng lưu trữ kết quả thường được nén bằng gzip hoặc các máy nén ngoài khác.

Khi xem xét các ví dụ về cách sử dụng cpio, tôi không thể tìm thấy một kịch bản duy nhất trong đó cpio sẽ tốt hơn các công cụ phổ biến hơn như tar.

Một ví dụ về việc sử dụng cpiosẽ được sử dụng là gì, (ngoài các bản sao lưu băng), hoặc nó không còn phù hợp trên các hệ thống ngày nay?


3
Tôi đã luôn tự hỏi điều này bản thân mình. Nhưng tôi biết rằng việc sử dụng thường xuyên hiện nay là dành cho hình ảnh kernel kernel initramfs. Initramfs cũng là một bổ sung tương đối gần đây cho kernel, vì vậy nó vẫn phù hợp với các hệ thống ngày nay.
Patrick

Bạn đã loại trừ các bản sao lưu băng nhưng không phải hình ảnh đĩa mềm. Tôi thấy nó hữu ích trong một trường hợp không có gì khác làm việc!

Câu trả lời:


5

Nó vẫn có liên quan để giải nén RPM. Có một rpm2cpiotiện ích chuyển đổi gói RPM thành cpiokho lưu trữ. Theo tôi biết, không có gì để chuyển đổi RPM thành tarkho lưu trữ. Dưới đây là một ví dụ sử dụng:

rpm2cpio myrpmfile.rpm | cpio -idmv

2
Trong khi điều này là đúng, nó không thực sự bao gồm phần chính của câu hỏi tại sao cpio tốt hơn tar. Điều này chỉ dẫn đến một câu hỏi khác, tại sao không có tiện ích rpm2tar tồn tại? RPM có sử dụng cpio trong nội bộ không, nếu vậy tại sao họ lại chọn nó trên tar?
Patrick

3
RPM là một phần dựa trêncpio . Vì vậy, rpm2cpiochỉ là thực hiện một chức năng trích xuất, không phải là một chuyển đổi. Đây là lý do tại sao không có rpm2tar.
Warren Young

2

Nếu hệ thống của bạn không có tar GNU với -Ttùy chọn và - toàn bộ cpiothì đó là cách để đưa một tập hợp con cụ thể của tệp vào kho lưu trữ tar:

find . -name CVS -prune -o -print0 | cpio -o -Hustar > all.tar

Tôi cũng thường tìm thấy -V/ --dotnhiều thông tin hơn về tiến trình sau đó chế độ dài dòng đầy đủ (trong tarhoặc cpio) trong trường hợp bạn chắc chắn biết bạn sẽ phải đóng gói bao nhiêu tệp (giả sử bạn biết thiết bị đầu cuối của bạn dài bao nhiêu và trong trường hợp của tôi là tốt với bảng nhân 80).

Luôn luôn có sử dụng cho nhiều giải pháp cho cùng một vấn đề. Vì cpiocó thể đọc tartài liệu lưu trữ, bạn cũng có thể loại bỏ tar và chỉ sử dụng cpioở mọi nơi.


find không có tên chính -print0và cpio không thể hiểu đầu ra từ gfind -print0.
schily

2

Trước đây, có một lợi thế của việc sử dụng cpionhưng tính năng đặc biệt này không được triển khai trong ví dụ gcpio. Tôi đang nói về thực tế rằng việc triển khai cpio AT & T ban đầu đã thực hiện trích xuất tệp theo cách cụ thể tương tự như việc installnày và đây là lý do tại sao AT & T thích sử dụng cpio để cài đặt nhị phân trên hệ thống trực tiếp.

Nếu bạn gọi stardưới tên cpio, bạn sẽ có được tính năng này và nếu bạn thêm tùy chọn -installvào các tùy chọn starkhi giải nén tệp, bạn sẽ có hành vi này.

BTW: định dạng lưu trữ CPIO không còn được xem là định dạng hữu ích của POSIX, vì nó không thể mở rộng. Bốn "biến thể" định dạng CPIO hoàn toàn không tương thích với nhau và mỗi khi cần một phần mở rộng, một biến thể định dạng CPIO hoàn toàn mới / không tương thích đã được tạo.


1

tar sử dụng định nghĩa lưu trữ ustar , giới hạn độ dài tên đường dẫn là 100 byte. Các hệ thống phân cấp lồng nhau sâu sắc - hoàn toàn không phổ biến trong những ngày này - không thể được lưu trữ bằng tar. cpio không có tật đó.

Tôi thích pax (1). Giống như cpio, pax sử dụng đầu vào và đầu ra tiêu chuẩn tốt hơn tar. pax có thể sử dụng định dạng cpio, có nghĩa là nếu bạn va vào giới hạn tên đường dẫn, bạn có thể tiếp tục sử dụng cùng một tiện ích chỉ bằng cách thêm -x cpio vào lệnh. Bạn chỉ sử dụng tùy chọn đó để tạo tài liệu lưu trữ; khi đọc pax phát hiện định dạng tự động.


1
GNU tar không có giới hạn như vậy.
psusi

Giới hạn thuộc về định nghĩa định dạng tệp, không thuộc về tiện ích. Vui lòng tham khảo char name[100]trong tài liệu tar của GNU .
James K. Lowden

Vâng, họ đã giải quyết nó bằng cách nào đó bởi vì tôi chỉ tạo một tập tin có tên 108 ký tự và tar xử lý nó tốt.
psusi

Không đúng, định dạng CPIO được chuẩn hóa duy nhất hỗ trợ độ dài tên tệp tối đa là 255 ký tự, trong khi định dạng lưu trữ TAR được tiêu chuẩn hóa có độ dài tên tệp không giới hạn.
schily

1

Tôi không thể tìm thấy một kịch bản duy nhất trong đó cpio sẽ tốt hơn các công cụ phổ biến hơn như tar.

Đây là một cái mà tôi đã học được trước đây rsynccp -rtồn tại:

$ find /foo -print | cpio -pud /bar

Điều này sao chép tất cả các tệp /foovào /bar, bảo toàn tất cả các quyền và cấu trúc thư mục.

Để làm điều đó với tar, bạn cần tạo một tệp lưu trữ tạm thời và sau đó giải nén nó một lần nữa, vì tarkhông có chế độ lọc thông qua này.


Không đúng, bạn đúng với triển khai tar UNIX lịch sử nhưng không phải starvì sao hỗ trợ tùy chọn -copy và có thể thực hiện các bản sao hiệu quả hơn cpio.
schily

@schily: câu hỏi này không phải về ngôi sao, mà là về tar. OP đã không mở cửa để cài đặt các công cụ của bên thứ ba.
Warren Young

Từ những gì tôi có thể nói, mọi sysadmin thường xuyên sử dụng tar thường được cài đặt sao. Nếu bạn tin rằng OP đang sử dụng Linux, thì chúng tôi cần khuyến khích người dùng không sử dụng "cpio" trên nền tảng đó như thường gcpiođược cài đặt dưới dạng cpio trong Linux và không may là gcpio gặp phải nhiều vấn đề.
schily

@schily: Một người trong chúng ta sống trong bong bóng và tôi khá chắc chắn đó không phải là tôi. Tôi chưa bao giờ sử dụng ngôi sao trong một phần tư thế kỷ sử dụng Unix. Nó không được cài đặt theo mặc định trên RHEL / CentOS, Solaris, Ubuntu Server, FreeBSD hoặc OS X. Nó thậm chí không có trong gói repo tiêu chuẩn cho hầu hết những thứ đó. Điều đó bao trùm một phần lớn của thế giới Unix sysadmin-centric ngày nay. Trong khi đó, bạn đã viết điều đó, vì vậy tất nhiên nó được cài đặt trên tất cả các hộp của bạn.
Warren Young

Star đã được cài đặt trên hầu hết các bản phân phối Linux trong một thời gian dài và đây là bản triển khai tar miễn phí lâu đời nhất. Nếu bạn không biết ngôi sao, có vẻ như bạn đã không kiểm tra các lựa chọn thay thế được cài đặt trong suốt 20 năm qua. Do các vấn đề khác nhau với gtar, tôi tránh gtar bất cứ khi nào có thể và nhiều người biết ngôi sao cũng làm như vậy. Vì vậy, người đọc phải quyết định ai là bong bóng.
schily

0

Tôi đã sử dụng cpio trong nhiều năm và vẫn làm. Nó đã giúp tôi tiết kiệm nhiều lần trong quá trình phục hồi mà không cần kiến ​​thức sâu rộng về Linux / Unix.

Ví dụ Tôi đã cài đặt Máy chủ Ubuntu 17.04LTS và thường xuyên cập nhật các tệp của mình để sao lưu bằng cpio. mỗi tháng sử dụng ổ USB 500Gb bên ngoài.

Tôi gắn ổ đĩa Sao lưu như vậy:

mount /dev/sdb1 /BACKUP 

Đảm bảo bạn đã tạo một thư mục có tên BACKUP trong thư mục gốc của bạn làm điểm gắn kết và sử dụng lệnh sau;

mount /dev/sdb1 /BACKUP    

Làm một dfđể đảm bảo nó được gắn kết. Sau đó cd /BACKUPvà tạo một thư mục có tên Ubuntu_Backup_17.04LTS.

Sau đó cd /, kiểm tra xem bạn đang ở / trước khi bắt đầu quá trình cpio với pwd, và sau đó và thực hiện lệnh sau:

find . -mount -print | cpio -pdumv /BACKUP/Ubuntu_Backup_17.04LTS

Điều này sau đó sẽ sao chép tất cả các tệp và thư mục từ thư mục ROOT LOẠI TRỪ điểm gắn kết BACKUP.

Sau khi kết thúc nếu bạn truy cập /BACKUP/Ubfox_Backup_17.04LTS và liệt kê các tệp và thư mục bạn sẽ thấy nó giống hệt như danh sách ổ ROOT của bạn.

Khôi phục hoàn toàn giống nhau, nó có thể là một khôi phục hoàn toàn chỉ đơn giản là một thư mục như / etc.

Thí dụ:

cd /BACKUP/Ubuntu_Backup_17.04LTS

và thực hiện ngược lại;

find . -mount -print | cpio -pdumv /  

hoặc cho một thư mục / etc) lệnh sẽ là

find /etc -mount -print | cpio -pdumv /  

Điều này sẽ sao chép / etc thư mục ra khỏi Sao lưu vào / để phục hồi.

Điều này sau đó sẽ sao chép tất cả các tệp và thư mục trở lại / phân vùng sau đó khởi động lại. Nó rất tiện dụng khi một bản cập nhật bị lỗi khủng khiếp.

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.