สร้างภาพเคอร์เนล (.img) รวมถึง ramdisk


12

ฉันได้สร้างเคอร์เนล Linux (3.0.1) สำหรับ Raspberry Pi ของฉันด้วยขั้นตอนต่อไปนี้:

1. Downloading kernel source
2. tar xvf source.tar.bz2
3. downloading arm cross compilation tool.
4. tar xvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
5. setting up path for cross tool export PATH=$PATH:/home/shan/<cross tool folder>/bin/
6. after entering linux source dir make ARCH=arm versatile_defconfig (is this reliable   with raspberry pi)
7. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
8. zImage is generated in /arch/arm/boot

คำถามของฉันคือฉันจะสร้าง kernel.img ได้อย่างไร ฉันคิดว่ามันมี zImage + ramdisk แต่ฉันจะสร้างมันได้อย่างไร

ใครช่วยแนะนำให้ฉันทำ ramdisk และแพ็คทั้งสองนี้เป็นไฟล์ kernel.img ฉันต้องการบูตเคอร์เนลนี้บน Raspberry Pi ของฉัน


นี่เป็นคำถามที่ยอดเยี่ยมที่ฉันยังไม่ได้ถาม
Jivings

ทำไมคุณใช้เคอร์เนล 3.0.1 พบวานิลลาเคอร์เนลในkernel.orgสถานที่หรือไม่
Krzysztof Adamski

ใช่ฉันได้พบสิ่งนี้จาก kernel.org
Shantanu Banerjee

ฉันได้เพิ่มคำถามใหม่เกี่ยวกับ qemu และเคอร์เนล raspberry pi-2 crosscompiled กับ busybox ใน initramfs: raspberrypi.stackexchange.com/questions/56302/ …
42n4

คำตอบ:


8

ไฟล์ kernel.img

เมื่อใช้ลินุกซ์เคอร์เนลไฟล์เป็นเพียงการเปลี่ยนชื่อkernel.img linux/arch/arm/boot/Imageมันก็ควรจะเป็นไปได้ (หรืออย่างน้อยมันเป็นไปได้ครั้งสุดท้ายที่ผมตรวจสอบ) ที่จะใช้เวอร์ชันบีบอัดไฟล์นี้ zImage- มันสามารถมีแบบบูรณาการinitramfs(ramdisk) แต่มันไม่จำเป็น ตัวอย่างเช่นkernel.imgไฟล์หุ้นไม่มีinitramfsในขณะที่kernel_emergency.imgทำ

หมายเหตุ:คู่มือการรวบรวมเคอร์เนลอย่างเป็นทางการในeLinux wikiแนะนำให้คุณใช้imagetool-uncompressed.pyเครื่องมือในการเตรียมkernel.imgไฟล์ มันจำเป็นในช่วงแรก ๆ ของ RaspberyPi แต่ปัจจุบัน bootloader สามารถจัดการไฟล์ปกติImageและzImageไฟล์ต่างๆได้

ปัญหาที่มาของเคอร์เนล

สิ่งสำคัญคือเมื่อสร้างเคอร์เนลสำหรับ RaspberryPi คุณไม่สามารถใช้รุ่นใด ๆ ได้เลย เฉพาะเวอร์ชันพิเศษที่พอร์ตไปยัง RaspberryPi จะทำงานได้ น่าเสียดายที่เวอร์ชันอัปสตรีมปัจจุบัน (พบในkernel.orgไซต์) เข้ากันไม่ได้กับ RaspberryPi นอกจากนี้versatil_configไม่ดีสำหรับ RaspberryPi คุณควรใช้bcmrpi_defconfigแทน (ที่พบในแหล่ง RaspberryPi เคอร์เนลเข้ากันได้) หรือbcmrpi_emergency_defconfigถ้าแผนของคุณเกี่ยวกับการใช้ initramfsBuildin

