Tutoriel Linux

Cpio sous Linux : extraire un initramfs sans écraser le mauvais dossier

Débutant4 min de lecture

Un fichier initramfs n’est pas une archive à ouvrir au hasard dans votre dossier courant. Selon la distribution, il peut être compressé avec gzip, xz, zstd ou un autre format, puis contenir une archive cpio. Une extraction mal préparée peut mélanger ses fichiers avec ceux du répertoire actuel ou vous faire modifier l’original.

La méthode sûre consiste à identifier la compression, travailler dans un dossier vide, lister le contenu avant extraction, puis ne reconstruire l’image qu’après vérification. Les commandes ci-dessous sont adaptées à une analyse locale, sans remplacer directement le fichier utilisé au démarrage.

Commencez par préserver l’initramfs original

Repérez d’abord l’image concernée. Les fichiers se trouvent souvent dans /boot et portent un nom lié à la version du noyau :

ls -lh /boot/initrd* /boot/initramfs* 2>/dev/null
uname -r

Ne travaillez pas directement dans /boot. Copiez l’image vers un espace de travail et créez un dossier d’extraction dédié :

mkdir -p "$HOME/tmp/initramfs-cpio"
cp --preserve=all /boot/initrd.img-$(uname -r) "$HOME/tmp/initramfs-cpio/original.img"
cd "$HOME/tmp/initramfs-cpio"
file original.img

Le nom de l’image varie selon la distribution. Si le chemin proposé n’existe pas, utilisez le fichier exact trouvé avec ls. La copie est importante : une reconstruction prématurée de l’initramfs peut rendre le démarrage plus difficile à diagnostiquer.

Identifiez la compression avant d’utiliser cpio

cpio lit l’archive interne, mais il ne décompresse pas automatiquement toutes les couches qui peuvent l’entourer. La commande file donne généralement le premier format à traiter :

file original.img

Vous pouvez rencontrer notamment gzip compressed data, Xz compressed data, Zstandard compressed data ou une image déjà détectée comme archive cpio. Décompressez vers un nouveau fichier et gardez l’original intact :

# gzip
cp original.img initramfs.cpio.gz
gzip -dc initramfs.cpio.gz > initramfs.cpio

# xz
cp original.img initramfs.cpio.xz
xz -dc initramfs.cpio.xz > initramfs.cpio

# zstd
cp original.img initramfs.cpio.zst
zstd -dc initramfs.cpio.zst > initramfs.cpio

Ne lancez qu’un seul bloc, selon le résultat de file. Si l’image est déjà une archive cpio, utilisez directement original.img comme entrée.

Listez l’archive avant de l’extraire

Créez un second dossier vide. L’option -t demande à cpio de lister les fichiers sans les extraire. L’option -F lui indique où se trouve l’archive :

mkdir extracted
cpio -itv -F initramfs.cpio | less

La liste permet de vérifier que vous avez bien affaire à l’archive attendue : répertoires bin, etc, lib, scripts d’initramfs et modules éventuels. Si vous obtenez une erreur de format, revenez à l’étape file : vous avez peut-être utilisé cpio avant de retirer la compression externe, ou choisi le mauvais fichier.

Extrayez dans le dossier prévu

Depuis le dossier de travail, extrayez maintenant l’archive dans extracted :

cd extracted
cpio -idmuv --no-absolute-filenames < ../initramfs.cpio

-i active l’extraction, -d crée les répertoires nécessaires, -m conserve les dates quand c’est possible et -v affiche les fichiers traités. L’option --no-absolute-filenames évite de recréer des chemins absolus hors du dossier de travail.

Vérifiez ensuite quelques éléments sans modifier le contenu :

find . -maxdepth 2 -type d | sort | head -30
ls -l ./init ./bin ./sbin 2>/dev/null
find . -type f -name '*.ko*' | head

Pour une inspection plus complète, utilisez find, grep ou diff sur cette copie. Ne supprimez pas un script d’initramfs simplement parce qu’il paraît inhabituel : son rôle dépend de la distribution, du stockage racine et des modules chargés au démarrage.

Reconstruire seulement après vérification

Si vous avez réellement modifié le contenu, la reconstruction doit se faire depuis la racine du dossier extrait, avec le format attendu par l’image d’origine :

cd "$HOME/tmp/initramfs-cpio/extracted"
find . -print0 | cpio --null -o -H newc > ../initramfs-rebuilt.cpio

Cette commande produit une archive cpio au format newc, fréquent pour les initramfs Linux. Il reste à remettre la compression utilisée par l’image d’origine, puis à vérifier le résultat avant toute installation. Pour un système Debian ou Ubuntu, unmkinitramfs est souvent plus pratique pour inspecter une image complète, tandis que update-initramfs est préférable pour régénérer proprement l’image à partir de la configuration du système.

Je vous conseille de tester l’extraction sur une copie et de conserver au moins une version fonctionnelle dans /boot. Une archive cpio valide ne garantit pas, à elle seule, que le noyau pourra démarrer avec les modules et scripts qu’elle contient.

Tux extrait un initramfs Linux dans un dossier de travail séparé
Extraire un initramfs dans un dossier séparé avant toute modification.