Itu sepenuhnya tergantung pada layanan apa yang ingin Anda miliki di perangkat Anda.
Program
Anda dapat mem-boot Linux secara langsung ke dalam shell . Ini tidak terlalu berguna dalam produksi — siapa yang hanya ingin memiliki shell di sana — tetapi ini berguna sebagai mekanisme intervensi ketika Anda memiliki bootloader interaktif:pass init=/bin/sh
ke baris perintah kernel. Semua sistem Linux (dan semua sistem unix) memiliki shell bergaya Bourne/POSIX di /bin/sh
.
Anda memerlukan seperangkat utilitas shell . BusyBox adalah pilihan yang sangat umum; ini berisi shell dan utilitas umum untuk manipulasi file dan teks (cp
, grep
, …), penyiapan jaringan (ping
, ifconfig
, …), manipulasi proses (ps
, nice
, …), dan berbagai alat sistem lainnya (fdisk
, mount
, syslogd
, …). BusyBox sangat dapat dikonfigurasi:Anda dapat memilih alat mana yang Anda inginkan dan bahkan fitur individual pada waktu kompilasi, untuk mendapatkan kompromi ukuran/fungsionalitas yang tepat untuk aplikasi Anda. Selain sh
, minimal Anda tidak dapat melakukan apa pun tanpanya adalah mount
, umount
dan halt
, tetapi tidak lazim untuk tidak memiliki cat
juga , cp
, mv
, rm
, mkdir
, rmdir
, ps
, sync
dan beberapa lagi. BusyBox menginstal sebagai biner tunggal yang disebut busybox
, dengan tautan simbolis untuk setiap utilitas.
Proses pertama pada sistem unix normal disebut init
. Tugasnya adalah memulai layanan lain. BusyBox berisi sistem init. Selain init
biner (biasanya terletak di /sbin
), Anda memerlukan file konfigurasinya (biasanya disebut /etc/inittab
— beberapa penggantian init modern menyingkirkan file tersebut tetapi Anda tidak akan menemukannya di sistem tersemat kecil) yang menunjukkan layanan apa yang akan dimulai dan kapan. Untuk BusyBox, /etc/inittab
adalah opsional; jika hilang, Anda mendapatkan shell root di konsol dan skrip /etc/init.d/rcS
(lokasi default) dijalankan saat boot.
Itu saja yang Anda butuhkan, di luar program yang membuat perangkat Anda melakukan sesuatu yang berguna. Misalnya, di router rumah saya yang menjalankan varian OpenWrt, satu-satunya program adalah BusyBox, nvram
(untuk membaca dan mengubah pengaturan di NVRAM), dan utilitas jaringan.
Kecuali jika semua executable Anda terhubung secara statis, Anda memerlukan pemuat dinamis (ld.so
, yang dapat dipanggil dengan nama berbeda bergantung pada pilihan libc dan arsitektur prosesor) dan semua library dinamis (/lib/lib*.so
, mungkin beberapa di antaranya ada di /usr/lib
) diperlukan oleh executable ini.
Struktur direktori
Standar Hierarki Filesystem menjelaskan struktur direktori umum sistem Linux. Itu diarahkan untuk instalasi desktop dan server:banyak yang dapat dihilangkan pada sistem tertanam. Ini adalah jumlah minimum yang umum.
/bin
:program yang dapat dieksekusi (beberapa mungkin ada di/usr/bin
sebagai gantinya)./dev
:simpul perangkat (lihat di bawah)/etc
:file konfigurasi/lib
:pustaka bersama, termasuk pemuat dinamis (kecuali semua executable ditautkan secara statis)/proc
:mount point untuk sistem file proc/sbin
:program yang dapat dieksekusi. Perbedaan dengan/bin
apakah itu/sbin
adalah untuk program yang hanya berguna bagi administrator sistem, tetapi perbedaan ini tidak bermakna pada perangkat yang disematkan. Anda dapat membuat/sbin
tautan simbolis ke/bin
./mnt
:berguna untuk memiliki sistem file root hanya-baca sebagai titik pemasangan awal selama pemeliharaan/sys
:mount point untuk sistem file sysfs/tmp
:lokasi untuk file-file sementara (biasanya berupatmpfs
pasang)/usr
:berisi subdirektoribin
,lib
dansbin
./usr
ada untuk file tambahan yang tidak ada di sistem file root. Jika Anda tidak memilikinya, Anda dapat membuat/usr
tautan simbolis ke direktori akar.
File perangkat
Berikut adalah beberapa entri tipikal dalam /dev
minimal :
console
full
(menulisnya selalu melaporkan “tidak ada ruang tersisa di perangkat”)log
(soket yang digunakan program untuk mengirim entri log), jika Anda memilikisyslogd
daemon (seperti BusyBox) membacanyanull
(bertindak seperti file yang selalu kosong)ptmx
danpts
direktori, jika Anda ingin menggunakan pseudo-terminal (yaitu terminal apa pun selain konsol) — mis. jika perangkat terhubung ke jaringan dan Anda ingin melakukan telnet atau sshrandom
(mengembalikan byte acak, berisiko memblokir)tty
(selalu menunjuk terminal program)urandom
(mengembalikan byte acak, tidak pernah memblokir tetapi mungkin non-acak pada perangkat yang baru di-boot)zero
(berisi urutan byte null yang tak terbatas)
Di luar itu, Anda memerlukan entri untuk perangkat keras Anda (kecuali antarmuka jaringan, ini tidak mendapatkan entri di /dev
):port serial, penyimpanan, dll.
Untuk perangkat yang disematkan, Anda biasanya akan membuat entri perangkat secara langsung pada sistem file root. Sistem kelas atas memiliki skrip yang disebut MAKEDEV
untuk membuat /dev
entri, tetapi pada sistem tersemat, skrip seringkali tidak digabungkan ke dalam gambar. Jika beberapa perangkat keras dapat di-hotplug (misalnya jika perangkat memiliki port host USB), maka /dev
harus dikelola oleh udev (Anda mungkin masih memiliki set minimal pada sistem file root).
Tindakan waktu boot
Di luar sistem file root, Anda perlu memasang beberapa lagi untuk operasi normal:
- proses pada
/proc
(sangat diperlukan) - sysfs di
/sys
(sangat diperlukan) tmpfs
sistem file pada/tmp
(untuk mengizinkan program membuat file sementara yang akan berada di RAM, bukan di sistem file root yang mungkin dalam flash atau hanya-baca)- tmpfs, devfs atau devtmpfs pada
/dev
jika dinamis (lihat udev di “File perangkat” di atas) - devpt di
/dev/pts
jika Anda ingin menggunakan [pseudo-terminals (lihat komentar tentangpts
di atas)
Anda dapat membuat /etc/fstab
file dan panggil mount -a
, atau jalankan mount
secara manual.
Mulai daemon syslog (serta klogd
untuk log kernel, jika syslogd
program tidak mengurusnya), jika Anda memiliki tempat untuk menulis log.
Setelah ini, perangkat siap memulai layanan khusus aplikasi.
Cara membuat sistem file root
Ini adalah cerita yang panjang dan beragam, jadi yang akan saya lakukan di sini hanyalah memberikan beberapa petunjuk.
Filesystem root dapat disimpan dalam RAM (dimuat dari citra (biasanya dikompresi) dalam ROM atau flash), atau dalam sistem file berbasis disk (disimpan dalam ROM atau flash), atau dimuat dari jaringan (biasanya melalui TFTP) jika berlaku . Jika sistem file root ada di RAM, jadikan initramfs — sistem file RAM yang kontennya dibuat saat boot.
Ada banyak kerangka kerja untuk merakit gambar akar untuk sistem tersemat. Ada beberapa petunjuk di FAQ BusyBox. Buildroot adalah salah satu yang populer, memungkinkan Anda untuk membangun seluruh root image dengan pengaturan yang mirip dengan kernel Linux dan BusyBox. OpenEmbedded adalah kerangka kerja serupa lainnya.
Wikipedia memiliki (tidak lengkap) daftar distribusi Linux tersemat yang populer. Contoh Linux tersemat yang mungkin Anda miliki di dekat Anda adalah keluarga sistem operasi OpenWrt untuk peralatan jaringan (populer di router rumah pembuat utak-atik). Jika Anda ingin belajar berdasarkan pengalaman, Anda dapat mencoba Linux dari Awal, tetapi Linux ditujukan untuk sistem desktop bagi penghobi, bukan untuk perangkat tersemat.
Catatan tentang Linux vs kernel Linux
Satu-satunya perilaku yang dimasukkan ke dalam kernel Linux adalah program pertama yang diluncurkan saat boot. (Saya tidak akan masuk ke seluk-beluk initrd dan initramfs di sini.) Program ini, secara tradisional disebut init, memiliki ID proses 1 dan memiliki hak istimewa tertentu (kekebalan terhadap sinyal KILL) dan tanggung jawab (menuai anak yatim). Anda dapat menjalankan sistem dengan kernel Linux dan memulai apa pun yang Anda inginkan sebagai proses pertama, tetapi yang Anda miliki adalah sistem operasi berdasarkan kernel Linux, dan bukan apa yang biasanya disebut "Linux" — Linux, dalam pengertian umum istilahnya, adalah sistem operasi mirip Unix yang kernelnya adalah kernel Linux. Misalnya, Android adalah sistem operasi yang tidak mirip Unix tetapi berdasarkan kernel Linux.
Yang Anda butuhkan hanyalah satu executable yang ditautkan secara statis, ditempatkan di sistem file, dalam isolasi. Anda tidak memerlukan file lain. Eksekusi itu adalah proses init. Ini bisa menjadi kotak sibuk. Itu memberi Anda shell dan sejumlah utilitas lain, semuanya dengan sendirinya. Anda dapat membuka sistem yang berfungsi penuh hanya dengan menjalankan perintah secara manual di busybox untuk me-mount sistem file root baca-tulis, buat node /dev, exec real init, dll.
Jika Anda tidak memerlukan utilitas shell apa pun, mksh
yang terhubung secara statis biner (misalnya terhadap klibc – 130K di Linux/i386) akan dilakukan. Anda membutuhkan /linuxrc
atau /init
atau /sbin/init
skrip yang hanya memanggil mksh -l -T!/dev/tty1
dalam satu lingkaran:
#!/bin/mksh
while true; do
/bin/mksh -l -T!/dev/tty1
done
-T!$tty
opsi adalah tambahan terbaru untuk mksh
yang memberitahunya untuk menelurkan shell baru di terminal yang diberikan dan menunggunya. (Sebelumnya, hanya ada -T-
untuk menjelekkan program dan -T$tty
untuk menelurkan di terminal tetapi tidak menunggunya. Ini tidak begitu bagus.) -l
opsi hanya memberitahunya untuk menjalankan shell login (yang berbunyi /etc/profile
, ~/.profile
dan ~/.mkshrc
).
Ini menganggap terminal Anda adalah /dev/tty1
, pengganti. (Dengan lebih banyak keajaiban, terminal dapat ditemukan secara otomatis. /dev/console
tidak akan memberi Anda kontrol pekerjaan penuh.)
Anda memerlukan beberapa file di /dev
agar ini berfungsi:
- /dev/console
- /dev/null
- /dev/tty
- /dev/tty1
Boot dengan opsi kernel devtmpfs.mount=1
menghilangkan kebutuhan akan /dev
yang terisi , biarkan saja menjadi direktori kosong (cocok untuk digunakan sebagai mountpoint).
Biasanya Anda ingin memiliki beberapa utilitas (dari klibc, busybox, beastiebox, toybox, atau toolbox), tetapi tidak terlalu dibutuhkan.
Anda mungkin ingin menambahkan ~/.mkshrc
file, yang menyiapkan $PS1 dan beberapa alias dan fungsi shell dasar.
Saya pernah membuat initrd 171K terkompresi (371K tidak terkompresi) untuk Linux/m68k menggunakan mksh (dan file mkshrc sampelnya) dan klibc-utils saja. (Namun, ini sebelum -T! ditambahkan ke shell, sehingga memunculkan shell login di /dev/tty2
sebagai gantinya dan menggemakan pesan ke konsol yang memberi tahu pengguna untuk beralih terminal.) Ini berfungsi dengan baik.
Ini adalah minimum yang sangat kecil mempersiapkan. Jawaban lain memberikan saran yang sangat baik untuk sistem yang lebih menonjol. Ini adalah kasus khusus yang nyata.
Penafian:Saya pengembang mksh.