我的硬盘上安装了Windows 10和Arch Linux,并且是GPT格式的分区表,有时候会碰到需要同时启动两个系统来做一些测试,这就需要用到虚拟机技术,推荐使用开源方案Virtualbox,硬盘当中已经有两个系统了,如果能够直接使用物理分区上的系统就能免去许多重新配置系统的麻烦。经过一番搜索之后,发现Virtualbox确实可以实现这一想法,既可以从Windows下启动Linux系统,也可以从Linux下启动Windows系统,多数笔记本(包括我自己的)对Linux的驱动支持都不是十分完善,Linux的启动Window就没有必要详细介绍了,如果你有这方面的需求,请参照参考文章的做法。以下是Windows下启动Linux系统的具体操作步骤:

1 硬盘上的分区情况

第1个是EFI分区(里面有Linux和Windows的启动文件),第2个是MSR分区,第3,4个分区是NTFS分区,第5个是swap分区,第6、7个是ext4分区。所以创建rawdisk的时候,需要包含第1个分区,才能顺利启动物理分区上的Arch Linux。

2 在Windows下启动安装在物理分区的Linux

2.1 创建虚拟机

下载并安装Virtualbox,然后新建一个Arch Linux的虚拟机,但是不创建虚拟硬盘,通过VBoxManage命令行工具创建虚拟硬盘,然后添加到虚拟机中,虚拟机的配置如下图所示。

另外虚拟机需要设置使用EFI启动,否则无法启动GPT格式的虚拟硬盘。

2.2 创建虚拟硬盘

为了避免虚拟机启动的时候引导到Windows系统,可以添加partitions参数,去除第3,4分区,但有可能会造成grub启动找不到分区,所以你最好先检查一下/etc/fstab,确保分区是以UUID的方式挂载。

#查看分区UUID的命令
sudo /usr/sbin/blkid
VBoxManage internalcommands listpartitions -rawdisk "\\.\PhysicalDrive0"
VBoxManage internalcommands createrawvmdk -filename "D:\VMs\Arch Linux\linux_hd.vmdk" -rawdisk "\\.\PhysicalDrive0" -partitions 1,5,6,7

2.3 把虚拟硬盘文件vmdk添加到虚拟机中

3 在Linux下启动安装在物理分区的Windows

3.1 创建虚拟机

3.2 创建虚拟硬盘

一开始不知道Virtualbox的efi只能引导Win 8以上的操作系统的,走了不少弯路,详细情况可以参考文章《UEFI support for Windows guests》,知道Win10推出了Bash on Ubuntu on Windows,我就索性将Win 2008 R2换成了Win 10。

vboxmanage internalcommands listpartitions -rawdisk /dev/sda
#将当前用户加入到vboxusers用户组
sudo usermod -G vboxusers -a `whoami`
#需重新登录
sudo chmod o+rw /dev/sda
VBoxManage internalcommands createrawvmdk -filename /home/wing/VirtualBox\ VMs/Win10/Win10.vmdk -rawdisk /dev/sda -relative
#将整个硬盘创建成一个虚拟硬盘可以避免Windows引导出错,如果你对windows boot manager比较熟悉,也可以只选择部分分区创建虚拟硬盘,需要另外建立一个引导分区到另外一个vmdk文件中,感兴趣的朋友可以研究研究。
sudo chmod o+rw /dev/sda3
sudo chmod o+rw /dev/sda4
VBoxManage internalcommands createrawvmdk -filename /home/wing/VirtualBox\ VMs/Win10/Win10.vmdk -rawdisk /dev/sda -partitions 3,4 -relative

3.3 把虚拟硬盘文件vmdk添加到虚拟机中

3.4 成功启动Windows 10

4 后记

4.1 X server does not come up in VirtualBox VM after upgrade to kernel 4.5

4.1.1 方法一:内核降级

在2016.4.15更新内核到Linux 4.5和Linux-header 4.5之后,从Virtualbox启动Arch就无法进入图形界面了,Arch的官方论坛有人也碰到了相同的问题,不然我还得一直用命令行。 方法很简单,就是内核降级到Linux 4.4.5,一般情况下,你更新后也缓存里的旧版内核应该还在的,只要运行一下以下的命令即可。如果你已经顺手清空了缓存,你就再等等。Oracle Virtualbox官方升级到下一个版本的时候,更新一下就好了。

cd /var/cache/pacman/pkg
ls | grep linux
sudo pacman --force -U linux-4.4.5-1-x86_64.pkg.tar.xz linux-headers-4.4.5-1-x86_64.pkg.tar.xz

4.1.2 方法二:添加内核参数

除了内核降级的方法,Arch论坛里还有人提出了更好的解决方案,就是添加kernel parameters。修改/etc/default/grub,往GRUBCMDLINELINUXDEFAULT变量中添加iomem=relaxed。

GRUB_CMDLINE_LINUX_DEFAULT="quiet iomem=relaxed"

然后重新生成grub.cfg。

sudo grub-mkconfig -o /boot/grub/grub.cfg

以上两种方法都来源于Arch论坛https://bbs.archlinux.org/viewtopic.php?pid=1620192

Last Updated 2018-10-14 日 23:38.
Created by Emacs 25.1.1 (Org mode 9.1.14)