전체 디스크 이미지 파일에서 파일 시스템을 읽는 방법은 무엇입니까?

전체 디스크 이미지 파일에서 파일 시스템을 읽는 방법은 무엇입니까?

다음 명령을 실행했습니다.

VBoxManage clonehd d6b9f0a5-98df-48ca-83c8-91a0809ec349 --format RAW Debian.raw
sudo dd if=~/.VirtualBox/HardDisks/Debian.raw of=/dev/sda5

파티션을 마운트하려고 하면 다음과 같은 불만 사항이 표시됩니다.

EXT4-fs (sda5): VFS: Can't find ext4 filesystem

이제 가상 머신에 ext4 파티션이 있다는 것을 알았습니다. 내가 뭘 잘못했나요?

답변1

이미지는 파일 시스템 이미지가 아닌 디스크 이미지입니다. 파일 시스템은 해당 이미지 내부의 파티션에 있습니다(매우 특이한 작업을 수행하지 않는 한). file Debian.raw및 를 실행하여 이를 확인할 수 있습니다 fdisk -l Debian.raw.

이 파티션에 액세스하는 가장 쉬운 방법은 루프 장치와 연결하는 것입니다. 가능하다면 드라이버가 이 옵션을 loop지원하고 로드하는지 확인하세요 . 그런 다음 디스크 이미지를 루프 장치와 연결하면 짜잔:max_partsrmmod loop; modprobe loop max_part=63

losetup -fs Debian.raw     # prints /dev/loop0 (or some other number)
mount /dev/loop0p1 /mnt    # 0 as above, 1 is the partition number

루프 드라이버가 파티션을 사용하도록 할 수 없는 경우 디스크 이미지에서 파티션의 오프셋을 찾아야 합니다. 실행하여 fdisk -lu Debian.raw파티션을 나열하고 시작 섹터 S(섹터는 512바이트)를 찾습니다. 그런 다음 losetup루핑 장치가 이 오프셋에서 시작되기를 원한다고 알려줍니다.

fdisk -lu Debian.raw  # note starting sector $S
losetup -fs -o $(($S * 512)) Debian.raw
mount /dev/loop0 /mnt  # /dev/loop0 or whatever losetup prints

VM 이미지에서 시스템으로 파티션을 복사하는 경우 위에서 설명한 대로 시작( $S) 및 끝( ) 오프셋을 결정합니다. 그런 다음 파티션을 복사하세요.$Efdisk -lu

<Debian.raw tail -c +$((512*$S)) | dd of=/dev/sda5 bs=4M

(원본과 대상이 동일한 디스크에 없으면 귀찮게 하지 말고 출력을 로 리디렉션하면 dd됩니다 . 동일한 디스크에 있으면 더 큰 매개 변수를 사용하는 것이 훨씬 빠릅니다 .)tail/dev/sda5ddbs

답변2

Lostup 2.21 -P 옵션

losetup -P -f --show my.img

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

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

단점: 이것은 최근 옵션이며 Ubuntu 14.04에는 존재하지 않습니다.

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

파텍스

sudo apt-get install kpartx
losetup -fs my.raw
sudo kpartx -a my.img
ls /dev/mapper

산출:

/dev/mapper/loop0
/dev/mapper/loop0p1

loop0p1첫 번째 파티션은 어디에 있으므로 다음과 같이 할 수 있습니다.

mkdir -p d
sudo mount /dev/mapper/loop0p1 d

이 방법의 장점: Ubuntu 14.04에서 작동하며 재부팅이 필요하지 않습니다.

관련 정보