membangun image kernel (.img) termasuk ramdisk

12

Saya telah membangun kernel Linux (3.0.1) untuk Raspberry Pi saya dengan langkah-langkah berikut:

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

Pertanyaan saya adalah, bagaimana saya bisa membangun kernel.img? Saya pikir ini berisi zImage + ramdisk tetapi bagaimana saya bisa membangun ini?

Adakah yang bisa membimbing saya untuk membuat ramdisk dan mengemas keduanya ke file kernel.img? Saya ingin mem-boot kernel ini pada Raspberry Pi saya.

Shantanu Banerjee
sumber
Ini adalah pertanyaan bagus yang saya terkejut belum ditanyakan.
Jivings
Mengapa Anda menggunakan kernel 3.0.1? Apakah kernel vanilla ini ditemukan di kernel.orgsitus?
Krzysztof Adamski
ya, saya telah menemukan ini dari kernel.org
Shantanu Banerjee
Saya telah menambahkan pertanyaan baru tentang qemu dan crosscompiled raspberry pi-2 kernel dengan busybox di initramfs: raspberrypi.stackexchange.com/questions/56302/…
42n4

Jawaban:

8

file kernel.img

Saat menggunakan kernel Linux, kernel.imgfile baru saja diganti namanya linux/arch/arm/boot/Image. Seharusnya juga dimungkinkan (atau setidaknya itu mungkin terakhir kali saya periksa) untuk menggunakan versi terkompresi dari file ini - zImage. Ini dapat berisi terintegrasi initramfs(ramdisk) tetapi tidak diperlukan. Sebagai contoh, kernel.imgfile stok tidak mengandung initramfssementara kernel_emergency.imgtidak.

Catatan: Panduan kompilasi kernel resmi pada eLinux wiki menyarankan Anda untuk menggunakan imagetool-uncompressed.pyalat untuk menyiapkan kernel.imgfile. Itu diperlukan pada hari-hari awal RaspberyPi tetapi saat ini bootloader dapat menangani file biasa Imagedan zImage.

Masalah sumber kernel

Yang sangat penting adalah bahwa ketika membangun kernel untuk RaspberryPi, Anda tidak bisa hanya menggunakan versi apa pun darinya. Hanya versi khusus yang porting ke RaspberryPi yang akan berfungsi. Sayangnya, versi hulu saat ini (ditemukan di kernel.orgsitus) tidak kompatibel dengan RaspberryPi. Selain itu, versatil_configini tidak baik untuk RaspberryPi, Anda sebaiknya menggunakan bcmrpi_defconfig(ditemukan pada sumber kernel yang kompatibel RaspberryPi) atau bcmrpi_emergency_defconfigjika rencana Anda menggunakan buildin initramfs.

Instruksi pembangunan kernel

