Wie kann ich ein Image von der Kommandozeile aus mounten?


39

Ich weiß, wie ein Laufwerk mit einer entsprechenden Gerätedatei in / dev gemountet wird, aber ich weiß nicht, wie dies für ein Disk-Image durchgeführt wird, das kein physisches Gerät darstellt und kein analoges in / dev hat (z. B. ein ISO-Datei oder ein Disketten-Image). Ich weiß, dass ich dies in Mac OS X tun kann, indem ich im Finder auf das Symbol des Disk-Images doppelklicke, wodurch das Laufwerk automatisch bereitgestellt wird. Ich möchte dies jedoch vom Terminal aus tun können. Ich bin mir nicht sicher, ob es eine allgemeine Unix-Methode dafür gibt oder ob diese plattformspezifisch ist.


1
Meinen Sie, Sie möchten es auf der Kommandozeile unter OS X tun? Sie erwähnen es, aber es könnte besser sein, explizit zu sein, wenn die Frage für ein bestimmtes Betriebssystem spezifisch ist. Welche Art von Disk-Image meinen Sie? .iso?
Ilkkachu

Antworten:


42

Wenn es sich um ein Festplatten-Image mit einer MBR-Partitionstabelle handelt, würde ich das Image durchsuchen, um den Versatz für die Partition zu ermitteln, die ich bereitstellen muss.

fdisk -lu /path/disk.img

Dann würde ich es über den Offset montieren.

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

Der Offsetwert wird in Byte angegeben, wobei fdiskeine Blockanzahl angezeigt wird. Sie sollten daher den Wert aus der Spalte "Begin" oder "Start" der fdiskAusgabe mit 512(oder einer beliebigen Blockgröße) multiplizieren , um den Offsetwert zu erhalten, bei dem gemountet werden soll.


5
losetup -PDies ist im Allgemeinen praktischer als diese Methode: unix.stackexchange.com/a/316407/32558
Ciro Santilli Am

35

Auf den meisten modernen GNU-Systemen kann der mountBefehl Folgendes ausführen:

mount -o loop file.iso /mnt/dir

Zum Aufheben des Ladevorgangs können Sie einfach den umountBefehl verwenden

umount /mnt/dir

Wenn Ihr Betriebssystem diese Option nicht hat, können Sie ein Loop-Gerät erstellen :

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)

zum umounten kannst du benutzen -d:

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

Wenn die Datei Partitionen enthält, z. B. ein HD-Image, können Sie den -PParameter verwenden (abhängig von Ihrem Betriebssystem). Er ordnet die Partitionen im Dateiinhalt zu:

losetup -P /dev/loop0 /path/file.iso # will create /dev/loop0 
ls /dev/loop0p* #the partitions in the format /dev/loop0pX

Dies ist im Grunde localhost(Loopback!) Für Disk-Images.
Leichtigkeit Rennen mit Monica

2
losetupund mount -o loopsind Linux-spezifisch. Es funktioniert nicht auf GNU-Distributionen, die einen anderen Kernel verwenden (wie hurd, illumos oder kFreeBSD, obwohl illumos und FreeBSD das Äquivalent mit einer anderen Syntax haben)
Stéphane Chazelas

Hier sind einige Funktionen zur weiteren Automatisierung losetup: unix.stackexchange.com/a/430415/32558
Ciro Santilli Am

6

Versuchen:

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

Sie könnten hinzufügen, nachdem loop:

  • -t msdos für Diskette
  • -t iso9660 für CD-ROM-Image

Linux versucht normalerweise, den Dateityp zu erraten.


6

losetup -P Automatisierung für Images mit mehreren Partitionen

Wie kann ich ein Image von der Kommandozeile aus mounten? | Unix & Linux Stack Exchange werden erwähnt losetup -P, und hier sind einige nützliche Bash-Funktionen, um die Dinge weiter zu automatisieren. Verwendung:

$ 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

Quelle:

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"
)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.