[Share Experiences] 实现linux系统在VHD、Vdi虚拟磁盘中运行在实体机里
Tofloor
poster avatar
176******70
deepin
2023-04-06 05:12
Author

之前因为工作的原因离不开windows系统在做了一个VHD版的win7,确实在工作中方便不少,现在用linux越来越顺手,看到Ventoy的官网有 Linux vDisk 文件启动插件 按照Ventoy网上的教程试着做了一个出来,

  1. 新建一个VHD文件(按照Ventoy网上的教程:1.固定大小,2.必须是VHD文件不能是VHDX文件)我是用winPE的BOOTICE工具制作,

  1. 将分区挂载在虚拟机(以UEFI模式这是重点)

我是用的是QEMU-KVM虚拟机

具体步骤创建虚拟机选择需要安装的系统光盘点前进,上边的框里选择你要安装的镜像位置,设置能存和CPU数,在第四步时把“为虚拟机启用存储”的勾选掉点前进。


虚拟机5.png

到第五步时勾选“在安装前自定义配置”点完成。

虚拟机6.png

见到虚拟机的微调部分,在概要里调整Firmware为UEFIX86_64..........

虚拟机7.png

然后点左下角的“添加硬件”选择左边第一个“存储”点击选择或创建自定义存储,然后点击“管理”,弹出对话框,在左下角点击“+”号。


QEMU8.png
在弹出的对话框里点击“浏览”。在弹出的对话框里选择你存放VHD文件的文件夹,点击完成。在“选择存储卷”的页面右侧点中你创建的VHD文件,点击“选择卷”然后启动虚拟机,安装系统。


虚拟机4.png

虚拟机3.png

注意安装系统前应阅读https://www.ventoy.net/cn/plugin_vtoyboot.html

查看支持的Linux发行版是否是你正在安装的版本

!!! 注意 !!!
有一些系统安装完之后还需要再额外安装一个 grub 的包才可以,否则最终的 vhd/vdi 文件只能在 UEFI 模式下启动,无法在 Legacy BIOS 模式下启动。
对于这种,在前面表格最后的 "备注" 一栏有说明,没有特殊说明的就不需要。比如,对于 Deepin 系统,需要安装 grub-pc-bin_xxxx.deb 包。以 deepin-desktop-community-1010-amd64.iso 为例, 需要安装 grub-pc-bin_2.02.24.3-1+eagle_amd64.deb 这个包,它位于 ISO文件的 /pool/main/g/grub2/ 目录下,可以直接使用 dpkg -i 命令来安装。
另外,如果缺少这个包,在运行下面的 vtoyboot.sh 脚本时也会打印一个提示信息。当然,如果你只需要在 UEFI 模式下启动这个 vdisk 文件,不需要在 Legacy BIOS 模式下启动,那就不需要管它了。

注意,系统安装完之后不能对虚拟机创建快照,否则会导致 vdi/vhd 无法识别。

安装vtoyboot脚本非常重要!!!!!!!

安装完成并启动到 Linux 系统中之后,执行 vtoyboot 脚本。这一步是为了在系统中做一些处理,以支持Ventoy启动。
vtoyboot 是配套 Ventoy 开发的一个项目,单独发布。从 https://github.com/ventoy/vtoyboot/releases 下载压缩包拷贝到虚拟机中安装即可。
下载到 Linux 系统中,解压,然后以root权限执行里面的脚本 sudo bash vtoyboot.sh 脚本执行完之后,使用 poweroff 命令关机。
注意 vtoyboot 会经常更新以支持更多的 Linux 版本以及修复 BUG,所以请使用最新版本。

完成前面2步之后,就可以把 vdi/vhd 文件拷贝到 U盘中,重启电脑,然后通过Ventoy启动它了。
注意,必须把文件后缀名改为 .vtoy 才可以正常启动。
推荐保留原来的后缀名,同时增加一个 .vtoy 后缀。比如: CentOS7.vhd.vtoy ubuntu20.04.vdi.vtoy Manjaro.vhd.vtoy

