无忧启动论坛

标题: vdfuseloop:支持更多格式虚拟磁盘启动的Linux方式(vdi/vmdk/vhd等) [打印本页]

作者: Misty    时间: 2020-2-2 04:29
标题: vdfuseloop:支持更多格式虚拟磁盘启动的Linux方式(vdi/vmdk/vhd等)
本帖最后由 Misty 于 2021-3-21 07:00 编辑

受到 @2011niumao 大佬的启发,近日研究了如何从vhd等虚拟磁盘启动Linux。可以注意到niumao大佬的kloop方案有诸多限制:
1. 仅限VHD
2. VHD必须固定大小
而固定大小的vhd实际上和wubi所使用的raw原始格式并没有任何区别,只不过加了一个header。实际上并不需要kloop,可以手动获取到分区起始位置并使用-o loop, offset=XXXX。所以其实和wubi方案并没有太大差别,都是物理设备 → loop partition → ext4

这明显丧失了虚拟磁盘的快照、 动态容量等各种特性,满足不了需求。经过一段时间的查找,找到国外网友使用vdfuse来支持多种虚拟磁盘读写的方案:
https://unix.stackexchange.com/questions/309900/deploy-linux-into-and-boot-from-vhd/465215#465215

思路(原理及调试方法见最下面):
vdfuse借助开源项目virtualbox的内核模块读写virtualbox支持的格式(至少有vmdk、vhd、vdi),从而挂载出loop,并可以支持动态大小的虚拟磁盘文件。
上面连接中的回答时间很新,所以操作基本都可以正常执行。经过实践,我总结出来了这些步骤

编译安装vdfuse

1. 安装依赖(注:还需要安装svn和git,请自行安装):sudo apt install libfuse-dev virtualbox pkg-config
2. 下载vdfuse: vdfuse年久失修,利用github的fork network追踪功能,发现有一个人将其fork并适配了新版的vbox 6.0.2,仅有少量编译错误需要修改。我已经把编译错误修复:https://github.com/NyaMisty/vdfuse
3. 编译并安装vdfuse:执行这些命令(注:可能需要挂代理)

dracut方案:
dracut可以在systemd关机后返回initramfs从而得以让我们正确卸载vhd。

(0. 安装dracut:sudo apt install dracut)
1. 同上编译安装vdfuse,然后执行sudo cp /usr/local/bin/vdfuse /usr/bin/vdfuse
2. 下载或克隆https://github.com/NyaMisty/dracut-vdfuseloop
3. 将90vdfuseloop复制到/usr/lib/dracut/modules.d
4. 修改/etc/dracut.conf.d/10-debian.conf,修改hostonly=no,在add_drivers一行前加#注释掉
5. 执行sudo dracut -f生成initramfs
6. 将生成好的/boot/initramfs-XXXXX.img和vmlinuz复制出来供引导
7. 编辑/usr/lib/dracut/dracut-initramfs-restore,找到其中的[[ -f $IMG ]] || IMG="/boot/XXXXXXXXXX",将其对应修改为dracut生成的img的文件名格式,如[[ -f $IMG ]] || IMG="/boot/initramfs-${KERNEL_VERSION}.img"
8. 配置grub参数
  1. iftitle [ find --set-root --ignore-floppies --ignore-cd  /VMs/LinuxWorkspace/LinuxWorkspace.vmdk ] 启动Ubuntu
  2. find --set-root --ignore-floppies --ignore-cd  /VMs/LinuxWorkspace/LinuxWorkspace.vmdk
  3. uuid ()
  4. kernel /ubuntuvm-vhd-helper/vmlinuz  rw rd.hostdev=UUID=%?% rd.vdisk=/VMs/LinuxWorkspace/LinuxWorkspace.vmdk rd.vdloop=/dev/vdhost/Partition1 rd.debug rd.shell verbose nomodeset
复制代码


initramfs-tool方案 (已废弃,仅作为记录保留):
initramfs-tool方案难以解决关机Buffer IO问题,如有高手解决可以考虑共享

(1-3接编译vdfuse)
4. 修改hooks使得vdfuse工具被包含到initramfs中
sudo gedit /usr/share/initramfs-tools/hooks/vdfuse

  1. #!/bin/sh -e
  2. PREREQ=""
  3. prereqs()
  4. {
  5.     echo "$PREREQ"
  6. }

  7. case "$1" in
  8.     prereqs)
  9.     prereqs
  10.     exit 0
  11.     ;;
  12. esac

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

  14. copy_exec /bin/ntfs-3g /sbin
  15. copy_exec /usr/local/bin/vdfuse /sbin
复制代码
5. 修改init-top实现自定义文件系统挂载逻辑
sudo gedit /usr/share/initramfs-tools/scripts/init-top/vdfuse

  1. #!/bin/bash -e
  2. PREREQ="udev"
  3. prereqs()
  4. {
  5.     echo "$PREREQ"
  6. }

  7. case "$1" in
  8.     prereqs)
  9.     prereqs
  10.     exit 0
  11.     ;;
  12. esac

  13. if [ ! -z $vdisk ]; then
  14.     mkdir /vdhost
  15.     mkdir /dev/vdhost
  16.     exec -a @ntfs-3g ntfs-3g $host /vdhost/
  17.     exec -a @vdfuse vdfuse -t VMDK -f /vdhost$vdisk /dev/vdhost
  18.     mount -t ext4 $ROOT /root
  19. fi
