GNU/Linux >> Znalost Linux >  >> Linux

Jak vytvořit vlastní distribuci Linuxu, která spustí pouze jeden program a nic jiného?

Minimální úvodní program hello world krok za krokem

Zkompilujte ahoj svět bez jakýchkoli závislostí, který končí v nekonečné smyčce. 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

Nemůžeme použít systémové volání exit, jinak jádro zpanikaří, jediný způsob, jak elegantně ukončit init, je vypnout počítač pomocí reboot systémové volání.

Potom:

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"

Toto vytvoří souborový systém s naším hello world na /init , což je první uživatelský program, který jádro spustí. Mohli jsme také přidat více souborů do d/ a byly by přístupné z /init program, když běží jádro.

Potom cd do stromu jádra Linuxu, sestavení jako obvykle a spusťte jej v 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"

A měli byste vidět řádek:

FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR

na obrazovce emulátoru! Všimněte si, že to není poslední řádek, takže se musíte podívat o něco výše.

Můžete také použít programy C, pokud je propojíte staticky:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
    sleep(0xFFFFFFFF);
    return 0;
}

s:

gcc -static init.c -o init

Dynamické propojení by vyžadovalo nastavení spustitelného dynamického linkeru, z nichž nejběžnější jsou součástí standardních knihoven C, jako je glibc.

Můžete běžet na skutečném hardwaru s USB na /dev/sdX a:

make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX

Skvělý zdroj na toto téma:Technický tip:Jak používat initramfs | landley.net Také vysvětluje, jak používat gen_initramfs_list.sh , což je skript ze zdrojového stromu linuxového jádra, který pomáhá automatizovat proces.

Testováno na Ubuntu 16.10, QEMU 2.6.1.

Další kroky

Další věc, kterou chcete udělat, je nastavit BusyBox.

BusyBox implementuje základní nástroje POSIX-y CLI, včetně shellu POSIX-y, který vám umožní snáze interaktivně experimentovat se systémem.

Osobně se v tuto chvíli raději spoléhám na Buildroot, což je úžasná sada skriptů, která automatizuje vytváření všeho ze zdroje a vytváření kořenového souborového systému.

Nahrál jsem k tomu velmi podrobného a automatizovaného pomocníka na:https://github.com/cirosantilli/linux-kernel-module-cheat


Nezačal bych si zahrávat s LFS, to je zahradní cesta vedoucí do nějakých tmavých lesů.

Začněte s distribucí, kde máte velkou kontrolu nad počáteční instalací, jako je Arch, nebo bezhlavou edicí, jako je server Ubuntu. Smyslem toho není ani tak úspora místa, jako spíše omezení složitosti konfigurace init; počínaje bezhlavým distrom, pokud aplikace, kterou chcete spustit, vyžaduje GUI, můžete přidat, co je k tomu potřeba, aniž byste museli skončit s přihlášením do GUI (aka. Display manager nebo DM) spuštěným init a plnohodnotnou pracovní plochou prostředí.

Pak se chcete naučit, jak nakonfigurovat systém init pro vaše účely – všimněte si, že bez init se neobejdete a může to být nejlepší způsob, jak dosáhnout vašeho cíle. Init systém používaný na většině linuxových distribucí je nyní systemd.

Jde o to minimalizovat to, co init dělá při bootování, a to je způsob, jak můžete vytvořit systém, který bude provozovat minimální množství softwaru pro podporu aplikace, na kterou se chcete zaměřit – takhle je v podstatě nastaven server, BTW, takže je to běžný úkol (všimněte si, že nemůžete mít doslova spuštěný "jen jeden" uživatelský proces, alespoň ne užitečné).

Pokud je aplikace, kterou chcete spustit, program s grafickým uživatelským rozhraním (dobrý příklad toho, proč nemůžete doslova spustit pouze jednu aplikaci, protože aplikace s grafickým rozhraním vyžadují X server), můžete mít ~/.xinitrc to vypadá takto;

#!/bin/sh

myprogram

Když pak startx , bude spuštěn pouze váš program a nebude možné měnit plochy nebo spouštět cokoli jiného, ​​částečně proto, že zde není žádný správce oken ani pracovní prostředí (nebude zde tedy ani rámeček okna ani záhlaví).


pokud jste trochu v programování a chcete to vytvořit od nuly, můžete použít LFS, tj. Linux od nuly http://www.linuxfromscratch.org/

pokud chcete přizpůsobit ubutnu, můžete použít ubunt-builder a pokud jej chcete na bázi rpm, můžete použít SUsE-Studio, Suse studio vám umožní vytvořit vlastní suse linux

na zdraví


Linux
  1. Jak vytvořit pevné a symbolické odkazy v Linuxu

  2. Jak vytvářet vlákna v Linuxu (pomocí ukázkového programu C)

  3. Jak vytvořit vlastní příkazy v Unixu/Linuxu?

  1. Jak vytvořit alias a používat příkaz Alias ​​v Linuxu

  2. Jak nastavit/vytvořit proměnné prostředí a prostředí v Linuxu

  3. Jak vytvořit uživatele s vlastním domovským adresářem v Linuxu

  1. Jak vytvořit a odstranit uživatelskou skupinu v Linuxu

  2. Linux – Jak zkontrolovat, zda je linuxová distribuce bezpečná a neobsahuje škodlivý kód?

  3. Jak nainstalovat CVS a vytvořit úložiště CVS na serveru Linux