ventoy / vtoyboot

Work with ventoy to support boot Linux distros in a vdisk file (vhd/vdi/raw ...)
GNU General Public License v3.0
275 stars 23 forks source link

[Feature Request] vtoyboot 支持虚拟磁盘动态格式下引导linux #65

Open lz-lunzi opened 1 year ago

lz-lunzi commented 1 year ago

有尝试其他方案下的动态磁盘引导linux 但是该方案很久没有维护了如果可以希望可以支持到 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=418705&ordertype=1 https://forum.ubuntu.com.cn/viewtopic.php?t=461537

其次有想过 1.将引导部分设置为固定安装最小系统 启动后加载数据 例如(桌面环境或驱动) 2.或者通过加载qemu-nbd 直接引导虚拟系统

lz-lunzi commented 1 year ago

以下是我的grub2 的实现 sudo gedit /usr/share/initramfs-tools/hooks/vdfuse

!/bin/sh -e

PREREQ="" prereqs() { echo "$PREREQ" }

case "$1" in prereqs) prereqs exit 0 ;; esac

. /usr/share/initramfs-tools/hook-functions

copy_exec /etc/fuse.conf /etc copy_exec /usr/bin/qemu-nbd /sbin

修改init-top实现自定义文件系统挂载逻辑 sudo gedit /usr/share/initramfs-tools/scripts/init-top/vdfuse

!/bin/sh -e

PREREQ="udev" prereqs() { echo "$PREREQ" }

case "$1" in prereqs) prereqs exit 0 ;; esac

if [ ! -z $vdisk ]; then mkdir /vdhost mkdir /dev/vdhost mount -t ntfs $host /vdhost/ modprobe nbd exec -a @11 /sbin/qemu-nbd -c /dev/nbd1 /vdhost$vdisk mount -t ext4 $ROOT /root

fi

sudo gedit /usr/share/initramfs-tools/scripts/init-bottom/vdhost

!/bin/sh -e

PREREQ="" prereqs() { echo "$PREREQ" } case "$1" in prereqs) prereqs exit 0 ;; esac if [ -d ${rootmnt}/vdhost ]; then mount -n -o move /vdhost ${rootmnt}/vdhost fi

sudo chmod +x /usr/share/initramfs-tools/hooks/vdfuse

sudo chmod +x /usr/share/initramfs-tools/scripts/init-top/vdfuse

sudo chmod +x /usr/share/initramfs-tools/scripts/init-bottom/vdhost

sudo /usr/sbin/mkinitramfs -o ./initrd.img

want20 commented 1 year ago

该方案我也在研究,目前卡在挂载工具问题上,vdfuse过渡依赖vbox,nbd又引导不起来,看起来得自己实现一个挂载工具。

lz-lunzi commented 1 year ago

@want20
initramfs-tools +qemu-nbd 可以实现大部分的linux的vhd引导。 但是实现上每次更新内核后都要重新生成并拷贝到外部 如果可以实现和votyboot 的方式将会更好 用户无需关注votyboot之外的操作 。 此外对于dracut 等其他方式可以参考https://github.com/MobtgZhang/VHD-Boot 但是我并没有在这方案中成功实现 如果有成功消息可以在此分享

want20 commented 11 months ago

@lz-lunzi initramfs-tools +qemu-nbd 可以实现大部分的linux的vhd引导。 但是实现上每次更新内核后都要重新生成并拷贝到外部 如果可以实现和votyboot 的方式将会更好 用户无需关注votyboot之外的操作 。 此外对于dracut 等其他方式可以参考https://github.com/MobtgZhang/VHD-Boot 但是我并没有在这方案中成功实现 如果有成功消息可以在此分享

initramfs-tools+qemu-nbd我没有成功过,每次切换 root 文件系统的时候 nbd 的连接都会断掉,dracut 也是这样,目前我用自己写的工具可以实现引导,因为是纯c写的,所以没啥依赖,移植到 arm一样可以。另外 initramfs-tools 做的镜像关机会卡住,挂载的镜像没法成功卸载。

还有内核拷贝的问题,grub 整个 vhd 解析插件就行了,无需拷贝出来,而且这个插件只读的就行。结合自己写的 dd 插件,可以实现还原。

votyboot的方式还没仔细研究,可以研究一下,能够在启动某个阶段hook?

更新内核重新生成应该无法避免吧?vtoyboot更新内核不也要重新跑一遍脚本?

want20 commented 11 months ago

此外,貌似之前看到有个qcow2 挂载的linux内核requests记录(还是野生patch之类的),要是能被采纳就好了,新内核直接可以挂载 qcow镜像到设备,没了解有没有或者会不会被合入。

want20 commented 11 months ago

这个 https://lwn.net/ml/linux-kernel/164846631540.251310.2398727490395218229.stgit@pro/