วิธีหีบห่อ initrd.img ใหม่


9

บนต้นฉบับ / boot/initrd.img- kernel_ver binwalkแสดงโครงสร้างนี้:

ป้อนคำอธิบายรูปภาพที่นี่

จาก0ถึง22528ไบต์มีไฟล์เก็บถาวรCPIOมีเฟิร์มแวร์ GenuineIntel.bin เฉพาะในลำดับชั้นของโฟลเดอร์เฉพาะ
จาก22528ไบต์มี gzip archiwe มีระบบไฟล์ที่เหมาะสมและ gzip นี้ยังถูกเก็บถาวรด้วย CPIO

หลังจากคลายออกและแก้ไขฉันจะบีบอัด initrd.img ด้วยวิธีเดียวกันได้อย่างไร (ด้วยลำดับชั้นโฟลเดอร์เดียวกัน) ชอบโครงสร้างดั้งเดิมนี้:

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากข้อเสนอแนะจากความคิดเห็น:

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

binwalk :

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือโครงสร้างที่แตกต่างอย่างสิ้นเชิง


คุณแยก initrd.img ลงในไดเรกทอรีทำงาน คุณเพิ่มเฟิร์มแวร์ GenuineIntel.bin ของคุณในลำดับชั้นของโฟลเดอร์เฉพาะไปยังไดเรกทอรีการทำงาน จากนั้นคุณทำการจัดเก็บลงสื่อถาวรอีกครั้งด้วยfind . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lzหากกระบวนการนั้นไม่ทำงานให้ชี้แจงว่าคำสั่งใดที่คุณรันและสิ่งที่ไม่ทำงาน
Panther

การแก้ไขภาพของคุณเพิ่มความเข้าใจของฉันให้กับปัญหาของคุณเล็กน้อย คุณจะต้องแตกรูปภาพเพิ่มในรหัสของคุณด้วยโครงสร้างไฟล์และตำแหน่งที่เหมาะสมของเฟิร์มแวร์ GenuineIntel.bin และบรรจุใหม่ลงใน. img ใหม่
Panther

@ bodhi.zazen ที่ผมกล่าวนี้ทำให้ไฟล์ที่แตกต่าง ...
EDID

@ bodhi.zazen ในที่สุดคุณเข้าใจสิ่งที่ฉันถาม?
EdiD

1
ดูเหมือนว่าไฟล์ initramfs เป็นการรวมกันของที่เก็บถาวร CPIO CPIO เก็บถาวรแต่ละรายการสามารถบีบอัด (ด้วย gzip, xz ฯลฯ ) หรือไม่บีบอัด ไฟล์อินพุตของคุณเริ่มต้นด้วยไฟล์ที่ไม่มีการบีบอัดที่ offset 0 จากนั้นไฟล์บีบอัดจะยังคงดำเนินต่อไปที่ offset 22528 น่าเสียดายที่ฉันไม่รู้เครื่องมือมาตรฐานที่สามารถแยกการบีบอัดไฟล์ CPIO ที่บีบอัดไว้
จุด

คำตอบ:


4

ฉันคิดออกว่าจะสร้างที่initrd.imgเก็บถาวรเดียวกันได้อย่างไร

คำตอบ Bodhi.zazen อาจใช้ได้เพราะนี่เป็นวิธีแก้ปัญหาที่รู้จักกันทั่วไป:

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

แต่คำถามนั้นแตกต่างกัน คำตอบนี้จะดีถ้าใน cpio เก็บถาวรมีระบบไฟล์ gzipped หนึ่ง แต่ในสถานการณ์นี้ยังมีเฟิร์มแวร์ของ Intel ในโครงสร้างโฟลเดอร์เฉพาะที่ฉันต้องการเก็บไว้

เพื่อให้ลำดับขั้นของโฟลเดอร์เดียวกันมีสามขั้นตอน:

  1. ทำให้CPIOเก็บระบบไฟล์ที่มีตัวเลือก -o ง่ายโดยไม่ต้องnewcรูปแบบในการสร้างขึ้นก่อนเช่น โฟลเดอร์ฐาน:

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

  2. ทำไฟล์เก็บถาวรที่เหมาะสมด้วยรูปแบบnewcที่มีเคอร์เนล / x86 / microcode / GenuineIntel.bin :

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

  3. เพิ่มระบบไฟล์เก็บถาวร gzipped ไปยัง new_initrd.img ที่เหมาะสม:

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


1
ที่ดี! ขอบคุณ! 10! แต่คุณจะแกะซองเดนเริ่มต้นได้อย่างไร?
RTH

