思路
- 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调试方法
- dd出来一个空镜像
- fdisk分成mbr或gpt,开辟EFI分区
- 执行命令
sudo kpartx -av testgrub
,挂载分区表
- 执行命令
sudo losetup /dev/loopX /dev/mapper/loopYp1
,把/dev/mapper下面的loop变成/dev下面的loop,否则grub会说找不到lvm分区
- 执行命令
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
- 注:默认似乎什么命令都不带,需要手动指定preload part_gpt等module才能正常进入grub,否则就会进grub-rescue报unknown filesystem
qemu-img convert testgrub testgrub.vmdk -O vmdk
转换磁盘
- VMware建虚拟机,选testgrub.vmdk,系统选Linux/Ubuntu64位,在高级里面开开UEFI
GRUB UEFI Windows编译方法
- 在Linux下面bootstrap好
- msys mingw shell里面装pacman -S base-devel
- 设置locale:
export LANGUAGE=en_US.UTF-8 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8
- 删除po/LINGUAS中的所有内容,除了zh-CN和zh-TW
- 直接和上面一样configure
- 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根本就没意识到有这个后缀,所有东西就都是炸的