Làm thế nào để đóng gói lại initrd.img?


9

Trên /boot/initrd.img- kernel_ver ban đầu binwalkhiển thị cấu trúc này:

nhập mô tả hình ảnh ở đây

Từ 0 đến 22528 byte, có kho lưu trữ CPIO chỉ chứa phần sụn chính hãng GenuineIntel.bin trong phân cấp thư mục cụ thể.
Từ 22528 byte có gzip archiwe chứa hệ thống tệp thích hợp và gzip này cũng được lưu trữ với CPIO

Sau khi giải nén và sửa đổi, làm cách nào tôi có thể nén initrd.img theo cùng một cách (với cùng phân cấp thư mục)? như cấu trúc ban đầu này:

nhập mô tả hình ảnh ở đây

Sau khi đề xuất từ ​​nhận xét:

find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

binwalk :

nhập mô tả hình ảnh ở đây

Đây là cấu trúc hoàn toàn khác nhau.


Bạn trích xuất initrd.img vào một thư mục làm việc. Bạn thêm chương trình cơ sở GenuineIntel.bin trong phân cấp thư mục cụ thể vào thư mục làm việc. Sau đó, bạn làm lại kho lưu trữ với find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lzNếu quy trình đó không hoạt động, hãy làm rõ những lệnh bạn đã chạy và những gì không hoạt động.
Panther

Chỉnh sửa của bạn, với một hình ảnh, thêm ít hiểu biết của tôi về vấn đề của bạn. Bạn cần trích xuất hình ảnh, thêm mã của mình, với cấu trúc tệp và vị trí thích hợp của chương trình cơ sở chính hãngIntel.bin và đóng gói lại thành một .img mới.
Panther

@ bodhi.zazen như tôi đã nói điều này tạo ra các tệp khác nhau ...
EdiD

@ bodhi.zazen cuối cùng bạn có hiểu tôi đang hỏi gì không?
EdiD

1
Có vẻ như tệp initramfs là sự kết hợp của tài liệu lưu trữ CPIO. Mỗi kho lưu trữ CPIO có thể được nén (với gzip, xz, v.v.) hoặc không nén. Tệp đầu vào của bạn bắt đầu bằng tệp không nén ở offset 0, sau đó tệp tiếp tục được nén ở offset 22528. Thật không may, tôi không biết về một công cụ tiêu chuẩn có thể trích xuất một kho lưu trữ CPIO có thể nén.
pts

Câu trả lời:


4

Tôi đã tìm ra cách để tạo ra chính xác cùng một initrd.imgkho lưu trữ.

Câu trả lời Bodhi.zazen có thể sẽ hoạt động vì đây là giải pháp thường được biết đến:

find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

nhưng câu hỏi đã khác Câu trả lời này sẽ rất tốt nếu trong kho lưu trữ cpio có một hệ thống tệp được nén nhưng trong tình huống này cũng có phần sụn Intel trong cấu trúc thư mục cụ thể mà tôi muốn giữ.

Để giữ cùng một hệ thống phân cấp thư mục, cần ba bước:

  1. Tạo lưu trữ hệ thống tệp CPIO với tùy chọn -o đơn giản không có định dạng newc được tạo trước đó, vd. thư mục cơ sở:

    find . | cpio -o | gzip -9 > ../base/file_system.gz

  2. Tạo kho lưu trữ phù hợp với định dạng newc chứa kernel / x86 / microcode / GenuineIntel.bin :

    find kernel/ | cpio -o -H newc > new_initrd.img

  3. Thêm kho lưu trữ hệ thống tập tin được nén vào new_initrd.img:

    find base/ | cpio -o >> new_initrd.img


1
Tuyệt quá! Cảm ơn! +10! Nhưng làm thế nào để bạn giải nén initrd ban đầu?
rth

Ngoài ra, giải pháp của bạn tạo ra một cấu trúc khác nhau một chút. Tôi đã có sự hoàn toàn tructure cùng trong binwalk khi tôi đã làm các bước (2) đầu tiên và sau đófind . | cpio -o | gzip -9 >> new_initrd.img
rth

@EdiD làm thế nào để bạn giải nén initrd ban đầu?
ImranRazaKhan

1
@ImranRazaKhan bạn cần bốn bước : cpio -id < initrd.img-kernel_ver; dd if=initrd.img-4.4.0-22-generic of=image.gz bs=22528 skip=1-match tên tệp initrd.img và kích thước khối của bạn; gunzip image.gz; cpio -i < image
EdiD

3

Bạn đóng gói lại với

cd your_working_directory_with_modifications
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

Lệnh thứ hai đổi tên initrd, bạn chỉ định initrd sẽ sử dụng khi khởi động trong grub.

