Windows不分区VHD装Linux多系统(七):ubuntu 22.04.1安装制作、扩容VHD,及失败实验结果
上一篇:Windows不分区VHD装Linux多系统(六):优化 & 安装NVIDIA 920MX独显驱动
一、安装过程:
环境:
1. 物理机系统:Win10
2. ISO镜像:ubuntu-22.04.1-desktop-amd64.iso
3.虚拟机:VirtualBox 图形用户界面,版本 6.1.36 r152435 (Qt5.6.2)
1. 新建VBox虚拟机,过程略。
2. 安装 ubuntu-22.04.1-desktop 系统,按提示即可。
需要注意地方是,在分区时,不要用镜像自动分区,要手动分区,分成一个 / (根)分区即可。
3. 物理机和虚拟机文件共享。
在软件中设置好共享的文件夹。
挂载共享目录:
sudo mount -t vboxsf Ubt2204 lin_dir
Ubt2204:是你物理机系统的目录。
lin_dir:是虚拟机里挂载的目录。
复制文件到虚拟机,任意目录下:
sudo cp lin_dir/ntfs-3g_ntfsprogs-2021.8.22-fixed.zip ./ sudo cp lin_dir/VHD_ubuntu2204_initrd.img_replace_file.tar ./
4. 编译文件,ntfs-3g
编译前要安装一些编译工具:
sudo apt install kpartx kpartx-boot util-linux gcc g++ build-essential vim
编译 ntfs-3g
unzip ntfs-3g_ntfsprogs-2021.8.22-fixed.zip cd ntfs-3g_ntfsprogs-2021.8.22-fixed ./configure make sudo make install
5. 替换文件
无忧论坛原始文件下载:
ntfs_3g.zip 2021-3-11
http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=336079&pid=4255267ubuntukloopnew.zip 2021-5-14
http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=336079&pid=4296362上面文件和论坛1楼下在的附件是一样的
点击下载文件:VHD_ubuntu2204_initrd.img_replace_file.tar 50KB
注:上面两个地方的下载文件,内容都是一样的,只是下面的增加了自动执行脚本。
initrd-img_create_replace_file.sh 脚本有,备份、替换、和编译的功能。
sh脚本运行后会在目录下出现,initrd.img-X.XX.X-XX-generic 和 vmlinuz-X.XX.X-XX-generic 名字的文件,
如果有多个版本,选高版本复制到共享文件夹,导出到物理机即可。
tar -xf VHD_ubuntu2204_initrd.img_replace_file.tar cd VHD_replace_file/ sudo bash initrd-img_create_replace_file.sh
注意:执行 sh 脚本一定要加 sudo ,因为要替换系统文件,需要高权限。
======================== 手动修改 =========================
因为 ubuntu 版本一直在升级,可能上面自动替换的文件,会不生效,所以还是补充手动修改内容 @2025-09-21
总结,要修改的文件:
init (修改 3 处) local (修改 3 处) mkinitramfs (修改 1 处) modules (修改 1 处) ntfs_3g (修改 1 处)
5.1 编辑文件一:init (修改 3 处)
$ sudo gedit /usr/share/initramfs-tools/init
一处:
在大约67行处后增加 export KLOOP= export KROOT= export KLVM= export HOSTFSTYPE= export KLOOPFSTYPE= export SQUSHFS= export UPPERDIR= export LOWERDIR= export WORKDIR= export QEMUNBD=
二处:
在大约237行处增加 kloop=*) KLOOP=${x#kloop=} ;; kroot=*) KROOT=${x#kroot=} ;; hostfstype=*) HOSTFSTYPE=${x#hostfstype=} ;; kloopfstype=*) KLOOPFSTYPE=${x#kloopfstype=} ;;
三处:
在大约378行处增加 unset KLOOP= unset KROOT= unset HOSTFSTYPE= unset KLOOPFSTYPE=
修改init执行权限、所属用户和组。(防止出现引导过程中找不到Init文件。Failed to execute /init Error -13)
sudo chmod 755 /usr/share/initramfs-tools/init sudo chown root:root /usr/share/initramfs-tools/init
5.2 编辑文件二:local (修改 3 处)
$ sudo gedit /usr/share/initramfs-tools/scripts/local
注意:在 local 里写不能有多余的空格,可以有回车换行,但空行不能有空格。 原文链接
一处:
在local_mount_root() 函数内增加 ,约207行 if [ -z "$KLOOP" ]; then
二处:
在约223行增加 fi
三处:
把原始的 225行开始删掉 if [ "$LOOP" ]; then if [ "$mountroot_status" != 0 ]; then if [ "${FSTYPE}" = ntfs ] || [ "${FSTYPE}" = vfat ] then ...中间省略... mount ${roflag} -o loop -t ${FSTYPE} ${LOOPFLAGS} "/host/${LOOP#/}" "${rootmnt?}" if [ -d "$rootmnt/host" ]; then mount -o move /host "$rootmnt/host" fi fi
替换成 下面的 (注意:可以有空行,但空行不能有空格或tab)
if [ -n "$KLOOP" ]; then ### reset the value of the root variable HOSTDEV="${ROOT}" NEWROOT="${rootmnt}" [ -n "$KROOT" ] && ROOT="$KROOT" [ -n "$KROOT" ] || ROOT="/dev/loop0" export ROOT realroot="$ROOT" ### auto probe the fs -type of the partition in which vhd-file live and mount it /host mkdir -p /host if [ -e ${NEWROOT}${KLOOP} ]; then mount --move $NEWROOT /host else if [ -z "$HOSTFSTYPE" ]; then HOSTFSTYPE="$(blkid -s TYPE -o value "${HOSTDEV}")" [ -z "$HOSTFSTYPE" -o "${HOSTFSTYPE}" = "ntfs" ] && HOSTFSTYPE="ntfs-3g" fi [ "${HOSTFSTYPE}" = "ntfs-3g" ] || modprobe ${HOSTFSTYPE} mount -t ${HOSTFSTYPE} -o rw ${HOSTDEV} /host fi ### mount the vhd-file on a loop-device if [ "${KLOOP#/}" != "${KLOOP}" ]; then modprobe loop kpartx -av /host${KLOOP} [ -e "$realroot" ] || sleep 3 fi ### mount the realroot / in vhd-file on $NEWROOT if [ -z "${KLOOPFSTYPE}" ]; then KLOOPFSTYPE="$(blkid -s TYPE -o value "$realroot")" [ -z "${KLOOPFSTYPE}" ] && KLOOPFSTYPE="ext4" fi [ -e "$realroot" ] || sleep 3 mount ${roflag} -t "${KLOOPFSTYPE}" $realroot $NEWROOT fi
5.3 编辑文件三:mkinitramfs (修改 1 处)
$ sudo gedit /usr/sbin/mkinitramfs
一处:
在约387处添加 # util-linux copy_exec /sbin/blkid /sbin copy_exec /sbin/losetup /sbin copy_exec /sbin/kpartx /sbin copy_exec /bin/ntfs-3g /bin copy_exec /sbin/shutdown /shutdown touch ${DESTDIR}/etc/initrd-release touch ${DESTDIR}/version
5.4 编辑文件四:向modules文件追加内容
sudo gedit /etc/initramfs-tools/modules
一处:
执行如下命令 $ chmod 777 /etc/initramfs-tools/modules $ sudo echo "loop" >> /etc/initramfs-tools/modules $ sudo echo "fuse" >> /etc/initramfs-tools/modules $ sudo echo "dm-mod" >> /etc/initramfs-tools/modules $ sudo echo "overlay " >> /etc/initramfs-tools/modules $ sudo echo "nbd" >> /etc/initramfs-tools/modules $ chmod 644 /etc/initramfs-tools/modules
5.5 编辑文件五:ntfs_3g文件替换
注:以下ntfs-3g代码原作者更新时间(2021-0311,更新链接)
$ sudo gedit /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g
将以下内容,替换原始内容
#!/bin/sh set -e case "${1}" in prereqs) exit 0 ;; esac if [ "${ROOTFSTYPE}" = ntfs ] || [ "${ROOTFSTYPE}" = ntfs-3g ] || \ [ "${LOOPFSTYPE}" = ntfs ] || [ "${LOOPFSTYPE}" = ntfs-3g ] || [ -n "$KLOOP" ] || [ -n "$SQUASHFS" ] then mkdir -p /run/sendsigs.omit.d pidof @ount.ntfs-3g >> /run/sendsigs.omit.d/ntfs-3g fi exit 0
修改init执行权限、所属用户和组。(防止出现引导过程中找不到Init文件。Error:-13) 说明链接
sudo chmod 755 /usr/share/initramfs-tools/init && \ sudo chown root:root /usr/share/initramfs-tools/init && \ sudo chmod 755 /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g && \ sudo chown root:root /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g
$ sudo /sbin/mkinitramfs -o initrd.img-`username -r`
6. 编辑 menu.lst
将 initrd.img 、 vmlinuz 、 vhd 三个文件放到不带中文的路径中 ,把对应路径写道 ment.lst 文件里,就可以重启电脑,尝试引导了。
7. 扩容。
7.1 扩容,方式1: 使用系统自动的VHD创建功能
按 2011niumao 大佬的方法:原文链接
在windows下制作一个新的容量很大的固定大小vhd。
计算机--右键--管理--存储--磁盘管理,菜单栏--操作--创建VHD-选择固定容量。
创建完VHD文件后,不用格式化,在管理器里,右键分离(卸载)vhd文件。
在VBox中把这个新vhd附加到ubuntu系统中,
启动到旧ubuntu中,然后把根分区,新vhd挂载到两个临时目录内,使用rsync命令复制旧系统文件到新vhd内。
最后手工编辑新vhd内/etc/fstab文件,把根分区UUID修改正确即可。
这些操作也可以在电脑启动到vhd内ubuntu系统里后进行的。
主要命令如下:
sudo mkdir /tmp/mm /tmp/tt sudo mount /dev/mapper/loop0p2 /tmp/mm sudo mount /dev/mapper/loop1p2 /tmp/tt sudo rsync -SHav /tmp/mm/* /tmp/tt/
注意: 新建想要大小VHD容量,尽量是容量2的倍数,例如:2G、4G、8G、16G、32G
7.2 扩容,方式2:使用第三方软件bootice
(经过试验,可以增加分区但不能格式化磁盘,也不能合并磁盘到主分区,不要用)
VHD默认是用VHD固定格式的,是做启动VHD必须的,可以用BOOTICE来将固定容量扩容。 BOOTICE--磁盘镜像--VHD文件信息--选择VHD文件--填入想扩展到容量--重设容量
输入新容量,确定后,开始扩容,扩容完成会提示完成。等待即可
7.3 扩容,方式3:使用DiskGenius创建Vmdk
使用DiskGenius-5.4.1.1178免费版-DG5411178_x64 创建 Vmdk 固定格式文件,
把可以挂载的 .vhd 内容克隆到新建的 .vmdk 文件里,
然后,把 .vmdk 转换成 .vhd 实现扩容。
结果: 失败
安装结束,
以下是 制作 VHD 遇到问题的过程。
--------------------------------------------------------------------------------------------------------------------
实验一 :
环境:
1. 物理机系统:Win10
2. ISO镜像:ubuntu-22.04.1-desktop-amd64.iso
3. 虚拟机:产品:VMware® Workstation 12 Pro 版本;12.1.0 build-3272444
默认安装 ubuntu-22.04.1 会把磁盘格式化成 GPT 格式,
为了创建一个单文件环境,所以用 DiskGenius 先将创建的好VM虚拟机 VMDK 文件格式化成 MBR格式。
用 DiskGenius 克隆功能将 VMKD 内容,克隆到 VHD 文件中。
引导结果:失败。
如下图:
试验过程:
1.用 DiskGenius-5.4.1.1178免费版-DG5411178_x64 创建固定大小的 vhd 后,将原始能启动的vhd内容,克隆(按文件复制(可消除碎片))。
结果:不能启动,显示上图
-