นอกจากนี้โซลูชันของคุณยังสร้างโครงสร้างที่แตกต่างออกไปเล็กน้อย ฉันได้รับโครงสร้างพื้นฐานเดียวกันใน binwalk เมื่อฉันทำตามขั้นตอน (2) เป็นครั้งแรกแล้วfind . | cpio -o | gzip -9 >> new_initrd.img
rth

@EdiD คุณจะเปิด initrd ดั้งเดิมได้อย่างไร
ImranRazaKhan

1
@ImranRazaKhan คุณต้องมีสี่ขั้นตอน: cpio -id < initrd.img-kernel_ver; dd if=initrd.img-4.4.0-22-generic of=image.gz bs=22528 skip=1- จับคู่ชื่อไฟล์ initrd.img และขนาดบล็อกของคุณ gunzip image.gz; cpio -i < image
EdiD

3

คุณบรรจุใหม่ด้วย

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

คำสั่งที่สองเปลี่ยนชื่อ initrd คุณระบุ initrd ที่จะใช้เมื่อบูตในด้วง

ฉันขอแนะนำให้คุณทดสอบ (บูต) initrd แบบกำหนดเองก่อนที่จะย้ายหรือเปลี่ยนชื่อ

ข้อมูลเพิ่มเติมจากการสนทนาในความคิดเห็น:

ก่อนอื่นฉันไม่คิดว่าคุณเข้าใจบทบาทของ cpio / tar ทั้ง cpio และ tar ใช้ไฟล์จำนวนหนึ่งและ / หรือไดเร็กทอรีและทำให้เป็นหนึ่งไฟล์หรือเก็บถาวร

ประการที่สองฉันไม่คิดว่าคุณเข้าใจถึงบทบาทของการบีบอัดการบีบอัดทำให้ขนาดไฟล์เล็กลง คุณสามารถใช้เครื่องมือใด ๆ ที่คุณต้องการบีบอัด

ดู

https://wiki.ubuntu.com/CustomizeLiveInitrd

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

ประการที่สามเคอร์เนล linux ใช้ cipo แทนน้ำมันดิน

ดู

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

ดูที่ "ทำไม cpio มากกว่า tar" มาตรา

ทำไม cpio มากกว่า tar

การตัดสินใจครั้งนี้เกิดขึ้นในเดือนธันวาคม 2544 การสนทนาเริ่มต้นที่นี่:

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

และวางกระทู้ที่สอง (โดยเฉพาะกับ tar vs cpio) เริ่มต้นที่นี่:

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

รุ่นสรุปที่รวดเร็วและสกปรก (ซึ่งไม่สามารถใช้แทนการอ่านหัวข้อด้านบน) คือ:

1) cpio เป็นมาตรฐาน มันมีอายุหลายสิบปี (จาก AT&T วัน) และใช้กันอย่างแพร่หลายใน Linux (ภายใน RPM ดิสก์ไดรเวอร์อุปกรณ์ของ Red Hat) นี่คือบทความ Linux วารสารเกี่ยวกับมันจาก 1996:

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

ไม่เป็นที่นิยมเท่า tar เพราะเครื่องมือบรรทัดคำสั่ง cpio ดั้งเดิมต้องการอาร์กิวเมนต์บรรทัดคำสั่ง _truly_hideous_ แต่นั่นไม่ได้บอกว่าวิธีการเกี่ยวกับรูปแบบการเก็บถาวรและมีเครื่องมือทางเลือกเช่น:

 http://freecode.com/projects/afio

2) รูปแบบไฟล์เก็บถาวร cpio ที่เลือกโดยเคอร์เนลนั้นเรียบง่ายกว่าและสะอาดกว่า (และง่ายกว่าในการสร้างและแยกวิเคราะห์) กว่ารูปแบบไฟล์เก็บถาวร tar หลายรูปแบบ รูปแบบไฟล์เก็บถาวร initramfs ที่สมบูรณ์มีการอธิบายใน buffer-format.txt สร้างขึ้นใน usr / gen_init_cpio.c และแยกใน init / initramfs.c ทั้งสามร่วมกันมีข้อความที่มนุษย์อ่านได้ทั้งหมดน้อยกว่า 26k

3) โครงการมาตรฐานของ GNU บน tar นั้นมีความเกี่ยวข้องโดยประมาณเท่ากับมาตรฐาน Windows บน zip Linux ไม่ได้เป็นส่วนหนึ่งของทั้งคู่และมีอิสระในการตัดสินใจทางเทคนิคของตัวเอง

4) เนื่องจากนี่เป็นรูปแบบภายในเคอร์เนลจึงอาจเป็น
เรื่องใหม่ได้อย่างง่ายดาย เคอร์เนลมีเครื่องมือของตัวเองเพื่อสร้างและแยกรูปแบบนี้ต่อไป การใช้มาตรฐานที่มีอยู่นั้นเป็นที่นิยมมากกว่า แต่ไม่จำเป็น

