เกิดอะไรขึ้นในแต่ละขั้นตอนของกระบวนการสร้างเคอร์เนล Linux


27

ฉันได้อ่านแบบฝึกหัดมากมายเกี่ยวกับวิธีสร้างเคอร์เนลที่กำหนดเองและการบูต Ubuntu โดยใช้เมล็ดเหล่านั้นและทำตามคำแนะนำและเมล็ดที่กำหนดเองที่บู๊ตเรียบร้อยแล้ว แต่ฉันไม่เข้าใจเกี่ยวกับสิ่งที่คำสั่งแต่ละคำสั่งในไกด์ทำ แต่ละคำสั่ง

ขั้นตอนที่อธิบายในเว็บไซต์ของ Ubuntuไม่มากของการทำงานกับfakeroot, dpkg, make-kpkg, initramfs บางส่วนและสิ่งที่น่ากลัวอื่น ๆ ที่ผลงาน แต่ก็ไม่ได้ช่วยให้ฉันเข้าใจสิ่งที่เกิดขึ้น

  • เอาต์พุตของอะไรmakeในไดเร็กทอรีเคอร์เนล linux?
  • มันสร้าง "ภาพเคอร์เนลที่บีบอัด" หรือไม่?
  • ไฟล์ "บีบอัดอิมเมจเคอร์เนล" ชื่ออะไรและวางไว้ที่ไหน
  • อะไรmake modulesทำอย่างไร
  • ควรmake modulesจะทำก่อนหรือหลังmake?
  • ไม่ได้makeสร้างโมดูลของฉันโดยอัตโนมัติหรือไม่
  • กระบวนการ (เป็นภาษาอังกฤษไม่ใช่แค่รายการคำสั่ง) ของการเพิ่มเมล็ดที่สร้างขึ้นใหม่ลงในรายการของเมล็ดที่สามารถบู๊ตได้?
  • อะไรmake installทำอย่างไร
  • จะmake installเพิ่มลงในรายการเคอร์เนลที่ใช้บู๊ตได้หรือไม่เพื่อไม่ต้องทำอะไรอีก
  • มีสิ่งที่เทียบเท่าmake modules_installหรือไม่?

สิ่งนี้ควรแบ่งออกเป็นหลายคำถาม
Ciro Santilli 新疆改造中心法轮功六四事件

คำตอบ:


34

จากด้านบน...

  • makeรวบรวมและเชื่อมโยงภาพเคอร์เนล vmlinuzนี้เป็นไฟล์เดียวชื่อ
  • make modulesรวบรวมแต่ละไฟล์สำหรับคำถามที่คุณตอบMในระหว่างการตั้งค่าเคอร์เนล รหัสวัตถุเชื่อมโยงกับเคอร์เนลที่สร้างขึ้นใหม่ของคุณ (สำหรับคำถามที่ตอบYแล้วสิ่งเหล่านี้เป็นส่วนหนึ่งของvmlinuzและสำหรับคำถามที่ตอบNแล้วจะถูกข้ามไป)
  • make install/vmlinuzติดตั้งเคอร์เนลของคุณเพื่อสร้าง
  • make modules_installการติดตั้งโมดูลเคอร์เนลของคุณไปหรือ/lib/modules/lib/modules/<version>

สำหรับการเพิ่มลงในรายการของเมล็ดที่มีอยู่นั้นจะถูกดูแลโดยตัวโหลดการบูต มันแตกต่างกันสำหรับบูตโหลดเดอร์แต่ละตัว แต่grubพบมากที่สุดใน x86 และ amd64 ดังนั้นฉันจะอธิบายอย่างนั้น จริงๆแล้วมันค่อนข้างง่าย ด้วงรูปลักษณ์ใน/, /bootและ/lib/modulesสำหรับสิ่งใด ๆ ที่ดูเหมือนว่ามันอาจจะเป็นเคอร์เนลทำงานและเพิ่ม และใช่นี่เป็นคำอธิบายที่ธรรมดามาก

"สิ่งที่น่ากลัว" นั้นในเอกสาร Ubuntu เป็นสิ่งพิเศษในการสร้างdebแพ็คเกจ เมื่อคุณทำมันให้มากกว่าตัวคุณมันจะดีกว่าที่จะบรรจุ คุณจะเปลี่ยนเวลา

