Bagaimana saya bisa membuat distro Linux "khusus" saya sendiri yang akan menjalankan hanya satu program, persis seperti cara yang sama seperti XBMCbuntu .
Bagaimana saya bisa membuat distro Linux "khusus" saya sendiri yang akan menjalankan hanya satu program, persis seperti cara yang sama seperti XBMCbuntu .
Jawaban:
Saya tidak akan mulai mengacaukan LFS, itu adalah jalan taman yang mengarah ke beberapa hutan gelap.
Mulailah dengan distro di mana Anda memiliki banyak kendali atas pemasangan awal, seperti Arch, atau edisi tanpa kepala seperti server Ubuntu. Inti dari ini bukan untuk menghemat ruang tetapi untuk membatasi kompleksitas konfigurasi init; mulai dari distro tanpa kepala, jika aplikasi yang ingin Anda jalankan memerlukan GUI, Anda dapat menambahkan apa yang diperlukan untuk itu tanpa harus berakhir dengan login GUI (alias. tampilan manajer atau DM) yang dimulai oleh init, dan desktop fullblown lingkungan untuk pergi bersamanya.
Anda kemudian ingin mempelajari cara mengkonfigurasi sistem init untuk tujuan Anda - perhatikan bahwa Anda tidak dapat melakukannya tanpa init, dan itu mungkin merupakan cara terbaik untuk mencapai tujuan Anda. Ada tiga variasi init yang biasa digunakan di linux (tetapi ada beberapa yang lain ):
Debian menggunakan variasi init gaya Unix SysV klasik . Pada saat jessie
rilis, Debian juga telah beralih ke systemd
( https://wiki.debian.org/systemd )
Ubuntu dan turunannya menggunakan pemula .
Fedora, Arch, dan turunannya menggunakan systemd .
Jika Anda belum tahu apa-apa tentang hal ini, tidak ada satupun yang lebih sulit digunakan daripada yang lain. Jika Anda menggunakan salah satu dari dua yang terakhir, mereka menyediakan beberapa mekanisme untuk kompatibilitas mundur dengan SysV, tetapi jangan repot-repot dengan itu , BUKAN lebih sederhana. 1
Intinya di sini adalah untuk meminimalkan apa yang init lakukan saat boot, dan itu adalah bagaimana Anda dapat membuat sistem yang akan menjalankan sejumlah kecil perangkat lunak untuk mendukung aplikasi yang ingin Anda fokuskan - ini pada dasarnya adalah bagaimana server diatur, BTW, jadi itu adalah tugas umum (perhatikan bahwa Anda tidak dapat benar-benar menjalankan "hanya satu" proseslandlandland, setidaknya tidak berguna).
Jika aplikasi yang ingin Anda jalankan adalah program GUI (contoh bagus mengapa Anda tidak bisa hanya menjalankan satu aplikasi, karena aplikasi GUI memerlukan server X), Anda dapat memiliki ~/.xinitrc
yang seperti ini;
#!/bin/sh
myprogram
Ketika Anda kemudian startx
, program Anda akan menjadi satu-satunya yang berjalan, dan tidak mungkin untuk mengubah desktop atau memulai yang lain, sebagian karena tidak ada window manager atau lingkungan desktop (karenanya, tidak akan ada bingkai jendela atau bilah judul baik).
1. Untuk sedikit mempermasalahkan hal ini: Ketika Anda meneliti ini, Anda mungkin menemukan beberapa keluhan tentang systemd dan pemula dari orang-orang yang sebelumnya akrab dengan klaim SysV, misalnya, bahwa mereka terlalu rumit. Namun, secara objektif mereka tidak lebih kompleks daripada SysV (IMO systemd sebenarnya lebih mudah digunakan, pada kenyataannya), tetapi kebanyakan anjing lebih suka trik lama mereka. Cengkeraman ini mulai mereda sekarang kedua sistem telah digunakan untuk sementara waktu.
init
tetapi tentu saja Anda dapat melakukannya tanpa upstart, systemd,
atau sysv. init
hanya beberapa file yang dapat dieksekusi yang dinamai init
kernel yang Anda gunakan ketika mount. initramfs.
Dalam kebanyakan kasus, ketiga lainnya ini tidak genap init
tetapi sebenarnya sedang exec
init,
busybox.
busybox
karena itu perlu perawatan terpisah dalam jawaban yang terpisah, tetapi tidak oleh saya.
Minimal init hello world program langkah demi langkah
Kompilasi dunia halo tanpa dependensi yang berakhir pada 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
Kami tidak dapat menggunakan panggilan sistem keluar, atau panik kernel.
Kemudian:
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 menciptakan sistem file dengan hello world kami di /init
, yang merupakan program userland pertama yang dijalankan oleh kernel. Kami juga bisa menambahkan lebih banyak file ke d/
dan mereka akan dapat diakses dari /init
program ketika kernel berjalan.
Kemudian 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 Anda 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
Tautan dinamis akan membutuhkan pengaturan tautan dinamis yang dapat dieksekusi, yang paling umum adalah bagian dari pustaka standar C seperti glibc.
Anda dapat menjalankan perangkat keras nyata dengan USB menyala /dev/sdX
dan:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Sumber hebat tentang hal ini: Tip Tek: Cara menggunakan initramfs | landley.net Ini juga menjelaskan cara menggunakan gen_initramfs_list.sh
, yang merupakan skrip dari pohon kode sumber Linux untuk membantu mengotomatiskan proses.
Diuji pada Ubuntu 16.10, QEMU 2.6.1.
Langkah selanjutnya
Hal berikutnya yang ingin Anda lakukan, adalah mengatur BusyBox .
BusyBox mengimplementasikan utilitas dasar POSIX-y CLI, termasuk shell POSIX-y, yang memungkinkan Anda untuk lebih mudah bereksperimen dengan sistem secara interaktif.
Secara pribadi, pada titik ini saya lebih suka untuk hanya mengandalkan Buildroot , yang merupakan kumpulan skrip menakjubkan yang mengotomatiskan membangun semuanya dari sumber dan membuat sistem berkas root.
Saya telah mengunggah pembantu yang sangat terperinci dan otomatis untuk itu di: https://github.com/cirosantilli/linux-kernel-module-cheat
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 mengkustomisasi ubutnu Anda dapat menggunakan ubunt-builder dan jika Anda menginginkannya berdasarkan rpm Anda dapat menggunakan SUsE-Studio, Suse studio akan memungkinkan Anda untuk membuat custom suse linux
Bersulang
Ini lebih tentang apa yang dibutuhkan "satu program" Anda.
Anda masih dapat memiliki permulaan yang baik untuk memahami bagaimana menyusun berbagai hal dengan membangun LFS (alias " Linux From Scratch ") . Kemudian Anda akan menambahkan hal-hal yang diperlukan oleh program Anda atau pergi untuk distribusi penuh karena membangun sub-sistem yang berat seperti Gnome atau KDE di LFS dapat benar-benar menyebalkan.
Tentu saja mundur mungkin lebih mudah pada awalnya, tetapi menghapus hal-hal dari distrib penuh bisa menyusahkan: lakukan ini di VM dan lakukan copy VM ini di setiap langkah.
(2 sen saya)
Edit :
Seperti yang ditunjukkan oleh SecurityBeast alih-alih mulai dari distribusi penuh seperti CentOS atau Ubuntu , Anda juga dapat melihat membangun alat distribusi seperti:
Yang perlu Anda tanyakan adalah apa yang "satu program" Anda butuhkan dan sumber daya apa yang Anda miliki.
Jika perlu berbagai pilihan perpustakaan dan dukungan binari, Anda mungkin lebih baik menggunakan distro linux "biasa" (Debian atau yang serupa) dan hanya sedikit mengotak-atik proses boot.
Jika membutuhkan pilihan yang lebih sempit dari barang-barang dukungan tetapi masih membutuhkan barang-barang seperti jaringan atau dukungan untuk berbagai perangkat keras menggunakan modul kernel yang berbeda atau bit dukungan pengguna dan Anda tidak ingin overhead ruang disk dari distro biasa maka saya akan menyarankan melihat embedded distro (buildroot atau serupa) atau mungkin linux dari pendekatan awal (meskipun itu bisa menjadi sakit kepala pemeliharaan)
Jika Anda hanya membutuhkan apa yang dapat disediakan oleh kernel non-modular dan tidak ada yang lain, maka menjalankan biner langsung pada kernel dapat bekerja dan menjadi solusi paling ringan ..
busybox
tetapi itu mungkin bukan yang Anda inginkan. jadi tolong, luangkan waktu yang diperlukan untuk mengekspresikan kebutuhan Anda dan kami mungkin dapat membantu Anda. Jangan ragu untuk mengedit pertanyaan Anda untuk menambahkan elemen yang relevan di dalamnya.