Tôi đề nghị bạn kiểm tra (khởi động) initrd tùy chỉnh trước khi di chuyển hoặc đổi tên nó.

Thông tin bổ sung từ các cuộc thảo luận trong các ý kiến:

Đầu tiên tôi không nghĩ bạn đang hiểu vai trò của cpio / tar. cả cpio và tar đều lấy một số tệp và / hoặc thư mục và biến chúng thành một tệp hoặc lưu trữ.

Thứ hai tôi không nghĩ bạn hiểu vai trò của nén, nén chỉ đơn giản là làm cho kho lưu trữ kết quả nhỏ hơn. Bạn có thể sử dụng bất kỳ công cụ nào bạn muốn để nén.

Xem

https://wiki.ubfox.com/CustomizeLiveInitrd

https://wiki.gentoo.org/wiki/Initramfs/Guide

Thứ ba, kernel linux sử dụng cipo thay vì tar.

Xem

https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Xem phần "Tại sao cpio chứ không phải tar?" phần

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.


Điều này sẽ không bảo tồn cấu trúc thư mục. Tôi muốn cấu trúc tương tự như initrd.img ban đầu. Ý nghĩa -> GenuineIntel.bin không được nén chỉ được lưu trữ với cpio trên root trong thư mục kernel / x86 / microcode và tại sao lzma trong khi tôi đang nói về gzip?
EdiD

lzma cho một kho lưu trữ nhỏ hơn. sử dụng gzip nếu bạn muốn Tôi không chắc tại sao bạn lại quan tâm đến việc nén hay không, chỉ nên hoạt động tốt với nén và dẫn đến hình ảnh nhỏ hơn trên đĩa. Không thực sự chắc chắn những gì bạn đang cố gắng thực hiện từ những gì bạn đã đăng.
Panther

Tôi muốn biết làm thế nào nó được thực hiện ban đầu. Có lẽ phần mềm intel không được nén vì khả năng truy cập nhanh hơn.
EdiD

gần như chắc chắn đã được nén, bạn có thể kiểm tra kho lưu trữ. Nén được sử dụng theo mặc định vì nó không ảnh hưởng đáng kể đến hiệu suất.
Panther

Không có bất cứ điều gì trong hướng dẫn cpio về nén. Kiểm tra câu trả lời được chấp nhận: superuser.com/questions
4323915 / từ

3

Gần đây tôi đã gặp phải câu hỏi tương tự và việc tìm kiếm trên web của tôi đã đưa tôi đến chủ đề này, vì vậy trong trường hợp nó giúp những người khác theo dõi những bước chân đó, đây là câu trả lời năm 2018 cho một câu hỏi cũ ...

Dường như trong các hạt nhân "gần đây", tệp initrd.img có thể chứa một kho lưu trữ cpio không nén (tức là chứa các bản cập nhật vi mã) được lưu trữ vào kho lưu trữ cpio (đã nén) có chứa cây thư mục initramfs bình thường.

Điều này được thảo luận ngắn gọn trong trang Debian Debian:
https://wiki.debian.org/initramfs#How_to_inspect_initramfs
, nhưng mã chính xác hơn để phân tích cú pháp thông qua loại tệp initrd.img này có thể được tìm thấy trong splitinitramfs()hàm trong unmkinitramfslệnh được tìm thấy trong initramfs-tools-coregói (ví dụ: https://git.launchpad.net/ubfox/+source/initramfs-tools/tree/unmkinitramfs ).

Tôi đã không cố gắng tự xây dựng lại loại tập tin initrd.img này, nhưng dựa trên trang Wiki đó, dường như để chỉnh sửa các tập lệnh khởi động initramfs, người ta sẽ không muốn giải nén tệp lưu trữ GenuineIntel. Thay vào đó, bạn chỉ có thể bảo quản kho lưu trữ cpio như ở một nơi riêng biệt, sau đó giải nén tệp lưu trữ thứ hai (đã nén), sửa đổi cây thư mục và xây dựng lại kho lưu trữ cpio đã nén, sau đó ghép tệp lưu trữ vi mã đã lưu với tệp mới được tạo.

(Mã ban đầu tạo ra kho lưu trữ "được chuẩn bị trước" này được tìm thấy trong /usr/share/initramfs-tools/hooks/intel_microcode.)


0

Trong Ubuntu, initrd.imgnó được nén bằng gzip, tôi muốn giữ lại khi tôi chỉnh sửa nó. đây là cách làm

trích xuất:

zcat /boot/initrd.img-3.19.0-80-generic | cpio --extract

nén:

find . 2>/dev/null | cpio --quiet --dereference -o -H newc | gzip -9 > /boot/initrd.img-3.19.0-80-generic
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.