Bagaimana saya bisa memasang gambar distro Raspberry Pi Linux?

37

Gambar sistem file normal dapat dengan mudah dipasang:

mount system.img /mnt

Diperiksa, dan dimodifikasi. Tetapi ketika saya mencoba ini dengan gambar sistem Raspberry Pi (misalnya raspbian), saya mendapatkan:

mount: unknown filesystem type '(null)'

Dan apa pun yang saya coba -t, itu tidak akan berhasil. Bagaimana saya bisa memasang gambar ini?

goldilocks
sumber
2
Pertanyaan paralel untuk MS Windows: raspberrypi.stackexchange.com/questions/28457/… ?
goldilocks

Jawaban:

71

Pertanyaan ini dijawab sebagai bagian dari jawaban untuk pertanyaan-pertanyaan lain, tetapi pantas mendapatkan perawatan kanonik di sini sehingga tidak harus terus diulang.

Anda tidak dapat memasang gambar secara keseluruhan karena sebenarnya mengandung dua partisi dan sektor boot. Namun, Anda dapat me-mount masing-masing partisi dalam gambar jika Anda tahu offsetnya di dalam file. Untuk menemukan mereka, periksa gambar sebagai perangkat blok dengan fdisk -l whatever.img. Output harus mencakup tabel seperti ini:

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

Ini adalah dua partisi. Yang pertama diberi label "FAT32", dan yang lainnya "Linux". Di atas tabel ini, ada beberapa informasi lain tentang perangkat secara keseluruhan, termasuk:

Units: sectors of 1 * 512 = 512 bytes

Kita dapat menemukan offset dalam byte dengan mengalikan ukuran unit ini dengan Startblok partisi:

  • Partisi 1 512 * 8192 = 4194304
  • Partisi ke-2 512 * 122880 = 62914560

Ini dapat digunakan dengan offsetopsi mountperintah. Kami juga memiliki petunjuk tentang jenis setiap partisi dari fdisk. Jadi, anggap kita memiliki direktori /mnt/img/onedan /mnt/img/twotersedia sebagai mount point:

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

Jika Anda mendapatkan kesalahan "tumpang tindih loop" di sini, versi mountAnda mengharuskan Anda untuk menentukan ukuran serta offset dari partisi pertama. Lepas itu, dan gunakan jumlah blok (57344) * 512 (= 29360128):

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

Partisi kedua tidak perlu sizelimit karena tidak ada apa-apa setelah itu di gambar.

Anda sekarang dapat mengakses dua partisi. Jika Anda tidak bermaksud mengubah apa pun di dalamnya, gunakan -rsakelar (hanya baca) juga. Jika Anda mengubah apa pun, perubahan itu akan disertakan dalam .imgfile.

Perhatikan bahwa partisi pertama mungkin dipasang di /bootdalam partisi kedua ketika sistem sedang berjalan.

goldilocks
sumber
12
kpartx membuatnya lebih mudah bagi Anda: kpartx -a whatever.imgmembuat simpul (loop) yang sesuai, yang nantinya bisa Anda pasang sesuka hati. Jalankan kpartx -d whatever.imguntuk menghapus simpul loop (tidak terpasang).
1
serupa: stackoverflow.com/a/1421075/544721
Grzegorz Wierzowiecki
Bagaimana cara me-mount root dan mem-boot partisi secara bersamaan: unix.stackexchange.com/q/342463/9689 ?
Grzegorz Wierzowiecki
1
PS Jika seseorang ingin me-mount kedua partisi pada saat yang sama, untuk menghindari kesalahan "tumpang tindih", cukup tentukan ukuran partisi dengan sizelimitopsi. Untuk info lebih lanjut: unix.stackexchange.com/a/342466/9689 . (Btw. Jawaban di atas dapat diperbarui untuk memberikan contoh penggunaan opsi itu)
Grzegorz Wierzowiecki
2
Daripada mengalikan secara manual, Anda dapat menggunakan Ekspansi Arithmetic bash: $((8192*512)).
Ruslan
20

losetupmenyediakan partisi yang menyelidikinya -P. Menggunakan ini membuat pemasangan partisi dari gambar disk penuh seperti gambar kartu SD Raspbian sangat mudah:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot
Johan Ehnberg
sumber
Ini tampaknya kurang rentan terhadap kesalahan manusia. Bisakah saya juga menggunakan label pada perintah mount?
ctrl-alt-delor
1

Pada awalnya saya menggunakan awk / grep untuk mem-parsing fdisk dan mengeluarkan offset, tetapi ternyata itu bisa sedikit rumit, flakey, dan sulit dimengerti nanti. Metode termudah yang saya temukan:

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}

Hal ini menciptakan suhu-dir untuk Anda, auto-menugaskan loop-perangkat berikutnya dan set itu untuk Anda sebagai p1dan p2partisi perangkat, dan gunung boot dan root.

Anda juga dapat menempatkan bagian pembersihan di jebakan keluar, jadi jika sesuatu gagal Anda tidak akan menggantung mount / file:

set -e
function cleanup {
  sudo umount -f $TMP/boot/
  sudo umount -f $TMP
  rmdir $TMP
}
trap cleanup EXIT
konsumer
sumber
0

Dalam kasus fdisk -l muncul dengan sektor bukan blok di Arch linux ... Cara lain untuk menemukan jumlah blok dalam kasus "kesalahan loop tumpang tindih" adalah dengan mengurangi offset dalam byte dari partisi pertama dari partisi kedua dari partisi kedua dan bagi dua. Misalnya (62914560-4194304) / 2 = 29360128

AB
sumber