Comment puis-je monter une image de distribution Linux Raspberry Pi?


37

Les images de système de fichiers normales peuvent être facilement montées:

mount system.img /mnt

Examiné et modifié. Mais lorsque j'essaie avec une image système Raspberry Pi (par exemple, Raspbian), je reçois:

mount: unknown filesystem type '(null)'

Et peu importe ce que j'essaye -t, ça ne marchera pas. Comment puis-je monter cette image?


2
La question parallèle pour MS Windows: raspberrypi.stackexchange.com/questions/28457/… ?
goldilocks

Réponses:


71

La réponse à cette question fait partie de la réponse à d'autres questions, mais elle mérite ici un traitement canonique, de sorte qu'elle n'a pas à être répétée.

Vous ne pouvez pas monter l'image dans son ensemble car elle contient en fait deux partitions et un secteur de démarrage. Toutefois, vous pouvez monter les partitions individuelles dans l'image si vous connaissez leur décalage dans le fichier. Pour les trouver, examinez l'image en tant que périphérique bloc avec fdisk -l whatever.img. La sortie devrait inclure un tableau comme celui-ci:

Device         Boot     Start       End  Blocks  Id System
whatever.img1            8192    122879   57344   c W95 FAT32 (LBA)
whatever.img2          122880   5785599 2831360  83 Linux

Ce sont les deux partitions. Le premier est intitulé "FAT32" et le second "Linux". Au-dessus de ce tableau, vous trouverez d'autres informations sur le périphérique dans son ensemble, notamment:

Units: sectors of 1 * 512 = 512 bytes

Nous pouvons trouver le décalage en octets en multipliant cette taille d'unité par le Startbloc de la partition:

  • 1ère partition 512 * 8192 = 4194304
  • 2ème partition 512 * 122880 = 62914560

Ceux-ci peuvent être utilisés avec l' offsetoption de la mountcommande. Nous avons également un indice sur le type de chaque partition fdisk. Donc, en supposant que nous ayons des répertoires /mnt/img/oneet /mnt/img/twodisponibles en tant que points de montage:

mount -v -o offset=4194304 -t vfat whatever.img /mnt/img/one
mount -v -o offset=62914560 -t ext4 whatever.img /mnt/img/two

Si vous obtenez une erreur "chevauchement de boucle", votre version de mountvous oblige à spécifier la taille ainsi que le décalage de la première partition. Démontez-le et utilisez le nombre de blocs (57344) * 512 (= 29360128):

mount -v -o offset=4194304,sizelimit=29360128 \
    -t vfat whatever.img /mnt/img/one  

La seconde partition n'a pas besoin de taille car il n'y a rien après l'image.

Vous pouvez maintenant accéder aux deux partitions. Si vous ne souhaitez rien y changer, utilisez également le -rcommutateur (lecture seule). Si vous changez quoi que ce soit, ces modifications seront incluses dans le .imgfichier.

Notez que la première partition est probablement montée /bootdans la seconde partition lorsque le système est en cours d'exécution.


12
kpartx vous facilite encore plus la tâche: kpartx -a whatever.imgcrée les nœuds (boucles) appropriés, que vous pouvez ensuite monter à volonté. Exécuter kpartx -d whatever.imgpour supprimer les nœuds de boucle (non montés).


Comment monter la partition racine et la partition de démarrage simultanément: unix.stackexchange.com/q/342463/9689 ?
Grzegorz Wierzowiecki

1
PS Si on veut monter les deux partitions en même temps, afin d'éviter l'erreur "de chevauchement", il suffit de spécifier la taille de la partition avec l' sizelimitoption. Pour plus d'informations: unix.stackexchange.com/a/342466/9689 . (La réponse ci-dessus peut être mise à jour pour fournir un exemple d'utilisation de cette option)
Grzegorz Wierzowiecki

2
Plutôt que de multiplier manuellement, vous pouvez utiliser Arithmétique de bash: $((8192*512)).
Ruslan

20

losetupfournit une partition explorant à travers -P. Cela facilite le montage de partitions d'une image disque complète telle que l'image de la carte SD Raspbian:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot

Cela semble moins sujet aux erreurs humaines. Puis-je également utiliser des étiquettes dans les commandes de montage?
ctrl-alt-delor

1

Au début, j’utilisais awk / grep pour analyser fdisk et extraire les décalages, mais j’ai trouvé que cela pouvait être un peu compliqué, floconneux et difficile à comprendre plus tard. La méthode la plus simple que j'ai trouvée:

IMAGE_FILE="YOUR IMAGE FILE GOES HERE"
TMP=$(mktemp -d)
LOOP=$(sudo losetup --show -fP "${IMAGE_FILE}")
sudo mount ${LOOP}p2 $TMP
sudo mount ${LOOP}p1 $TMP/boot/

# do stuff to ${TMP}/ which is rpi filesystem

# cleanup
umount ${TMP}/boot/
umount ${TMP}
rmdir ${TMP}

Cela crée un répertoire temporaire pour vous, affecte automatiquement le périphérique de boucle suivant, le configure pour vous en tant p1que p2périphériques de partition et vous permet de monter les bases de démarrage et racine.

Vous pouvez également placer la partie nettoyage dans un piège de sortie. Ainsi, en cas d'échec, vous n'aurez plus de fichiers / montages pendants:

set -e
function cleanup {
  sudo umount -f $TMP/boot/
  sudo umount -f $TMP
  rmdir $TMP
}
trap cleanup EXIT

0

Dans le cas où fdisk -l apparaît avec des secteurs au lieu de blocs sur Arch linux ... Un autre moyen de déterminer le nombre de blocs en cas "d'erreur de boucle de recouvrement" consiste à soustraire le décalage en octets de la première partition de la deuxième partition. et diviser par deux. Par exemple (62914560-4194304) / 2 = 29360128

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.