买机尽可能避免采用微软 Hyper-V 虚拟化的,很坑

69次阅读

共计 3423 个字符,预计需要花费 9 分钟才能阅读完成。

内容最后由 天权璇玑 于 2023-5-7 18:11 编辑 Linux 一键重装最近增加了很多功能,包括适配御三家:Vultr/DigitalOcean/Linode,以及谷歌 Google Cloud/ 阿里云轻量 / 亚马逊 AWS Lightsail 等等商家,把各种各样稀奇古怪的 grub 引导和读取校验网络配置等问题解决了,还加入了支持安装 Kali 的功能(甲骨文 Oracle ARM 机千万别装,重启就黑屏,什么提示都没有,在 VNC 里都没法调试,且无法通过强制重启回到原系统),功能测试如果没问题的话,预计不久后发布,今天拿 Ruvds 4 毛机测试,却发现不少问题:最高只能安装到 Debian 10,装 Debian 11 12、Kali 重启后必 kernel panic(内核恐慌);RU VDS 用的是微软的 Hyper-V 虚拟化技术,且它的这个 Hyper-V 容器版本似乎不是很高,BIOS 版本竟然只到 2016 年。报错代码是:Kernel panic – not syncing: VFS: unable to mount root fs on unknown-block(0,0) 复制代码网上找了一大圈,这个帖子里的最高赞答案比较让人信服:https://unix.stackexchange.com/questions/414655/not-syncing-vfs-unable-to-mount-root-fs-on-unknown-block0-0VFS: unable to mount root fs on unknown-block(0 0) means the kernel was unable to mount the root filesystem. There are two common causes for this:The kernel doesn\’t support the filesystem on the device. If you compiled your own kernel, this is usually because you specified the filesystem driver should be built as a module rather than a native part of the kernel; if you\’re using the distro\’s kernel, this is usually because you picked an exotic format for your root filesystem. In either case, don\’t do that.The name of the root device passed to the kernel is wrong. This one can be tricky to fix: the best method I\’ve found is to modify the kernel command line from the bootloader, making educated guesses about what the root= parameter should look like until I find something that works. 简单来讲这种错误的发生是因为两点造成的:内核不支持设备的文件系统,一般是因为驱动不兼容造成;内核存放的目录位置不对,系统读不到。第二种原因发生的概率很低,因为脚本重装前在系统 grub.cfg 里留下的 menuentry 引导菜单中,设置了把 /tmp/boot/ 目录中的 linux 和 initrd 文件向系统 /boot/ 目录拷贝的操作。find . | cpio -H newc –create –verbose | gzip -9 > /tmp/initrd.imgcp -f /tmp/initrd.img /boot/initrd.img || sudo cp -f /tmp/initrd.img /boot/initrd.imgcp -f /tmp/vmlinuz /boot/vmlinuz || sudo cp -f /tmp/vmlinuz /boot/vmlinuz 复制代码而且 Debian 9 和 Debian 10 在 Ruvds 的 Hyper-V 容器里是可以安装的,只有 Debian 11 以上版本,包括 Debian 12,以及最新版的 Kali 都不行。说明网络安装初始化的微型 Linux 系统目录位置设置的是没问题的。那么问题只能出在驱动不兼容上,Debian 9 自带的 Linux 内核版本是 4.9.X,Debian 10 为 4.19.X,都是 4 系列,而 Debian 11 为 5.10.X,Debian 12 和截止到 2023 年 5 月份的 Kali 版本内核都是 6.1.X。Linux 内核大版本更新的时候,自带的驱动程序也会出现变化。所以我推测凡是自带内核大于 4 的 Linux 版本,在 Ruvds 的 Hyper-V 容器里都无法作为网络启动文件正常启动。对于网络重装来说,一个典型的 grub 引导菜单中,Linux   /boot/vmlinuz 负责读取自动应答文件(preseed.cfg),安装当前版本的 Linux,initrd  /boot/initrd.img 负责为 vmlinuz 预先布置一个环境,以支持 vmlinuz 运行。简单来讲就是 initrd.img 是一个微型 PE 系统(按重装 Windows 理解),vmlinuz 就是安装程序。“Kernel panic – not syncing: VFS: unable to mount……”出错的原因就是 initrd.img 这个小系统没正常启动,自然就无法带着 vmlinuz 完成新系统安装。我还尝试过指定 Debian 10 版本的 initrd.img,搭配 Debian 11 的 vmlinuz 启动,虽然重启后微型系统启动成功了,但安装还是无法顺利进行,安装程序提示找不到网卡,估计还是因为 initrd.img 的 Linux 内核(4.19.X)跟 vmlinuz 的 Linux 内核(5.10.X)不匹配造成的。这就说明每个大版本的 vmlinuz 和 initrd.img 都是成对的,不能混搭使用。我试过添加“-firmware”参数,即附带额外驱动来启动安装,结果不但 Debian 11+/Kali 装不了,连 Debian 10 及以下也装不了了,Debian 10 安装程序提示缺少正确的硬盘驱动,看来 Hyper-V 虚拟出来的硬盘驱动很特殊,非特定版本的 Linux 内核无法识别,而且也不吃通用驱动包。然后参考萌咖脚本里的方法,强制要求微型系统以低内存模式启动,结果还是报错,提示 blkid 分区失败,估计是没检查到驱动器。我推测解决方法应该是把支持 Hyper-V 的硬盘驱动,编译打包进 Debian 11+/Kali 的 initrd.img 中,用这个修改版的微型系统启动,驱动问题就解决了,安装自然也就能顺利进行。但我实在是不知道怎么把驱动编译到某内核里,有没有大手子教我一下。无论是 kvm 还是 QEMU 虚拟化,都不会受系统固件版本影响,导致新版本 Linux 安装出现问题,可能是因为它们本来就是通过母机 Linux 虚拟化出来的,兼容性问题就少很多。用以下命令可以检测系统用了什么虚拟化技术,如果出现“Microsoft”,我建议你还是别碰,毛病什么的会比其他虚拟化环境多很多。微软还是老老实实做好 Windows 吧,做跨平台还是不行。dmidecode -s system-manufacturersystemd-detect-virt 复制代码 zhujizixun 2023-05-07 18:12 2 写了这么多咱也看不懂,但是标题说的不对,Windows 系统推荐 hyperv 天权璇玑 2023-05-07 18:13 3zhujizixun 发表于 2023-5-7 18:12 写了这么多咱也看不懂,但是标题说的不对,Windows 系统推荐 hypervWindows 自带的 Hyper-V 也很难用,我只用 VMware fuckhdc 2023-05-07 18:15 4 哥们,你东西掉水了,往船身上做记号是不对的,你得往天上打信号弹,然后再在船身上刻记号 天权璇玑 2023-05-07 18:18 5fuckhdc 发表于 2023-5-7 18:15 哥们,你东西掉水了,往船身上做记号是不对的,你得往天上打信号弹,然后再在船身上刻记号 … 什么抽象比喻,说点能懂的 tem 2023-05-07 18:20 6 闭源的垃圾 独服到虚拟机跑 iperf 那 CPU 占用 天权璇玑 2023-05-07 18:24 7tem 发表于 2023-5-7 18:20 闭源的垃圾 独服到虚拟机跑 iperf 那 CPU 占用很难不赞同

正文完
 0