디스크 이미지에서 여러 파티션을 동시에 마운트하는 방법은 무엇입니까?

디스크 이미지에서 여러 파티션을 동시에 마운트하는 방법은 무엇입니까?

노력하고있어루트 및 부팅 파티션 마운트~의라즈베리 파이영상:

mount -v -o offset="70254592" -t ext4 /mnt/X/raspbian-jessie.img /tmp/raspbian
mount -v -o offset="4194304" -t vfat /mnt/X/raspbian-jessie.img /tmp/boot

루트가 마운트되면 부트를 마운트하면 다음과 같은 결과가 발생합니다.

mount: /mnt/X/raspbian-jessie.img: overlapping loop device exists

하나의 디스크 이미지에 여러 파티션을 동시에 마운트하는 방법은 무엇입니까? (이것은 분명히 디스크에서는 가능하지만 파일에서는 가능하지 않은 이유는 무엇입니까?)

답변1

중복을 방지하려면 파티션의 길이를 지정해야 합니다. 옵션은 을 참조 sizelimit하십시오 man mount.man losetup

답변2

Lostup 2.21 -P 옵션

losetup -P -f --show my.img

/dev/loopXpY파티션당 하나씩 만듭니다.

장점: 실행 파일(util-linux 패키지)은 많은 배포판에 사전 설치되어 있습니다.

단점: 이것은 최근 옵션이며 Ubuntu 14.04에는 존재하지 않습니다. 그 전에는 kpartx를 사용하십시오.https://unix.stackexchange.com/a/405639/32558

losetup -P오토메이션

용법:

$ 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

원천:

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"
)

답변3

도구를 사용하십시오 kpartx. 이미지 파티션을 매핑하고 /dev/mapper이를 사용하여 직접 마운트할 수 있습니다.

$ sudo kpartx -a disk.img
$ sudo mount -o loop /dev/mapper/loop0p2 /mnt

추신. 완료되면 매핑을 삭제하는 것을 잊지 마세요.sudo kpartx -d disk.img

답변4

여기에 있는 다른 답변이 정확하다고 생각하지만 제 생각에는간결- 아니면 조금 더 가세요. losetup좋습니다. 하지만 이제 막 시작하는 사람들에게는 혼란스러울 수도 있습니다. 그래서 - 내 대답은 다음과 같습니다.

OP가 질문을 시작하지 않았으므로 fdisk -lu <file.img>내 RPi를 예로 사용하겠습니다. fdisk -lu <file.img>제공하기 때문이죠"숫자"예제를 완료합니다.

내 파이에서:

$ fdisk -lu ./back.img
Disk ./back.img: 2.89 GiB, 3099590656 bytes, 6053888 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00f24f4c

Device      Boot  Start     End Sectors  Size Id Type
./back.img1        2048  526335  524288  256M  c W95 FAT32 (LBA)
./back.img2      526336 6053887 5527552  2.6G 83 Linux

보시다시피 두 개의 파티션이 있습니다. 하나는 FAT32(2048~526335)이고 다른 하나는 Linux/ ext4(526336~6053887) 또는 두 개의 파티션 524,288 및 5,527,552 입니다.부서(512바이트/섹터)입니다.

또한 다음 두 파티션을 시도할 때 mount"중복" 오류가 발생했습니다 .

$ sudo mount -o loop,offset=1048576 ./back.img /mnt/loopy/boot
$ sudo mount -o loop,offset=269484032 ./back.img /mnt/loopy/root
mount: /mnt/loopy/root: overlapping loop device exists for /home/pi/back.img.

위의 답변에서 알 수 있듯이 솔루션은 실제로 sizelimit옵션이지만 적어도 나에게는 약간 미묘합니다.

$ sudo umount /mnt/loopy/boot /mnt/loopy/root 
$ sudo mount -o loop,offset=1048576,sizelimit=268435456 ./back.img /mnt/loopy/boot 

# NOTE: sizelimit = 512 bytes/sector * 524288 sectors = 268435456 bytes 

$ sudo mount -o loop,offset=269484032,sizelimit=2830106624 ./back.img /mnt/loopy/root 

# NOTE: sizelimit = 512 bytes/sector * 5527552 sectors = 2830106624 bytes 

두 파티션이 모두 성공적으로 마운트되었으므로 back.img이제 원하는 대로 변경할 수 있습니다. 편집기를 사용하여 /mnt/loopy/root/etc: hostnamehosts의 세 파일을 수정했습니다 dhcpcd.conf. 완료되면 두 가지를 모두 제거하고 수정된 back.img파일을 NAS로 전송했습니다.

$ sudo umount /mnt/loopy/root /mnt/loopy/boot 
$ rsync -avi ./back.img /mnt/SynologyNAS/rpi_share/raspberrypi3a 
sending incremental file list
>f.st...... back.img

sent 3,100,347,489 bytes  received 35 bytes  10,897,530.84 bytes/sec
total size is 3,099,590,656  speedup is 1.00 

# NOTE: don't use `cp` for this! 

마지막으로 모든 것이 잘 되었다는 증거로 새 SD 카드에 Etcher"구운" back.img다음 이를 사용하여 새 RPi 3A+를 부팅했습니다.

관련 정보