注意vDisk文件在物理机环境下启动之后,普通软件的安装、升级可以正常操作,没有限制。如果是对内核、驱动进行了升级、或者类似于通过 dnf update 命令进行了系统的大升级之后, 建议再重新执行一次 vtoyboot 脚本,防止下次重启之后vDisk文件无法启动。

下边是:修改/opt 、/usr/local和/home挂载在真实的磁盘分区实现数据与系统的分离。

使用虚拟磁盘启动的好处是,如果系统出现问题把备份的VHD拷贝过来就能直接启动,但是坏处是,home文件夹里的文件和/opt,/usr/local,安装的软件就都一起丢失了,怎么办呢,把这三个目录挂载在真实的磁盘目录,那开整!

首先把存放VHD文件的磁盘分出来一个分区,然后直接用Ventoy引导启动,

使用CP命令拷贝/opt 、/usr/local和/home文件到新分的分区里。

cp -r -p /opt /media/***********************/ (新磁盘是挂载在media下的)

cp -r -p /home /media/***********************/

cp -r -p /usr/local /media/***********************/

然后查看新分的分区的UUID是多少

使用sudo blkid 命令进行查看。

修改/etc/fstab文件

使用命令sudo vim /etc/fstab

如果在安装的时候分别使用独立的分区挂载home ,usr/local和opt的话会在文件的下方有关于这三个分区的挂载目录,如果没有设置独立挂载文件的下方就没有这三个目录的挂载选项。

按照上图添加挂载信息,在UUID=的后边改成你查询到的新分区的UUID。

然后保存。(按ESC 输入:wq)

重启系统,测试挂载。

sudo mount -a
如果不报错那么挂载成功了,此后每次开机会自动挂载

这时候可不是该窃喜的时候,如果更新完内核又忘了运行一下Vtoyboot就关机,等再次启动时,启动不了,在虚拟机里启动以运行Vtoyboot,发现虚拟机里也无法运行 ubuntu22.04.VHD.vtoy(因为home ,usr/local和opt都挂载在了VHD外),那怎么办。。。。。

办法总会有的,在在虚拟机里新建一个虚拟磁盘 data.img (QEMU-KVM是img后缀,其他虚拟机是别的后缀),大概10个G以内,和liveCD一块在虚拟机内启动,使用磁盘工具,
虚拟机9.1.png格式化创建的虚拟磁盘。

虚拟机8.png

虚拟机9.png

然后使用sudo blkid 命令进行查看磁盘信息。

虚拟机10.png

这个/dev/ada1就是新建的虚拟磁盘 data.img了。

修改磁盘的UUID跟之前挂载在外部的那个磁盘一样。

使用uuidgen | xargs tune2fs /dev/sdb -U ************************(之前上文提到的那个UUID)如果提示没有该命令可以使用

虚拟机11.png

如果提示没有该命令可以使用

sudo apt-get update

sudo apt-get install uuid-runtime进行下载。

然后在用cp命令复制一份/opt 、/usr/local和/home这三个目录。

cp -r -p /opt /media/***********************/ (新磁盘是挂载在media下的)

cp -r -p /home /media/***********************/

cp -r -p /usr/local /media/***********************/

然后使用虚拟机添加 ubuntu22.04.VHD.vtoy 和新建的虚拟磁盘 data.img 试试,竟然也能启动了。

虚拟机1.png

虚拟机2.png

可以用虚拟机liveCD挂载 ubuntu22.04.VHD.vtoy 使用rm -rf命令删除 ubuntu22.04.VHD.vtoy 内的/opt 、/usr/local这三个目录下的文件。

Reply Favorite View the author
All Replies
jjcui8595
Moderator
2023-04-06 05:23
#1

大赞like

Reply View the author
璀璨星空
deepin
2023-04-06 05:31
#2

收藏kissing_heart

Reply View the author
Dazer007
deepin
2023-04-14 06:11
#3

看到统信UMate系统盘的操作,修改:vim /etc/fstab

# 具体编辑 /etc/fstab,在末尾添加
/data/home /home none defaults,bind 0 0
/data/opt /opt none defaults,bind 0 0
/data/root /root none defaults,bind 0 0
/data/var /var none defaults,bind 0 0

Reply View the author