zhangguanzhang's Blog

proxmox里使用cloud-init和一些笔记

字数统计: 2.8k阅读时长: 14 min
2019/01/22

cloud-init的镜像模板制作

模板制作

记录下proxmox制作带有 cloud-init 的虚机模板过程
因为刚开始制作虚机模板的硬盘是固定大小,后面通过克隆后调整硬盘大小就会自动 growpart ,需要安装 cloud-utils-growpart。好像只能往大的扩,我个人也倾向于最小 20G,所以这里我开的是20G硬盘的虚机
另外查了下和实际试了下 cloud-utils-growpart 好像只支持 ext3ext4 不支持 lvm 自动扩,其他的文件系统可以考虑试试 lvm 自己写个脚本去开机启动自动扩。这里我分区不带 swap,标准分区+ext4
1
安装完后进系统里自行配制好网卡(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

转换模板

记住 vmid ,在虚机所在的 pve 后台 ssh 上执行下面命令,我这是本地的 lvm 去存储 cloud-initmetadata

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这部分不再是灰色了
2
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 可以用

1
pveproxy start --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 获取和操作

CATALOG
  1. 1. cloud-init的镜像模板制作
    1. 1.1. 模板制作
    2. 1.2. 转换模板
  2. 2. proxmox 的一些 openstack 角度笔记
    1. 2.1. 解开硬盘
  3. 3. 安装完proxmox的一些设置
    1. 3.1. nat 网络
    2. 3.2. 更改默认的web端口 proxmox change the default web port of 8006
  4. 4. proxmox 笔记
    1. 4.1. 移动一块盘到另一个机器上
    2. 4.2. export disk
    3. 4.3. 命令行替代 web 的一些操作