优麒麟技术论坛

 找回密码

把优麒麟Ubuntu Kylin 16.04 UKUI安装进VHD虚拟磁盘 [复制链接]

把优麒麟Ubuntu Kylin 16.04 UKUI安装进VHD虚拟磁盘

把系统装进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了。

更多讨论和附件下载请到:

http://forum.ubuntu.org.cn/viewtopic.php?t=461537

http://bbs.wuyou.net/forum.php?m ... p;extra=&page=1

本人电脑是EFI+GPT ;在Win10下用WinLy引导工具安装成功。



评分

参与人数 1麒麟币 +5 收起 理由
handsome_feng + 5 神马都是浮云

查看全部评分

发表于 2016-10-29 16:21:13
回复

使用道具 举报

小黑屋|Ubuntu Kylin    

GMT+8, 2021-12-1 11:23 , Processed in 0.021179 second(s), 18 queries .

Copyright ©2013-2021 Ubuntu Kylin. All Rights Reserved .

ICP No. 15002470-2 Tianjin

快速回复 返回顶部 返回列表