ทำไมฉันต้องมี initramfs


17

ฉันพบว่าถ้าฉันเลือกjffsหรือsdเป็นระบบไฟล์ (และไม่initramfs) ขนาดเคอร์เนลจะเล็กมาก (1.4 MB เมื่อเทียบกับinitramfsที่ 3.4MB) หมายความว่าinitramfsต้องใช้พื้นที่มากพอสมควร ดังนั้นถ้าฉันสามารถฉันจะลบมันอย่างสมบูรณ์และจะมีเคอร์เนลขนาดเล็กมากซึ่งเป็นสิ่งที่ฉันต้องการ

คำถามพื้นฐานที่ปรากฏในใจของฉันคือ: ทำไมฉันต้องinitramfs? เคอร์เนล Linux ไม่สามารถบูตได้หากไม่มีระบบไฟล์เริ่มต้นใช่ไหม

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


2
คุณไม่สามารถทำได้หากไม่มี initramfs ความเป็นไปได้ที่จะทำโดยไม่มีไฟล์ initramfs เพิ่มเติม แต่ไม่ว่าคุณจะทำอะไรเคอร์เนลจะมีไฟล์เปล่าหรือไม่ ดังนั้นฉันไม่เข้าใจคำถามของคุณ - คุณกำลังพูดถึงการกระจายอะไร? คุณสร้างเคอร์เนลของคุณอย่างไร? คุณสามารถให้ไฟล์เคอร์เนล. config ได้หรือไม่ สิ่งเหล่านี้สำคัญมาก ฉันสงสัยว่า distro ของคุณกำลังรวบรวม initramfs ลงในเคอร์เนลโดยตรงและดังนั้นจึงเป็นการเติม initramfs ที่ว่างเปล่าไว้ในนั้น - แต่ฉันไม่สามารถรู้ได้จากข้อมูลที่คุณให้
mikeserv

2
@ mikeserv เห็นได้ชัดว่าตัวเริ่มต้นในตัว แต่ตัวเริ่มต้นว่าง / ไม่ได้ใช้จะไม่นับ
psusi

@psusi เคอร์เนล docs ไม่เห็นด้วย และฉันก็ยังยืนกรานเพียงเพราะมันไม่จำเป็นต้องมีความลึกลับใด ๆ - มัน/root- แค่นั้น - สิ่งเดียวที่มันแตกต่างกันคือswitch_rootแม้ว่าจะมีมาตรการป้องกันที่เหมาะสมพร้อมกับโมดูลเคอร์เนลที่โหลดแล้วบางอย่างก็สามารถทำได้ตลอดเวลา Initramfs ไม่มีอะไรมากไปกว่าดิสก์อิมเมจ - เต็มหรือไม่มันอยู่ที่นั่น และคุณไม่เคยขาดมัน - มันเป็นรากฐานของคุณ มันไม่ควรเป็นเรื่องลึกลับเป็นสิ่งที่ฉันคิดและฉันไม่ชอบความสับสนที่ไม่จำเป็นรอบตัว
mikeserv

2
@mikeserv, no, / root เป็นโฮมไดเรกทอรีสำหรับผู้ใช้รูท rootfs คือ / ซึ่งมีการติดตั้งรูทจริงไว้ด้านบน คุณเป็นเพียงการโต้แย้งความหมาย สำหรับวัตถุประสงค์ของการสนทนานี้การไม่มี initramfs หมายถึงการไม่มีไฟล์บนดิสก์ที่ตัวโหลดบูตของคุณต้องโหลดและส่งผ่านไปยังเคอร์เนล
psusi

นั่นเป็นความจริงฉันใช้ / รูทเพื่อความชัดเจนเท่านั้น แต่ฉันจะให้อันนั้นแก่คุณ แต่ไม่ใช่พวกเขาไม่ได้หมายถึงพวกเขาเป็นกลไกพื้นฐานของเคอร์เนลลินุกซ์ของคุณ สิ่งเหล่านี้เป็นสิ่งพื้นฐาน ให้ลองทำให้ถูกต้อง
mikeserv

คำตอบ:


12

ขนาดที่เพิ่มขึ้นของการมี initramfs ไม่ได้เกิดจากไดรเวอร์ ramfs (เป็นเพียงไม่กี่กิโลไบต์และจำเป็นสำหรับสิ่งอื่น ๆ อยู่ดี) แต่สำหรับตัว initramfs initramfs มีโปรแกรมที่จำเป็นในการรวบรวมและติดตั้งระบบไฟล์รูทจริง