复制代码
注1:vdfuse的-t参数为虚拟磁盘的格式,请根据自己的虚拟磁盘来配置,支持VMDK/VHD/VDI三个值
注2:此处niumao前辈利用patch ntfs3g实现了防止buffer io的错误,但是实际上可以通过简单的exec传参来让argv[0][0] == "@"。方法来源于https://github.com/systemd/systemd/issues/13981
注3:虽然配置了ntfs3g和vdfuse不被kill,但仍然会出现buffer I/O error,原因不明


6. 修改init-bottom
sudo gedit /usr/share/initramfs-tools/scripts/init-bottom/vdhost
  1. #!/bin/sh -e
  2. PREREQ=""
  3. prereqs()
  4. {
  5.     echo "$PREREQ"
  6. }
  7. case "$1" in
  8.     prereqs)
  9.     prereqs
  10.     exit 0
  11.     ;;
  12. esac
  13. if [ -d ${rootmnt}/vdhost ]; then
  14.     mount -n -o move /vdhost ${rootmnt}/vdhost
  15. fi
复制代码


6. 设置权限
  1. sudo chmod +x /usr/share/initramfs-tools/hooks/vdfuse
  2. sudo chmod +x /usr/share/initramfs-tools/scripts/init-top/vdfuse
  3. sudo chmod +x /usr/share/initramfs-tools/scripts/init-bottom/vdhost
复制代码

7. 生成initramfs,并拷贝initrd.img和vmlinuz
具体方法参见niumao前辈的文章

8.  设置grub参数
这里仅列出grub4dos的参数设置(抄自niumao大佬)
  1. iftitle [ find --set-root --ignore-floppies --ignore-cd  /VMs/LinuxWorkspace/LinuxWorkspace.vmdk ] 启动Ubuntu
  2. find --set-root --ignore-floppies --ignore-cd  /VMs/LinuxWorkspace/LinuxWorkspace.vmdk
  3. uuid ()
  4. kernel /ubuntuvm-vhd-helper/vmlinuz  root=/dev/vdhost/Partition1 host=/dev/XXXX vdisk=/VMs/LinuxWorkspace/LinuxWorkspace.vmdk verbose nomodeset
  5. initrd /ubuntuvm-vhd-helper/initrd.img
复制代码

其中host参数代指vhd所在物理磁盘的分区设备文件路径;
root代指vhd挂载后linux rootfs所在分区(vdfuse挂载后会在/dev/vdhost下形成EntireDisk以及各个分区,如Partition1。一般均为Partition1,即第一个主分区)
vdisk代指vhd所在分区中的路径
kernel和initrd的路径设置为复制出来的路径

此处参数设置错误时或不知道具体值时,可以随便填写,initramfs会自动出错,并弹出shell供诊断。相应的查看各个参数对应信息即可

grub2配置可以根据niumao前辈的配置照葫芦画瓢



原理:
vdfuse与kpartx不同,会有进程驻留。vdfuse方案是物理设备 → vdfuse → loop partition → ext4,可以注意到比kpartx多了一级,这导致了systemd默认的卸载方式无法正常卸载掉vhd。
initramfs-tool提供的结构并不能很好的控制systemd,所以我没能实现解决buffer io的问题
dracut相比initramfs-tool与systemd结合更紧密,因而更容易控制systemd对我们挂载点的操作。所以我们得以借助dracut的强大功能解决buffer io error。

1. 用exec -a @ntfs-3g ntfs-3g方法挂载hostdev到/dev/host,避免被systemd关机时杀掉。挂载到/dev下在关机流程会被systemd忽略,从而避免被remount为ro(见systemd/src/core/umount.c/umount.c)
2. 用exec -a方法挂载vdfuse到/dev/vdhost。原理同上
3. 不提供root参数,使用mount hook,从而避免dracut使用systemd的挂载和设备探测功能(systemd对于loop设备支持较差)
4. 进行pre-shutdown hook,关机前按顺序卸载ext4、vdfuse、ntfs,从而避免buffer i/o error


调试方法:
1. initramfs-tool方案调试方法:添加参数: debug systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M printk.devkmsg=on enforcing=0
2. dracut方案调试方法: 添加参数debug rd.break=pre-shutdown rd.break=shutdown debug systemd.log_level=debug systemd.log_target=kmsg printk.devkmsg=on enforcing=0 log_buf_len=10M verbose nomodeset rd.udev.debug rd.timeout=300 rd.break=initqueue rd.break=pre-mount rd.break=mount







作者: Misty    时间: 2020-2-2 06:42
本帖最后由 Misty 于 2021-3-21 07:35 编辑

