Linux VHD 物理机启动

大类
Env
技术标签
环境增强
优先级
High
开始日期
Feb 5, 2020
状态
Monitoring
Public
Public
最后更新
Nov 23, 2021
 

思路

  • vdfuse:一个可以把vhd、vmdk等虚拟磁盘格式挂载为block设备的工具,原理是借用VirtualBox的磁盘模块,所以稳定性是有一定保障的
  • dracut-vdfuse-loop:把vdfuse用dracut集成到initramfs中,这样内核启动后就通过initramfs里面的脚本挂载vmdk
  • grub-vmsnap:grub模块,用于读取VMware的snapshot信息,并将其通过kernel argument传进来

GRUB UEFI编译方法

  • 还是一样的bootstrap过程
    • 注:我似乎无法代理git:// protocol,把所有东西都换成了https://
  • configure命令需要加上 --target=x86_64 --with-platform=efi来指出是UEFI
 

GRUB UEFI调试方法

  1. dd出来一个空镜像
  1. fdisk分成mbr或gpt,开辟EFI分区
  1. 执行命令sudo kpartx -av testgrub,挂载分区表
  1. 执行命令 sudo losetup /dev/loopX /dev/mapper/loopYp1,把/dev/mapper下面的loop变成/dev下面的loop,否则grub会说找不到lvm分区
  1. 执行命令 sudo grub-install --module "part_gpt part_msdos ntfs fat ext2 normal chain boot configfile linux multiboot" --target=x86_64-efi --efi-directory=grub-mount --boot-directory=grub-mount/boot --removable grub-mount
    1. 注:默认似乎什么命令都不带,需要手动指定preload part_gpt等module才能正常进入grub,否则就会进grub-rescue报unknown filesystem
  1. qemu-img convert testgrub testgrub.vmdk -O vmdk转换磁盘
  1. VMware建虚拟机,选testgrub.vmdk,系统选Linux/Ubuntu64位,在高级里面开开UEFI
 

GRUB UEFI Windows编译方法

  1. 在Linux下面bootstrap好
  1. msys mingw shell里面装pacman -S base-devel
  1. 设置locale:
    1. export LANGUAGE=en_US.UTF-8 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8
  1. 删除po/LINGUAS中的所有内容,除了zh-CN和zh-TW
  1. 直接和上面一样configure
  1. make -j8 windowsdir
 
注:尝试在Linux下交叉编译,但是无法成功
./configure --host=x86_64-linux-gnu --build=x86_64-pc-windows --target=x86_64 --with-platform=efi \ BUILD_CC=gcc BUILD_PKG_CONFIG=pkg-config HOST_CC=x86_64-linux-gnu-gcc HOST_CFLAGS='-g -O2' PKG_CONFIG=x86_64-linux-gnu-pkg-config \ TARGET_CC=x86_64-w64-mingw32-gcc \ TARGET_STRIP='x86_64-w64-mingw32-strip' \ TARGET_NM='x86_64-w64-mingw32-nm' \ TARGET_RANLIB='x86_64-w64-mingw32-ranlib' \ grub_cv_target_cc_link_format="-mi386pep"
linker编译出来带exe后缀,但是grub根本就没意识到有这个后缀,所有东西就都是炸的