Program init hello world minimal langkah demi langkah
Kompilasi dunia halo tanpa ketergantungan apa pun yang berakhir dengan loop tak terbatas. init.S
:
.global _start
_start:
mov $1, %rax
mov $1, %rdi
mov $message, %rsi
mov $message_len, %rdx
syscall
jmp .
message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
.equ message_len, . - message
Kita tidak dapat menggunakan exit system call, atau kernel panik, satu-satunya cara untuk keluar dengan anggun dari init adalah mematikan mesin dengan reboot
syscall.
Lalu:
mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o # link
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"
Ini membuat sistem file dengan hello world kita di /init
, yang merupakan program userland pertama yang akan dijalankan oleh kernel. Kita juga bisa menambahkan lebih banyak file ke d/
dan mereka dapat diakses dari /init
program saat kernel dijalankan.
Lalu cd
ke dalam pohon kernel Linux, build seperti biasa, dan jalankan di QEMU:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"
Dan Anda akan melihat garis:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
di layar emulator! Perhatikan bahwa ini bukan baris terakhir, jadi Anda harus melihat lebih jauh.
Anda juga dapat menggunakan program C jika menautkannya secara statis:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
dengan:
gcc -static init.c -o init
Penautan dinamis memerlukan penyiapan tautan dinamis yang dapat dijalankan, yang paling umum adalah bagian dari pustaka standar C seperti glibc.
Anda dapat menjalankan perangkat keras nyata dengan USB di /dev/sdX
dan:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Sumber hebat tentang hal ini:Kiat Teknologi:Cara menggunakan initramfs | landley.net Juga menjelaskan cara menggunakan gen_initramfs_list.sh
, yang merupakan skrip dari pohon sumber kernel Linux untuk membantu mengotomatiskan proses.
Diuji pada Ubuntu 16.10, QEMU 2.6.1.
Langkah selanjutnya
Hal berikutnya yang ingin Anda lakukan adalah menyiapkan BusyBox.
BusyBox mengimplementasikan utilitas POSIX-y CLI dasar, termasuk shell POSIX-y, yang memungkinkan Anda untuk lebih mudah bereksperimen dengan sistem secara interaktif.
Secara pribadi, pada titik ini saya lebih suka mengandalkan Buildroot, yang merupakan kumpulan skrip luar biasa yang mengotomatiskan pembangunan segala sesuatu dari sumber dan membuat sistem file root.
Saya telah mengunggah pembantu yang sangat terperinci dan otomatis untuk itu di:https://github.com/cirosantilli/linux-kernel-module-cheat
Saya tidak akan mulai mengotak-atik LFS, itu adalah jalur taman yang mengarah ke hutan gelap.
Mulailah dengan distro di mana Anda memiliki banyak kendali atas penginstalan awal, seperti Arch, atau edisi tanpa kepala seperti server Ubuntu. Intinya bukan untuk menghemat ruang tetapi untuk membatasi kompleksitas konfigurasi init; mulai dari distro headless, jika aplikasi yang ingin Anda jalankan memerlukan GUI, Anda dapat menambahkan apa yang diperlukan untuk itu tanpa harus diakhiri dengan login GUI (alias. manajer tampilan atau DM) dimulai dengan init, dan desktop yang lengkap lingkungan yang menyertainya.
Anda kemudian ingin mempelajari cara mengonfigurasi sistem init untuk tujuan Anda -- perhatikan bahwa Anda tidak dapat melakukannya tanpa init, dan ini mungkin cara terbaik untuk mencapai tujuan Anda. Sistem init yang digunakan pada kebanyakan distro linux saat ini adalah systemd.
Intinya di sini adalah untuk meminimalkan apa yang dilakukan init saat boot, dan begitulah cara Anda dapat membuat sistem yang akan menjalankan perangkat lunak dalam jumlah minimal untuk mendukung aplikasi yang ingin Anda fokuskan -- ini pada dasarnya adalah cara menyiapkan server, BTW, jadi ini adalah tugas umum (perhatikan bahwa Anda tidak dapat benar-benar menjalankan proses userland "hanya satu", setidaknya tidak berguna).
Jika aplikasi yang ingin Anda jalankan adalah program GUI (contoh bagus mengapa Anda tidak dapat menjalankan satu aplikasi saja, karena aplikasi GUI memerlukan server X), Anda dapat memiliki ~/.xinitrc
yang terlihat seperti ini;
#!/bin/sh
myprogram
Ketika Anda kemudian startx
, program Anda akan menjadi satu-satunya yang berjalan, dan tidak mungkin mengubah desktop atau memulai yang lain, sebagian karena tidak ada pengelola jendela atau lingkungan desktop (karenanya, tidak akan ada bingkai jendela atau bilah judul juga).
jika Anda sedikit dalam pemrograman dan Anda ingin membuatnya dari awal, Anda dapat menggunakan LFS yaitu Linux dari Scratch http://www.linuxfromscratch.org/
jika Anda ingin menyesuaikan ubutnu Anda dapat menggunakan ubunt-builder dan jika Anda menginginkannya pada basis rpm Anda dapat menggunakan SUSE-Studio,Suse studio akan memungkinkan Anda membuat suse linux khusus
sorakan