把系统装进VHD虚拟磁盘的好处是;不影响原来的磁盘分区;想装几个系统就装几个;不要了直接删除VHD文件就行。
第一步,安装VHD系统:
在windows系统下用VirtualBox下安装UBUNTU系统,建立固定大小的vhd格式虚拟磁盘文件,推荐24g大小或更大。
安装UBUNTU时候分成三个主分区如下:
第一分区 320M 卷标EFI fat32格式;
第二分区 20G ext4格式 ,挂载根分区/
第三分区 剩余给交换分区;卷标SWAP。
其后的安装过程网上教程很多,此处略去不述。
第二步,制作能够直接引导vhd内UBUNTU系统的initrd.img文件:
在VirtualBox启动装好的UBUNTU系统,并确保能联网;
1.首先安装kpartx,kpartx-boot,util-linux,dm-setup一些软件。
可以在新立得中搜索安装。也可以使用命令。
打开一个终端,输入
sudo apt-get install kpartx kpartx-boot util-linux dmsetup
2.修改两个文件:local mkinitramfs
修改前先备份两个文件:
sudo cp /usr/share/initramfs-tools/scripts/local ./local.backup
sudo cp /usr/sbin/mkinitramfs ./mkinitramfs.backup
先修改local文件
sudo gedit /usr/share/initramfs-tools/scripts/local
把如下部分:
###################################
# TO BOOT FROM VHD #
###################################
for x in $(cat /proc/cmdline); do
case $x in
vloop=*)
VLOOP="${x#vloop=}"
;;
vlooppart=*)
VLOOPPART="${x#vlooppart=}"
;;
vloopfstype=*)
VLOOPFSTYPE="${x#vloopfstype=}"
;;
vloopcheck=*)
VLOOPCHECK="${x#vloopcheck=}"
;;
esac
done
if [ "$VLOOP" ]; then
if [ "$mountroot_status" != 0 ]; then
if [ ${FSTYPE} = ntfs ] || [ ${FSTYPE} = vfat ]; then
panic "
Could not mount the partition ${ROOT}.
This could also happen if the file system is not clean because of an operating
system crash, an interrupted boot process, an improper shutdown, or unplugging
of a removable device without first unmounting or ejecting it. To fix this,
simply reboot into Windows, let it fully start, log in, run 'chkdsk /r', then
gracefully shut down and reboot back into Windows. After this you should be
able to reboot again and resume the installation.
(filesystem = ${FSTYPE}, error code = $mountroot_status)"
fi
fi
mkdir -p /host
mount -o move ${rootmnt} /host
str=${VLOOP}
disk_files="/host${str}"
# FIXME This has no error checking
modprobe loop
kpartx -av "${disk_files}"
sleep 3
# Get the vloop filesystem type if not set
if [ -z "${VLOOPFSTYPE}" ]; then
FSTYPE="unknown"
else
FSTYPE="${VLOOPFSTYPE}"
fi
if [ "$FSTYPE" = "unknown" ] && [ -x /sbin/blkid ]; then
FSTYPE=$(/sbin/blkid -s TYPE -o value "/dev/mapper/loop0${VLOOPPART}")
[ -z "$FSTYPE" ] && FSTYPE="ext4"
fi
if [ ${readonly} = y ]; then
roflag=-r
else
roflag=-w
fi
mount -t ${FSTYPE} "/dev/mapper/loop0${VLOOPPART}" ${rootmnt}
if [ -d ${rootmnt}/host ]; then
mount -o move /host ${rootmnt}/host
fi
fi
###################################
# end, TO BOOT FROM VHD #
###################################
拷贝到/usr/share/initramfs-tools/scripts/local 文件的相同位置处。
这个位置在文件最后几行上面,最后结果,接着上面的这段后面是以下几行。
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
run_scripts /scripts/local-bottom
[ "$quiet" != "y" ] && log_end_msg
}
该文件修改结束。
保存后再执行sudo rm /usr/share/initramfs-tools/scripts/local~ 删除备份
3.修改mkinitramfs文件
sudo gedit /usr/sbin/mkinitramfs
找到# util-linux,在其下插入以下几行:
copy_exec /sbin/losetup /sbin
copy_exec /sbin/kpartx /sbin
copy_exec /sbin/shutdown /shutdown
touch ${DESTDIR}/etc/initrd-release
touch ${DESTDIR}/version
插入后该处几个语句为:(如果mkinitramfs文件中没有# util-linux这条,就直接插入下面7行)
# util-linux
copy_exec /sbin/blkid /sbin
copy_exec /sbin/losetup /sbin
copy_exec /sbin/kpartx /sbin
copy_exec /sbin/shutdown /shutdown
touch ${DESTDIR}/etc/initrd-release
touch ${DESTDIR}/version
保存一下。再执行sudo rm /usr/sbin/mkinitramfs~ 删除备份
接下来安装NTFS磁盘驱动:
(这个是重编译 ntfs-3g源码,你也可以从软件中心搜索ntfs-3g安装)
4.附件ntfs-3g_ntfsprogs-2014.2.15.fixed 是已经修改好的ntfs-3g源码.
对他手工编译安装.打开一个终端.进入该目录.依次执行以下命令:
./configure (如提示权限不够则用:su ./configure就可以)
make
sudo make install
5.编辑文件:/usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g
先备份 sudo cp /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g ./ntfs_3g.backup
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 ]
then
mkdir -p /run/sendsigs.omit.d
pidof mount.ntfs >> /run/sendsigs.omit.d/ntfs-3g
pidof mount.ntfs-3g >> /run/sendsigs.omit.d/ntfs-3g
fi
###################################
##the following maybe help to resolve the buffer I/O error problem
##when reboot or halt.
###################################
if [ -d /run/initramfs -a -f /init ]
then
mkdir -p /run/initramfs/dev /run/initramfs/host /run/initramfs/proc /run/initramfs/root /run/initramfs/run /run/initramfs/sys /run/initramfs/tmp
rm -rf /lib/modules
for xxx in /*
do
if [ ${xxx} = "/dev" -o ${xxx} = "/host" -o ${xxx} = "/proc" -o ${xxx} = "/root" -o ${xxx} = "/run" -o ${xxx} = "/sys" -o ${xxx} = "/tmp" ];
then
:
else
cp -a ${xxx} /run/initramfs/ 1>/dev/null 2>&1;
fi
done
unset xxx
fi
###################################
exit 0
再执行删除备份 sudo rm /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g~
接下来:
6.生成initrd.img文件
sudo /usr/sbin/mkinitramfs -o ~/initrd.img-XXXXXXXXX-generic (可以加上版本号得到其他内核版本的initrd.img)
接下来把装好的VHD盘添加到实体机的引导菜单:
先在电脑中安装GRUB2引导工具,安装过程网上教程很多,此处略去不述。
以Ubuntu Kylin为例子。假设内核版本是4.4.0-43 ;装好的VHD盘vhd文件名字为ubuntu.vhd,把这里生成的img文件(在你账户的个人目录)改名为initrd.img-4.4.0-43-generic
与 /boot/下的vmlinuz-4.4.0-43-generic文件,这两个文件从虚拟机复制到主机备用,可用U盘或传到网盘,总之要弄到主机上。
把虚拟盘文件UBUNTU.vhd和vmlinuz-4.4.0-43-generic ;initrd.img-4.4.0-43-generic
一共3个文件拷贝或移动到一个NTFS分区根目录下一个ubuntu目录中。如果没有ubuntu目录就手动建立一个。
把下面引导菜单代码添加到GRUB的菜单文件grub.cfg中
menuentry "Ubuntu Kylin系统"
insmod gzio
insmod part_msdos
insmod part_gpt
insmod ext2
insmod ntfs
insmod probe
insmod search
search --no-floppy -f --set=aabbcc /ubuntu/ubuntu.vhd
set root=${aabbcc}
probe -u --set=ddeeff ${aabbcc}
linux /ubuntu/vmlinuz-4.4.0-43-generic root=UUID=${ddeeff} vloop=/ubuntu/ubuntu.vhd vlooppart=p2
initrd /ubuntu/initrd.img-4.4.0-43-generic
}
这个菜单代码是自动搜索确定UUID并把它传给内核,不需要指定的hd0;gpt2等分区号。
以上步骤做完后,重启电脑,在GRUB菜单选择"Ubuntu Kylin系统" 就可以在主机上启动VHD中的Ubuntu Kylin了。
本人电脑是EFI+GPT;在Win10下用WinLy引导工具安装成功。