admin 管理员组

文章数量: 887021

摘要:本文主要介绍把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/rolling/7/isos/x86_64/,推荐everything版本

8、windows下载地址

9、diskgenius软件,百度下载

10、vhd文件扩容教程

11、打开efi分区的方法

diskpart
list volume 
select <num>  // 选择对应efi分区(根据大小和分区类型分辨)
help set 
set ID=<guid> // 这里guid是列出的普通类型对应的guid,其实就是它示例的最后一条
                // 之后最好改回去
assign
// 若没弹出可能要重新插入,再去磁盘管理里面手动分配驱动器号

一、基础知识

1、计算机启动过程

  参考文章https://www.jianshu/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则是保存在第一个扇区。

二、安装windows到vhd

方法一、使用wtga

  使用wtga非常简单,选择ISO文件,目标磁盘,vhdx模式,uefi+gpt,600gb,其他默认就行了。

1、要注意要在本地磁盘系统上进行制作,若是移动磁盘上的系统则有可能提示创建vhd文件失败而失败。

2、对多种类系统不友好。若安装Linux会使用其他引导程序,对efi分区产生改动,就会使原来的引导故障。

3、若改动后启动蓝屏,应该使用bootice高级模式编辑bcd,修改windows boot manager的applictiondevice为该移动硬盘(坏了是unknowdevice),但是一个问题是只能引导一个了,多个的话也不会出现选择界面

4、也不利于备份查看。无法直接用虚拟机进入系统中查看系统。

方法二、使用vmware

  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、可能开机总是弹出一个什么优化提示,那是因为屏蔽了本地硬盘,系统优化缓存没地放,可以启用一个本机盘就行。无大碍。

附win10开机自动挂载虚拟磁盘的方法:

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到vhd是比较麻烦的,Linux不好的看教程都看不懂。我是搞整整两天才成功,看了无数的教程。主要教程地址:

地址1,地址2

这是无忧论坛的niumao大神写的,这应该目前唯一可用的原创启动vhd中Linux的教程,我找遍全网,基本是复制他的方法,在国外论坛是也是被推荐了这个网址,有兴趣的兄弟可以去这个论坛研究一下。

我示例用的ubuntu,制作好了需要的两个启动文件了,有兴趣的可以拿来直接用。下载地址https://pan.baidu/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
}

1、使用grub2引导

从这里下载grub2-for-windows,https://www.aioboot/en/install-grub2-from-windows/#Download

教程参考看这篇

制作efi文件的时候要把上菜单需要的命令添加进去

制作好引导后放到对应的目录下,最好使用xorbootu菜单,指向它的efi文件,以便和windows引导共存,目录结构不能变(EFI/Boot/bootx64.efi 是写死的)。

2、制作vhd文件

(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,那就可能是分区没分好,启动菜单写错了。

3、自己制作initrd.img文件

方法如下:

首先通过虚拟机进入你的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,复制出来,替换,也是可以的。

四、安装centos等到vhd

  方法一、

先制作好vhd文件,centos分三个区,不要有lvm分区,swap也分成标准分区(主分区),提取出上面ubuntu的lib/modules下的xxxxxx.generic文件夹(先压缩再解压),再放进centos的lib/modules/ 里面。我也分享了一个可以直接用的https://pan.baidu/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用的,我试了,没直接转移一个压缩文件方便,不介绍了。

其他Linux

与方法一一样替换即可

五、最后

   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

即可。

7、切换不同厂家cpu的电脑时可能遇到AMDRyzenMasterDriver.sys导致的蓝屏,首先在虚拟机中启动或安全模式进入系统,命令行输入driverquery,查看所有驱动,可以找到这个,amd cpu超频驱动。然后尝试sfc /scannow修复,或安装鲁大师,驱动精灵修复,删除驱动。

8、选择虚拟机记得windows 10 x64类型,否则就是32位了,而且不能使用UEFI引导,系统硬盘容量最大将不能超过2T

9、开虚拟机总显示硬盘被占用,可以延迟挂载vhd和挂载之后等个几分钟

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文标签: 指南 系统 Linux Windows vhd