GNU/Linux >> Tutoriels Linux >  >> Linux

Comment créer une distribution Linux personnalisée qui exécute un seul programme et rien d'autre ?

Programme minimal init hello world étape par étape

Compilez un hello world sans aucune dépendance qui se termine par une boucle infinie. 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

Nous ne pouvons pas utiliser l'appel système exit, sinon le noyau panique, le seul moyen de sortir proprement de l'init est d'éteindre la machine avec le reboot appel système.

Ensuite :

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"

Cela crée un système de fichiers avec notre hello world à /init , qui est le premier programme utilisateur que le noyau exécutera. Nous aurions également pu ajouter plus de fichiers à d/ et ils seraient accessibles depuis le /init programme lorsque le noyau s'exécute.

Alors cd dans l'arborescence du noyau Linux, compilez comme d'habitude et exécutez-le dans 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"

Et vous devriez voir une ligne :

FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR

sur l'écran de l'émulateur ! Notez que ce n'est pas la dernière ligne, vous devez donc regarder un peu plus haut.

Vous pouvez également utiliser des programmes C si vous les liez de manière statique :

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

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

avec :

gcc -static init.c -o init

La liaison dynamique nécessiterait la configuration d'un exécutable de l'éditeur de liens dynamique, dont les plus courants font partie des bibliothèques standard C telles que glibc.

Vous pouvez exécuter sur du matériel réel avec une clé USB sur /dev/sdX et :

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

Excellente source sur ce sujet :Conseil technique :Comment utiliser initramfs | landley.net Il explique également comment utiliser gen_initramfs_list.sh , qui est un script de l'arborescence des sources du noyau Linux pour aider à automatiser le processus.

Testé sur Ubuntu 16.10, QEMU 2.6.1.

Étapes suivantes

La prochaine chose que vous voulez faire est de configurer BusyBox.

BusyBox implémente les utilitaires CLI POSIX-y de base, y compris un shell POSIX-y, qui vous permet d'expérimenter plus facilement le système de manière interactive.

Personnellement, à ce stade, je préfère simplement compter sur Buildroot, qui est un ensemble incroyable de scripts qui automatise la construction de tout à partir de la source et la création du système de fichiers racine.

J'ai téléchargé un assistant très détaillé et automatisé pour cela sur :https://github.com/cirosantilli/linux-kernel-module-cheat


Je ne commencerais pas à jouer avec LFS, qui est un chemin de jardin menant à des bois sombres.

Commencez par une distribution où vous avez beaucoup de contrôle sur l'installation initiale, comme Arch, ou une édition sans tête comme le serveur Ubuntu. Le but n'est pas tant de gagner de la place que de délimiter la complexité de la configuration init; à partir d'une distribution sans tête, si l'application que vous souhaitez exécuter nécessite une interface graphique, vous pouvez ajouter ce qui est requis pour cela sans avoir à vous retrouver avec une connexion à l'interface graphique (alias. le gestionnaire d'affichage ou DM) démarré par init et un bureau complet environnement qui va avec.

Vous voulez ensuite apprendre à configurer le système init selon vos besoins -- notez que vous ne pouvez pas vous passer d'init, et c'est peut-être le meilleur moyen d'atteindre votre objectif. Le système d'initialisation utilisé sur la plupart des distributions Linux est désormais systemd.

Le but ici est de minimiser ce que fait init au démarrage, et c'est ainsi que vous pouvez créer un système qui exécutera une quantité minimale de logiciels pour prendre en charge l'application sur laquelle vous voulez vous concentrer -- c'est essentiellement ainsi qu'un serveur est configuré, BTW, c'est donc une tâche courante (notez que vous ne pouvez pas littéralement avoir "un seul" processus utilisateur en cours d'exécution, du moins pas de manière utile).

Si l'application que vous souhaitez exécuter est un programme GUI (un bon exemple de la raison pour laquelle vous ne pouvez pas littéralement exécuter une seule application, puisque les applications GUI nécessitent un serveur X), vous pouvez avoir un ~/.xinitrc qui ressemble à ceci ;

#!/bin/sh

myprogram

Quand tu as alors startx , votre programme sera la seule chose en cours d'exécution, et il sera impossible de changer de bureau ou de démarrer quoi que ce soit d'autre, en partie parce qu'il n'y a pas de gestionnaire de fenêtres ou d'environnement de bureau (par conséquent, il n'y aura pas non plus de cadre de fenêtre ni de barre de titre).


si vous êtes un peu dans la programmation et que vous voulez le créer à partir de zéro, vous pouvez utiliser LFS, c'est-à-dire Linux from Scratch http://www.linuxfromscratch.org/

si vous souhaitez personnaliser ubutnu, vous pouvez utiliser ubunt-builder et si vous le souhaitez sur une base rpm, vous pouvez utiliser Suse-Studio, Suse studio vous permettra de personnaliser suse linux

bravo


Linux
  1. Comment définir/créer des variables d'environnement et de shell sous Linux

  2. Comment créer des threads sous Linux (avec un exemple de programme C)

  3. Comment créer et monter des systèmes de fichiers sous Linux

  4. Distro Linux avec juste busybox et bash ?

  5. Comment créer des commandes personnalisées sous Unix/Linux ?

Comment créer sa propre distribution Linux avec Yocto

Comment compiler C, C++ et Java à l'aide de Terminal sous Linux

Comment créer et gérer des pods Kubernetes sous Linux

Comment créer et changer d'espace de travail dans Linux Mint [Astuce rapide]

Comment créer et utiliser un fichier d'échange sous Linux

Comment écrire et exécuter un programme C sous Linux