ryan4yin / thiscute.world

Ryan4Yin's Space
https://thiscute.world
17 stars 3 forks source link

posts/proxmox-virtual-environment-instruction/ #22

Open utterances-bot opened 1 year ago

utterances-bot commented 1 year ago

Proxmox Virtual Environment 使用指南 - This Cute World

https://thiscute.world/posts/proxmox-virtual-environment-instruction/

conghuayu commented 1 year ago

十分深入且详尽的文章,标题虽然写着指南,但内容明显已经达到了最佳实践的范畴了👍 PVE论坛上有一帖是关于cloud image与cloudinit配合使用的坑点,链接:https://forum.proxmox.com/threads/ide-cloud-init-volumes-are-not-usable-when-cold-booting-a-vm.117345/ 我实际上也遇到了相同的问题,有workaround可以解决,但是总归不够优雅。欢迎探讨。

ryan4yin commented 1 year ago

@conghuayu 哈哈,感谢提供信息~ 看这篇文章描述,把 ide2 加入到 boot order 中就能解决 cloudinit 镜像的问题,我今晚试试看。

conghuayu commented 1 year ago

Hi,ryan4yin 你好, 我原本也想在那个帖子里写点测试过程和反馈,但我意识到我碰到的问题可能比冷启动更严重。

简要概述一下:在 q35 + OVMF 的 VM 上使用 cloud 镜像,以 ide / sata 方式挂载 cloud-init drive,且设置好 boot order,启动时 VM 无法通过 cloud-init 初始化,重启之后依然无效。(但是以 scsi 方式挂载时一切正常)

我测试了 debian-11-genericcloud-amd64.qcow2 和 jammy-server-cloudimg-amd64-disk-kvm.img,表现基本一致。但是我不确定能否在其他用户的 PVE 环境中复现这个问题,如果你对此感兴趣的话,可以简单测试一下。以下是我的代码,仅供参考:

VMID=256
qm create ${VMID} \
    --name ubuntutest \
    --ostype l26 \
    --machine q35 --scsihw virtio-scsi-single --agent enabled=1 --bios ovmf --efidisk0 local-lvm:0,pre-enrolled-keys=0 --tpmstate0 local-lvm:0 \
    --cpu cputype=host --cores 2 \
    --memory 2048 \
    --net0 virtio,bridge=vmbr0,firewall=1

qm set ${VMID} --scsi0 local-lvm:0,import-from=/path/to/jammy-server-cloudimg-amd64-disk-kvm.img,discard=on,iothread=1,ssd=1
qm disk resize ${VMID} scsi0 8G

# ide2 失败
qm set ${VMID} --ide2 local-lvm:cloudinit --serial0 socket --vga serial0 --sshkey /path/to/id_rsa.pub --ipconfig0 ip=x.x.x.x/x,gw=x.x.x.x
qm set ${VMID} --boot order='scsi0;ide2'

# sata0 失败
qm set ${VMID} --sata0 local-lvm:cloudinit --serial0 socket --vga serial0 --sshkey /path/to/id_rsa.pub --ipconfig0 ip=x.x.x.x/x,gw=x.x.x.x
qm set ${VMID} --boot order='scsi0;sata0'

# scsi1 正常
qm set ${VMID} --scsi1 local-lvm:cloudinit --serial0 socket --vga serial0 --sshkey /path/to/id_rsa.pub --ipconfig0 ip=x.x.x.x/x,gw=x.x.x.x
qm set ${VMID} --boot order='scsi0;scsi1'

此外我找到了一些看起来像是关于类似问题的讨论,供参考 https://bugs.launchpad.net/cloud-init/+bug/1961832 https://bugs.launchpad.net/cloud-images/+bug/1940791

考虑到相比于传统的 i440fx + SeaBIOS,PCIe 直通和其他可能的现代化功能都需要基于 q35 + OVMF 硬件,我认为在此基础上讨论使用 cloud-init 时遇到的问题是有益的, 如果能记录下来,也可以让后来者方便。

令我感到疑惑的是,如果查阅 q35 相关的资料,你会发现这个芯片组实际上并没有 IDE 控制器,但是当安装 Windows10 等操作系统时,默认情况下 ISO 文件又确实是通过 ide2 挂载的,且安装过程很顺利。不太清楚 PVE 有没有做什么特殊的操作,我只能说我还没有参透 符文 QEMU。

