Comment monter une image disque à partir de la ligne de commande?

40

Je sais comment monter un lecteur qui a un fichier de périphérique correspondant dans / dev, mais je ne sais pas comment faire cela pour une image de disque qui ne représente pas un périphérique physique et qui n'a pas d'analogue dans / dev Fichier ISO ou une image de disquette). Je sais que je peux le faire sous Mac OS X en double-cliquant sur l'icône de l'image du disque dans le Finder, ce qui montera le lecteur automatiquement, mais j'aimerais pouvoir le faire depuis le terminal. Je ne suis pas sûr s'il existe une manière générale de faire cela, ou si cela est spécifique à la plate-forme.

utilisateur628544
la source
1
Voulez-vous dire que vous voulez le faire sur la ligne de commande sous OS X? Vous en parlez, mais il serait peut-être préférable d'être explicite si la question est spécifique à un certain OS. Aussi, de quel type d'image disque parlez-vous? .iso?
Ilkkachu

Réponses:

43

S'il s'agissait d'une image de disque dur avec une table de partitions MBR, je voudrais fdisk l'image pour trouver le décalage de la partition que je dois monter.

fdisk -lu /path/disk.img

Ensuite, je le monterais en dépassant le décalage.

mount -o loop,offset=xxxx /path/disk.img /mnt/disk.img.partition

La valeur de décalage est en octets, alors que fdiskmontre un nombre de blocs, vous devez donc multiplier la valeur de la colonne "Début" ou "Début" de la fdisksortie par 512(ou quelle que soit la taille du bloc) pour obtenir le décalage sur lequel monter.

jc__
la source
6
losetup -Pest généralement plus pratique que cette méthode: unix.stackexchange.com/a/316407/32558
Ciro Santilli 新疆 改造 中心 事件
35

Sur la plupart des systèmes GNU modernes, la mountcommande peut gérer cela:

mount -o loop file.iso /mnt/dir

pour démonter, vous pouvez simplement utiliser le umount commande

umount /mnt/dir

Si votre système d'exploitation ne dispose pas de cette option, vous pouvez créer un périphérique en boucle. :

losetup -f # this will print the first available loop device ex:/dev/loop0
losetup /dev/loop0 /path/file.iso #associate loop0 with the specified file
mount /dev/loop0 /mnt/dir #It may be necessary specify the type (-t iso9660)

pour démonter vous pouvez utiliser -d :

umount /mnt/dir
losetup -d /dev/loop0

Si le fichier contient des partitions, par exemple une image HD, vous pouvez utiliser le -Pparamètre (selon votre système d'exploitation), il mappera les partitions dans le contenu du fichier:

losetup -P /dev/loop0 /path/file.iso # will create /dev/loop0 
ls /dev/loop0p* #the partitions in the format /dev/loop0pX
a0f3dd13
la source
Ceci est fondamentalement localhost(bouclage!) Pour les images de disque.
Courses de légèreté avec Monica
2
losetupet mount -o loopsont spécifiques à Linux. Cela ne fonctionnera pas sur les distributions GNU utilisant un noyau différent (comme hurd, illumos ou kFreeBSD bien que illumos et FreeBSD aient l'équivalent avec une syntaxe différente)
Stéphane Chazelas
Voici quelques fonctions à automatiser davantage losetup: unix.stackexchange.com/a/430415/32558
Ciro Santilli 中心 事件
6

Essayer:

mount -o loop /path/to/file.iso /mnt

Vous pourriez ajouter, après loop:

  • -t msdos pour disquette
  • -t iso9660 pour l'image du CD-ROM

Linux essaie généralement de deviner le type de fichier.

Archemar
la source
6

losetup -P automatisation pour images multi-partitions

Comment monter une image disque à partir de la ligne de commande? | Unix et Linux Stack Exchange sont mentionnés losetup -P, et voici quelques fonctions pratiques de Bash pour automatiser davantage les choses. Usage:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

La source:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)
Ciro Santilli 改造 中心 六四 事件
la source