Як я можу змонтувати зображення дистрибутива 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щоб видалити (відключені) вузли циклу.


Як змонтувати кореневий і завантажувальний розділ одночасно: unix.stackexchange.com/q/342463/9689 ?
Grzegorz Wierzowiecki

1
PS Якщо ви хочете монтувати обидва розділи одночасно, щоб уникнути помилки "перекриття", просто вкажіть розмір розділу з sizelimitопцією. Для отримання додаткової інформації: unix.stackexchange.com/a/342466/9689 . (Btw. Відповідь вище може бути оновлена, щоб навести приклад використання цього варіанту)
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

Це здається менш схильним до людських помилок. Чи можу я також використовувати мітки в командах mount?
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

0

У випадку, якщо fdisk -l з'являється з секторами замість блоків на Arch linux ... Ще один спосіб знайти кількість блоків у разі "помилки перекриття циклу" - відняти зміщення в байтах першого розділу з другого розділу і розділити на два. Наприклад (62914560-4194304) / 2 = 29360128

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.