Bagaimana cara membuat distro Linux khusus yang hanya menjalankan satu program dan tidak ada yang lain?

12

Bagaimana saya bisa membuat distro Linux "khusus" saya sendiri yang akan menjalankan hanya satu program, persis seperti cara yang sama seperti XBMCbuntu .

pengguna3462992
sumber
Selamat datang di U&L, silakan ikuti tur berpemandu dan luangkan waktu untuk mempelajari cara mengajukan pertanyaan apa yang ingin Anda lakukan? karena definisi aplikasi sangat kabur dan tidak berarti apa-apa, karena saran saya adalah menggunakan busyboxtetapi 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.
Kiwy
1
Tampak jelas bagi saya ...
goldilocks
@ TAFKA'goldilocks 'tidak, karena saya yakin Anda masih dapat memiliki akses ke terminal atau yang serupa di XBMCubuntu sementara tampaknya hanya satu aplikasi yang berjalan secara grafis, tetapi tidak hanya satu aplikasi yang berjalan. Saya telah membuat distro kecil sekali dari awal hanya dengan kernel dan busybox, dalam hal ini, bahkan jika ada layanan yang diluncurkan oleh kernel, Anda dapat mengatakan busybox adalah satu-satunya aplikasi Anda.
Kiwy
@ Kiwi Itu jawaban yang bagus (lebih baik dari LFS). Perlu diingat: 1) Pertanyaan ini mungkin berguna untuk orang lain yang tujuan umum adalah sama, sehingga berbagai jawaban yang baik, 2) Meskipun ada berbagai solusi yang mungkin di sini - yaitu TIMTOWTDI - dan beberapa mungkin menjadi lebih cocok untuk beberapa tujuan yang lebih spesifik daripada yang lain, saya cukup yakin mereka semua akan bekerja dan aspek yang signifikan dalam memutuskan solusi akan subjektif (misalnya, karena pengetahuan dan pengalaman OP sebelumnya, bukan sifat obyektif dari tugas) .
goldilocks

Jawaban:

6

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 jessierilis, 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 ~/.xinitrcyang 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.

goldilocks
sumber
1
Anda tidak dapat melakukannya tanpa inittetapi tentu saja Anda dapat melakukannya tanpa upstart, systemd,atau sysv. inithanya beberapa file yang dapat dieksekusi yang dinamai initkernel yang Anda gunakan ketika mount. initramfs.Dalam kebanyakan kasus, ketiga lainnya ini tidak genap inittetapi sebenarnya sedang execinit,busybox.
disunting
@ mikeserv Benar-benar (dan saya secara eksplisit menyebutkan bahwa ini bukan satu-satunya tiga pilihan). Perhatikan juga bahwa saya sengaja dikecualikan busyboxkarena itu perlu perawatan terpisah dalam jawaban yang terpisah, tetapi tidak oleh saya.
goldilocks
Betapa anggunnya Anda untuk menawarkan! Tapi tidak mungkin.
mikeserv
Akan menarik untuk mengetahui apakah pendekatan ini benar-benar berhasil dalam praktiknya. Adakah yang benar-benar mencobanya?
Faheem Mitha
@FaheemMitha Jika Anda maksud dengan apa yang saya rekomendasikan di sini (sesuaikan konfigurasi init), tentu saja itu memang terjadi - begitulah sistem sudah bekerja, Anda hanya akan menghasilkan versi yang dilucuti dan disederhanakan (saya yakin ini adalah apa itu XBMCbutu). Jika maksud Anda, mengganti init dengan beberapa executable ala busybox yang lebih dapat dieksekusi, mungkin lebih banyak masalah daripada nilainya kecuali Anda harus melakukannya seperti itu - tujuan utama busybox adalah untuk digunakan dalam lingkungan tertanam yang kecil (dengan, misalnya, hanya beberapa MB RAM).
goldilocks
18

Minimal init hello world program langkah demi langkah

masukkan deskripsi gambar di sini

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 /initprogram ketika kernel berjalan.

Kemudian cdke 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/sdXdan:

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

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
sumber
4
Ini mungkin jawaban yang paling diremehkan di sini: D. Luar biasa!
msouth
1
@ Mulut sedikit kurang jadi sekarang :-)
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
1

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

Binatang Keamanan
sumber
1

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:

Ouki
sumber
1

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 ..

plugwash
sumber