Làm cách nào để gắn hình ảnh phân phối Raspberry Pi Linux?


37

Hình ảnh hệ thống tập tin bình thường có thể dễ dàng gắn kết:

mount system.img /mnt

Kiểm tra, và sửa đổi. Nhưng khi tôi thử điều này với hình ảnh hệ thống Raspberry Pi (ví dụ: raspbian), tôi nhận được:

mount: unknown filesystem type '(null)'

Và dù tôi có cố gắng -tthế nào thì nó cũng không hoạt động. Làm thế nào tôi có thể gắn hình ảnh này?


2
Câu hỏi song song dành cho MS Windows: raspberrypi.stackexchange.com/questions/28457/ ?
goldilocks

Câu trả lời:


71

Câu hỏi này được trả lời như một phần của câu trả lời cho các câu hỏi khác, nhưng nó xứng đáng được đối xử theo quy tắc ở đây để không phải tiếp tục lặp lại.

Bạn không thể gắn toàn bộ hình ảnh vì nó thực sự chứa hai phân vùng và khu vực khởi động. Tuy nhiên, bạn có thể gắn các phân vùng riêng lẻ trong ảnh nếu bạn biết phần bù của chúng bên trong tệp. Để tìm thấy chúng, kiểm tra hình ảnh như một thiết bị khối với fdisk -l whatever.img. Đầu ra phải bao gồm một bảng như thế này:

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

Đây là hai phân vùng. Cái đầu tiên được gắn nhãn "FAT32" và cái còn lại là "Linux". Trên bảng này, có một số thông tin khác về toàn bộ thiết bị, bao gồm:

Units: sectors of 1 * 512 = 512 bytes

Chúng ta có thể tìm thấy phần bù theo byte bằng cách nhân kích thước đơn vị này với Startkhối của phân vùng:

  • Phân vùng thứ 1 512 * 8192 = 4194304
  • Phân vùng thứ 2 512 * 122880 = 62914560

Chúng có thể được sử dụng với offsettùy chọn của mountlệnh. Chúng tôi cũng có một đầu mối về loại của mỗi phân vùng fdisk. Vì vậy, giả sử chúng tôi có các thư mục /mnt/img/one/mnt/img/twocó sẵn dưới dạng các điểm gắn kết:

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

Nếu bạn gặp lỗi "vòng lặp chồng chéo" ở đây, phiên bản mountyêu cầu của bạn yêu cầu bạn chỉ định kích thước cũng như độ lệch của phân vùng đầu tiên. Bỏ kết nối đó và sử dụng số khối (57344) * 512 (= 29360128):

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

Phân vùng thứ hai không cần siz006it vì không có gì sau nó trong hình ảnh.

Bây giờ bạn có thể truy cập hai phân vùng. Nếu bạn không có ý định thay đổi bất cứ điều gì ở họ, hãy sử dụng công tắc -r(chỉ đọc). Nếu bạn thay đổi bất cứ điều gì, những thay đổi đó sẽ được bao gồm trong .imgtệp.

Lưu ý rằng phân vùng đầu tiên có thể được gắn vào /bootphân vùng thứ hai khi hệ thống đang chạy.


12
kpartx giúp bạn dễ dàng hơn nữa: kpartx -a whatever.imgtạo các nút (vòng lặp) thích hợp, mà sau này bạn có thể gắn kết theo ý muốn. Chạy kpartx -d whatever.imgđể xóa các nút vòng lặp (không đếm được).


Làm cách nào để gắn kết phân vùng root và boot cùng lúc: unix.stackexchange.com/q/342463/9689 ?
Grzegorz Wierzowiecki

1
PS Nếu một người muốn gắn cả hai phân vùng cùng một lúc, để tránh lỗi "chồng chéo", chỉ cần chỉ định kích thước của phân vùng với sizelimittùy chọn. Để biết thêm thông tin: unix.stackexchange.com/a/342466/9689 . (Btw. Câu trả lời trên có thể được cập nhật để cung cấp ví dụ sử dụng tùy chọn đó)
Grzegorz Wierzowiecki

2
Thay vì nhân lên thủ công, bạn có thể sử dụng Mở rộng số học của bash : $((8192*512)).
Ruslan

20

losetupcung cấp phân vùng thăm dò thông qua -P. Sử dụng điều này làm cho việc gắn các phân vùng của hình ảnh đĩa đầy đủ, chẳng hạn như hình ảnh thẻ SD Raspbian rất dễ dàng:

losetup -P /dev/loop0 raspbian.img
mount /dev/loop0p2 /mnt
mount /dev/loop0p1 /mnt/boot

Điều này dường như ít bị lỗi của con người. Tôi cũng có thể sử dụng nhãn trong các lệnh mount?
ctrl-alt-delor

1

Lúc đầu, tôi đang sử dụng awk / grep để phân tích fdisk và rút ra các offset, nhưng thấy nó có thể hơi phức tạp, không hoàn hảo và khó hiểu sau này. Phương pháp đơn giản nhất tôi đã tìm thấy:

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}

Điều này tạo ra một temp-dir cho bạn, tự động gán các vòng lặp thiết bị tiếp theo và bộ nó lên cho bạn khi p1p2phân vùng thiết bị, và gắn kết khởi động và rễ.

Bạn cũng có thể đặt phần dọn dẹp vào bẫy thoát, vì vậy nếu có lỗi, bạn sẽ không có các tệp / tệp treo lủng lẳng:

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

0

Trong trường hợp fdisk -l hiển thị với các cung thay vì các khối trên Arch linux ... Một cách khác để tìm số khối trong trường hợp "lỗi vòng lặp chồng chéo" là trừ phần bù theo byte của phân vùng thứ nhất khỏi phân vùng thứ hai và chia cho hai. Ví dụ: (62914560-4194304) / 2 = 29360128

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.