Как я могу смонтировать образ дистрибутива Raspberry Pi Linux?

37

Обычные образы файловой системы могут быть легко смонтированы:

mount system.img /mnt

Рассмотрено и изменено. Но когда я пытаюсь сделать это с образом системы Raspberry Pi (например, raspbian), я получаю:

mount: unknown filesystem type '(null)'

И что бы я ни пытался -t, это не сработает. Как я могу смонтировать этот образ?

Златовласка
источник
2
Параллельный вопрос для MS Windows: raspberrypi.stackexchange.com/questions/28457/… ?
Златовласка

Ответы:

71

Ответ на этот вопрос является частью ответа на другие вопросы, но здесь он заслуживает канонического подхода, поэтому повторять его не нужно.

Вы не можете смонтировать образ в целом, потому что он на самом деле содержит два раздела и загрузочный сектор. Однако вы можете смонтировать отдельные разделы в образе, если знаете их смещение внутри файла. Чтобы найти их, изучите изображение как блочное устройство fdisk -l whatever.img. Выходные данные должны включать в себя следующую таблицу:

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

Это два раздела. Первый помечен как «FAT32», а второй - «Linux». Над этой таблицей есть некоторая другая информация об устройстве в целом, включая:

Units: sectors of 1 * 512 = 512 bytes

Мы можем найти смещение в байтах, умножив размер этого блока на Startблок раздела:

  • 1-й раздел 512 * 8192 = 4194304
  • 2-я перегородка 512 * 122880 = 62914560

Они могут быть использованы с offsetопцией mountкоманды. У нас также есть подсказка о типе каждого раздела из fdisk. Итак, предположим, что у нас есть каталоги /mnt/img/oneи они /mnt/img/twoдоступны как точки монтирования:

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

Если вы получаете ошибку «Перекрывающийся цикл», ваша версия mountтребует, чтобы вы указали размер, а также смещение первого раздела. Размонтируйте его и используйте количество блоков (57344) * 512 (= 29360128):

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

Второй раздел не нуждается в sizelimit, так как на изображении нет ничего после него.

Теперь вы можете получить доступ к двум разделам. Если вы не собираетесь что-либо менять в них, используйте -rпереключатель (только для чтения). Если вы что-то измените, эти изменения будут включены в .imgфайл.

Обратите внимание, что первый раздел, вероятно, смонтирован /bootво втором разделе, когда система работает.

Златовласка
источник
12
kpartx делает это еще проще для вас: kpartx -a whatever.imgсоздает подходящие (петлевые) узлы, которые вы можете позже смонтировать по желанию. Запустите kpartx -d whatever.imgдля удаления (не смонтированных) узлов цикла.
1
аналогично: stackoverflow.com/a/1421075/544721
Гжегож Вежовецкий,
Как смонтировать корневой и загрузочный раздел одновременно: unix.stackexchange.com/q/342463/9689 ?
Гжегож Вежовецкий,
1
PS Если вы хотите смонтировать оба раздела одновременно, чтобы избежать ошибки «перекрытия», просто укажите размер раздела с sizelimitопцией. Для получения дополнительной информации: unix.stackexchange.com/a/342466/9689 . (Кстати, ответ выше может быть обновлен, чтобы привести пример использования этой опции)
Grzegorz Wierzowiecki
2
Вместо умножения вручную, вы можете использовать Арифметическое расширение в Bash: $((8192*512)).
Руслан
20

losetupобеспечивает прохождение раздела -P. Использование этого делает установку разделов полного образа диска, такого как образ карты Raspbian SD, очень простым:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot
Йохан Энберг
источник
Это кажется менее подверженным человеческим ошибкам. Могу ли я также использовать метки в командах монтирования?
Ctrl-Alt-Delor
1

Сначала я использовал awk / grep для разбора fdisk и извлечения смещений, но обнаружил, что это может быть немного сложным, ненадежным и трудным для понимания позже. Самый простой метод, который я нашел:

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}

Это создаст для вас временный каталог, автоматически назначит следующее петлевое устройство и настроит его для вас в качестве устройств раздела p1и p2разделов, а также установит загрузочный и корневой каталог.

Вы также можете поместить часть очистки в выходную ловушку, так что если что-то не получится, у вас не будет висящих файлов / файлов:

set -e
function cleanup {
  sudo umount -f $TMP/boot/
  sudo umount -f $TMP
  rmdir $TMP
}
trap cleanup EXIT
konsumer
источник
0

В случае, если fdisk -l отображается с секторами вместо блоков в Arch linux ... Другой способ найти количество блоков в случае «ошибки перекрывающегося цикла» - вычесть смещение в байтах первого раздела из второго раздела. и разделить на два. Например (62914560-4194304) / 2 = 29360128

AB
источник