cloud-init的镜像模板制作 centos7 模板制作 记录下proxmox制作带有 cloud-init
的虚机模板过程 因为刚开始制作虚机模板的硬盘是固定大小,后面通过克隆后调整硬盘大小就会自动 growpart
,需要安装 cloud-utils-growpart
。好像只能往大的扩,我个人也倾向于最小 20G
,所以这里我开的是20G硬盘的虚机 另外查了下和实际试了下 cloud-utils-growpart
好像只支持 ext3
和 ext4
不支持 lvm 自动扩,其他的文件系统可以考虑试试 lvm 自己写个脚本去开机启动自动扩。这里我分区不带 swap,标准分区+ext4 安装完后进系统里自行配制好网卡(onboot=yes,清掉uuid)和 dns,因为需要安装一些东西 我个人喜欢拿到手就关闭 selinux 和 firewalld 以及 NetworkManager
1 2 3 systemctl disable --now firewalld NetworkManager setenforce 0 sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config
为了让虚拟化层能重启和关闭虚拟机,必须在虚拟机内安装并运行 acpid
服务,为了使根分区正确调整大小安装cloud-utils-growpart
, cloud-init
支持下发前设置信息写入 instance
1 2 yum install -y acpid cloud-init cloud-utils-growpart systemctl enable acpid
禁用默认 zeroconf
路线(当系统无法连接 DHCP server 的时候,就会尝试通过 ZEROCONF
来获取IP,并添加一条 169.254.0.0/16
的路由条目)
1 echo "NOZEROCONF=yes" >> /etc/sysconfig/network
修改sshd不使用dns防止ssh连接慢
1 2 sed -ri '/UseDNS/{s@#@@;s@\s+.+@ no@}' /etc/ssh/sshd_config systemctl restart sshd
关闭 search 和 127 的dns 有必要的话可以这里提前配置下公网 dns
1 2 sed -ri '/^\s*search/s@^@#@' /etc/resolv.conf sed -ri '/127.0.0./s@^@#@' /etc/resolv.conf
默认的 cloud-init
的配置文件我们目前需要关心下面这三行:ssh_pwauth
为 0 是禁止使用 password 登陆。disable_root:1
是禁止 root 登陆但是我试了下和在网上看到不改 0 也能登陆不知道为啥。 package-update-upgrade-install
这个模块会在 instance 初次开机后会 yum update -y
1 2 3 disable_root: 1 ssh_pwauth: 0 - package-update-upgrade-install
可以通过下面命令修改
1 2 3 4 5 cp /etc/cloud/cloud.cfg /etc/cloud/cloud.cfg.bak sed -ri '/disable_root/{s#\S+$$#0#}' /etc/cloud/cloud.cfg sed -ri '/ssh_pwauth/{s#\S$#1#}' /etc/cloud/cloud.cfg sed -ri '/package-update/s@^@#@' /etc/cloud/cloud.cfg
默认 cloud-init
会创建一个系统类型的用户,不想创建就把这些注释了
1 2 3 4 5 6 7 # default_user: # name: centos # lock_passwd: true # gecos: Cloud User # groups: [wheel, adm, systemd-journal] # sudo: ["ALL=(ALL) NOPASSWD:ALL"] # shell: /bin/bash
其他的也可以自己安装点东西例如 ntp
啥的,弄完后关机即可
1 2 3 4 5 6 7 yum install -y dos2unix wget unzip tcpdump crontabs telnet htop bind-utils lsof sysstat strace ipvsadm ipset fio # 开启 qemu-guest-agent yum install -y qemu-guest-agent sed -ri '/^BLACKLIST_RPC/s#^#$#' /etc/sysconfig/qemu-ga poweroff
debian 12 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # https://mirrors.tuna.tsinghua.edu.cn/help/debian/ cat > /etc/apt/sources.list << EOF deb https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm main contrib # deb-src https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm main contrib deb https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib # deb-src https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib deb https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib # deb-src https://mirrors4.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib deb https://security.debian.org/debian-security bookworm-security main contrib # deb-src https://security.debian.org/debian-security bookworm-security main contrib EOF apt install -y \ cloud-init cloud-initramfs-growroot parted vim \ dos2unix tcpdump telnet \ htop lsof sysstat psmisc strace \ ipset ipvsadm qemu-guest-agent systemctl enable qemu-guest-agent cp /etc/cloud/cloud.cfg /etc/cloud/cloud.cfg.bak sed -ri '/disable_root/{s#\S+$$#0#}' /etc/cloud/cloud.cfg sed -ri '/ssh_pwauth/{s#\S$#1#}' /etc/cloud/cloud.cfg sed -ri '/package-update/s@^@#@' /etc/cloud/cloud.cfg
转换模板 记住 vmid ,在虚机所在的 pve 后台 ssh 上执行下面命令,我这是本地的 lvm 去存储 cloud-init
的 metadata
1 2 3 4 5 6 7 8 9 10 11 12 root@pve:~# qm list VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID 100 cyn1 running 2048 20.00 42543 101 cyn2 running 2048 20.00 42916 102 cyn running 2048 20.00 32136 103 Copy-of-cyn running 2048 20.00 44227 104 cloud-test stopped 2048 20.00 0 root@pve:~# qm set 104 --ide2 local-lvm:cloudinit update VM 104: -ide2 local-lvm:cloudinit Using default stripesize 64.00 KiB. Rounding up size to full physical extent 8.00 MiB Logical volume "vm-104-cloudinit" created.
然后在web上可以看到cloud-init这部分不再是灰色了
web 页面上把它转换成模板即可,部署的话完整克隆下,开机之前双击需要设置的信息即可,否则例如密码不设置默认是模板的密码 pve 后台 ssh 上也可以通过命令设置初始化使用的信息,例如:
1 qm set <vmid> --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1
备份虚机的话可以使用 vzdump
命令,查看命令帮助使用 vzdump help
,备份出来的是一个vma的后缀文件
1 2 # 备份id的虚机到当前目录而非存储池 vzdump --dumpdir . <id>
vma文件可以命令导入qmrestore vzdump-qemu-xx.vma <vmid>
参考资料:
http://blog.sina.com.cn/s/blog_79fd72df0101uo3z.html
https://www.cnblogs.com/linkenpark/p/9527518.html
https://pve.proxmox.com/wiki/Cloud-Init_Support
https://github.com/rharmonson/richtech/wiki/CentOS-7-1511-Minimal-oVirt-Template
proxmox 的一些 openstack 角度笔记 解开硬盘 pve 宿主机可以安装 libguestfs-tools
和来不开机虚机来查看和编辑一些信息,可以使用 vma extract
解开 vma 发现是一个硬件信息的 conf 和一个 raw 的硬盘文件,转成 qcow2 文件后查看,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 root@pve:~# vma extract vzdump-qemu-100-2019_01_31-13_11_02.vma temp/ DEVINFO temp//tmp-disk-drive-scsi0.raw 21474836480 root@pve:~# ll temp/ total 1271184 -rw-r--r-- 1 root root 21474836480 Feb 22 13:33 disk-drive-scsi0.raw -rw-r--r-- 1 root root 391 Feb 22 13:33 qemu-server.conf root@pve:~# qemu-img convert -f raw temp/disk-drive-scsi0.raw -O qcow2 myvm-disk1.qcow2 root@pve:~# ll total 2571096 -rw-r--r-- 1 root root 1328283648 Feb 22 13:34 myvm-disk1.qcow2 drwxr-xr-x 2 root root 4096 Feb 22 13:33 temp -rw-r--r-- 1 root root 1304569344 Feb 21 11:36 vzdump-qemu-100-2019_01_31-13_11_02.vma root@pve:~# virt-ls myvm-disk1.qcow2 / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
详细命令可以看看下面的https://blog.csdn.net/wenwenxiong/article/details/52223731 https://blog.51cto.com/xiaoli110/1568307?utm_source=tuicool
安装完proxmox的一些设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 # 设置时区 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 设置vi sed -ri 's#set compatible#set nocompatible\nset backspace=2#' /etc/vim/vimrc.tiny # 关闭You do not have a valid subscription for this server弹窗 grep -P "!== 'Active'" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js && sed -ri.bak '/!== '"'Active'"'/{s#\([^)]+\)#(false)#}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js # 7、8 的关闭方法 if pveversion -v |& grep -Eq '^proxmox-ve: (7|8)';then sed_num=$(awk '/\/nodes\/localhost\/subscription/{flag=1}flag==1{a++}a<18&&/Ext.Msg.show/{print NR;exit}' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js) if [ -n "$sed_num" ];then sed -ri.bak "${sed_num}"'s#Ext.Msg.show#Ext.Msg.noshow#' /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js #systemctl restart pveproxy fi fi # 关闭企业源 mv /etc/apt/sources.list.d/pve-enterprise.list{,.bak} #下载秘钥 wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg # 添加社区源 https://pve.proxmox.com/wiki/Package_Repositories echo "deb http://download.proxmox.com/debian/pve $(. /etc/os-release; echo $VERSION_CODENAME) pve-no-subscription" >/etc/apt/sources.list.d/pve-install-repo.list # 关闭屏幕或者合上盖子不休眠 https://wiki.archlinuxcn.org/wiki/%E7%94%B5%E6%BA%90%E7%AE%A1%E7%90%86 #sed -ri '/HandleLidSwitch(Docked)?=/{s@^#@@;s#=.+$#=ignore#}' /etc/systemd/logind.conf sed -ri '/^#?Allow/{s@^#@@;s#=yes#=no#}' /etc/systemd/sleep.conf # 上面俩都不管用,下面这个才管用 apt install -y gnome-tweak-tool gnome-tweaks # 运行后,通用,关闭 "笔记本电脑盖子关闭时挂起" reboot
nat 网络 默认配置,一个桥接网络:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ cat /etc/network/interfaces auto lo iface lo inet loopback iface eno1 inet manual auto vmbr0 iface vmbr0 inet static #hwaddress ether 02:01:02:03:04:08 address 192.168.1.2 netmask 255.255.255.0 gateway 192.168.1.1 bridge_ports eno1 bridge_stp off bridge_fd 0
例如上面是单网口机器,这样 eno1 成为一根线,默认桥接接口 vmbr0
结尾的是 static 所以配置 IP,也可以 dhcp
但是这样管理 pve 就不方便。
我们虚机想不使用桥接到宿主机的同层网络,添加 nat 网络,下面接口名我取为 vmbr1
:
1 2 3 4 5 6 7 8 9 10 auto vmbr1 iface vmbr1 inet static address 192.168.2.1 netmask 255.255.255.0 bridge_ports none bridge_stp off bridge_fd 0 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -t nat -A POSTROUTING -s '192.168.2.0/24' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '192.168.2.0/24' -o vmbr0 -j MASQUERADE
我设置为 nat1
发现 web 上无法编辑以及无法设置虚机到这个网络下,应该是 pve 只纳管 vm
啥开头的接口。nat 用 192.168.2.1/24
是因为桥接网络 192.168.1.1/24
我也要保留着使用
更改默认的web端口 proxmox change the default web port of 8006 搜了一圈全部是扯淡的 iptables 更改端口
8006 是进程 pveproxy bind 的,查该包文件为
1 2 3 4 5 6 7 8 9 $ dpkg -S pveproxy pve-docs: /usr/share/pve-docs/pveproxy.8.html pve-manager: /lib/systemd/system/pveproxy.service pve-manager: /var/log/pveproxy pve-manager: /usr/share/man/man8/pveproxy.8.gz pve-manager: /usr/share/bash-completion/completions/pveproxy pve-manager: /usr/bin/pveproxy pve-manager: /usr/share/perl5/PVE/Service/pveproxy.pm pve-manager: /usr/share/zsh/vendor-completions/_pveproxy
可以看到 8006 是写死在 perl 库文件里的
1 2 $ grep 8006 /usr/share/perl5/PVE/Service/pveproxy.pm my $socket = $self->create_reusable_socket(8006, undef, $family);
备份更改
1 2 3 4 5 6 7 8 9 cp /usr/share/perl5/PVE/Service/pveproxy.pm{,.bak} sed -ri 's#8006#6443#' /usr/share/perl5/PVE/Service/pveproxy.pm # 删掉登录的 banner 端口信息 sed -ri 's#:8006#:6443#' /usr/bin/pvebanner # 重启相关服务 systemctl restart pvebanner pveproxy
摸索了下 perl,发现这个 web 完全是 pve 官方自己 perl5 写的库启动的 web,无法 bind 1024 以下的端口,setcap 和 systemctl 文件里都加过 NET 相关权限还是不行。看了下脚本前台 debug 可以用
暂时不知道如何解决,目前版本是6.1.3
,搜到个改端口的正确姿势但是是以前的老版本,perl 脚本有定义,但是现阶段看了perl脚本完全变了行不通
proxmox 笔记 移动一块盘到另一个机器上 先分离 200 的两个硬盘,参考 https://pve.proxmox.com/wiki/Moving_disk_image_from_one_KVM_machine_to_another
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 $ lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert base-101-disk-0 pve Vri---tz-k 10.00g data data pve twi-aotz-- <350.29g 39.87 2.40 root pve -wi-ao---- 96.00g snap_vm-102-disk-0_a20210429 pve Vri---tz-k 30.00g data vm-102-disk-0 swap pve -wi-ao---- 7.00g vm-100-cloudinit pve Vwi-a-tz-- 4.00m data 9.38 vm-100-disk-0 pve Vwi-a-tz-- 10.00g data base-101-disk-0 15.84 vm-100-disk-1 pve Vwi-a-tz-- 7.00g data 0.17 vm-101-cloudinit pve Vwi-a-tz-- 4.00m data 0.00 vm-102-cloudinit pve Vwi-aotz-- 4.00m data 9.38 vm-102-disk-0 pve Vwi-aotz-- 70.00g data 99.94 vm-102-state-a20210429 pve Vwi-a-tz-- <8.49g data 44.03 vm-103-disk-0 pve Vwi-aotz-- 25.00g data 99.98 vm-104-disk-0 pve Vwi-aotz-- <2.02g data 99.32 vm-105-cloudinit pve Vwi-a-tz-- 4.00m data 9.38 vm-105-disk-0 pve Vwi-a-tz-- 10.00g data 84.57 vm-107-cloudinit pve Vwi-a-tz-- 4.00m data 9.38 vm-107-disk-0 pve Vwi-a-tz-- 10.00g data 85.32 vm-200-disk-0 pve Vwi-a-tz-- <2.02g data 99.31 vm-200-disk-1 pve Vwi-a-tz-- <2.02g data 99.32 $ grep lvm /etc/pve/nodes/pve/qemu-server/200.conf unused0: local-lvm:vm-200-disk-0 unused1: local-lvm:vm-200-disk-1 $ sed '/200-disk-1/d' /etc/pve/nodes/pve/qemu-server/200.conf $ lvrename pve/vm-200-disk-1 pve/vm-104-disk-1 $ echo 'unused1: local-lvm:vm-104-disk-1' >> /etc/pve/nodes/pve/qemu-server/104.conf
export disk 适合从没关联上的两个 pve 之间迁移
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 $ qm config 100 boot: cdn bootdisk: scsi0 cipassword: ********** cores: 1 ide0: local:iso/CentOS-7-x86_64-Minimal-2003.iso,media=cdrom,size=1035M ide2: local-lvm:vm-100-cloudinit,media=cdrom,size=4M ipconfig0: ip=192.168.2.222/24,gw=192.168.2.3 memory: 1024 name: test net0: virtio=32:F4:F5:38:5F:65,bridge=vmbr0,firewall=1 numa: 0 ostype: l26 scsi0: local-lvm:vm-100-disk-0,size=10G scsihw: virtio-scsi-pci smbios1: uuid=d73367d4-efaf-4b82-899a-8199e8c168d8 sockets: 1 virtio1: local-lvm:vm-100-disk-1,size=7G vmgenid: 9450e6bd-0a5d-468d-a760-c1c55abad4df $ pvesm path local-lvm:vm-100-disk-0 /dev/pve/vm-100-disk-0 $ qemu-img convert -O qcow2 -f raw /dev/pve/vm-100-disk-0 OUTPUT.qcow2 # 拷贝到另一个 pve 上后导入存储池 local-lvm $ qm importdisk 200 OUTPUT.qcow2 local-lvm
命令行替代 web 的一些操作 上传 iso 文件,实际上路径就在 /var/lib/vz/template/iso/
api 文档 https://pve.proxmox.com/pve-docs/api-viewer/ 也可以 pvesh [get|post] /xxx/xxx 获取和操作