GNU/Linux >> Belajar Linux >  >> Linux

Apa aplikasi sistem file root minimum yang diperlukan untuk mem-boot linux sepenuhnya?

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 berupa tmpfs pasang)
  • /usr :berisi subdirektori bin , lib dan sbin . /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 memiliki syslogd daemon (seperti BusyBox) membacanya
  • null (bertindak seperti file yang selalu kosong)
  • ptmx dan pts 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 ssh
  • random (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 tentang pts 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.


Linux
  1. Linux – Apa Cara Berbeda Untuk Mengatur Izin File Dll Di Gnu/linux?

  2. Linux – Bagaimana Cara Mengubah Kata Sandi Root yang Terlupakan?

  3. Linux – Bagaimana Cara Mengetahui Hard Disk Apa yang Ada di Sistem?

  1. Linux – Sumber Entropi Apa yang Digunakan oleh Kernel Linux?

  2. Apa saja Jenis Shell yang Berbeda di Linux?

  3. Apa tujuan dari grup "roda" di Linux?

  1. Apa peran Magic Number dalam memuat boot di Linux?

  2. Apa kerugian dari antrian pesan Linux?

  3. Apa cara terbaik untuk menentukan bahwa dua jalur file merujuk ke objek file yang sama?