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=4255267

ubuntukloopnew.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

  

5.6 重新生成可引导固定vhd的内核初始镜像盘initrd.img-第二阶段结束
在ubuntu系统中,打开终端,输入以下命令,就可以生成一个initrd.img:
$ 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文件--填入想扩展到容量--重设容量

image

 输入新容量,确定后,开始扩容,扩容完成会提示完成。等待即可

 

 7.3 扩容,方式3:使用DiskGenius创建Vmdk

使用DiskGenius-5.4.1.1178免费版-DG5411178_x64 创建 Vmdk 固定格式文件,

把可以挂载的 .vhd 内容克隆到新建的 .vmdk 文件里,

然后,把 .vmdk 转换成 .vhd 实现扩容。

结果: 失败

image

 

 

 

 

 

 

 


 

安装结束,

以下是 制作 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内容,克隆(按文件复制(可消除碎片))。

结果:不能启动,显示上图

 

 

 

 

 

 

 

-

 

posted @ 2022-10-16 18:30  悟透  阅读(1892)  评论(0)    收藏  举报