Initramfs ทำให้ง่ายขึ้นมากและในบางกรณีเป็นไปได้ (เช่นเข้ารหัส/) เพื่อบูตระบบ ขอแนะนำอย่างยิ่งให้เก็บไว้ในฮาร์ดแวร์แบบพีซีที่มีอุปกรณ์ต่อพ่วงที่สามารถถอดเปลี่ยนได้จำนวนมาก ในทางกลับกันมันสมเหตุสมผลมากที่จะบู๊ตอุปกรณ์ฝังตัวที่ไม่มี initramfs ใด ๆ พร้อมเคอร์เนลที่รองรับการกำหนดค่าฮาร์ดแวร์เฉพาะที่สร้างขึ้น

เคอร์เนลของหลักสูตรต้องการบูตระบบไฟล์: ต้องมีวิธีในการโหลดแอปพลิเคชันที่คุณต้องการเรียกใช้ หากคุณจะไม่ทำงานอะไรเลยคุณอาจปิดเครื่องอยู่เช่นกัน

หากคุณไม่ต้องการใช้ initramfs เพียงบอก bootloader ของคุณว่าจะไม่ผ่าน ยังไม่รวมสิ่งใดสิ่งหนึ่งในผลลัพธ์ของการสร้างเคอร์เนลแน่นอนว่าจะเกิดอะไรขึ้นถ้าทั้งหมดเป็นสถาปัตยกรรม - และขึ้นอยู่กับ bootloader: ตัวอย่างเช่นvmlinuxและbzImageไม่รวม initramfs (เป็นดิบและเคอร์เนลที่บีบอัดตามลำดับ ) แต่uImage(สำหรับ U-Boot) จะบรรจุทั้งเคอร์เนลและ initramfs หากมีอยู่

(ในทางเทคนิคแล้วmikeserv notes จะมี initramfs เสมอ - แต่โดยค่าเริ่มต้นจะเป็นไฟล์เก็บถาวรขนาด 134 ไบต์สิ่งที่คุณเห็นและต้องการกำจัดก็คือชื่อ "true" ที่ไม่ว่างเปล่าที่สร้างโดย กระบวนการสร้างของคุณและมีเครื่องมือที่ใช้เพื่อเมาท์ระบบไฟล์รูท)

โปรดทราบว่า initramfs อาจเป็นวิธีที่สมเหตุสมผลในการสร้างระบบแอปพลิเคชันเดียวโดยไม่มีข้อมูลถาวร: ใส่แอปพลิเคชันทั้งหมดของคุณลงใน initramfs บูตและเก็บรักษาไว้ สิ่งนี้ทำให้ง่ายต่อการจัดระเบียบที่เก็บข้อมูลถาวรของคุณหรืออิมเมจสำหรับบูต (ทั้งหมดที่คุณต้องการคือเคอร์เนลและ initramfs ซึ่งสามารถรวมเข้าด้วยกันได้) วิธีการนี้มีข้อเสีย: ข้อมูลทั้งหมดใน initramfs จะถูกเก็บไว้ใน RAM อย่างถาวรและคุณไม่สามารถแก้ไขไฟล์ในอิมเมจสำหรับบูตได้อย่างง่ายดายคุณต้องสร้างไฟล์เก็บถาวรใหม่


หากคุณกำลังใช้เคอร์เนลลินุกซ์ 2.6 หรือใหม่กว่าคุณมี initramfs ไม่ว่าคุณจะใช้อิมเมจ initramfs รองหรือไม่ก็ตามเป็นเรื่องอื่น แต่ initramfs นั้นไม่ใช่ทางเลือก
mikeserv

2
@mikeserv คุณมีใช่ แต่ initramfs ที่ว่างเปล่าคือถั่วลิสง ไม่จำเป็นต้องใช้ (ซึ่งต้องการให้มีโปรแกรมมากพอที่จะติดตั้งรูทจริงซึ่งจะเพิ่มขนาดในแบบที่ไม่สามารถมองข้ามได้ในระบบฝังตัวทั่วไป)
Gilles 'หยุดความชั่วร้าย'

