我之前记录了一下创建proxmox debian12 cloud-init模板的过程,但有一些问题没有得到很好的解决,比如hostname设置失效。后来我发现用virt-customize去自定义debian cloud image更方便,而且hostname设置失效的问题也不会出现了。
另外我之前在这篇文章中提到过virt-customize的一些简单用法,但实际上virt-customize只是libguestfs这一套工具包里面的其中一个工具而已。
实际上libguestfs除了virt-customize以外还包含了很多其他强大且实用的工具,它能做的事情非常多。这篇文章就简单介绍一下这个牛逼的libguestfs。。
[重要提示]
不要在proxmox的母鸡系统中安装libguestfs,因为libguestfs与proxmox不兼容:
https://forum.proxmox.com/threads/is-it-safe-to-install-libguestfs-tools-directly-on-pve.58780/
https://forum.proxmox.com/threads/did-i-just-brick-proxmox-8-by-installing-libguestfs-tools.135085/
就算哪天与proxmox兼容了也不要安装在母鸡系统内,因为安装libguestfs会携带安装一大堆依赖的软件包,起码有1G多,它会把你的系统搞的非常杂乱和臃肿,不利于后续的维护。
个人建议单独开一台小鸡,在小鸡内安装libguestfs,之后所有的工作都在小鸡内完成。
安装的话很简单,Debian只需:
apt -y update apt -y install libguestfs-tools
然后就可以使用到libguestfs官网右边列出的那一系列工具了:https://libguestfs.org/,下面简单介绍一下常用的几个功能。
查看image内的任意文件:
virt-cat -a debian-12-generic-amd64.qcow2 /etc/motd
可以看到成功回显了:
编辑image内的任意文件:
virt-edit -a debian-12-generic-amd64.qcow2 /etc/motd
更新系统:
virt-customize -a debian-12-generic-amd64.qcow2 --update
设置时区:
virt-customize -a debian-12-generic-amd64.qcow2 --timezone 'Asia/Shanghai'
安装软件包:
virt-customize -a debian-12-generic-amd64.qcow2 --install qemu-guest-agent,wget,curl,git,net-tools
启动systemd服务:
virt-customize -a debian-12-generic-amd64.qcow2 --run-command "systemctl enable qemu-guest-agent"
修改ssh配置文件:
virt-customize -a debian-12-generic-amd64.qcow2 --run-command "sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config" virt-customize -a debian-12-generic-amd64.qcow2 --run-command "sed -i 's/PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config"
这里就不一一列举所有的用法了,有需求的可以自己研究一下。
之前有人问我怎么修改debian官方image里面的源,我看了下其实有多种方法都可以实现。
第一种就还是利用cloud-init,自定义一个cloud-init的用户配置文件,然后在里面根据官方的这个示例配置来修改。
第二种就是利用libguestfs了,这里记录下详细的修改过程。
默认情况下,cloud-init是会接管软件源配置的,如果我们直接去编辑软件源配置文件的话没有用,机器开机后软件源配置文件的内容会被cloud-init覆盖掉。
搜了一下发现可以直接改cloud-init的base_config:https://cloudinit.readthedocs.io/en/latest/reference/base_config_reference.html
编辑cloud-init的base_config配置文件:
virt-edit -a debian-12-generic-amd64.qcow2 /etc/cloud/cloud.cfg
往下翻就可以看到软件源相关的配置了:
... package_mirrors: - arches: [default] failsafe: primary: https://deb.debian.org/debian security: https://deb.debian.org/debian-security ...
在这里找个合适的软件源镜像:https://www.debian.org/mirror/list,然后替换掉之前的配置即可:
... package_mirrors: - arches: [default] failsafe: primary: https://mirrors.xtom.com/debian security: https://mirrors.xtom.com/debian-security ...
这里有一个坑就是很多软件源镜像没有同步这个debian-security,你得找一个都同步了的。。因为debian-security是最近几个版本加进来的,以前debian没有这个。。
然后如果需要增加套件的话,可以直接编辑下面这个文件,cloud-init不会覆盖这个配置文件:
virt-edit -a debian-12-generic-amd64.qcow2 /etc/apt/sources.list.d/debian.sources
默认只有main:
Types: deb deb-src URIs: mirror+file:///etc/apt/mirrors/debian.list Suites: bookworm bookworm-updates bookworm-backports Components: main Types: deb deb-src URIs: mirror+file:///etc/apt/mirrors/debian-security.list Suites: bookworm-security Components: main
根据这个文档:https://wiki.debian.org/SourcesList,你可以在里面加上contrib/non-free等套件:
Types: deb deb-src URIs: mirror+file:///etc/apt/mirrors/debian.list Suites: bookworm bookworm-updates bookworm-backports Components: main contrib non-free non-free-firmware Types: deb deb-src URIs: mirror+file:///etc/apt/mirrors/debian-security.list Suites: bookworm-security Components: main contrib non-free non-free-firmware
把修改好的image传到proxmox:
scp debian-12-generic-amd64.qcow2 root@1.2.3.4:/root/debian-12-generic-amd64-source.qcow2
然后创建一个vm:
qm create 50000 \ --name debian12-cloud-init-mod-source \ --cpu host \ --cores 2 \ --memory 2048 \ --net0 virtio,bridge=vmbr0,firewall=1 \ --net1 virtio,bridge=vnet0,firewall=1 \ --scsihw virtio-scsi-single \ --agent enabled=1,freeze-fs-on-backup=1,fstrim_cloned_disks=1
导入image并进行一系列设置,最后转换成系统模板:
qm set 50000 --scsi0 local-zfs:0,import-from=/root/debian-12-generic-amd64-source.qcow2,cache=writeback,iothread=1,discard=on qm set 50000 --ide2 local-zfs:cloudinit qm set 50000 --boot order=scsi0 qm set 50000 --serial0 socket --vga serial0 qm set 50000 --ciuser=root --cipassword="setyourpassword" qm set 50000 --nameserver="8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844" qm set 50000 --ipconfig1 ip=dhcp qm template 50000
测试都是ok的: