GNU/Linux >> Belajar Linux >  >> Linux

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

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


Linux
  1. Cara Mengatur/Membuat Variabel Lingkungan dan Shell di Linux

  2. Cara membuat dan menghapus grup pengguna di Linux

  3. Cara Membuat Pengguna Dengan Direktori Home Kustom Di Linux

  1. Cara Menginstal CVS dan Membuat Repositori CVS di Server Linux

  2. Cara Membuat Thread di Linux (Dengan Program Contoh C)

  3. Cara membuat dan memasang sistem file di Linux

  1. Cara Membuat Tautan Keras dan Simbolik di Linux

  2. Cara Membuat Alias ​​​​dan Menggunakan Perintah Alias ​​​​di Linux

  3. Bagaimana cara membuat perintah khusus di Unix/Linux?