ถั่วลิสงภาคบังคับอยู่ดี และฉันไม่รู้เมื่อฉันพูดเป็นอย่างอื่น! ผู้ถามกำลังขอข้อมูลเกี่ยวกับวิธีลบออกเป็นระบบไฟล์ - ซึ่งเป็นไปไม่ได้
mikeserv

และใช่ว่าจะต้องมีการใช้งาน - หากไม่มี initramfs จะไม่มีรูท เคย
mikeserv

8

จากLFS :

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

...

มีเหตุผลหลักเพียงสี่ข้อในการมี initramfs ในสภาพแวดล้อม LFS: การโหลดรูทจากเครือข่ายโหลดจากโลจิคัลวอลุ่ม LVM มีรูตเข้ารหัสที่จำเป็นต้องใช้รหัสผ่านหรือเพื่อความสะดวกในการระบุรูทเป็น LABEL หรือ UUID สิ่งอื่นมักจะหมายความว่าเคอร์เนลไม่ได้รับการกำหนดค่าอย่างเหมาะสม

...

สำหรับการกระจายส่วนใหญ่โมดูลเคอร์เนลเป็นเหตุผลที่ดีที่สุดที่จะมี initramfs ในการแจกแจงทั่วไปมีสิ่งที่ไม่ทราบจำนวนมากเช่นชนิดระบบไฟล์และเค้าโครงดิสก์ ในทางนี้เป็นสิ่งที่ตรงกันข้ามกับ LFS ซึ่งเป็นที่รู้จักกันความสามารถของระบบและรูปแบบและเคอร์เนลที่กำหนดเองถูกสร้างขึ้นตามปกติ ในสถานการณ์นี้จำเป็นต้องใช้ initramfs

www.kernel.orgแหล่งอื่น

นอกจากนี้ยังมีระบบลีนุกซ์จำนวนมากที่เหมือนกับเราเตอร์ที่ไม่ได้ใช้ initramfs


1

คุณต้องการ initramfs สำหรับการตั้งค่าที่ซับซ้อนมากขึ้นเช่นการบูทเครือข่ายหรือ lvm หรือการโจมตีเนื่องจากต้องการยูทิลิตี้โหมดผู้ใช้บางอย่างเพื่อกำหนดค่าการเข้าถึงรูต fs สำหรับพาร์ติชันธรรมดาธรรมดาบนดิสก์จากนั้นตราบใดที่คุณมีไดรเวอร์ดิสก์ในตัวเคอร์เนลและระบุอาร์กิวเมนต์รูทตามพา ธ อุปกรณ์แทน UUID จากนั้นคุณสามารถทำได้โดยไม่ต้องมี initramfs แน่นอนว่าเส้นทางของอุปกรณ์อาจมีการเปลี่ยนแปลงขึ้นอยู่กับอุปกรณ์แบบพลักแอนด์เพลย์ (เช่น usb) ที่คุณเชื่อมต่อหรือแม้กระทั่งช่วงเวลาสุ่มแบบสุ่มซึ่งเป็นเหตุผลว่าทำไมทุกคนถึงใช้ uuids และ initramfs เพื่อความน่าเชื่อถือ


สิ่งนี้ยังไม่ถูกต้อง
mikeserv

6
@mikeserv ความคิดเห็นของคุณไม่มีประโยชน์ หากคุณจะอ้างว่าคุณต้องอธิบายว่าทำไม
psusi

ฉันได้ทำหรือมากกว่าเอกสารเคอร์เนลประกอบด้วย 99% ของคำตอบของฉันไม่
mikeserv

@mikeserv มันถูกต้อง ฉันใช้ Gentoo linux มาหลายปีแล้วโดยไม่ใช้ initramfs
ทิม

1

นี่เป็นคำถามเก่า แต่ก็ยังไม่ปรากฏว่ามีคำตอบที่ยอมรับดังนั้นฉันจะทิ้งมันไว้ที่นั่น (ฉันไม่มีผู้เชี่ยวชาญที่นี่ฉันพยายามจะคิดออกเอง)

จากhttps://www.kernel.org/doc/Documentation/early-userspace/README (ตลอดทางที่ด้านล่างซึ่งระบุว่ายังไม่ได้รับการอัปเดตตั้งแต่ปี 2004)

เคอร์เนลในปัจจุบันมี 3 วิธีในการเมาท์ระบบไฟล์รูท:

ก) ไดรเวอร์อุปกรณ์และระบบไฟล์ที่จำเป็นทั้งหมดรวบรวมไว้ในเคอร์เนลไม่มี initrd init / main.c: init () จะเรียก prepare_namespace () เพื่อติดตั้งระบบไฟล์รูทขั้นสุดท้ายโดยยึดตามตัวเลือก root = และทางเลือก init = เพื่อเรียกใช้งานไบนารีตัวอื่นที่นอกเหนือจากที่ระบุในตอนท้ายของ init / main.c: init ()

b) ไดรเวอร์อุปกรณ์และระบบไฟล์บางตัวที่สร้างขึ้นเป็นโมดูลและเก็บไว้ใน initrd initrd ต้องมีไบนารี '/ linuxrc' ซึ่งควรจะโหลดโมดูลไดรเวอร์เหล่านี้ นอกจากนี้ยังเป็นไปได้ที่จะเมานต์ระบบไฟล์รูทสุดท้ายผ่าน linuxrc และใช้ pivot_root syscall initrd ถูกเมานต์และดำเนินการผ่าน Prepar_namespace ()

c) ใช้ initramfs ต้องข้ามการเรียกไปที่ Prepar_namespace () ซึ่งหมายความว่าไบนารีจะต้องทำงานทั้งหมด ไบนารีที่บอกว่าสามารถเก็บไว้ใน initramfs ได้โดยการปรับเปลี่ยน usr / gen_init_cpio.c หรือผ่านรูปแบบ initrd ใหม่ซึ่งเป็นไฟล์เก็บถาวร cpio จะต้องเรียกว่า "/ init" ไบนารีนี้มีหน้าที่รับผิดชอบในการทำทุกอย่าง

เพื่อรักษาความเข้ากันได้ย้อนหลังไบนารี / init จะทำงานก็ต่อเมื่อมันมาถึงไฟล์เก็บถาวร initramfs cpio หากไม่ใช่กรณีนี้ init / main.c: init () จะเรียกใช้ Prepar_namespace () เพื่อเมานต์รูทสุดท้ายและดำเนินการหนึ่งในไบนารีเริ่มต้นที่กำหนดไว้ล่วงหน้า

สำหรับสิ่งที่คุ้มค่าฉันเชื่อว่าอุปกรณ์ / distros เช่น Raspberry Pi ฯลฯ ไม่ใช้ initramfs ในบางกรณีเคอร์เนลอยู่ในพาร์ติชั่นรูท (ติดตั้งโดย bootloader ซึ่งมีโมดูล fs ที่จำเป็น) ในกรณีอื่น ๆ ที่เคอร์เนลอยู่ใน/bootพาร์ติชันเช่นนั้น initramfs บนพาร์ติชั่นเดียวกันสามารถเข้าถึงได้โดยตรง ได้ระบุไว้

ในบางกรณี initramfs สามารถสร้างขึ้นในไฟล์เดียวกับเคอร์เนล แต่นี่ไม่ใช่กรณี (a) ดูเหมือนว่าจะค่อนข้างชัดเจนว่าในบางกรณี initramfs ไม่จำเป็น


0

ฉันพบคำอธิบายต่อไปนี้ชัดเจนยิ่งขึ้น

initramfsเป็นระบบไฟล์รูทที่ฝังอยู่ในเคอร์เนลและโหลดในระยะเริ่มต้นของกระบวนการบูต มันเป็นตัวตายตัวแทนของ initrd มันให้พื้นที่ผู้ใช้เริ่มต้นซึ่งสามารถทำสิ่งต่าง ๆ ที่เคอร์เนลไม่สามารถทำได้ด้วยตนเองในระหว่างกระบวนการบู๊ต

การใช้ initramfs เป็นทางเลือก โดยค่าเริ่มต้นเคอร์เนลเริ่มต้นฮาร์ดแวร์โดยใช้ไดรเวอร์ในตัวเมาท์พาร์ติชันรูทที่ระบุโหลดระบบ init ของการกระจาย Linux ที่ติดตั้ง จากนั้นระบบ init จะโหลดโมดูลเพิ่มเติมและเริ่มให้บริการจนกระทั่งในที่สุดช่วยให้คุณสามารถเข้าสู่ระบบนี่เป็นพฤติกรรมเริ่มต้นที่ดีและเพียงพอสำหรับผู้ใช้หลายคน initramfs สำหรับผู้ใช้ที่มีความต้องการขั้นสูง สำหรับผู้ใช้ที่ต้องทำสิ่งต่าง ๆ ให้เร็วที่สุดแม้กระทั่งก่อนที่จะติดตั้งพาร์ติชันรูท

นี่คือตัวอย่างของสิ่งที่คุณสามารถทำได้กับ initramfs:

  • เมาท์พาร์ติชันรูท (สำหรับพาร์ทิชันที่เข้ารหัสลอจิคัลและพิเศษ);
  • เตรียมกระสุนกู้ภัยแบบเรียบง่าย (ถ้ามีอะไรผิดปกติ);
  • กำหนดกระบวนการบู๊ตเอง (เช่นพิมพ์ข้อความต้อนรับ, บู๊ตสาด, ฯลฯ );
  • โหลดโมดูล (เช่นไดรเวอร์ของบุคคลที่สาม);
  • สิ่งที่เคอร์เนลไม่สามารถทำได้ (ตราบเท่าที่คุณสามารถทำได้ในพื้นที่ของผู้ใช้เช่นโดยการรันคำสั่ง) หากคุณไม่มีข้อกำหนดขั้นสูงคุณไม่จำเป็นต้องมี initramfs

-1

initramfsไม่ว่าสิ่งที่คุณทำคุณมี ไม่มีการดำเนินการใด ๆ หากไม่มีมันเป็นระบบไฟล์เดียวที่กำหนดให้กับคุณ จากkernel.org :

รูทคืออะไร?

Rootfsเป็นตัวอย่างพิเศษramfs(หรือtmpfs,ถ้าที่เปิดใช้งาน) ซึ่งเป็น ปัจจุบันอยู่เสมอในระบบ 2.6 คุณไม่สามารถเลิกเมานท์ได้rootfsด้วยเหตุผลเดียวกันกับที่คุณไม่สามารถฆ่ากระบวนการเริ่มต้น แทนที่จะมีรหัสพิเศษเพื่อตรวจสอบและจัดการรายการว่างเปล่ามันมีขนาดเล็กลงและง่ายขึ้นสำหรับเคอร์เนลเพื่อให้แน่ใจว่ารายการบางรายการไม่สามารถว่างเปล่าได้

ระบบส่วนใหญ่ก็ติดระบบแฟ้มอื่นมากกว่าrootfsและไม่สนใจมัน จำนวนพื้นที่ว่างของอินสแตนซ์ที่ว่างเปล่าของ ramfs ใช้เวลาน้อยมาก

หากเปิดใช้งาน* CONFIG_TMPFS *rootfsจะใช้tmpfsแทนramfsค่าเริ่มต้น ที่จะมีผลบังคับใช้ramfs,เพิ่ม"rootfstype=ramfs"บรรทัดคำสั่งเคอร์เนล

initramfs คืออะไร

2.6 เคอร์เนล Linux ทั้งหมดมีไฟล์"cpio"เก็บถาวรรูปแบบgzippedซึ่งจะถูกแยกออกมาrootfsเมื่อเคอร์เนลบูทขึ้น เคอร์เนลจะตรวจสอบว่าrootfsมีไฟล์อยู่"init"หรือไม่และถ้าเป็นเช่นนั้นจะเรียกใช้งานเป็น PID 1 หากพบinitกระบวนการนี้มีความรับผิดชอบในการนำระบบที่เหลือมารวมถึงการค้นหาและติดตั้งอุปกรณ์รูทจริง ( ถ้ามี). หากrootfsไม่มีinitโปรแกรมหลังจากcpioแยกไฟล์เก็บถาวรที่ฝังตัวลงเคอร์เนลจะผ่านไปยังรหัสเก่าเพื่อค้นหาและติดตั้งพาร์ติชันรูทจากนั้นเรียกใช้งานตัวแปรที่แตกต่าง/sbin/initจากนั้น