การสร้างเคอร์เนลและโมดูลนั้นแยกจากกันเพราะสำหรับคนที่ต้องการ (เช่นนักพัฒนาเคอร์เนล) พวกเขามักจะทำการเปลี่ยนแปลงเฉพาะโมดูล พวกเขาสามารถใช้การเปลี่ยนแปลงสร้างใหม่และติดตั้งเพียงโมดูล สิ่งนี้ช่วยประหยัดเวลาได้มากเมื่อต้องทำ 20 ครั้งต่อวัน มันจะไม่ถูกปรับปรุงให้มีmake everythingคำสั่งเดียว คุณแทนทำงานเช่นเดียวกับเอกสารกล่าวว่าจะทำอย่างไรmake && make modules && make install && make modules_install กระบวนการสร้างสนับสนุนนักพัฒนาเคอร์เนลไม่ใช่คุณ และนั่นคือวิธีที่ควรจะเป็น

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

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


1
ขอบคุณมากสำหรับคำอธิบายที่มนุษย์อ่านได้ของกระบวนการนี้ ฉันมีข้อสงสัยเล็กน้อย การรวบรวมเคอร์เนลของฉันผลิต vmlinux ไม่ใช่ vmlinuz ฉันคิดว่าความแตกต่างคือการบีบอัด ฉันควรบีบอัดภาพด้วยตนเองหรือไม่? คือ/vmlinuzไดเรกทอรีในโฟลเดอร์ราก? เมื่อฉันทำการติดตั้ง make จะมีการสร้างไดเรกทอรีนี้และเคอร์เนลใหม่จะถูกวางไว้ที่นั่นหรือไม่ จะmake modules_installแทนที่โมดูลที่ติดตั้งอยู่ในปัจจุบันของฉันหรือไม่ สมมติว่าฉันวาง vmlinux ของฉันใน / boot directory ฉันต้องทำอย่างอื่น (เช่นแก้ไขไฟล์การตั้งค่า grub และทำ grub-update หรืออะไรหลังจากนั้น?)
AnkurVj

3
คุณพูดถูกความแตกต่างคือการบีบอัด คำสั่งmake bzimageคือสิ่งที่ทำ /vmlinuzเป็นไฟล์ไบนารีไม่ใช่ไดเรกทอรี ฉันได้ทำเฉพาะเมล็ดข้าวบรรจุในช่วง 5 ปีที่ผ่านมาดังนั้นฉันจำไม่ได้ว่าพฤติกรรมของmodules_installเคอร์เนลที่ติดตั้งโดยตรง ด้วงจะค้นหาเคอร์เนลของคุณใน/bootโดยไม่มีความช่วยเหลือ ใช่คุณควรเรียกใช้grub-updateหลังจากติดตั้งเคอร์เนลใหม่
บาฮามาต

ดังนั้นฉันควรจะทำmake bzimageแทนmake? ฉันจะต้องทำmake cleanและmake bzimageอีกครั้ง? โดย/vmlinuzที่คุณหมายถึงไฟล์จะถูกสร้างขึ้นในไดเรกทอรีรากหรือในไดเรกทอรีลินุกซ์เคอร์เนลที่มา?
AnkurVj

1
มันไม่สำคัญเลยว่าเคอร์เนลของคุณจะถูกบีบอัดหรือไม่ ไม่มีการบีบอัดจะใช้พื้นที่ดิสก์เพิ่มขึ้นเล็กน้อย สิ่งที่นำหน้าด้วย/คือพา ธ สัมบูรณ์ดังนั้นใช่นั่นคือไฟล์ในรูท
บาฮามาต

1
@GuyAvraham โมดูลตอบYรวบรวมใน (เช่นพวกเขาเป็นส่วนหนึ่งของ vmlinuz) โมดูลที่ได้รับคำตอบMจะถูกรวบรวมเป็นโมดูลที่โหลดได้ โมดูลที่ได้รับคำตอบNจะไม่ได้รับการรวบรวม make modules_installใช้กับผู้ที่ได้รับคำตอบMเท่านั้น
บาฮามาต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.