คำแนะนำในการสร้างเคอร์เนล

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

  1. ดาวน์โหลด toolchain อย่างเป็นทางการในการสร้างของคุณเอง ฉันคิดว่ามันติดตั้งมา/usr/bin/arm-linux-gnueabi-*แล้ว หากคุณมีที่อื่นคุณควรเปลี่ยนตัวCROSS_COMPILEเลือกในmakeคำสั่งทั้งหมดของคุณ

  2. ไปที่https://github.com/raspberrypi/linuxไซต์ที่คุณสามารถค้นหา RapsberryPi kernel อย่างเป็นทางการ คุณสามารถดาวน์โหลดรหัสได้สองวิธี:

    • ในฐานะที่เป็นไฟล์บีบอัด (เพื่อใช้ตัวเลือกนี้คุณไม่จำเป็นต้องติดตั้งgitยูทิลิตี้และคุณสามารถทำได้แม้ใน RapsberryPi เอง): คลิกที่ZIPไอคอนCodeแท็บด้านล่างเล็กน้อยที่ด้านบนของเว็บไซต์ สิ่งนี้จะช่วยให้คุณสามารถดาวน์โหลดไฟล์ต้นทางเป็นzipไฟล์ คุณสามารถใช้คอมไพล์เพื่อทำสิ่งนี้แทน แต่ (ตามที่อธิบายไว้ในวิกิ) จะต้องใช้พื้นที่และเวลามากขึ้น จากนั้นขยายขนาดไฟล์เพื่อรับแผนผังต้นกำเนิด
    • การใช้gitยูทิลิตี้ (สิ่งนี้ไม่ได้ผลสำหรับฉันบน RaspberryPi เนื่องจากมี RAM อยู่เล็กน้อย แต่น่าจะทำงานได้ดีบนระบบเดสก์ท็อป ( --depth 1อาร์กิวเมนต์สำหรับบันทึกซึ่งป้องกันไม่ให้ git ดาวน์โหลดประวัติการพัฒนาทั้งหมด (ซึ่งมีขนาดใหญ่มาก):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. ใช้การกำหนดค่าเริ่มต้นที่จัดทำโดยมูลนิธิ:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. เรียกใช้make oldconfigและตอบคำถามบางข้อ (ควรกด Enter ในแต่ละคำถามโดยเว้นคำตอบเริ่มต้น):

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
    
  5. รวบรวมเคอร์เนล:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. คัดลอกโมดูลเคอร์เนลไปที่/tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. ใช้Imageไฟล์เป็นkernel.img

  8. อัปโหลดโมดูลทั้งหมดไปยังจาก/tmp/modules/lib/modules/ในคอมพิวเตอร์ของคุณไปยัง/lib/modules/ไดเรกทอรีบนรูต RaspberryPi ของคุณ

การเพิ่ม initramfs

นี้ไม่ได้ให้คำแนะนำเกี่ยวกับวิธีการสร้างinitramfsอย่างไร เนื่องจากนี่เป็นหัวข้อที่กว้างมาก (โดยทั่วไปคุณต้องสร้างสภาพแวดล้อม Linux userspace ที่ทำงานได้จริงไม่มีข้อ จำกัด ว่ามันซับซ้อนแค่ไหน) ฉันจะไม่พูดถึงเรื่องนี้ในตอนนี้ ฉันจะทราบว่าinitramfsสามารถใช้ในสองรูปแบบที่แตกต่างกัน - แบบสแตนด์อโลนที่มันเป็นไฟล์แยกและ buildin ที่มันถูกรวมเข้ากับไฟล์ภาพเคอร์เนล (เหมือนในkernel_emergency.img) ตัวเลือกที่สองควรได้รับการสนับสนุนโดย bootloader RaspberryPi แต่มีข่าวลือบางอย่างว่ามันเสียในเวอร์ชั่นเฟิร์มแวร์ปัจจุบันดังนั้นคุณควรใช้เวอร์ชั่น buildin

วิธีที่ดีที่สุดในการเริ่มต้นคือการใช้เนื้อหา initramfs ที่ใช้งานได้ (ซึ่งถูกใช้สำหรับ kernel_emergency.img) โดยการดาวน์โหลดจากที่เก็บ gitub พื้นฐานอื่นและหลังจากคุณสามารถบูตเคอร์เนลโดยใช้iniramfsอิมเมจนี้ลองสร้างของคุณเอง สิ่งที่ควรจำเป็นสำหรับสิ่งนี้คือให้ชี้ไปที่CONFIG_INITRAMFS_SOURCEตัวเลือกการกำหนดค่าเคอร์เนลไดเรกทอรีที่ดาวน์โหลด

หมายเหตุสุดท้าย

ดังนั้นคุณควรทำใน 3 ขั้นตอน:

  1. ลองสร้างและบูทเคอร์เนลโดยไม่มีinitramfsไฟล์
  2. ลองเพิ่มinitramfsเนื้อหาที่พร้อมในเคอร์เนลของคุณ
  3. เปลี่ยนinitramfsเนื้อหานี้เพื่อให้เหมาะกับความต้องการของคุณ

1
ที่ดีเขียนขึ้น แต่คุณไม่ควรใช้zip; gitถ่ายโอนไฟล์อย่างมีประสิทธิภาพและคุณสามารถใช้depth=1เพื่อป้องกันประวัติการดาวน์โหลด (ฉันคิดว่า)
อเล็กซ์แชมเบอร์เลน

ใช่มันเป็นเรื่องจริง แต่การพยายามทำสิ่งนี้กับ RaspberryPi นั้นไม่ใช่ความคิดที่ดีจริงๆ การดาวน์โหลด zip ใช้งานได้ดีในทางกลับกัน ฉันจะเพิ่มบันทึกย่อเกี่ยวกับการใช้คอมไพล์ด้วย
Krzysztof Adamski

การรวบรวมเคอร์เนลบน Raspberry Pi เป็นแนวคิดที่น่ากลัวในตัวมันเอง
อเล็กซ์แชมเบอร์เลน

@AlexChamberlain: มันช้ามาก แต่ก็เป็นไปได้แน่นอน (ฉันทำเอง) ใช้เวลาหนึ่งคืนดังนั้นมันจึงไม่เลว นอกจากนั้นทำไมมันช่างน่ากลัวจัง?
Krzysztof Adamski

ถ้าฉันใช้ bcmrpi_emergency_defconfig มันจะมี initramfs หรือไม่?
Shantanu Banerjee

0

หากคุณใช้ Debian รุ่นเดียวกันทั้งคู่โดยใช้ X-Apt, dpkg-cross ฯลฯ ... และเครื่องมือ emdebian สามารถทำงานได้ดีมาก

ที่มา: ใช้เพื่อพัฒนาแอป c ++ สำหรับระบบ ARM แบบฝังที่รัน emdebian

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.