ทั้งหมดนี้แตกต่างจากตัวเริ่มต้นเก่าในหลายวิธี:

  • initrd เก่าเป็นไฟล์แยกต่างหากเสมอในขณะที่ไฟล์เก็บถาวร initramfs เชื่อมโยงกับเคอร์เนลอิมเมจลินุกซ์ (ไดเรกทอรี linux - * / usr ใช้เพื่อสร้างไฟล์เก็บถาวรนี้ในระหว่างการสร้าง)

  • ไฟล์ initrd เก่าเป็นอิมเมจระบบไฟล์ gzipped (ในบางรูปแบบไฟล์เช่น ext2 ที่ต้องการไดรเวอร์ที่สร้างไว้ในเคอร์เนล) ในขณะที่ไฟล์เก็บถาวร initramfs ใหม่เป็นไฟล์เก็บถาวร gzipped cpio (เช่น tar เพียงง่ายกว่าดู cpio (1) และเอกสารประกอบ / early-userspace / buffer-format.txt) รหัสการสกัด cpio ของเคอร์เนลไม่เพียง แต่เล็กมากเท่านั้น แต่ยังรวมถึงข้อความและข้อมูลที่สามารถละทิ้งได้ในระหว่างกระบวนการบู๊ต

  • โปรแกรมที่รันโดย initrd เก่า (ซึ่งเรียกว่า / initrd, ไม่ใช่ / init) ทำการตั้งค่าบางอย่างจากนั้นกลับสู่เคอร์เนลในขณะที่โปรแกรม init จาก initramfs ไม่คาดว่าจะกลับไปที่เคอร์เนล (หาก / init จำเป็นต้องปิดการควบคุมมันสามารถ overmount / ด้วยอุปกรณ์รูทใหม่และดำเนินการโปรแกรม init อื่นดูโปรแกรมอรรถประโยชน์ switch_root ด้านล่าง)

  • เมื่อเปลี่ยนอุปกรณ์รูทเครื่องอื่น initrd จะ pivot_root จากนั้นติดตั้ง ramdisk แต่initramfs เป็น rootfs: คุณไม่สามารถ pivot_root rootfs หรือเลิกเมานท์ แทนที่จะลบทุกอย่างออกจาก rootfs เพื่อเพิ่มพื้นที่ว่าง (ค้นหา -xdev / -exec rm '{}' ';'), overmount rootfs ด้วย root ใหม่ (cd / newmount; mount --move. /; chroot.) แนบ stdin / stdout / stderr กับใหม่ / dev / console และดำเนินการ init ใหม่

เนื่องจากนี่เป็นกระบวนการที่ใช้ความพยายามอย่างน่าทึ่ง (และเกี่ยวข้องกับการลบคำสั่งก่อนที่คุณจะสามารถรันได้) แพ็คเกจ klibc แนะนำโปรแกรมผู้ช่วยเหลือ (utils / run_init.c) เพื่อทำสิ่งนี้ให้คุณ แพ็คเกจอื่น ๆ ส่วนใหญ่ (เช่น busybox) ได้ตั้งชื่อคำสั่งนี้ว่า "switch_root"

การเติม initramfs:

กระบวนการสร้างเคอร์เนล 2.6 จะสร้างไฟล์เก็บถาวร initramfs รูปแบบ gzipped cpio เสมอและเชื่อมโยงเข้ากับเคอร์เนลไบนารีผลลัพธ์ โดยค่าเริ่มต้นการเก็บถาวรนี้ว่างเปล่า (บริโภค 134 ไบต์บน x86)

ตัวเลือกการกำหนดค่า CONFIG_INITRAMFS_SOURCE (ในการตั้งค่าทั่วไปใน menuconfig และการใช้ชีวิตใน usr / Kconfig) สามารถใช้ในการระบุแหล่งที่มาสำหรับการเก็บถาวร initramfs ซึ่งจะถูกรวมเข้ากับไบนารีผลลัพธ์ ตัวเลือกนี้สามารถชี้ไปยังการเก็บถาวร cpio gzipped ที่มีอยู่ไดเรกทอรีที่มีไฟล์ที่จะเก็บถาวรหรือข้อกำหนดไฟล์ข้อความเช่นตัวอย่างต่อไปนี้:

  dir /dev 755 0 0
  nod /dev/console 644 0 0 c 5 1
  nod /dev/loop0 644 0 0 b 7 0
  dir /bin 755 1000 1000
  slink /bin/sh busybox 777 0 0
  file /bin/busybox initramfs/busybox 755 0 0
  dir /proc 755 0 0
  dir /sys 755 0 0
  dir /mnt 755 0 0
  file /init initramfs/init.sh 755 0 0

เรียกใช้ "usr / gen_init_cpio" (หลังเคอร์เนลบิลด์) เพื่อรับข้อความการใช้งานที่บันทึกในรูปแบบไฟล์ด้านบน

