一、通过mount加上偏移
首先需要确认下镜像分区开始的偏移:
[cce lang="bash"]
fdisk -l vm-xp-qa-new.img
[/cce]
这个文件的输出为:
Disk vm-xp-qa-new.img: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = 扇区 of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x4dcc4dcc
设备 Boot Start End Blocks Id System
vm-xp-qa-new.img1 * 63 41913584 20956761 7 HPFS/NTFS/exFAT
从这里可以看见,这个windows分区,是从第63个块开始的,每个块的大小是512字节,最后得出的挂载偏移为32256字节。
因此,最终挂载的命令就是:
[cce lang="bash"]
mount -o loop,offset=32256 -t ntfs vm-xp-qa-new.img /mnt/
[/cce]
这里指定了挂载分区的格式为ntfs,挂载偏移为32256字节。
然后就可以在/mnt目录中看见这个虚拟机磁盘镜像,直接修改里面的文件了。
二、通过映射成loop设备
首先获取最近一个可用的loop设备:
[cce lang="bash"]
losetup -f --show vm-linux-qa-master.img
[/cce]
这里会输出一个loop设备,如果之前没有映射过,应该是/dev/loop0
然后生成对应的块设备:
[cce lang="bash"]
kpartx -a /dev/loop0
[/cce]
执行之后,会在/dev/mapper/中多出一个loop0p1文件,也就是刚那个磁盘镜像的分区块文件了(对应硬盘的sda和sda1这样的关系)。
然后就可以直接将/dev/mapper/loop0p1文件mount到指定位置,就可以读写里面的文件了。
清理的时候,除了umount /dev/mapper/loop0p1这个文件的挂载点之外,还要清除loop0的使用:
[cce lang="bash"]
kpartx -d /dev/loop0
losetup -d /dev/loop0
[/cce]
ps:在gentoo中,losetup应该已经在的,在sys-apps/util-linux这个包中;kpartx由sys-fs/multipath-tools这个包提供,直接emerge即可