虚拟机里的/home目录并不是直接放在宿主机磁盘的某个固定文件夹中,它本质上是位于一个虚拟磁盘镜像文件(如.vmdk、.qcow2)内部,这个镜像文件的具体存放位置由你的虚拟化软件决定。
这就好比你把一个箱子(虚拟机)里的东西(/home目录)放在另一个大仓库(宿主机)里,但仓库的具体货架位置要看你是用哪家快递(VMware、VirtualBox还是KVM),很多朋友把虚拟机里的路径和宿主机路径搞混,今天咱们就把这件事彻底说清楚。
先搞懂虚拟机磁盘的本质
虚拟磁盘是一个文件,不是一个分区
当你创建一台虚拟机时,虚拟化软件会为它生成一个或多个虚拟磁盘文件,虚拟机内部看到的整个文件系统包括/boot、/home、/usr全都打包在这个或这几个文件里,虚拟机的操作系统并不知道自己活在文件里,它以为自己在操作一块真实的硬盘。
这个虚拟磁盘文件在宿主机上就是一个普通的大文件,比如你给虚拟机分配的磁盘容量是50GB,那么宿主机上就会存在一个大小接近50GB的文件(实际大小取决于是否使用了稀疏分配)。
常见的虚拟磁盘文件格式
- VMware:
.vmdk(单个文件或多个分卷) - VirtualBox:
.vdi(也支持vmdk) - KVM/QEMU:
.qcow2、.raw、.img - Hyper-V:
.vhdx、.vhd
不管哪种格式,它们都扮演着“硬盘”的角色,虚拟机的/home目录就躺在这个文件内部,具体位于文件内的哪个扇区,由虚拟机内部的分区和文件系统决定。
/home目录到底存放在哪个文件里?虚拟机磁盘文件路径详解
要找到虚拟机里的/home,你首先要找到宿主机上对应的虚拟磁盘文件,不同虚拟化软件的默认存放位置差异很大。
VMware Workstation 的默认路径
- Windows宿主机:
C:Users你的用户名DocumentsVirtual Machines虚拟机名称虚拟机名称.vmdk - Linux宿主机:
~/vmware/虚拟机名称/虚拟机名称.vmdk
如果你创建虚拟机时自定义过路径,那么文件就存在你指定的那个文件夹,比如你为了省C盘空间,把虚拟机放在了D:VMsUbuntuServer
,那/home就在D:VMsUbuntuServerUbuntuServer.vmdk里面。
VirtualBox 的默认路径
- Windows宿主机:
C:Users你的用户名VirtualBox VMs虚拟机名称虚拟机名称.vdi - macOS宿主机:
~/VirtualBox VMs/虚拟机名称/虚拟机名称.vdi - Linux宿主机:
~/VirtualBox VMs/虚拟机名称/虚拟机名称.vdi
VirtualBox有一个全局设置叫“默认虚拟机文件夹”,你可以通过菜单 管理 -> 全局设定 -> 常规 查看或修改,如果修改过,虚拟磁盘文件就在你指定的位置。
KVM/QEMU 的路径
KVM的虚拟磁盘文件通常通过存储池管理,默认位置在:
/var/lib/libvirt/images/虚拟机名称.qcow2
这是业内最常见的默认路径,但很多生产环境会把存储池挂载到独立的大容量磁盘上,比如/data/kvm/images/,你可以用以下命令查看虚拟机的磁盘文件实际路径:
virsh domblklist 虚拟机名称
输出中的“源”列就是磁盘文件的绝对路径。
home是单独分区,情况有何不同?
有的虚拟机在安装系统时,把/home单独划分成一个分区,甚至是一块独立的虚拟磁盘,这时情况会稍微复杂一些。
LVM与普通分区的区别
如果/home是主分区或逻辑分区,它和共享同一个虚拟磁盘文件,只是文件内部的分区不同,虚拟机有sda1(/boot)、sda2()、sda3(/home),那么这些分区都在同一个.vmdk文件里。
如果/home使用LVM,它可能是逻辑卷的一部分,仍然位于同一个物理虚拟磁盘上。
但如果你在虚拟机里添加了第二块虚拟硬盘专门挂载/home,那么宿主机上就会多出一个单独的虚拟磁盘文件,比如你的虚拟机配置里有两个磁盘:虚拟机名称.vmdk和虚拟机名称-2.vmdk,那么/home就在第二个文件里。
如何确认虚拟机内部/home是否独立分区
在虚拟机终端执行:
df -h /home
看“文件系统”那一列,如果显示的是/dev/sda3或/dev/mapper/某逻辑卷,并且和根目录的设备不一样,说明它是独立分区,还可以执行:
lsblk
这个命令会清晰列出所有块设备,你会看到sda、sdb等磁盘,以及它们下面的分区,如果/home挂载在sdb1上,那么宿主机上一定存在第二个虚拟磁盘文件。
为什么你找不到/home目录?常见误区
很多人按照“虚拟机里的/home”去宿主机目录里翻找,结果只看到一堆文件夹,根本没有home这个名字,这是因为虚拟机内部的路径和宿主机路径没有任何直接映射关系。
不要把虚拟机里的路径和宿主机路径混淆
虚拟机的/home是虚拟机文件系统里的根目录下的一个子目录,而宿主机上可能也有一个/home,但那是给宿主机用户用的,两者毫无关联,虚拟机的/home是虚拟磁盘文件内部分区格式化的结果,你在宿主机上无法直接通过文件管理器进入虚拟机的/home,除非挂载虚拟磁盘镜像。
如果你在宿主机上想查看虚拟机/home,需要借助工具(比如guestfish、qemu-nbd),或者直接在虚拟机里浏览,这一点是初学者最容易搞错的地方。
快照和链接克隆会改变实际存储位置吗?
会,当虚拟机创建快照时,VMware会生成新的增量磁盘文件,例如原来的Ubuntu.vmdk变成只读,新增一个Ubuntu-000001.vmdk用于记录变化,这时,/home里修改过的数据会写入增量文件,未修改的仍留在原始文件。
链接克隆则更特殊,它的磁盘文件引用一个基础镜像,自身只保存差异数据,这种情况下,虚拟机的/home分散”在两个文件中:基础镜像文件和链接克隆的差异文件,你单独看一个文件是不完整的。
实操:如何快速定位宿主机上的虚拟磁盘文件
使用命令查找(Linux宿主机)
如果宿主机是Linux,并且你用KVM或命令行创建的虚拟机,用以下命令最直接:
find / -name ".qcow2" -type f 2>/dev/null
这会列出所有qcow2文件路径,如果是raw格式,就改成.img或.raw。
对于VMware Workstation(Linux版),搜索vmdk文件:
find / -name ".vmdk" -type f 2>/dev/null
运行后大概率会得到类似
/home/你的用户名/vmware/Ubuntu/Ubuntu.vmdk的输出,注意,这里的/home是宿主机上的目录,巧合而已,别和虚拟机里的混淆。
使用软件界面查看(Windows宿主机)
在VMware Workstation中,右键虚拟机名称 -> 选择“设置” -> 点击“硬盘” -> 右侧会显示“磁盘文件”的完整路径,直接复制这个路径,在文件管理器里粘贴,就能定位。
在VirtualBox中,选中虚拟机 -> 点“设置” -> “存储” -> 点击控制器下的磁盘图标,右侧“位置”就是vdi文件所在路径。
如果你想在Windows宿主机上批量查找所有虚拟磁盘,可以用Everything搜索.vmdk或.vdi,几秒钟出结果。
常见问题解答
虚拟机扩容后,/home目录的存放位置会变吗?
不会,扩容可能有两种方式:一是扩大原有虚拟磁盘文件的大小,此时/home仍在该文件中,只是文件变大了;二是为虚拟机添加一个新的虚拟磁盘,然后把/home迁移到新磁盘上,这时宿主机上会多出一个新的磁盘文件,/home的物理存放位置就变了。
我想备份虚拟机的/home目录,直接复制vmdk文件可行吗?
可行,但一定要先关闭虚拟机或者做快照,直接复制运行中的vmdk文件会导致数据不一致,因为虚拟机还在往里写数据,正确做法是:关机状态下复制,或者使用虚拟化软件自带的“导出”功能,如果你想单独备份/home,在虚拟机里打包/home为tar.gz,然后复制到宿主机更安全。
为什么我用du -sh看虚拟机文件夹,大小和虚拟机内部/home不一致?
因为虚拟磁盘文件还可能包含、/usr、/var等目录的数据,以及文件系统元数据,删除文件后虚拟机内部空间释放了,但虚拟磁盘文件不会自动缩小,除非你手动压缩(如VMware的“碎片整理和压缩”),所以宿主机上看到的大小通常会大于虚拟机内部/home的使用量。
虚拟机的/home从来不在宿主机上有一个“同名心房”,它被封装在虚拟磁盘文件里,具体位置随虚拟化软件和配置改变,你只要记住:先定位vmx或vdi或qcow2文件,就找到了/home所在的那块“硬盘”,多数情况下,默认路径就是那两个常见目录,特殊情况用命令查一下就行。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/622050.html





