摘要:本文主要介绍把windows系统和Linux系统装进vhd文件,并从移动硬盘引导启动
Table of Contents
一、基础知识
1、计算机启动过程
二、安装windows到vhd
方法一、使用wtga
方法二、使用vmware
附win10开机自动挂载虚拟磁盘的方法:
三、安装Linux到vhd
1、使用grub2引导
2、制作vhd文件
3、自己制作initrd.img文件
四、安装centos等到vhd
方法一、
方法二
其他Linux
五、最后
准备:
1、gpt分区形式移动固态硬盘一个,
2、VMware Workstation Pro ,下载地址
3、bootice,下载地址
4、xorbootu,下载地址及教程
5、wtga,下载地址及教程
6、ubuntu下载地址
7、centos x86_64版下载地址https://buildlogs.centos.org/rolling/7/isos/x86_64/,推荐everything版本
8、windows下载地址
9、diskgenius软件,百度下载
10、vhd文件扩容教程
11、打开efi分区的方法
diskpart
list volume
select // 选择对应efi分区(根据大小和分区类型分辨)
help set
set ID= // 这里guid是列出的普通类型对应的guid,其实就是它示例的最后一条
// 之后最好改回去
assign
// 若没弹出可能要重新插入,再去磁盘管理里面手动分配驱动器号
参考文章https://www.jianshu.com/p/f11e6e5d5c81
windows10的uefi + gpt大致启动过程:通电 -> 读取并展示所有可引导的存储设备 -> 用户选择或默认第一个硬盘 -> 读取第一个FAT格式的分区 -> 执行EFI/Boot/bootx64.efi文件 -> 加载启动管理器EFI/Microsoft/bootmgfw.efi并读取bcd文件 -> 按bcd中信息和用户选择(只有一个就不用选)启动对应操作系统 -> 一般是加载指定分区(如c盘)的Windows/system/winload.efi文件
windows10的BIOS + mbr大致启动过程:通电 -> 读取并展示所有可引导的存储设备 -> 用户选择或默认第一个硬盘 -> 读取硬盘的mbr(主引导记录,在第一个扇区,512字节) -> 据此在分区表中检查活动分区位置 -> 在活动分区的分区引导记录(PBR,活动分区引导记录也称DBR,大约1M的分区,一般打不开,需要bootice才能编辑)中查找bootmgr和Boot/BCD -> 据此加载指定分区的windows/system/winload.efi文件,启动系统
win10的efi启动 <==> gpt磁盘,BIOS启动 <==> mbr磁盘
gpt磁盘和mbr磁盘的区别就是gpt一定会多出一个efi分区保存分区信息,mbr则是保存在第一个扇区。
使用wtga非常简单,选择ISO文件,目标磁盘,vhdx模式,uefi+gpt,600gb,其他默认就行了。
1、要注意要在本地磁盘系统上进行制作,若是移动磁盘上的系统则有可能提示创建vhd文件失败而失败。
2、对多种类系统不友好。若安装Linux会使用其他引导程序,对efi分区产生改动,就会使原来的引导故障。
3、若改动后启动蓝屏,应该使用bootice高级模式编辑bcd,修改windows boot manager的applictiondevice为该移动硬盘(坏了是unknowdevice),但是一个问题是只能引导一个了,多个的话也不会出现选择界面
4、也不利于备份查看。无法直接用虚拟机进入系统中查看系统。
1、首先创建vhd磁盘到移动硬盘:计算机管理 -> 磁盘管理 -> 操作 -> 创建vhd,30GB,固定大小,vhd后缀。
必须是固定大小,动态的引导要用win10专用程序,不然启动时会提示vhd host space not enough。然后再初始化为mbr磁盘,分配盘符。这里也不能是gpt,因为不好引导。
2、打开vmware,创建自定义虚拟机: windows x64类型,BIOS启动方式,物理硬盘(整个磁盘)。这里物理硬盘选择我们刚刚创建并挂载的磁盘,可以进磁盘管理找到对应的序号。
3、进入设置,选择CD,指向安装ISO包。
4、启动,等待安装,重启,关机。再去磁盘管理分离vhd。
5、打开xorboot,第三个选项(uefi启动序列) -> 导出xorboot.efi
6、新建菜单,类似下面这样
菜单示例7、OK,完成了,可以重启,f12,选择磁盘,选择这个系统启动了
8、优点:可以在另外一个系统,挂载磁盘,用BIOS启动类型的的虚拟机登录系统。只是需要手动扩容,无大碍。
9、可能开机总是弹出一个什么优化提示,那是因为屏蔽了本地硬盘,系统优化缓存没地放,可以启用一个本机盘就行。无大碍。
1、手动点击磁盘文件,弹出错误,需要去磁盘管理手动联机并分配驱动器号。
2、保存下面为bat文件
@echo off
echo select vdisk file=A:\web.vhdx >vhdsel_GLAND // 指定磁盘位置即可
echo attach vdisk >>vhdsel_GLAND
echo online DISK >>vhdsel_GLAND
echo attributes disk clear readonly >>vhdsel_GLAND // 重复此段添加另一个磁盘
echo list disk >>vhdsel_GLAND // 名称不能和其他启动脚本中一样
diskpart /s vhdsel_GLAND
del /f /q vhdsel_GLAND
exit
进win10设置,关闭自动播放,就不会每次启动弹出资源管理器了
3、控制面板 -> 管理工具 -> 任务计划程序 (打开启动任务)创建任务。
常规 -> 选择用户和不管用户登录都要运行 ,使用最高权限运行
操作 -> 添加bat文件
触发器 -> 用户登录时或者开机时,看你需要
安装Linux到vhd是比较麻烦的,Linux不好的看教程都看不懂。我是搞整整两天才成功,看了无数的教程。主要教程地址:
地址1,地址2
这是无忧论坛的niumao大神写的,这应该目前唯一可用的原创启动vhd中Linux的教程,我找遍全网,基本是复制他的方法,在国外论坛是也是被推荐了这个网址,有兴趣的兄弟可以去这个论坛研究一下。
我示例用的ubuntu,制作好了需要的两个启动文件了,有兴趣的可以拿来直接用。下载地址https://pan.baidu.com/s/1xh6iwybAdIt2KjyJmet1hw,提取码 rzih。里面也包含教程和标准文件。
grub2启动菜单写法如下:
// 只要修改对应文件位置即可直接引导
menuentry 'ubuntu-18.10.vhd' --class ubuntu {
insmod gzio
insmod part_msdos
insmod part_gpt
insmod ext2
insmod ntfs
insmod probe
insmod search
search --no-floppy -f --set=aabbcc /ubt/ubt1810.vhd
set root=${aabbcc}
probe -u --set=ddeeff ${aabbcc}
linux /ubt/vmlinuz-4.13.0-36-generic root=UUID=${ddeeff} kloop=/ubt/ubt1810.vhd kroot=/dev/mapper/loop0p1
initrd /ubt/initrd.img-4.13.0-36-generic
}
从这里下载grub2-for-windows,https://www.aioboot.com/en/install-grub2-from-windows/#Download
教程参考看这篇
制作efi文件的时候要把上菜单需要的命令添加进去
制作好引导后放到对应的目录下,最好使用xorbootu菜单,指向它的efi文件,以便和windows引导共存,目录结构不能变(EFI/Boot/bootx64.efi 是写死的)。
(1)新建vhd,固定大小20gb,vhd类型,挂载,打开VMware,新建类型为ubuntu 64位(不能没有64),BIOS启动类型,磁盘使用物理磁盘,指向此整个磁盘。修改配置,CD为ubuntu的ISO文件。开机
(2)制作过程中需要特别注意的一点是,一定不要出现逻辑分区,只有一个主分区就行。ubuntu16,若系统自动分区,会有swap这个逻辑分区,我当初就是这样,踩了个大坑。这里手动分区,分一个就够了。ubuntu18,系统自动只有一个主分区,可以自动。最好使用diskgenius工具查看,若磁盘下只有一个盘就OK。手动分区,会遇到虚拟机屏幕分辨率太小,按钮被隐藏的文件,建议去网上找样图,用tab键分。
(3)最好使用我制作的两个文件引导此ubuntu.vhd,(initrd.img-4.13.0-36-generic和vmlinuz-4.13.0-36-generic),若成功则可下一步自己制作,这样兼容性好很多。
(4) 三个文件最好放同一目录
若启动失败,报错init问题,如not init working found,那就可能是分区没分好,启动菜单写错了。
方法如下:
首先通过虚拟机进入你的ubuntu
①在终端安装必要软件 sudo apt-get install kpartx kpartx-boot util-linux dmsetup lvm2,若联网却提示找不到软件,请
sudo apt-get update。最好分开安装,dmsetup可能是dm-setup
② sudo gedit /usr/share/initramfs-tools/init
把init里面第30行的
mount -t tmpfs -o "noexec,nosuid,size=10%,mode=0755" tmpfs /run
修改为
mount -t tmpfs -o "noexec,size=20%,mode=0755" tmpfs /run
就是删除 nosuid, 选项。
附:经测试,ubuntu1910版本需要用标准文件替换方可。
③sudo gedit /usr/share/initramfs-tools/scripts/local ,用标准文件里local的替换
附:1910版不可替换,只可对应修改,上面附件有说明。主要找准两个函数的相应注释即可。
④sudo gedit /usr/sbin/mkinitramfs 用标准文件里mkinitramfs的替换
附:1910版也不能替换了,否则编译不出文件来。
⑤sudo gedit /etc/initramfs-tools/modules
加入以下三行
loop
fuse
dm-mod
⑥ 编译安装ntfs-3g
附件ntfs-3g_ntfsprogs-2016.2.22.fixed 是已经修改好的ntfs-3g源码.
对他手工编译安装.解压到你的主目录以后,打开一个终端.进入该目录.依次执行以下命令:
./configure
make
sudo make install
⑦ sudo gedit /usr/share/initramfs-tools/scripts/local-bottom/ntfs_3g 用标准文件里ntfs_3g的替换
⑧生成:sudo /usr/sbin/mkinitramfs -o ~/initrd.img-XXXXXXXXX-generic // 这里xxxx请与/boot/里对应的文件版本号保持一致
不出意外的话可以在home中找到生成的文件
(6)vmlinuz文件是/boot/下对应的那一个
(7)建议使用U盘传输文件,貌似无法在虚拟机和主机之间复制粘贴。方法:菜单栏 -> 虚拟机 -> 可移动设备 -> 你的u盘 -> 连接。可能需要重新插拔U盘,以连接。
(8)说明,我的标准文件是在niumao大神分享ubt-small.vhd中提取的,因为他分享的文件不对(可能是版本问题),直接去启动它的vhd,复制出来,替换,也是可以的。
先制作好vhd文件,centos分三个区,不要有lvm分区,swap也分成标准分区(主分区),提取出上面ubuntu的lib/modules下的xxxxxx.generic文件夹(先压缩再解压),再放进centos的lib/modules/ 里面。我也分享了一个可以直接用的https://pan.baidu.com/s/1Wkxs2C9RxX9D7OdyXL_Qag 提取码:ls5l
上面的引导菜单只需改对应文件和kroot=/dev/mapper/loop0p2(这个2应该改为你的根分区“/”所在顺序,若你分了三个主分区,根分区在中间就是2,使用diskgenius即可查看根分区的位置),下面贴出我的菜单(class可换可不换)
menuentry 'centos 7' --class centos {
insmod gzio
insmod part_msdos
insmod part_gpt
insmod ext2
insmod ntfs
insmod probe
insmod search
search --no-floppy -f --set=aabbcc /centos/centos7.vhd
set root=${aabbcc}
probe -u --set=ddeeff ${aabbcc}
linux /centos/vmlinuz-4.13.0-36-generic root=UUID=${ddeeff} kloop=/centos/centos7.vhd kroot=/dev/mapper/loop0p2
initrd /centos/initrd.img-4.13.0-36-generic
}
ps:centos不支持ntfs,所以U盘格式化为fat即可,fat不支持那个文件夹中的数据类型,所以需要变为压缩文件。
若VMware中分辨率太低,不妨右键程序图标,设置调整视图属性。
centos安装时把软件全钩了也只需10g的空间,建议全钩了,不然之后安装就很麻烦,例如图形界面。
因为还需设置这个文件夹的权限为755,新手建议用root用户操作,默认755.
附:centos分区若提示partition 。。空间不足。,。。core.img。那可能是需要删掉下面的一个未知分区
见分享教程fedora,是可以给centos用的,我试了,没直接转移一个压缩文件方便,不介绍了。
与方法一一样替换即可
1、把所有系统都变成一个文件,无需格式化U盘,是不是心情很舒畅。到这里我们就成功的把win10、ubuntu、centos成功装进vhd,放进优盘,并且优盘无需改动,可以方便的备份,复制,可以方便的真机登录和虚拟机登录,也可以方便的升级。直接把安装到u盘,一般只能装一个系统,而且升级的话大概率会使系统废了,装进vhd升级没问题的。(ps: 有些同学喜欢禁用win10自动更新,如果只是禁止启动的话是没用的,win10还是会强制更新,而禁用自动启动会导致更新失败,并数次重启还原,然后又是更新,这时应该开启自动更新服务)
2、可以将虚拟机使用整个移动硬盘进行启动测试,但是efi分区得把ID改回来
3、若想让移动固态硬盘成为第一启动项,而不用每次按f12选择,建议使用bootice,修改ufei启动序列,自己进BIOS修改可能会无效。
4、禁用win10自动更新的方法:设置 -> 网络和Internet -> 状态 -> 更改连接属性 -> 开启 '按流量计费的链接'
目前这方面的教程比较稀少,我写的也比较匆忙,不懂的兄弟可以找我QQ1147940842,如果觉得有帮助或者有不好的地方,还请留言,评论,感谢。
补充:最近(2019/4/26)实现动态大小的vhdx装系统,原来只需修改注册表项就行了,[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\FsDepends\Parameters] "VirtualDiskExpandOnMount"从1改为4,就不会提示vhd空间不足,原因是动态vhd引导时为了性能,会扩张到最大大小,参考微软原文。再说明下安装时选虚拟机x64配置,uefi对应gpt磁盘,虚拟磁盘新建时应该使用diskgenius重新快速分区,要有esp分区,磁盘管理器分会无法安装;bios对应mbr,就不能用diskgenius分,只能磁盘管理器。现在就方便很多了,初始体积减少大半,可以方便的差分。
补充:可以使用xorbootu引导,也可以使用原windows引导文件,如从可用win10系统的efi分区照移(如gpt虚拟机磁盘),原bootx64.efi改名,新建引导项指向它,原BCD删除,新建一个,添加各种启动项。不知为何win启动管理器界面编程老版黑白的,不是新版蓝色的,试了几次改不回来,不过也好,老版的不要选定后重新启动机器。
补充:vhd + bitlocker是非常不错的文件保护方式
5、最近(2020/03/02)又编译了一次内核,并修正了一下本教程。其实1910用原来的内核也能启动。只是启动过程的命令行报个红点,没什么事。最新的没有,全是绿色。不过关机的时候会慢2秒
6、最近(2020/4/26),ubuntu20.04 ltsl版本发布,在编译内核时,有几点注意即可,ntfs-3g可用2017版本,init文件需要直接替换,如果只修改nousid将无法启动,mkinitramfs没有#util-linux,但它上面的代码没变,粘贴全部即可,local对照修改即可。
还有硬盘格式记得是mbr,ubuntu20自动分会产生逻辑分区,必须手动,手动会发生虚拟机里分辨率太小的问题,上一步勾选安装图形,媒体选项即可。
在实际使用过程中,ubuntu1910和20.04,都出现了cpu运行高时会死机的现象,最后我通过在本地磁盘上安装好系统和软件,然后在虚拟机中备份,并还原到vhd中,可以解决这个问题,如果还原的是全新的系统,后续装软件还是有该问题,应该是安装软件时有问题,也想不到为什么,因为我的软件基本是解压文件夹里直接运行的,难道是vscode, google,nodejs,meteor?,ubuntu18没有这个问题,可能是init文件产生的问题。还有wifi驱动,在物理磁盘上就不给我自动装好,干脆直接用网线。
附备份命令:
在虚拟机中启动其他ubuntu,备份本地磁盘上的ubuntu,最好先清空缓存和垃圾:
$ tar cvpzf ./backup.tgz --exclude=./proc --exclude=./lost+found --exclude=./backup.tgz --exclude=./mnt --exclude=./sys --exclude=./media ./
最后会提示,tar: Error exit delayed from previous errors,忽略即可。
还原,也是在其他虚拟机上:
在要还原的磁盘上:
sudo rm -rf ./
sudo tar xvpfz <这是到这个文件的绝对路径>/backup.tgz ./
重建文件夹:
sudo mkdir proc lost+found mnt sys media
即可。
最近比较忙,待下个月有空得重新写这篇博客,不然变得乱七八糟的了