URL: https://linuxfr.org/users/linkdd/journaux/linux-et-busybox-un-duo-parfait-pour-s-amuser Title: Linux et BusyBox, un duo parfait pour s'amuser Authors: David Delassus Date: 2022年01月31日T09:34:55+01:00 License: CC By-SA Tags: linux, busybox, debian, flatpak et snap Score: 54 Bonjour Nal, Depuis peu, le weekend j'aime bien m'amuser sur des petits projets que je ne compte pas continuer. Ce weekend, c'était concevoir rapidement un OS bootable basé sur Linux. Mais sans suivre [LFS](http://fr.linuxfromscratch.org/). # Le disque virtuel Je commence par me créer une petite image disque : ``` $ qemu-img create ./hd0.img 2G ``` Puis une table des partitions (à la va vite, une seule partition qui fait tout le disque): ``` $ cfdisk ./hd0.img ``` Enfin, je formate le tout en EXT4 et le monte : ``` $ losetup -P /dev/loop0 ./hd0.img $ mkfs.ext4 /dev/loop0p1 $ mkdir ./mnt $ mount /dev/loop0p1 ./mnt ``` # Booter avec Linux et GRUB L'étape suivante, c'est installer le noyau et le bootloader. J'ai pas envie de compiler moi même par flemme, je prend donc le noyau et l'initrd d'une Debian : ``` $ mkdir ./mnt/boot $ cp /boot/vmlinuz-* ./mnt/boot/kernel.bin $ cp /boot/initrd* ./mnt/boot/kernel.initrd $ mkdir ./mnt/boot/grub $ touch ./mnt/boot/grub.cfg ``` J'édite ce dernier fichier avec le contenu suivant : ``` set timeout=0 set default=0 menuentry "Mini Linux" { set root=(hd0,msdos1) echo "Loading kernel..." linux /boot/kernel.bin noresume quiet root=/dev/sda1 echo "Loading initial ramdisk..." initrd /boot/kernel.initrd } ``` L'option `noresume` est obligatoire vu que j'ai pas de partition SWAP et que le initrd de Debian est configuré avec l'UUID de la partition de ma distribution. J'aurais une belle erreur en boucle au démarrage (cf [cet article](https://mike632t.wordpress.com/2021/03/21/error-message-running-scripts-local-block-on-boot/)). Je pourrais recréer l'initrd, mais cela me prendrais plus que 2min. Non c'est pas le but. On finalise l'installation de Grub avec la commande suivante : ``` $ echo "(hd0) /dev/loop0"> ./grub-device-map $ grub-install \ --no-floppy \ --grub-mkdevicemap=./grub-device-map \ --modules="biosdisk part_msdos ext2 configfile" \ --root-directory ./mnt \ /dev/loop0 ``` On créé quelques dossiers supplémentaires : ``` $ mkdir ./mnt/{dev,run,sys,proc} ``` Et hop, plus qu'à démonter et tester tout ça : ``` $ umount ./mnt $ losetup -d $ qemu-system-x86_64 -hda ./hd0.img -m 1G ``` Ça boot ! Et je me retrouve dans l'initramfs car il ne trouve pas le programme init (PID 1). # Un système minimal avec BusyBox Pour le coup, rien de plus simple : - on se rend à [cette adresse](https://busybox.net/downloads/binaries/1.35.0-x86_64-linux-musl/) - on télécharge les binaires statiques - on les place dans `./mnt/bin` (pas oublier de remonter le disque) Un petit changement du fichier `./mnt/grub/grub.cfg` : ```patch - linux /boot/kernel.bin noresume quiet root=/dev/sda1 + linux /boot/kernel.bin noresume quiet root=/dev/sda1 init=/bin/init ``` Le programme `init` va lire le fichier `/etc/inittab`, et s'il n'existe pas, il va assumer une configuration par défaut, c'est pas vraiment ce que je veux, du coup, vite fait bien fait : ``` $ mkdir ./mnt/etc $ cat> ./mnt/etc/inittab < ./mnt/etc/rc.sh < ./mnt/etc/passwd <

AltStyle によって変換されたページ (->オリジナル) /