Tempat terbaik untuk mengambil sumber kernel untuk RaspberryPi ada di yayasan github . Anda juga dapat menemukan penjelasan yang berguna tentang cara mendapatkannya dan cara mengompilasinya di wiki resmi RasbperryPi . Inilah versi kecil saya dari langkah-langkah yang terlibat (CATATAN: Saya berasumsi Anda ingin melakukan crosscompile kernel. Ini jauh lebih cepat dan harus membuat hasil yang sama tetapi membangun kernel secara native di RaspberryPi juga dimungkinkan):

  1. Unduh toolchain resmi di buat sendiri. Cara Eigher, saya asssume itu dipasang di /usr/bin/arm-linux-gnueabi-*. Jika Anda memilikinya di tempat lain, Anda harus mengubah CROSS_COMPILEopsi di semua makeperintah Anda .

  2. Pergi ke https://github.com/raspberrypi/linux situs di mana Anda dapat menemukan sumber kernel RapsberryPi resmi. Anda dapat mengunduh kode dengan dua cara:

    • Sebagai file terkompresi (untuk menggunakan opsi ini Anda tidak harus menginstal gitutilitas dan Anda dapat melakukan ini bahkan di RapsberryPi sendiri): Klik ZIPikon, Codetab di bawah ini sedikit di bagian atas situs. Ini seharusnya memungkinkan Anda mengunduh file sumber sebagai zipfile. Anda bisa menggunakan git untuk melakukan ini, tetapi itu (seperti yang dijelaskan pada wiki) akan membutuhkan lebih banyak ruang dan waktu. Kemudian dekompres file tersebut untuk mendapatkan source tree.
    • Menggunakan gitutilitas (ini tidak bekerja untuk saya di RaspberryPi karena mungkin ada sedikit RAM tetapi harus bekerja dengan baik pada sistem desktop (perhatikan --depth 1argumen yang mencegah git mengunduh seluruh riwayat pengembangan (yang sangat besar):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. Gunakan konfigurasi default yang disediakan oleh yayasan:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. Jalankan make oldconfigdan jawab beberapa pertanyaan (itu boleh saja untuk menekan enter di setiap pertanyaan meninggalkan jawaban default):

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
    
  5. Kompilasi kernel:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. Salin modul kernel ke /tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Gunakan Imagefile sebagaikernel.img

  8. Unggah semua modul ke dari /tmp/modules/lib/modules/di komputer Anda ke /lib/modules/direktori di rootfs RaspberryPi Anda.

Menambahkan initramfs

Namun ini tidak memberikan instruksi tentang cara membuat initramfs. Karena ini adalah topik yang sangat luas (pada dasarnya, Anda harus membuat lingkungan pengguna Linux yang berfungsi semut, tidak ada batasan seberapa rumitnya), saya tidak akan membahasnya di sini sekarang. Saya hanya akan mencatat bahwa initramfsdapat digunakan dalam dua bentuk yang berbeda - satu, di mana file terpisah dan buildin di mana ia terintegrasi dengan file gambar kernel (seperti itu ada di kernel_emergency.img). Opsi kedua harus didukung oleh bootloader RaspberryPi tetapi ada beberapa rumor bahwa itu rusak pada versi firmware saat ini sehingga Anda mungkin harus menggunakan versi buildin.

Cara terbaik untuk memulai adalah dengan menggunakan konten initramfs yang berfungsi (yang digunakan untuk kernel_emergency.img) dengan mengunduhnya dari repositori github yayasan lain dan hanya setelah Anda dapat mem-boot kernel menggunakan iniramfsgambar ini , coba buat sendiri. Semua yang diperlukan untuk ini adalah menunjuk ke direktori yang diunduh menggunakan CONFIG_INITRAMFS_SOURCEopsi konfigurasi kernel.

Catatan akhir

Jadi Anda harus melakukan ini dalam 3 langkah:

  1. Cobalah membangun dan mem-boot kernel tanpa initramfsfile.
  2. Coba tambahkan initramfskonten siap ke kernel Anda.
  3. Ubah initramfskonten ini sesuai dengan kebutuhan Anda.
Krzysztof Adamski
sumber
1
Menulis hebat, tetapi Anda tidak boleh menggunakannya zip; gitefisien mentransfer file dan Anda dapat menggunakan depth=1untuk mencegah riwayat pengunduhan (saya pikir).
Alex Chamberlain
Ya, ini benar tetapi mencoba melakukan ini pada RaspberryPi sendiri bukanlah ide yang bagus. Di sisi lain, mengunduh zip berfungsi dengan baik. Saya akan menambahkan catatan pendek tentang penggunaan git juga.
Krzysztof Adamski
Mengkompilasi kernel pada Raspberry Pi adalah ide yang buruk.
Alex Chamberlain
@AlexChamberlain: Ini sangat lambat tapi pasti mungkin (saya sudah melakukan ini sendiri). Dibutuhkan satu malam sehingga tidak terlalu buruk. Selain itu, mengapa itu begitu mengerikan?
Krzysztof Adamski
jika saya menggunakan bcmrpi_emergency_defconfig apakah itu mengandung initramfs ??
Shantanu Banerjee
0

Jika Anda menjalankan versi Debian yang sama pada keduanya, menggunakan X-Apt, dpkg-cross dll ... dan alat emdebian dapat bekerja dengan sangat baik.

Sumber: digunakan untuk mengembangkan aplikasi c ++ untuk sistem ARM tertanam yang menjalankan emdebian.

James Bennet
sumber