「Linux」- 挂载 VMDK 文件、复制 VMDK 内部的文件

问题描述

该笔记将记录:挂载 .vmdk 文件的方法(目的是从中提取文件),以及相关问题的解决办法;

解决方案

下面介绍的方法是类似的,只是使用的工具不同;

(推荐)通过 vmware-mount 命令

Mount VMDK in Ubuntu

我们通常使用 VMware Workstation 软件(在 Linux 中),其自带 vmware-mount 命令,能够进行挂载 .vmdk 文件;

常规 VMKD 文件

针对常规的 VMKD 文件(常规,指内部安装操作系统,并具有多个分区):

# vmware-mount -p mydisk.vmdk
Nr Start Size      Type Id System
1  2024  947890173 BIOS 7  HPFS/NTFS

# mkdir /mnt/myfiles
# vmware-mount mydisk.vmdk 1 /mnt/myfiles

// 其中 1 为 vmware-mount -p 输出中的 Nr 列

扁平 VMDK 文件

针对扁平的 VMDK 文件(扁平,flat,指没有分区,直接在虚拟机格式化使用):

# mkdir /mnt/vmdk /mnt/vmdk-fs 

# vmware-mount -f mydisk.vmdk /mnt/vmdk/

# mount /mnt/vmdk/flat /mnt/vmware-fs

// 其 vmware-mount -f 将产生 flat 文件

带有 LVM 分区的 VMDK 文件

linux – How to mount an LVM volume from a dd/raw/vmdk image? – Super User
linux – Cannot delete device /dev/loop0 – Stack Overflow
LFCS: How to Manage and Create LVM Using vgcreate, lvcreate and lvextend Commands – Part 11

挂载文件系统:

vmware-mount -f mydisk.vmdk /mnt/vmdk/

apt-get install kpartx
kpartx -a -v /mnt/vmdk/flat

# 前个步骤 flat 已映射为快设备

# 其后续操作与 LVM 管理类似,不再赘述

lvscan ... 
vgrename ...                                                # 如果 VG 出现重名,需要重命名处理

卸载文件系统:

umount ...                                                  # 卸载文件系统

vgchange --activate n '<vg name>'                           # 关闭 LVM 分区(否则 Ubuntu 22.04 LTS 会提示被 loop 占用)

kpartx -d /mnt/vmdk/flat                                    # 卸载 flat 所映射的快设备

umount /mnt/vmdk/                                           # 卸载 flat 文件

(废弃)通过 vmdkmount 命令

第一步、vmdkmount

安装 libvmdk 工具:

apt-get install libvmdk-utils

使用 vmdkmount 进行挂载:

vmdkmount Win7_64/Win7_64.vmdk /mnt/vmdk/

挂载后,在 /mnt/vmdk 下生成了 vmdk1 文件;

第二步、计算偏移量

使用 mmls 命令,该命令属于 sleuthkit 软件包;

对 vmdk1 文件执行如下操作,查看扇区分布:

mmls vmdk1

会得到类似下面的输出:

# DOS Partition Table
# Offset Sector: 0
# Units are in 512-byte sectors
#
#       Slot      Start        End          Length       Description
# 000:  Meta      0000000000   0000000000   0000000001   Primary Table (#0)
# 001:  -------   0000000000   0000002047   0000002048   Unallocated
# 002:  000:000   0000002048   0000206847   0000204800   NTFS / exFAT (0x07)
# 003:  000:001   0000206848   0220198911   0219992064   NTFS / exFAT (0x07)
# 004:  -------   0220198912   0220200959   0000002048   Unallocated

计算偏移量:

echo 512*206848 | bc
# 输出:105906176
# 其实,用 fdisk 查看也是可以的;

第三步、mount

# 执行挂载操作;
mount -o ro,offset=105906176 /mnt/vmdk/vmdk1 /mnt/vmdk1

# 到此挂在成功,移步到 /mnt/vmdk1 目录下查看内容;

error log

# 日期:02/27/2017
# VirtualBox + Debian8,我挂载时候出现了一个错误:“vmdk write access unavailable, cannot proceed”,其实我也不是很懂,下面命令解决了我的问题:

mount -t ext4 -o loop,ro,noexec,noload,offset=1048576 /mnt/vmdk/vmdk1 /mnt/vmdk1/

# 日期:03/01/2017
# 今天我挂载了 virtualbox + ubuntu 10.10 amd64 的 VMDK 文件,并没有出现上述错误;
# 从虚拟机里看文件系统是 Ext4 格式;

(废弃)通过 afflib-tools 工具

Install afflib-tools

apt-get install afflib-tools

affuse /path/file.vmdk /mnt/vmdk

Check sector size

# fdisk -l /mnt/vmdk/file.vmdk.raw
Disk file.vmdk.raw: 20 GiB, 21474836480 bytes, 41943040 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: 0x000da525

Device       Boot Start      End  Sectors Size Id Type
/mnt/vmdk/file.vmdk.raw1 *     2048 41943039 41940992  20G 83 Linux
Multiply sectorsize and startsector. In example it would be 2048*512

echo 2048*512 | bc
# 输出 1048576

Mount using that offset

mount -o ro,loop,offset=1048576 /mnt/vmdk/file.raw /mnt/vmdisk