ข้อดีอย่างหนึ่งของไฟล์กำหนดค่าคือไม่จำเป็นต้องเข้าถึงรูทเพื่อตั้งค่าการอนุญาตหรือสร้างโหนดอุปกรณ์ในไฟล์เก็บถาวรใหม่ (โปรดทราบว่าทั้งสองตัวอย่างรายการ "ไฟล์" คาดว่าจะค้นหาไฟล์ชื่อ "init.sh" และ "busybox" ในไดเรกทอรีชื่อ "initramfs" ภายใต้ไดเรกทอรี linux-2.6. * ดูที่เอกสาร / ผู้ใช้เร็ว / README สำหรับ รายละเอียดเพิ่มเติม.)

เคอร์เนลไม่ได้ขึ้นอยู่กับเครื่องมือ cpio ภายนอก หากคุณระบุไดเรกทอรีแทนไฟล์กำหนดค่าโครงสร้างพื้นฐานการสร้างของเคอร์เนลจะสร้างไฟล์การกำหนดค่าจากไดเรกทอรีนั้น (usr / Makefile เรียกใช้สคริปต์ / gen_initramfs_list.sh) และดำเนินการจัดทำแพ็กเกจไดเรกทอรีนั้นโดยใช้ไฟล์กำหนดค่า (โดยป้อนไปที่ usr / gen_init_cpio ซึ่งสร้างจาก usr / gen_init_cpio.c) โค้ดการสร้าง cpio build-time ของเคอร์เนลมีอยู่ในตัวเองอย่างสมบูรณ์และตัวแยกเวลาบูตของเคอร์เนลก็มีอยู่ในตัวด้วย (ชัดเจน)


1
คุณสามารถบู๊ตได้โดยไม่ต้องมี initramfs คำตอบของคุณจะเน้นไปที่ข้อดีของ initramfs แต่ไม่สามารถใช้ได้กับระบบฝังตัวทั่วไปและแม้กระทั่งบนเดสก์ท็อปหรือเซิร์ฟเวอร์ที่แนะนำให้ใช้ initramfs แต่ก็ไม่ได้บังคับ
Gilles 'ดังนั้นหยุดความชั่วร้าย'

@Gilles - คุณไม่สามารถ ไม่ว่าคุณจะทำอะไรคุณมี initramfs มันถูกคอมไพล์ลงในเคอร์เนล - ตอนนี้เคอร์เนลของคุณเคอร์เนลของฉันทั้งหมดของเคอร์เนลของเรา อ่าน kernel docs - โพสต์ทั้งหมดของฉันเป็น copy-paste คุณไม่ถูกต้อง คุณจะโต้แย้งเอกสารอย่างเป็นทางการได้อย่างไร
mikeserv

1
ฉันไม่ได้โต้แย้งเอกสารอย่างเป็นทางการฉันโต้แย้งข้อสรุปที่คุณวาดไว้ คุณกำลังอ่านเอกสารที่อธิบายวิธีใช้ initramfs ไม่มีการระบุว่าต้องใช้ initramfs
Gilles 'หยุดความชั่วร้าย'

@Gilles หากสิ่งนี้ไม่ดีพอ: "กระบวนการสร้างเคอร์เนล 2.6 จะสร้างไฟล์เก็บถาวรรูปแบบ cpio เริ่มต้นและเชื่อมโยงไปยังฐานข้อมูลเคอร์เนลผลลัพธ์โดยค่าเริ่มต้นไฟล์เก็บถาวรนี้ว่างเปล่า (ใช้ 134 ไบต์บน x86) .... " ฉันสามารถทำได้ดีกว่า. ด้านบนคือการค้นหาเว็บ 2 หรือ 3 นาที
mikeserv

3
ฉันอ่านเอกสารแล้ว ฉันทำเพื่อหาเลี้ยงชีพ มันไม่ใช่เรื่องของความเห็น มี initramfs เสมอ แต่ไม่จำเป็นต้องใช้สำหรับการบูต ฉันไม่สามารถหาคำอธิบายที่เหมาะสมของโครงสร้างเคอร์เนลสำหรับกรณีนี้ได้เนื่องจากเป็นกรณีคลาสสิคที่คิดว่าไม่รับประกันคำอธิบาย ตรรกะหลักอยู่ในdo_mounts.c- โดยเฉพาะprepare_namespaceซึ่งsaved_root_nameมาพร้อมกับroot=อาร์กิวเมนต์บรรทัดคำสั่ง
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.