更新:支持VMware快照功能! (仅bios)
1. 下载https://github.com/NyaMisty/grub-vmsnap,用build.sh编译后,复制grub/grub-core/vmsnap.mod到grub2的i386-pc目录下
2. 重新从github上下载dracut-vdfuseloop
3. 使用grub2引导:
  1. <blockquote><blockquote>menuentry 'Start Ubnutu'  --class ubuntu  {
复制代码

vmsnap模块的作用是解析vmx文件中的snapshot树,然后按顺序传入传入到内核参数中


需要注意的是如果snapshot传入的参数错误,则可能父盘被意外写入,导致整个磁盘无法使用,所以grub中预留了prompt供用户检查当前磁盘文件名是否正确,请务必仔细检查,如有错误请直接关机




作者: newliz    时间: 2020-2-2 11:39
很详细!
作者: yang77    时间: 2020-2-4 22:38
喜欢听大佬们技术分析
作者: studyggm    时间: 2020-2-4 23:25
技术贴,标记了
作者: yang77    时间: 2020-2-19 23:00
非常棒的技术贴,收藏
作者: atmgnd    时间: 2020-2-21 17:48
qemu-img 创建的vhd WINDOWS为什么不能用,有知道的吗?
作者: nianyueriPE    时间: 2020-8-27 19:25
请问我以前安装了vbox,已经有vdfuse命令,还要编译安装vdfuse吗?
作者: Blan77    时间: 2020-9-1 22:30
很给力! 完全同意
作者: 2011goodluckwxl    时间: 2020-10-10 19:24
有个问题就是我每次运行起来报错
作者: ytqxg    时间: 2020-11-2 20:08
太复杂了,都是程序员之间的讨论,有没有更简单直接可操作性的方案啊。把linux装进VHDX启动。
作者: chensjiu    时间: 2020-11-3 10:20
没看懂,纯粹支持一下
作者: qins2020    时间: 2020-11-26 21:53
66666666666666666666
作者: samsung4203    时间: 2020-11-27 11:03

非常棒的技术贴,收藏
作者: wangziqiang    时间: 2020-11-29 20:56
一说代理 就放弃了,麻烦啊,
作者: wdtx    时间: 2020-12-6 17:01
技术贴,学习学习。。。
作者: lijingjack    时间: 2020-12-22 10:32
按照这个思路,理论上qcow2也可以通过qemu-nbd来支持吧,但是实际上不行,不知道问题出在哪里,vmdk我已经尝试成功了。
作者: Misty    时间: 2021-3-21 06:55
lijingjack 发表于 2020-12-22 10:32
按照这个思路,理论上qcow2也可以通过qemu-nbd来支持吧,但是实际上不行,不知道问题出在哪里,vmdk我已经 ...

那就得看看qemu-nbd为啥没挂载上了hhh
可以自己调试看看
作者: 2011niumao    时间: 2021-3-21 07:11
我使用kloop那个模式,在initrd.img挂载
作者: 2011niumao    时间: 2021-3-21 07:13
在内存盘系统initrd.img 里加入nbd模块和qemu-nbd 命令后挂载启动动态vhd成功了。
作者: 2011niumao    时间: 2021-3-21 07:17
另外,最近发现另一种可写挂载ntfs分区的方法,其挂载格式是ufsd ,可以安装到ubuntu上,用它代替ntfs-3g, 不需要改写源文件,就可以避免buffer io 错误。
作者: 2011niumao    时间: 2021-3-21 07:21
论坛里就有帖子,“关于paragon ntfs驱动(ufsd)性能的问题请教”
作者: Misty    时间: 2021-3-21 08:27
2011niumao 发表于 2021-3-21 07:17
另外,最近发现另一种可写挂载ntfs分区的方法,其挂载格式是ufsd ,可以安装到ubuntu上,用它代替ntfs-3g,  ...

哦是paragon的那个驱动啊,感觉确实会好用一些,但是感觉这种闭源驱动配置起来都不简单,我个人感觉正确使用ntfs3g就够了(用dracut已经解决buffer io错误了)

这个帖子主要是想把vmware虚拟机起起来(这样既可以在vmware里跑,又可以在需要的时候拿出来跑)
作者: faoao    时间: 2021-4-1 19:53
标题: 求助vdfuse编译安装,和grub2启动项编写
本帖最后由 faoao 于 2021-4-13 17:25 编辑

我的系统是 ubuntu20.04 用VMware安装在vmdk里,自动分了 /boot/efi 和 /根目录两个分区

1、vdfuse编译安装问题
./fetch_vbox_headers.sh 执行有问题(是不是仓库地址改了?),我直接从 https://download、virtualbox、org/virtualbox/6.1.18/VirtualBox-6.1.18.tar.bz2 下载的源码提取了include文件夹放入vdfuse中(能不能行?)。
后面的 make 和 sudo make install 执行感觉有问题
  1. w@X:~/下载/vdfuse$ make
  2. gcc -DHAVE_CONFIG_H -I. -I./src    -Iinclude -I/usr/include/fuse -D_FILE_OFFSET_BITS=64 -MT vdfuse.o -MD -MP -MF .deps/vdfuse.Tpo -c -o vdfuse.o `test -f 'src/vdfuse.c' || echo './'`src/vdfuse.c
  3. src/vdfuse.c: In function ‘main’:
  4. src/vdfuse.c:272:7: warning: passing argument 5 of ‘VDInterfaceAdd’ makes integer from pointer without a cast [-Wint-conversion]
  5.   272 |   if (RT_FAILURE(VDInterfaceAdd(&vdError, "VD Error", VDINTERFACETYPE_ERROR,
  6.       |       ^~~~~~~~~~
  7.       |       |
  8.       |       void *
  9. In file included from include/VBox/vd.h:42,
  10.                  from src/vdfuse.c:114:
  11. include/VBox/vd-ifs.h:155:39: note: expected ‘size_t’ {aka ‘long unsigned int’} but argument is of type ‘void *’
  12.   155 |                                size_t cbInterface, PVDINTERFACE *ppVDIfs)
  13.       |                                ~~~~~~~^~~~~~~~~~~
  14. mv -f .deps/vdfuse.Tpo .deps/vdfuse.Po
  15. gcc -Iinclude -I/usr/include/fuse -D_FILE_OFFSET_BITS=64 -Wl,-rpath,/usr/lib/virtualbox  -o vdfuse vdfuse.o /usr/lib/virtualbox/VBoxDDU.so -lfuse -pthread
复制代码

2、grub2启动项编写问题

我的grub启动项参照 niumao大佬的改的
  1. menuentry 'VBUNTUFIX linux' --class ubuntu --class gnu-linux --class gnu --class os {
  2.         insmod gzio
  3.         insmod part_msdos
  4.         insmod part_gpt
  5.         insmod ext2
  6.         insmod ntfs
  7.         insmod probe
  8.         insmod search
  9.         search --no-floppy -f --set=aabbcc /Ubuntu/Ubuntucl.vmdk
  10.         set root=${aabbcc}
  11.         probe -u --set=ddeeff ${aabbcc}
  12.         linux /Ubuntu/vmlinuz root=UUID=${ddeeff} vloop=/Ubuntu/Ubuntucl.vmdk vlooppart=p1
  13.         initrd /Ubuntu/initramfs-5.8.0-48-generic.img
  14. }
复制代码
但是还是进不了系统,进入了 dracut: 的命令行
我现在不知道是vmdk系统中软件还没安装配置好,还是grub2启动项没编辑好。麻烦大佬帮忙修改下

作者: faoao    时间: 2021-4-1 20:59
本帖最后由 faoao 于 2021-4-13 17:27 编辑

已在上一楼修改,请删除本楼
作者: minmax    时间: 2021-9-22 21:35
本帖最后由 minmax 于 2021-9-23 20:54 编辑

vdfuse 讚

作者: minmax    时间: 2021-9-25 22:14
有哪位完成此帖 可以分享 完成的档案 感谢
作者: Blan77    时间: 2021-10-20 18:44
I would like to study it
作者: fendou00    时间: 2021-11-3 11:09

作者: zhangxuwang    时间: 2021-11-10 10:32
大佬,想用动态vhd装linux,能否出个详细的教程
作者: y4h3z4    时间: 2022-3-8 20:54
zhangxuwang 发表于 2021-11-10 10:32
大佬,想用动态vhd装linux,能否出个详细的教程

我也在等待大佬的详细教程
作者: kero990    时间: 2022-3-11 12:36
我有两个问题
第一,如果我不用win,我只是多个linux的多系统,但不想多分区,我该怎么做
我的考虑是,vhd并不是linux下的常规虚拟磁盘格式,使用vhd格式更多的需求是win作为主系统的需求。那么如果摒弃vhd这种格式,只考虑将linux装进一个虚拟磁盘文件,无论它是raw,crow2,会不会更简单一些。

第二,我目前折腾的这台机器是个国产机,也就是arm64架构,既然这个方案是用的vbox的解决方案,那么它能否支持arm64架构的linux呢?
作者: want20    时间: 2022-11-23 17:44
lijingjack 发表于 2020-12-22 10:32
**** 作者被禁止或删除 内容自动屏蔽 ****

qemu-nbd 挂载 动态 ubuntu vhd ,在 dracut 的 pre-mount 挂脚本处理,救援模式shell 下看日志是可以成功挂到 sysroot上的,也手动验证了,但是在 switch root 的时候,qemu-nbd 就立马断开连接了(shutting down socket),ps 看进程结束了,猜测是 systemd kill 掉了。exec 的方案也无效,但是理论上来说 vdfuse 都可以挂载到进入系统,qemu-nbd 原理也是一样的,不知道怎么整了emmm,大佬给点建议呗
作者: want20    时间: 2022-11-23 18:58
qemu-nbd 挂载 动态 ubuntu vhd ,在 dracut 的 pre-mount 挂脚本处理,救援模式shell 下看日志是可以成功挂到 sysroot上的,也手动验证了,但是在 switch root 的时候,qemu-nbd 就立马断开连接了(shutting down socket),ps 看进程结束了,猜测是 systemd kill 掉了。exec 的方案也无效,但是理论上来说 vdfuse 都可以挂载到进入系统,qemu-nbd 原理也是一样的,不知道怎么整了emmm,大佬给点建议呗
作者: 2011dingfei    时间: 2022-12-14 15:26
Misty 发表于 2020-2-2 06:42
更新:支持VMware快照功能! (仅bios)
1. 下载https://github.com/NyaMisty/grub-vmsnap,用build.sh编译后 ...

吊炸天了!怎么不更新了!正需要这个功能
作者: 2011dingfei    时间: 2022-12-19 21:50
Misty 发表于 2020-2-2 06:42
更新:支持VMware快照功能! (仅bios)
1. 下载https://github.com/NyaMisty/grub-vmsnap,用build.sh编译后 ...

uefi能用了吗
作者: fendou00    时间: 2023-1-11 17:34
试了一下,没成功, 打印:
Gave up waiting for root file system device.Common problems:
- Boot args(cat /proc/cmdline)
-Check rootdelay= ( did the system wait long enough?)
- Missing modules (cat /proc/moudles;ls /dev)
ALERT! /dev/vdhost/Partition2 does not exist. Dropping to a shell!

有尝试成功的大佬吗?

作者: ZMLoveLH    时间: 2023-1-12 16:38
看看楼主的教程,学习那些支持虚拟磁盘启动的Linux方式
作者: 2013qwaszx    时间: 2023-2-5 00:32
补充一下:dracut方案《第四步》中,fedora 37中/etc/dracut.conf.d/为空目录,没有任何配置文件。
可以在第五步中增加选项-N,即
  1. dracut -f -N
复制代码
,在生成时指定hostonly模式。
作者: paodiao    时间: 2023-5-8 20:50
want20 发表于 2022-11-23 18:58
qemu-nbd 挂载 动态 ubuntu vhd ,在 dracut 的 pre-mount 挂脚本处理,救援模式shell 下看日志是可以成功 ...

老哥,我也在看使用qemu-nbd启动qcow2的问题,你有研究出什么结果没?感谢!
作者: want20    时间: 2023-5-29 15:34
paodiao 发表于 2023-5-8 20:50
老哥,我也在看使用qemu-nbd启动qcow2的问题,你有研究出什么结果没?感谢!

没,qemu-nbd始终无法起来,还是老问题,可以用vboximg-mount替代,vdfuse只支持mbr,vboximg-mount支持mbr和gpt,但是都需要装个vbox,想把其提取出来,但是vbox为了做多平台,代码还不好提。目前知道几个方案,libguestfs-tools和nbdfuse有些镜像分区读不出?libvhd只支持读,blktap没试过。
作者: want20    时间: 2023-5-29 15:38
want20 发表于 2023-5-29 15:34
没,qemu-nbd始终无法起来,还是老问题,可以用vboximg-mount替代,vdfuse只支持mbr,vboximg-mount支持m ...

以上针对vhd而言,差分qcow2应该有其他挂载工具吧,vhd比较麻烦
作者: want20    时间: 2023-5-29 15:48
kero990 发表于 2022-3-11 12:36
我有两个问题
第一,如果我不用win,我只是多个linux的多系统,但不想多分区,我该怎么做
我的考虑是,vh ...

显然不支持,vbox除了apple的m系列外目前不支持arm,当然把挂载工具vdfuse换成支持arm的即可
作者: ghosthark    时间: 2023-6-15 22:25
有在drauct下成功使用qemu-ndb的挂载vhd(动态)的案例吗
按照楼主的方案initramfs-tool方案改写qemu-nd挂载成功了
但是drauct改写时nbd被断开显示IO  error
[  568.600126] fedora kernel: block nbd1: shutting down sockets
[  568.603241] fedora kernel: blk_print_req_error: 11 callbacks suppressed
[  568.603244] fedora kernel: I/O error, dev nbd1, sector 97519872 op 0x0:(READ) flags 0x3000 phys_seg 1 prio class 2
[  568.603260] fedora systemd-journald[292]: Received SIGTERM from PID 1 (systemd).
[  568.603774] fedora kernel: EXT4-fs error (device nbd1p2): __ext4_get_inode_loc_noinmem:4687: inode #3014657: block 12058656: comm systemd: unable to read itable block
作者: ghosthark    时间: 2023-6-15 22:25
有在drauct下成功使用qemu-ndb的挂载vhd(动态)的案例吗
按照楼主的方案initramfs-tool方案改写qemu-nd挂载成功了
但是drauct改写时nbd被断开显示fedora kernel: I/O error

作者: 2011niumao    时间: 2023-6-16 10:25
本帖最后由 2011niumao 于 2023-6-16 10:30 编辑
ghosthark 发表于 2023-6-15 22:25
有在drauct下成功使用qemu-ndb的挂载vhd(动态)的案例吗
按照楼主的方案initramfs-tool方案改写qemu-nd ...

看看我这个方案。好像我也没有成功,但是Ubuntu系统qemu-nbd是成功了的,只是明显感觉到系统迟钝。
注意,引导参数是 qemu-nbd. 它的值是vhd文件的含路径的名称。

注意,需要安装ntfs-3g,  最好是我修订过的ntfs-3g



  1. ########################################################################
  2. ###                           KLOOP by niumao                        ###
  3. ########################################################################

  4. QEMUNBD=$(getarg qemunbd=)

  5. export QEMUNBD


  6. if [ -n "$QEMUNBD" ]; then

  7.         ### reset the value of the root variable
  8.         HOSTDEV="${root#block:}"
  9.         [ -n "$KROOT" ]  ||  root="/dev/loop0"
  10.         [ -n "$KROOT" ]  &&  root="$KROOT"
  11.         realroot="$root"
  12.         export root
  13.         if ismounted "$NEWROOT"; then
  14.                 umount "$NEWROOT"
  15.         fi
  16.                         
  17.         ###  auto probe the fs-type of the partition in which vhd-file live and mount it  /host
  18.         mkdir -p /host
  19.         if [ -z "${HOSTFSTYPE}" ]; then
  20.                 HOSTFSTYPE="$(blkid -s TYPE -o value "$HOSTDEV")"
  21.                 [ -z "${HOSTFSTYPE}"  -o  "${HOSTFSTYPE}" = "ntfs" ] && HOSTFSTYPE="ntfs-3g"
  22.         fi
  23.         [ "${HOSTFSTYPE}" = "ntfs-3g" ] || modprobe ${HOSTFSTYPE}
  24.         mount -t "${HOSTFSTYPE}" -o rw   $HOSTDEV /host
  25.         
  26.         ### mount the vhd-file on a loop-device
  27.         if [ "${QEMUNBD#/}" != "${QEMUNBD}" ]; then
  28.                 modprobe  nbd
  29.                 [ -e /host$QEMUNBD ] || sleep 3
  30.                 qemu-nbd -c /dev/nbd0 /host$QEMUNBD
  31.                 kpartx -av /dev/nbd0
  32.                 [ -e "$realroot" ] ||  sleep 3
  33.         fi

  34.         ### mount the realroot / in vhd-file on $NEWROOT
  35.         if [ -z "${KLOOPFSTYPE}" ]; then
  36.                 KLOOPFSTYPE="$(blkid -s TYPE -o value "$realroot")"
  37.                 [ -z "${KLOOPFSTYPE}" ] && KLOOPFSTYPE="ext4"
  38.         fi
  39.         [ -e "$realroot" ] || sleep 3
  40.         mount -t "${KLOOPFSTYPE}" -o rw $realroot $NEWROOT
  41.         
  42.         ### mount /host in initrd to /host of the realrootfs
  43.         if [  "${HOSTHIDDEN}" != "y" ] ; then
  44.                 [ -d "${NEWROOT}"/host ] || mkdir -p ${NEWROOT}/host
  45.                 mount -R /host   ${NEWROOT}/host
  46.         fi

  47. fi


  48. ########################################################################
  49. ###                        END,  KLOOP by niumao                     ###
  50. ########################################################################
复制代码

作者: 2011niumao    时间: 2023-6-16 10:35
ghosthark 发表于 2023-6-15 22:25
有在drauct下成功使用qemu-ndb的挂载vhd(动态)的案例吗
按照楼主的方案initramfs-tool方案改写qemu-nd ...

是不是应该首先在vhd内系统的内核设置一下,block的黑名单或者白名单?再重新制作initramfs使用此内核引导。
作者: ghosthark    时间: 2023-6-16 21:10
2011niumao 发表于 2023-6-16 10:25
看看我这个方案。好像我也没有成功,但是Ubuntu系统qemu-nbd是成功了的,只是明显感觉到系统迟钝。
注意 ...

感谢大佬回复,我尝试使用该脚本但是还是没有正常引导 我的环境是fedroa 38  efi分区 +EXT4(/分区)   
grub2 配置如下
  1. menuentry 'kloop-dracut' --class ubuntu {
  2.         insmod gzio
  3.         insmod part_msdos
  4.         insmod part_gpt
  5.         insmod ext2
  6.         insmod ntfs
  7.         insmod probe
  8.         set vhdfile="/CloudStorage/Virtual/Virtual_Disk/Blackup/kloop_dracut/kloop_dracut.vhd"
  9.         set root=(hd1,gpt2)
  10.         search --no-floppy -f --set=aabbcc  $vhdfile
  11.         set root=${aabbcc}
  12.         probe -u --set=ddeeff ${aabbcc}
  13.         linux        /CloudStorage/Virtual/Virtual_Disk/Blackup/kloop_dracut/vmlinuz rw root=UUID=${ddeeff} qemunbd=$vhdfile kroot=/dev/nbd1p2   selinux=0  rd.debug rd.shell
  14.         initrd       /CloudStorage/Virtual/Virtual_Disk/Blackup/kloop_dracut/initrd.img
  15. }
复制代码


返回debug 如下123网盘后加 /s/PP7lVv-YAOC.html提取码:IJnn
作者: ghosthark    时间: 2023-6-16 21:56
kpartx -av 操作将分区挂载到了/dev/mapper 下 修改grub2配置 kroot=/dev/mapper/nbd1p2 一直滚动输出 卡在starting draut-pre-udev.service  -  rule-based manager for devievents and files
作者: 2011niumao    时间: 2023-6-17 14:18
ghosthark 发表于 2023-6-16 21:56
kpartx -av 操作将分区挂载到了/dev/mapper 下 修改grub2配置 kroot=/dev/mapper/nbd1p2 一直滚动输出 卡 ...

kroot 的值应该是什么呢?是/dev/mapper/nbd1p2?还是 /dev/npd1p2?两者不一样的。也许两种都可以?
作者: ghosthark    时间: 2023-6-18 18:10
2011niumao 发表于 2023-6-17 14:18
kroot 的值应该是什么呢?是/dev/mapper/nbd1p2?还是 /dev/npd1p2?两者不一样的。也许两种都可以?

ktoot=/dev/mapper/nbd1p2 和
kroot=/dev/npd1p2 加 注释掉kprat后的运行结果一样
问题照片如下

www点123pan点com/s/PP7lVv-i9OC.htm
作者: ghosthark    时间: 2023-6-19 22:18
本帖最后由 ghosthark 于 2023-6-19 23:54 编辑
2011niumao 发表于 2023-6-17 14:18
kroot 的值应该是什么呢?是/dev/mapper/nbd1p2?还是 /dev/npd1p2?两者不一样的。也许两种都可以?

通过增加grub debug rd.break=pre-shutdown rd.break=shutdown  rd.udev.debug  rd.break=pre-mount rd.break=mount
以及在增加 blockdev 之后进入到了initqueue 阶段 增加rd.break=initqueue rd.initqueue.debug 后发现内核模块丢失无法通过modprobe加载包括fuse  ntfs  nvme在内的所有模块并且ntfs-3g 挂载也无法操作
作者: duhe303    时间: 2023-6-19 22:36
很详细。。。
作者: ghosthark    时间: 2023-6-30 00:18
fedroa dracut 方式

vdfuseloop 方式使用qmeu-nbd 替换vdfuse 操作会导致卡在initqueue
kloop方案改写也有相同问题

arch
kloop_mkinitcpio 使用qemunbd  rootfs下提示 ntfs-3g 已挂载 但是umount 之后依然无法挂载 并且使用kloop的ntfs-3g make中很多报错 因此使用的是ntfs-3g+fuse2的包 但是这个似乎挂载时有用户权限问题
至此 只有参照楼主initramfs-tool方案改写qemu成功了
全部资料信息github.com/MobtgZhang/VHD-Boot
如果有成功实现 dracut mkinitcpio 实现使用qemu-nbd 方式挂载动态vhd 成功的方案可以分享一下不胜感激

作者: 2011niumao    时间: 2023-7-3 13:50
标题: 把qemu-nbd命令装入内核初始镜像盘
本帖最后由 2011niumao 于 2023-7-3 14:01 编辑
ghosthark 发表于 2023-6-30 00:18
fedroa dracut 方式

vdfuseloop 方式使用qmeu-nbd 替换vdfuse 操作会导致卡在initqueue

对于Fedora, 你确定在使用dracut命令时候,把命令qemu-nbd装入到了initramfs里了?是qemu-nbd,不要错拼。
不然,内核挂载好动态vhd文件所在分区后,找不到qemu-nbd命令,是无法挂载动态vhd的、
使用以下一个命令来制作initramfs,不用修改配置文件(在add-drivers参数后面是否应该加入 nbd 存疑,下面arch同理)
  1. sudo dracut  -i /home/niumao/mydracut/10-vhdmount-kloop.sh /lib/dracut/hooks/pre-mount/10-vhdmount-kloop.sh  --no-hostonly  --install " vi /etc/virc ps grep cat rm blkid losetup  kpartx partx mount.fuse mount.ntfs-3g ntfs-3g shutdown  qemu-nbd "   --add-drivers  "fuse dm-mod nbd"  -o " plymouth btrfs crypt  cifs fcoe fcoe-uefi iscsi nfs"  /home/niumao/dracut-fedora-kloop
复制代码
关于arch有同样的问题,不过因为不是dracut模式,可以选择修改配置文件后重新制作initramfs
  1. sudo  gedit /etc/mkinitcpio.conf
复制代码
修改地方大体如下
  1. BINARIES="losetup partx mount.fuse mount.ntfs-3g ntfs-3g shutdown qemu-nbd "
  2. MODULES="fuse ntfs loop  nbd"
复制代码

作者: ghosthark    时间: 2023-7-28 10:43
2011niumao 发表于 2023-7-3 13:50
对于Fedora, 你确定在使用dracut命令时候,把命令qemu-nbd装入到了initramfs里了?是qemu-nbd,不要错拼。 ...

配置正确之后还是异常 返回
Starting initrd-switch-root.service - Switch Root...
[
170.773548] blk_print_req_error: 2 callbacks suppressed
170.773551] I/O error, dev nbdi, sector 42946816 op 0x0:(1READ) flags 0x3000 phys_seg 1 prio class 2
[ 170.773607] systemd-journald[5138]: Received SIGTERMfrom PID 1 (systemd)
170.774783] EXT4-fs error (device nbd1p2):__ext4_get_inode_loc_noinmem:4493: inode #1310721: block 5242912: comm systemd: un
able to read itable block
[ 170.775600] I/O error, dev nbdi, sector 1003520 op 0x1:(WRITE) flags 0x23800 phys_seg 1 prio class 2
[ 170.776124] Buffer I/O error on dev nbdip2, logicalblock 0, lost sync page write
[ 170.776402] EXT4-fs (nbd1p2): I/O error while writing superblock
[ 170.801244] systemd[1]: systemd 253.7-1.fc38 runniing in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCR
YPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDOZ +IDNŽ -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBEDISK +PCREZ +PWQUALITY +P11KI
T +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPP_FRAMEWORK +XKBCOMMON +UTMP +SYSUINIT default-hierarchy=unified)
[]
170.802266] systemd[1]: Detected virtualization vware
[ 170.802661] systemd[1]: Detected architecture x86-644.
[ 170.803121] systemd[1]: Running in initrd.
作者: want20    时间: 2023-7-31 11:53
本帖最后由 want20 于 2023-7-31 11:59 编辑
ghosthark 发表于 2023-7-28 10:43
配置正确之后还是异常 返回
Starting initrd-switch-root.service - Switch Root...
[

用qemu-nbd是会这样的,我都没成功过,initramfs-tool 和 dracut 都是 switch root 的时候卡 io error,目前我的方案是自己写的挂载工具,可以实现 x86 和 arm 的挂载,但是 initramfs-tool 的关机无论是用 vdfus 还是 vboximg-mount 会容易卡死,挂载的镜像设备卸载不掉,dracut 关机脚本写好了就不会。单纯自己使用的话完全可以用 vboximg-mount 做,虽然要装 vbox,且不能移植到arm平台。
引导起来只是第一步,后续还在解决断电文件系统损坏,镜像损坏等问题,至于性能方面,只要挂载工具没做 direct io 或者每次写都加同步的话,还是很不错的。加了 direct io 或者 实时同步到 disk 的话 io 性能会大大下降。

此外,给 grub 加个 vhd 的只读模块就不用把内核镜像拷出来了,挂起来直接引导。目前打算研究一下 ventoy 的实现,看下会不会更优雅一点。

作者: ghosthark    时间: 2023-8-10 22:14
want20 发表于 2023-7-31 11:53
用qemu-nbd是会这样的,我都没成功过,initramfs-tool 和 dracut 都是 switch root 的时候卡 io error, ...

initramfs-tool 我没有遇到问题
dracut  目前定位到没有加--uefi参数  可以进入rootfs 但是没有成功启动
grub 加个 vhd 的只读模块 这个怎么实现 可以分享一下吗 loopback ?似乎不支持动态磁盘
如果可以有支持动态磁盘的通用方案可以分享一下吗
作者: ghosthark    时间: 2023-8-20 19:48
2011niumao 发表于 2023-7-3 13:50
对于Fedora, 你确定在使用dracut命令时候,把命令qemu-nbd装入到了initramfs里了?是qemu-nbd,不要错拼。 ...

经过这段时间尝试已经成功实现arch 原因在于  lo设备没有分配网络地址和qemu依赖/var/lock中存放链接文件
增加
  1. mkdir -p /var/lock
  2. addr add 127.0.0.1/8 dev lo
  3. ip link set lo up
复制代码

之后正常启动 但是存在关机异常 但基本可用
fedroa 的dracut 还是没有头绪,目前只能定位到在initrd阶段正常但后续过程中导致了nbd设备和模块被kill 继续尝试中
作者: want20    时间: 2023-9-14 11:50
本帖最后由 want20 于 2023-9-14 11:54 编辑
ghosthark 发表于 2023-8-10 22:14
initramfs-tool 我没有遇到问题
dracut  目前定位到没有加--uefi参数  可以进入rootfs 但是没有成功启 ...

提示一下,参考vboot的vhd模块,自己改。他本身是支持动态vhd的,但是不支持差分,可以自己加差分的支持。没差分也问题不大,就是更新initrd后记得压到第一级镜像。这一part经过长时间测试,非常稳定。外部因素,暂时无法分享代码,望理解。
作者: 假大空    时间: 2023-11-14 08:49
linux vhd差分这个没弄明白
作者: ghosthark    时间: 2024-2-19 15:33
求教qemu-nbd 的动态磁盘引导方式已经尝试过  github.com/MobtgZhang/VHD-Boot/blob/master/kloop/fedora-kloop/README.md]以及github.com/MobtgZhang/VHD-Boot/blob/master/vdfuseloop/README.md 都卡在启动中
作者: 2011admlee    时间: 2024-5-10 23:42
严格按照你的方法制作,结果不成功,你的dracut方案中菜单是不是有错误,kernel后怎么没有下一行命令:initrd这个命令行。到底可不可行,别忽悠人。
作者: 2011admlee    时间: 2024-5-10 23:43
严格按照你的方法来,还是启动不了,你的dracut方案中grub4dos菜单是不是有错,kernel命令行下一行呢?
作者: jyaken    时间: 2024-6-2 14:12
真是神仙,看了大佬的github,赞叹
作者: cqlive    时间: 2024-6-14 15:15
技术贴啊
作者: arkuon    时间: 2024-6-25 19:01
大佬牛逼
作者: purple305    时间: 2024-7-31 10:10
dracut方案启动没有成功,报systemd-udevd: worker exited。 用的是动态VHD,vdfuse可以挂载动态VHD吗?
作者: purple305    时间: 2024-7-31 11:05
@2011niumao  initramfs-tool+NBD+动态VHD可以成功切换启动,就是关机有io error,怀疑需要修改Systemd或shutdown。

dracut方案+动态VHD不成功,目前看dracut的脚本应该都执行了,最后进系统时报错。@minmax 这个方案你是否成功了,能分享一下成功的详细流程吗?
作者: 我是下错    时间: 2024-8-12 13:09
感谢分享
作者: 我是下错    时间: 2024-8-12 23:50
好东西
作者: 75344840    时间: 2024-8-31 20:49
讨论都看了,为啥都是虚拟机环境。物理机下不是更真实吗?
作者: 旭东    时间: 2024-9-9 22:32
感谢分享了




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3