5.1. Mem-boot Installer pada 32-bit soft-float ARM

5.1.1. Format image boot

Pada sistem berbasis ARM dalam kebanyakan kasus, salah satu dari dua format untuk image boot digunakan: a) kernel standar Linux format zImage (vmlinuz) bersama dengan ramdisk awal Linux standar (initrd.gz) atau b) kernel format uImage (uImage) bersama dengan ramdisk awal yang sesuai (uInitrd).

uImage/uInitrd adalah format image yang dirancang untuk firmware U-Boot yang digunakan pada banyak sistem berbasis ARM (kebanyakan yang 32-bit). Versi U-Boot yang lebih lama hanya dapat mem-boot berkas dalam format uImage/uInitrd, jadi ini sering digunakan pada sistem armel yang lebih lama. Versi U-Boot yang lebih baru dapat - selain mem-boot uImage/uInitrd - juga mem-boot image kernel Linux standar dan ramdisk, tetapi sintaks perintah untuk melakukan itu sedikit berbeda dari itu untuk mem-boot uImages.

Untuk sistem yang menggunakan kernel multiplatform, selain kernel dan ramdisk awal diperlukan apa yang disebut berkas device-tree (atau blob device-tree, dtb). Ini spesifik untuk setiap sistem yang didukung dan berisi deskripsi perangkat keras tertentu. dtb harus disediakan pada perangkat oleh firmware, tetapi dalam praktiknya yang lebih baru sering perlu dimuat.

5.1.2. Mem-boot memakai TFTP

Boot dari jaringan mengharuskan Anda memiliki koneksi jaringan dan server boot jaringan TFTP (dan mungkin juga server DHCP, RARP, atau BOOTP untuk konfigurasi jaringan otomatis).

Pengaturan sisi server untuk mendukung boot jaringan dijelaskan dalam Bagian 4.3, “Mempersiapkan Berkas untuk Boot Jaringan TFTP”.

5.1.2.1. Mem-boot TFTP di U-Boot

Boot jaringan pada sistem menggunakan firmware U-Boot terdiri dari tiga langkah: a) mengkonfigurasi jaringan, b) memuat image (kernel/ramdisk awal/dtb) ke dalam memori dan c) benar-benar mengeksekusi kode yang dimuat sebelumnya.

Pertama, Anda harus mengkonfigurasi jaringan, baik secara otomatis melalui DHCP dengan menjalankan

setenv autoload no
dhcp

atau secara manual dengan mengatur beberapa variabel

lingkungan
setenv ipaddr <alamat ip klien>
setenv netmask <netmask>
setenv serverip <alamat ip server tftp>
setenv dnsip <alamat ip nameserver>
setenv gatewayip <alamat ip dari gateway default>

Jika mau, Anda dapat membuat pengaturan ini permanen dengan menjalankan

saveenv

Setelah itu Anda perlu memuat image (kernel/ramdisk awal/dtb) ke dalam memori. Ini dilakukan dengan perintah tftpboot, yang harus dilengkapi dengan alamat di mana image harus disimpan dalam memori. Sayangnya peta memori dapat bervariasi dari sistem ke sistem, sehingga tidak ada aturan umum alamat mana yang dapat digunakan untuk ini.

Pada beberapa sistem, U-Boot menetapkan satu set variabel lingkungan dengan alamat pemuatan yang sesuai: kernel_addr_r, ramdisk_addr_r, dan fdt_addr_r. Anda dapat memeriksa apakah mereka didefinisikan dengan menjalankan

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Jika tidak didefinisikan, Anda harus memeriksa dokumentasi sistem Anda untuk nilai yang sesuai dan mengaturnya secara manual. Untuk sistem berbasis SOC ALLWINNER SunXi (misalnya Allwinner A10, nama arsitektur sun4i atau Allwinner A20, nama arsitektur sun7i), Anda dapat misalnya menggunakan nilai-nilai berikut:

setenv kernel_addr_r 0x46000000
setenv fdt_addr_r 0x47000000
setenv ramdisk_addr_r 0x48000000

Ketika alamat pemuatan ditentukan, Anda dapat memuat image ke dalam memori dari server tftp yang ditentukan sebelumnya dengan

tftpboot ${kernel_addr_r} <nama berkas dari image kernel>
tftpboot ${fdt_addr_r} <nama berkas dari dtb>
tftpboot ${ramdisk_addr_r} <nama berkas dari image ramdisk awal>

Bagian ketiga adalah mengatur baris perintah kernel dan benar-benar mengeksekusi kode yang dimuat. U-Boot meneruskan konten variabel lingkungan bootargs sebagai baris perintah ke kernel, sehingga parameter apa pun untuk kernel dan penginstal - seperti perangkat konsol (lihat Bagian 5.3.1, “Boot serial console”) atau opsi preseed (lihat Bagian 5.3.2, “Parameter Pemasang Debian” dan Lampiran B, Mengotomatiskan instalasi menggunakan preseed) - dapat diatur dengan perintah seperti

setenv bootargs console=ttyS0,115200 rootwait panic=10

Perintah yang tepat untuk mengeksekusi kode yang dimuat sebelumnya tergantung pada format image yang digunakan. Dengan uImage/uInitrd, perintahnya adalah

bootm ${kernel_addr_r} ${ramdisk_addr_r} $ dan{fdt_addr_r}

dengan image Linux native itu adalah

bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}

Catatan: Saat mem-boot image linux standar, penting untuk memuat image ramdisk awal setelah kernel dan dtb saat U-Boot mengatur variabel filesize ke ukuran berkas terakhir yang dimuat dan perintah bootz memerlukan ukuran image ramdisk agar berfungsi dengan benar. Dalam hal mem-boot kernel khusus platform, yaitu kernel tanpa device-tree, cukup hilangkan parameter ${fdt_addr_r}.