作为题外话,根据 https://cloud.debian.org/images/cloud/ 上的说明:

nocloud: Mostly useful for testing the build process itself. Doesn't have cloud-init installed, but instead allows root login without a password.

nocloud 镜像似乎不预装 cloud-init,所以无法从 cloud-init drive 初始化应当是正常的。镜像中的 "nocloud" 和 https://cloudinit.readthedocs.io/en/latest/topics/datasources/nocloud.html 中所指的 "ds=nocloud" 应该不是同一个东西。

ryan4yin commented 1 year ago

@conghuayu 感谢补充,我找时间试下你的 case 再来反馈。

另外也感谢补充 debian 的 nocloud 镜像文档,它居然没预装 cloud-init...难怪我以前怎么搞都搞不定 cloud-init 初始化... 说到底 nocloud 这个词就很有歧义,不同的地方还有不同的含义...

ryan4yin commented 1 year ago

@conghuayu 我因为没显卡,到目前为止都还没仔细研究过 PCI 直通,不过对你说的踩下 q35 + OVMF 的坑并记录下来,方便后来人,我也很认同~

不过最近搞 ESPHome ,然后就迷上了玩单片机、电路板😂有一阵没折腾 pve 了

本来想今天试下发现已经很晚了,下次,下次试试😂

conghuayu commented 1 year ago

@ryan4yin 你好,我已经弄清楚了这个问题的原因。作为一点(人生的)经验,在这里简单分享。 还是根据 https://cloud.debian.org/images/cloud/ 上关于 genericcloud 镜像的说明:

genericcloud: Similar to generic. ... Is smaller than generic by excluding drivers for physical hardware.

按照描述,genericcloud 镜像通过去除一些在云环境下“用不到”的驱动和模块以获得更小的镜像体积,其中就包含对 IDESATA 控制器的支持。更进一步的实验可以证实这一点:如果以 sata0 作为启动盘,genericcloud 镜像会启动失败;同样的代码,如果换用 generic 镜像则一切正常。

更专业地看,generic 镜像使用 linux-image-amd64 内核,而 genericcloud 镜像使用 linux-image-cloud-amd64 内核,后者在构建时去掉了对 PATASATA 的驱动支持(以及另外一大堆云环境下可能无用的特性),更多细节见: https://salsa.debian.org/kernel-team/linux/-/blob/master/debian/config/config https://salsa.debian.org/kernel-team/linux/-/blob/master/debian/config/config.cloud

总结来说,与 q35 + OVMF 无关,与镜像有关,而且如果不出意外的话,其他发行版的 cloud 镜像应该都采用了类似的策略,使用时应该根据具体情况合理选择。

ryan4yin commented 1 year ago

@conghuayu 哈哈类似的坑我也踩过,这篇文章里有一段:

##### 「Ubuntu Cloud Image 无法识别到 USB 设备」的排查记录

现象:

- 在尝试使用 PVE 将 USB 接口直通到 Ubuntu Cloud Image 启动的虚拟机作为 NAS 系统时,发现 `lsblk` 根本无法找到我的 USB 硬盘
- 换成我笔记本接硬盘盒,能够正常识别并挂载硬盘
- 使用 `lsusb` 不会报错,但是也看不到任何内容
- 使用 `lspci` 能找到 USB 对应的 PCI 设备
- 进一步使用 `cat /proc/modules | grep usb` 与 `lsmod | grep usb` 均查不到任何 usb 相关的内核模块
  - 而在我笔记本上 `lsmod | grep usb` 能够输出 `usb_storage` `usb_core` 等多项内核模块。 
- 再用 `modprobe usb` 会提示 `modprobe: FATAL: Module usb not found in directory /lib/modules/5.15.0-1021-kvm`

问题原因很明显了,Ubuntu 根本没有为 cloud image 预置 usb 内核模块,所以才有这个问题...

