Production de fichiers racine Linux

Le système de fichiers racine est le premier système de fichiers qui est monté au démarrage du noyau. Le fichier image du code du noyau est stocké dans le système de fichiers racine et le programme de démarrage du système installera certains scripts et services d'initialisation de base à partir de celui-ci après le système de fichiers racine. est monté . Attendez qu'il soit chargé en mémoire pour s'exécuter.

1. Système de fichiers racine

Un système de fichiers est une structure de répertoires incluse dans un disque (y compris un CD-ROM, une disquette, un disque flash et d'autres périphériques de stockage) ou une partition ; un périphérique de disque applicable peut contenir un ou plusieurs systèmes de fichiers ; si vous souhaitez entrer un système de fichiers , d'abord Ce que vous faites est de monter le système de fichiers ; pour monter le système de fichiers, vous devez spécifier un point de montage.

Remarque : Pour notre développement d'applications, lors de l'achat d'une carte de développement, le fabricant fournira un système de fichiers racine prêt à l'emploi et BootLoader, etc., si nécessaire, nous pouvons modifier les commandes sans créer un nouveau système de fichiers racine à partir de zéro . Mais le processus de production ici peut nous donner une compréhension plus approfondie du système de fichiers Linux .

2. Le système de fichiers racine principal

* Sous Linux, rootfs est essentiel. Les principales implémentations sur PC sont le ramdisk et le système de fichiers racine directement montés sur le disque dur (disque dur, disque dur) ; les systèmes embarqués ne démarrent généralement pas à partir du disque dur, mais à partir de la mémoire flash. Le moyen le plus simple consiste à charger rootfs sur le RAMDisk de la RAM. Le plus compliqué est Cramfs lu directement à partir de Flash, et le plus compliqué est le partitionnement sur Flash et la construction de systèmes de fichiers tels que JFFS2.

* RAMDisk compresse le rootfs préparé et l'écrit dans Flash. Lors du démarrage, le Bootloader le charge dans la RAM, le décompresse, puis le monte sur /. Cette méthode est simple à utiliser, mais le système de fichiers dans la RAM n'est pas compressé, il doit donc occuper la RAM, une ressource rare dans de nombreux systèmes embarqués.

Ramdisk utilise l'espace mémoire pour simuler les partitions du disque dur. Ramdisk utilise généralement la compression du système de fichiers du disque et le stocke dans la mémoire flash. Lorsque le système est initialisé, il est décompressé en SDRAM et monté sur le système de fichiers racine. Dans le système Linux, il existe deux types de ramdisk , l'un est qu'il peut être formaté et chargé, ce qui est déjà pris en charge dans le noyau linux 2.0/2.2, et son inconvénient est que la taille est fixe ; l'autre n'est pris en charge que par le noyau 2.4, qui est réalisé via ramfs, et il ne peut pas être formaté, mais il est pratique à utiliser, et sa taille augmente ou diminue avec l'espace requis.C'est la technologie de disque virtuel couramment utilisée sous Linux à l'heure actuelle.

* initrd est le format de RAMDisk. Avant le noyau 2.4, c'était image-initrd. Le noyau 2.5 a introduit cpio-initrd, qui simplifie grandement le processus de démarrage de Linux et se conforme à la philosophie de base de Linux : Keep it simple, stupid (KISS) Mais cpio -initrd En tant que nouveau format, il n'a pas été largement testé, et image-initrd est principalement utilisé dans Linux embarqué.

* Cramfs est un système de fichiers très simple écrit par Linus. Il a une bonne compression et peut également être exécuté directement à partir de Flash sans le charger dans la RAM, économisant ainsi de la RAM. Cependant, Cramfs est en lecture seule et n'est pas pratique pour les répertoires qui doivent être modifiés au moment de l'exécution (tels que : /etc, /var, /tmp). Par conséquent, ces répertoires sont généralement transformés en fs inscriptibles tels que ramfs.

* SquashFS est une amélioration de Cramfs. Il dépasse certaines limitations de Cramfs et présente également des avantages dans l'utilisation de Flash et de RAM. Cependant, selon le développeur, il n'est peut-être pas aussi bon que Cramfs en termes de performances. Il s'agit également d'une nouvelle approche qui doit être davantage testée avant de pouvoir être adoptée dans les systèmes embarqués.

3. Fabriqué par Ramdisk

La méthode de production de RAMDisk est la suivante :
(1) Sous l'environnement du système d'exploitation Linux du PC, générez un fichier qui peut être virtualisé en tant que périphérique bloc, en supposant que le nom du fichier est init.img.

$ jj if=/dev/zero of=init.img bs=4096 count=1024

Parmi eux, bs*count est la taille du périphérique bloc (unité : octet). Une fois le fichier init.img généré, le fichier doit être formaté.

$ mke2fs –m0 –F init.img

(2) Créez un nouveau dossier ram et montez init.img dans le répertoire ram.

$ mkdir ram 
$ mount init.img ram/ -o boucle

À ce stade, lire et écrire dans le répertoire ram équivaut à lire et écrire dans le fichier init.img. L'utilisateur peut écrire les fichiers requis par le système de fichiers racine dans le répertoire ram. Après avoir écrit des fichiers dans le répertoire ram, vous devez utiliser la commande umount ram pour démonter init.img, afin que les fichiers écrits puissent être enregistrés dans init.img.

(3) Après l'ajout, umount ram est requis

4. Créé par Cramfs

CramFS (Compressed Rom File System) est un système de fichiers développé par Linux Torvalds lorsqu'il travaillait chez Transmeta. Il s'agit d'un nouveau type de système de fichiers en lecture seule conçu pour les versions postérieures au noyau Linux 2.4. Il adopte la compression zlib et le taux de compression peut généralement atteindre 1:2, mais il peut toujours obtenir une lecture aléatoire efficace. Dans les systèmes Linux, généralement Compress les répertoires qui n'ont pas besoin d'être modifiés fréquemment et décompressez les fichiers compressés au démarrage du système. Parce que Cramfs n'affectera pas la vitesse de lecture des fichiers du système et qu'il s'agit d'un système de fichiers hautement compressé. Par conséquent, il est largement utilisé dans les systèmes embarqués.

Dans un environnement embarqué, les ressources de mémoire et de mémoire externe doivent être utilisées avec parcimonie. Si vous utilisez la méthode RAMDISK pour utiliser le système de fichiers, une fois le système en cours d'exécution, vous devez d'abord décompresser le fichier image sur le Flash dans la mémoire pour construire un environnement RAMDISK avant de pouvoir lancer le programme. Mais il a aussi une faiblesse fatale. Dans des circonstances normales, le même code occupe non seulement de l'espace dans Flash (sous une forme compressée), mais occupe également un plus grand espace en mémoire (sous une forme décompressée), ce qui viole les exigences environnementales intégrées pour économiser les ressources autant que possible.

L'utilisation du système de fichiers CramFS est un moyen de résoudre ce problème. CramFS est un système de fichiers dans un format compressé. Il n'a pas besoin de décompresser tout le contenu du système de fichiers dans la mémoire en une seule fois, mais calcule uniquement les données immédiatement lorsque le système a besoin d'accéder aux données à un certain emplacement. CramFS, décompressez-le dans la mémoire en temps réel, puis accédez à la mémoire pour obtenir les données qui doivent être lues dans le système de fichiers. La décompression dans CramFS et l'emplacement de stockage des données en mémoire après la décompression sont conservés par le système de fichiers CramFS lui-même. Les utilisateurs n'ont pas besoin de comprendre le processus de mise en œuvre spécifique, cette méthode améliore donc la transparence. Pour les développeurs, c'est pratique et économise de l'espace de stockage .

Mais Cramfs a aussi ses inconvénients : retard, inférieur à 16 Mo, ne prend pas en charge l'écriture, et ne prend en charge que le noyau avec PAGE_CREATE_SIZE=4096.

La commande effectuée : (le système de fichiers est stocké dans le dossier racine)

#mkcramfs racine cramfs.img

5. Production d'autres systèmes de fichiers racine

Créez le système de fichiers yaffs : mkyaffsimage myroots myroots.img 
Créez squashfs : mksquashfs $(FS_DIR) $(FS_NAME) -noappend -be -lzma -no-fragments –noI

6. Compilation et production BusyBox

Créez un dossier de répertoire racine vide et des dossiers sous le répertoire racine de la carte cible :

[root@190 friendly-arm]# mkdir myroots 
[root@190 friendly-arm]#pwd 
/friendly-arm/myroots 
[root@190 friendly-arm]#cd myroots 
[root@190 myroots]# mkdir bin sbin usr lib dev mnt opt ​​root etc home proc tmp var 
[root@190 myroots]# mkdir etc/init.d

Entrez dans le répertoire etc/init.d, créez un fichier de script et nommez-le rcS, ouvrez-le avec gedit et ajoutez le contenu suivant :

# ! /bin/sh 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin: runlevel=S prevlevel= 
N 
umask 
022 
export PATH runlevel prevlevel 
# 
# Trap CTRL-C &c uniquement dans ce shell afin que nous puissions interrompre les sous-processus. 
# 
trap ":" INT QUITTER TSTP

Créer des nœuds dans dev
Si vous utilisez le noyau "linux 2.6.xx", vous devez créer des nœuds "console" et "null" à l'avance. Sinon, le contenu affichera l'erreur suivante au démarrage du système :

Attention : impossible d'ouvrir une console initiale. 
Panique du noyau - pas de synchronisation : Tentative de tuer init !

La commande pour créer un nœud est la suivante :

# mknod dev/console c 5 1 
# mknod dev/null c 1 3 移植Busybox:

Allez dans le répertoire où le fichier compressé est stocké et décompressez-le. Entrez ensuite dans le dossier décompressé du répertoire busybox, puis configurez busybox.

[root@190 busybox-1.2.0]# make menuconfig

Parce que les options de configuration sont organisées différemment pour chaque version. Quoi qu'il en soit, nous prêtons attention aux options suivantes sur la ligne:

1) Prise en charge de devfs 
2) Construisez BusyBox en tant que binaire statique (pas de bibliothèques partagées) // Compilez busybox dans un lien statique 
3) Voulez-vous construire busybox avec une compilation croisée ? 
(/usr/local/arm/3.3.2 /bin/arm-linux-) Préfixe de compilation croisée //spécifier le compilateur croisé 
4) init 
5) Prend en charge la lecture d'un fichier inittab //prend en charge init pour lire le fichier de configuration /etc/inittab 
6) (X) ash select ash //build 
7 ) ash 8) cp cat ls mkdir mv //Le choix des outils de commande exécutables, vous pouvez le découvrir 
vous-même, choisissez ce dont vous avez besoin 
9) mount 
10) umount 
11) Prise en charge des montages en boucle 
12) Prise en charge de l'ancien /etc/mtab 
13) insmod 14 
) Prend en charge les versions 2.2.x à 2.4.x des noyaux Linux 
15) Prend en charge les versions 2.6.x des noyaux Linux 
16) vi 
17) ne pas utiliser l'utilisateur

Le contenu ci-dessus doit être sélectionné et d'autres peuvent être définis sur la valeur par défaut ; si vous souhaitez prendre en charge d'autres fonctions, telles que la prise en charge du réseau, vous pouvez choisir en fonction de vos besoins. Si l'anglais n'est pas très mauvais, ce n'est pas un problème.
Après la configuration, enregistrez et quittez. Ensuite, compilez-le et installez-le dans le répertoire racine du système de fichiers que vous venez de créer :

[root@190 busybox-1.2.0] make TARGET_ARCH=arm CROSS=arm-linux- \ PREFIX=/friendly-arm/myroots/ all install

Après l'installation, copiez les fichiers binaires correspondants dans le répertoire correspondant du système de fichiers racine :
copiez certains programmes de contrôle de l'administrateur dans le répertoire /sbin, le plus important est d'inclure une commande init ;
copiez la bibliothèque requise pour que l'application s'exécute Pour /lib, les fichiers de bibliothèque peuvent être copiés depuis le répertoire d'installation de l'outil de compilation croisée sur le PC, comme libc-2.2.2.so, libcryt-2.2.2.so, libm-2.2.2.so, libutil-2.2 .2. so, etc., créez des raccourcis pour certaines bibliothèques correspondantes et fournissez des applications à appeler par des noms de raccourcis. Il convient de noter que la bibliothèque C doit utiliser la version de la bibliothèque C glibc, et glibc se trouve dans /lib/libc.so.6

Je suppose que tu aimes

Origine blog.csdn.net/yaxuan88521/article/details/131182364
conseillé
Classement