5) Al Viro ได้ตัดสินใจ (อ้างถึง: "tar น่าเกลียดเหมือนนรกและไม่ได้รับการสนับสนุนทางด้านเคอร์เนล"):

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

อธิบายเหตุผลของเขา:

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

และที่สำคัญที่สุดคือการออกแบบและดำเนินการรหัส initramfs


สิ่งนี้จะไม่รักษาโครงสร้างโฟลเดอร์ไว้ ฉันต้องการโครงสร้างเดียวกันกับ initrd.img ดั้งเดิม ความหมาย -> GenuineIntel.bin ไม่ได้บีบอัดเก็บถาวรด้วย cpio บนรากในเคอร์เนลโฟลเดอร์ / x86 / microcode และทำไม lzma ในขณะที่ฉันพูดถึง gzip?
EdiD

lzma ให้ไฟล์เก็บถาวรขนาดเล็กลง ใช้ gzip หากคุณต้องการ ฉันไม่แน่ใจว่าทำไมคุณถึงกังวลเกี่ยวกับการบีบอัดหรือไม่ควรทำงานได้ดีกับการบีบอัดและทำให้รูปภาพเล็กลงบนดิสก์ ไม่แน่ใจจริงๆว่าคุณพยายามทำอะไรจากสิ่งที่คุณโพสต์
Panther

ฉันต้องการที่จะรู้ว่ามันทำเดิม อาจไม่มีการบีบอัดเฟิร์มแวร์ intel เนื่องจากการเข้าถึงที่เร็วกว่า
EdiD

บีบอัดเกือบจะแน่นอนคุณสามารถตรวจสอบการเก็บถาวร การบีบอัดจะถูกใช้เป็นค่าเริ่มต้นเนื่องจากไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน
Panther

ไม่มีอะไรในคู่มือ cpio เกี่ยวกับการบีบอัด ตรวจสอบคำตอบที่ยอมรับได้: superuser.com/questions/343915/…
EdiD

3

ฉันเพิ่งพบคำถามเดียวกันนี้และการค้นหาเว็บของฉันทำให้ฉันเข้ามาที่หัวข้อนี้ดังนั้นในกรณีที่มันช่วยคนอื่น ๆ ตามรอยเท้าเหล่านี้นี่คือคำตอบของปี 2018 สำหรับคำถามเก่า ...

ดูเหมือนว่าในเมล็ด "ล่าสุด" ไฟล์ initrd.img สามารถมีการเก็บถาวร cpio ที่ไม่บีบอัด (เช่นมีการอัปเดตไมโครโค้ด) ที่นำเสนอต่อการเก็บถาวร (บีบอัด) cpio ที่มีแผนผังไดเรกทอรีเริ่มต้นปกติ initramfs

มีการกล่าวถึงสั้น ๆ ในหน้า Debian Wiki:
https://wiki.debian.org/initramfs#How_to_inspect_initramfs
แต่รหัสที่แม่นยำยิ่งขึ้นสำหรับการแยกวิเคราะห์ไฟล์ initrd.img ที่พบในsplitinitramfs()ฟังก์ชันภายในunmkinitramfsคำสั่งที่พบในคำสั่งที่พบในinitramfs-tools-coreแพคเกจ (เช่น https://git.launchpad.net/ubuntu/+source/initramfs-tools/tree/unmkinitramfs )

ฉันยังไม่ได้พยายามสร้างไฟล์ initrd.img ประเภทนี้อีกครั้ง แต่จากหน้าวิกินั้นดูเหมือนว่าจะแก้ไขสคริปต์การเริ่มต้นระบบ initramfs เราไม่ต้องการแยกไฟล์เก็บถาวรของ GenuineIntel เลย แต่คุณสามารถเก็บ cpio ถาวรตามที่เป็นอยู่ที่ไหนสักแห่งแยกจากนั้นแตกไฟล์ที่บีบอัด (บีบอัด) ที่สองปรับเปลี่ยนโครงสร้างไดเรกทอรีและสร้างไฟล์เก็บถาวร cpio ที่ถูกบีบอัดใหม่

(รหัสที่สร้างไว้ในที่เก็บถาวร "prepended" นี้มีอยู่ใน/usr/share/initramfs-tools/hooks/intel_microcode)


0

ใน Ubuntu นั้นinitrd.imgถูกบีบอัดใน gzip ฉันต้องการที่จะเก็บมันไว้เมื่อฉันแก้ไขมัน นี่คือวิธี:

สารสกัดจาก:

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

การบีบอัด:

find . 2>/dev/null | cpio --quiet --dereference -o -H newc | gzip -9 > /boot/initrd.img-3.19.0-80-generic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.