进一步搜索发现这个帖子:[What's the difference between ubuntu's amd64-disk-kvm.img and the regular amd64.img cloud images?](https://askubuntu.com/questions/1315370/whats-the-difference-between-ubuntus-amd64-disk-kvm-img-and-the-regular-amd64),解答了我的疑惑。

原因是,我使用了 ubuntu 为 cloud 环境做了精简的 kvm 内核,非常轻量,但是缺少 usb 等常用内核模块。

对于 NAS 外接存储这个场景,我应该使用不以 kvm 结尾的 ubuntu cloud image,换了个基础镜像后问题就解决了~
ryan4yin commented 1 year ago

@conghuayu 看起来各种 sata/usb 等外设的内核模块,在 cloud/kvm 这类精简镜像里都会被干掉,所以看起来个人玩还是 generic 最稳妥,带有 cloud/kvm 等标签的镜像都有风险😂

我对比了镜像体积,generic 也大不了多少。

sysadminxxx commented 1 year ago

请教下,homelab用的零刻,铭凡这些小主机,散热怎么样?跑pve新的GTR6等显卡性能提升没什么意义吧?

ryan4yin commented 1 year ago

@sysrootxyz 散热我感觉还行,不过一方面也是因为我跑的负载都不高。

显卡没啥意义,AMD 的核显貌似没法 PCI 直通,我试了 VirGL 之类的中转方案也不太成熟,很难利用上核显。

asdasdqqq commented 1 year ago

博主,你好!我有跟你一样的机器Minisfroum UM560 AMD R5 5625U,我想问下在Proxmox中利用上5626U核心显卡的性能可行吗?(即显卡直通),我了解的intel的igpu是可以直通的,不知道amd的可不可以?期待回复,非常感谢!

ryan4yin commented 1 year ago

@asdasdqqq 之前搞过一波,没搞定,就没研究了。或许有方法,不过我还没找到。

asdasdqqq commented 1 year ago

嗯嗯,感觉,我也搜了一圈,在外语环境倒是没看到什么人研究,在国内论坛倒是有:

https://bbs.x86pi.cn/thread?topicId=20 https://bbs.x86pi.cn/thread?topicId=25

asdasdqqq commented 1 year ago

感觉是跟机器主板型号绑定的,而且直通后就宿主机可能就没有画面了,遂放弃(~ ̄▽ ̄)~ btw:pve去除未订阅提示,可以试试这个命令:

cd /usr/share/javascript/proxmox-widget-toolkit/
cp -f proxmoxlib.js proxmoxlib.js_bak
sed -i '/Ext\.Msg\.show({/{:a;N;/});$/!ba;/No valid subscription/s/Ext\.Msg\.show/Ext.Msg.noshow/g}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
diff proxmoxlib.js proxmoxlib.js_bak

这个命令将会在文件 proxmoxlib.js 中查找所有包含 Ext.Msg.show({}); 的代码块,并在其中查找 No valid subscription。如果找到了匹配的行,则将其中的 Ext.Msg.show 替换为 Ext.Msg.noshow

ryan4yin commented 1 year ago

@asdasdqqq 感谢反馈,之前用的旧版本也是一个类似的命令,后面失效了,这个我试试。

ak1ra-komj commented 11 months ago

关于 Debian nocloud 镜像的说明发现评论区已经有人提到了,

目前我是在 TrueNAS SCALE 12.12 的 VM 环境中使用的 Debian Cloud Images, 在我这里 Debian 12 的 generic 镜像 cloud-init 可以正常工作, genericcloud 的系统可以启动但 cloud-init 不工作, 按照说明后者只是精简掉一些 physical hardware driver, 这个我也没找到原因; 另外, Debian 11 的最近几次构建的 generic 似乎是有问题的, 我在这里记录了一些问题, 这个问题还没深入研究, 暂时也还没解决,

不得不吐槽, TrueNAS SCALE 这个 VM 功能太"残废"了, 后面打算按你的 HomeLab setup 也整点迷你主机来用 PVE 做虚拟化...

ryan4yin commented 11 months ago

@ak1ra-komj 嗯感谢补充!debian 的 cloud 镜像确实是有那么点坑...

hsxfjames commented 11 months ago

pulumi 现在有个倒是更新的很勤快 emmm https://github.com/muhlba91/pulumi-proxmoxve

ryan4yin commented 11 months ago

@HasikSylphon 挺好的,我那个项目都好久没维护了,因为我自己虚拟机不多,现在没有这么多的自动化需求。

hsxfjames commented 11 months ago

咦 这个评论系统也挺好,可以白嫖 github 的邮件通知