Como montar uma imagem de disco a partir da linha de comando?

40

Eu sei como montar uma unidade que possui um arquivo de dispositivo correspondente em / dev, mas não sei como fazer isso para uma imagem de disco que não representa um dispositivo físico e não possui um analógico em / dev (por exemplo, um Arquivo ISO ou uma imagem de disquete). Sei que posso fazer isso no Mac OS X clicando duas vezes no ícone da imagem do disco no Finder, que montará a unidade automaticamente, mas eu gostaria de fazer isso no terminal. Não tenho certeza se existe uma maneira geral do Unix de fazer isso ou se é específico da plataforma.

user628544
fonte
1
Você quer dizer isso na linha de comando do OS X? Você mencionou, mas pode ser melhor ser explícito se a pergunta for específica para um determinado sistema operacional. Além disso, que tipo de imagem de disco você quer dizer? .iso?
Ilkkachu # 15/16

Respostas:

43

Se fosse uma imagem do disco rígido com uma tabela de partição MBR, eu daria uma olhada na imagem para encontrar o deslocamento da partição que preciso montar.

fdisk -lu /path/disk.img

Então eu montaria passando o deslocamento.

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

O valor do deslocamento está em bytes, enquanto fdiskmostra uma contagem de blocos; portanto, você deve multiplicar o valor da coluna "Iniciar" ou "Iniciar" da fdisksaída por 512(ou qualquer que seja o tamanho do bloco) para obter o deslocamento no qual montar.

jc__
fonte
6
losetup -Pgeralmente é mais conveniente que esse método: unix.stackexchange.com/a/316407/32558
Ciro Santilli
35

Na maioria dos sistemas GNU modernos, o mountcomando pode lidar com isso:

mount -o loop file.iso /mnt/dir

desmontar você pode simplesmente usar o umountcomando

umount /mnt/dir

Se o seu sistema operacional não tiver essa opção, você poderá criar um dispositivo de loop :

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)

para montar você pode usar -d:

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

Se o arquivo tiver partições, por exemplo, uma imagem HD, você pode usar o -Pparâmetro (dependendo do sistema operacional), ele mapeará as partições no conteúdo do arquivo:

losetup -P /dev/loop0 /path/file.iso # will create /dev/loop0 
ls /dev/loop0p* #the partitions in the format /dev/loop0pX
a0f3dd13
fonte
Isso é basicamente localhost(loopback!) Para imagens de disco.
Lightness Races com Monica
2
losetupe mount -o loopsão específicos do Linux. Não vai funcionar em distribuições GNU usando um kernel diferente (como Hurd, illumos ou kFreeBSD embora illumos e FreeBSD terão o equivalente com uma sintaxe diferente)
Stéphane Chazelas
Aqui estão algumas funções para automatizar ainda mais losetup: unix.stackexchange.com/a/430415/32558
Ciro Santilli
6

Experimentar:

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

Você pode adicionar, depois de loop:

  • -t msdos para disquete
  • -t iso9660 para imagem de CD-ROM

O Linux geralmente tenta adivinhar o tipo de arquivo.

Archemar
fonte
6

losetup -P automação para imagens de múltiplas partições

Como montar uma imagem de disco a partir da linha de comando? | O Unix e Linux Stack Exchange mencionado losetup -P, e aqui estão algumas funções úteis do Bash para automatizar ainda mais as coisas. Uso:

$ 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

Fonte:

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 adicionou uma nova foto
fonte