Tại sao sử dụng cpio cho initramfs?


11

Tôi đang thực hiện các initramfs của riêng mình theo wiki Gentoo . Thay vì quen thuộc targzip, trang đang bảo tôi sử dụng cpiogzip. Wikipedia nói rằng nó cpiođược sử dụng bởi initramfs của kernel 2.6, nhưng không giải thích tại sao.

Đây chỉ là một quy ước hay là cpiotốt hơn cho initramfs? Tôi vẫn có thể sử dụng targzip?


IIRC bạn không thể sử dụng tar làm initramfs (Tôi không đăng nó dưới dạng câu trả lời vì tôi không chắc chắn 100%). BTW bằng Gentoo Tôi thấy dễ dàng hơn nhiều khi định cấu hình các initramfs tích hợp thay vì làm thủ công.
Maciej Piechotka

@Maciej Tôi chỉ muốn biết cách thực hiện :) Hơn nữa tôi đang thấy một sự cải thiện lớn về thời gian khởi động bằng cách sử dụng initramfs của riêng tôi
phunehehe

Bạn đã hiểu nhầm tôi. Phương pháp mà tôi đang nói đến là bằng cách cung cấp kernel trong khi cấu hình một tệp spec mà các tệp nên được đưa vào initrd (bao gồm cả tùy chỉnh, /initv.v.) và kernel chỉ đơn giản sử dụng kernel đó. Tôi không tham gia vào việc tạo initramfs bằng genkernel hoặc các phương thức tương tự.
Maciej Piechotka

@Maciej Trông thật vui! Thỉnh thoảng tôi sẽ thử nó.
phunehehe

Tốt. IMHO dễ cài đặt hơn và nó tự động kết hợp với kernel (vì vậy tôi không cần phải nhớ sao chép các tệp mới vào initrd).
Maciej Piechotka

Câu trả lời:


9

Tôi không chắc chắn 100%, nhưng vì ramdisk ban đầu cần được giải nén bởi kernel trong khi khởi động, cpio được sử dụng vì nó đã được triển khai trong mã kernel.


6
Hãy chắc chắn 100%. linux / init / initramfs.c giải nén một cpio -H newckho lưu trữ.
ephemient

@ephemient Đây thực sự là một cái gì đó. Nếu không có câu trả lời nào nữa trong vài ngày nữa, tôi sẽ chấp nhận rằng nó cpiođược sử dụng như một quy ước và chúng ta phải sử dụng cpio.
phunehehe

Bất kỳ ý tưởng tại sao newc là định dạng được chọn?
CMCDragonkai

1
Theo tài liệu kernel, cpio được triển khai chỉ vì initramdisk, vì vậy họ có thể thực hiện bất kỳ định dạng nào khác.
lvella

10

Trích dẫn Documentation/filesystems/ramfs-rootfs-initramfs.txt:

Tại sao cpio chứ không phải tar?

Quyết định này được đưa ra vào tháng 12 năm 2001. Cuộc thảo luận bắt đầu tại đây:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1538.html

Và sinh ra một chủ đề thứ hai (cụ thể là trên tar vs cpio), bắt đầu từ đây:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1587.html

Phiên bản tóm tắt nhanh và bẩn (không thay thế cho việc đọc các chủ đề trên) là:

1) cpio là một tiêu chuẩn. Nó đã tồn tại hàng thập kỷ (từ thời AT & T) và đã được sử dụng rộng rãi trên Linux (bên trong RPM, đĩa trình điều khiển thiết bị của Red Hat). Đây là một bài viết trên Tạp chí Linux về nó từ năm 1996:

http://www.linuxjournal.com/article/1213

Nó không phổ biến như tar vì các công cụ dòng lệnh cpio truyền thống yêu cầu các đối số dòng lệnh _truly_ leatherous_. Nhưng điều đó không nói gì về định dạng lưu trữ và có các công cụ thay thế, chẳng hạn như:

http://freecode.com/projects/afio

2) Định dạng lưu trữ cpio được chọn bởi kernel đơn giản và gọn gàng hơn (và do đó dễ tạo và phân tích cú pháp hơn) so với bất kỳ (hàng chục) định dạng lưu trữ tar khác nhau. Định dạng lưu trữ initramfs hoàn chỉnh được giải thích trong bộ đệm-format.txt, được tạo trong usr / gen_init_cpio.c và được trích xuất trong init / initramfs.c. Cả ba cùng nhau đạt tổng cộng dưới 26k văn bản có thể đọc được.

3) Tiêu chuẩn hóa dự án GNU trên tar gần như liên quan đến tiêu chuẩn hóa Windows trên zip. Linux không phải là một phần của một trong hai, và được tự do đưa ra các quyết định kỹ thuật của riêng mình.

4) Vì đây là định dạng bên trong kernel, nó có thể dễ dàng trở thành
một thứ hoàn toàn mới. Kernel cung cấp các công cụ riêng để tạo và trích xuất định dạng này. Sử dụng một tiêu chuẩn hiện có là tốt hơn, nhưng không cần thiết.

5) Al Viro đã đưa ra quyết định (trích dẫn: "tar xấu xí như địa ngục và sẽ không được hỗ trợ về phía hạt nhân"):

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1540.html

giải thích lý do của mình:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1550.html http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1638.html

và, quan trọng nhất, đã thiết kế và triển khai mã initramfs.


3

Từ những gì tôi nhớ về những ngày SysV cũ của tôi, cpio có thể xử lý các tập tin dev, nhưng tar thì không; điều này làm cho cpio trở thành tiện ích sao lưu 'thô' được lựa chọn trước khi đổ rác. Nó cũng dễ dàng hơn để xử lý các tập tin một phần và các liên kết cứng để sao lưu gia tăng dễ dàng hơn. Tôi nghĩ rằng GNU tar đã bắt kịp với các tính năng cpio vì vậy bây giờ nó chỉ là vấn đề về sự thoải mái của người dùng. Cả cpio và tar nên được cài đặt theo mặc định.


1
cpiocó thể xử lý tartài liệu lưu trữ -format và ngược lại trong một số trường hợp, nhưng điều đó không thành vấn đề. Hạt nhân chỉ có thể giải nén newckiểu cpiotài liệu lưu trữ -format, mà không có tartôi biết sản xuất.
ephemient

Định dạng mà GNU cpio gọi không chính xác newcđược đặt tên chính thức ascvà tất nhiên được hỗ trợ bởi star.
schily

1
@schily: Điều đó cho thấy một trong những lý do ngầm khá độc đáo. "Chà, đó là một loại lưu trữ tar. Nhưng định dạng tar nào có thể, và nó có tương thích với trình trích xuất tar này không?" OTOH, lịch sử phiên bản của cpio ít phức tạp hơn nhiều.
Piskvor rời khỏi tòa nhà vào
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.