本文记录下如何在proxmox上创建一个Debian9的kvm虚拟机模版,以及如何使用模式创建KVM虚拟机。
部分安装参考:https://cosmiccat.net/2018/07/368/
(已经过二次踩坑的校验,修正一些不良表述)

介绍下环境
服务器是在LET论坛上看到的,链接

硬件配置

1
2
3
4
5
6
7
Dual Intel Xeon 5420
CPU: 2.5Ghz - 2 Processors (8 Cores / 8 Threads)
Memory: 24GB DDR2 RAM
Storage: 2TB HDD or 120GB SSD ( Can do 2x 1TB HDD if requested in order notes)
Bandwidth: 100Mbit Unmetered
IPs: 5 Usable IPv4 (IPv6 available on request)
Location: West Virginia (USA)

ip信息

1
2
3
4
System IP: x.x.x.218
Usable IP Range: x.x.x.218 - x.x.x.222
Gateway: x.x.x.217
Subnet Mask: 255.255.255.248

母鸡上的网络配置情况:

ps:刚刚去LET看offers的时候,看到一个同价格配置好点的,vpsrus

按35刀/月的来看
配置如下

1
2
3
4
5
6
Single Xeon X5680 6/12 cores 3.33/3.60 GHz - $ 35.00/m free setup
24GB RAM
1 X 256 GB SSD
10TB BW @ 1Gbs port
/29 IPV4 block
/64 IPV6

比dedispec好太多,6/12 意思是 6核心/12线程,/29 block 有5个可用ip,256G ssd,1G的带宽口(不过肯定是共享
楼主提供的测试ip

1
North Carolina Test IPv4: 199.255.156.6

虽然和dedispec一样,国内去程都是163线路(163线路的辨别),但是vpsrus的延迟稍好点(快了10ms
affyun上关于vpsrus的历史评测

下载系统镜像

为了减小模版,我下载的是debian9的最简镜像
对于Debian系列,最简不叫minimal,而叫netinst(网络安装版)
CentOS系列,最简系统是叫minimal
debian9 64位(291M):
https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.5.0-amd64-netinst.iso
debian8 64位:
http://cdimage.debian.org/debian-cd/8.1.0/amd64/iso-cd/debian-8.1.0-amd64-netinst.iso
full image(3.4G):
https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/debian-9.5.0-amd64-DVD-1.iso

你可以自行选择下载的镜像,下载到母鸡的/var/lib/vz/template/iso路径中即可。
我创建的模版是基于netinst的:

1
2
cd /var/lib/vz/template/iso/
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.5.0-amd64-netinst.iso

创建VM

我们需要先创建一个VM,然后将其转换成模版。
访问proxmox网页管理端:
https://[console-ip]:8006

右上角,点击创建VM,这个是创建KVM
(另一个,创建CT,就是OPENVZ

填写虚拟机名字,我这里就填的debian9-template

系统,在local中选择iso镜像文件

硬盘,给个3G吧(如果填2G会安装时会提示空间不够

CPU,随便给

内存,给个4G吧

网络(桥接vmbr0即可
网络的配置有点像在PC机上使用VMware/Virtualbox 桥接那样
通过母鸡(宿主机)上已有的网卡获取同网段的IP

确认

添加cloud-init


启动VM,就和平常安装一样的
语言位置默认


自动探测网络


这里坑了我一天,这里要取消掉自动探测,点两下返回,选择手动配置网络

填上ip


子网掩码

网关

DNS服务器(我是cf的脑残粉

主机名和域名就随便配置了(如果上一步网络设置成功的话,这里hostnamedomain name应该会是上游路由器的名字)
主机名:我改成debian顺眼点
域名:为空


系统提示要创建用户,随便创建个,克隆的时候可以用cloud-init初始化的

硬盘这步要手动配置,选最后一个,为了克隆模版开小鸡的时候,系统根据硬盘空间自动扩展分区大小,分成不带LVM的单分区。

这里选中硬盘,点继续(continue)

这里是问你要不要创建新的分区表到这个硬盘,因为你选择的是一整块硬盘。选是,然后继续

来到这个界面,需要创建分区,选中硬盘下面的那块free space空间,继续

创建新分区

输入分区大小,默认,直接下一步

主分区,默认,下一步

来到这个页面,需要双击可启动标志位(bootable flag)

使其变为on,然后选择done setting up the partition,之后点下一步

硬盘分区方案好了,准备按照这个方案写磁盘,选finish partitioning and write changes to disk,然后下一步

这里会问你,你的方案没有创建swap分区,是否要返回分区界面,选no,模版不需要swap

确认是否写入磁盘,选是,下一步,就会开始格式化磁盘了(emmm 有些人说他们装个系统,怎么点了下一步又跳回去了,你不看清楚选项,我有什么办法呢

是否要扫描其他的光盘(因为debian的完整安装盘是有3张,第一张是基础系统,后面两张是软件包,这时候你可以换上其他的光盘继续离线安装软件包
但是这里我们不需要,选否

配置包管理工具(apt),根据位置地区来选择最近的软件源
这是需要网络的,之前配置的网络,在这个步骤就可以检验是否配置成功了
(当然你也可以选择不使用网络镜像, 这样的话就没法安装ssh的模块,安装好了后默认情况下是无法使用ssh连接,除非你另外安装ssh

是否参与最受欢迎的软件的调查,不参加

软件包配置,选上ssh和系统工具包吧(因为安装是最精简的系统,为了满足需求,建议安装的软件包

是否安装grub,选是

这样就安装完成了

网络配置

安装完成后,检查有没有问题,可以根据自己的需要安装一些额外的软件包

我发现没网,因为系统网卡接口自动配置的ipv6。
查看/sys/class/net/,只有两个网络接口:

1
ens18 lo

只有把ens18改成ipv4的接口

配置可以参考:
https://blog.csdn.net/u012268339/article/details/66472386
https://blog.csdn.net/u011077672/article/details/71123319

debian的网络配置文件是 /etc/network/interfaces
我的情况是,单网卡,多ip,似乎不支持DHCP,所以静态配置如下:


注意一下:
1
auto ens18

可能默认是allow-hotplug,已经亲测,不改是无法连上网络的

另外,如果存在/etc/resolv.conf文件,系统会使用这个文件中的DNS服务器,网络配置文件中的DNS服务器可能不会生效
所以最好是在安装的时候,就把网络这些配置好,要不然还要配置ssh server,非常麻烦

重启网卡

1
/etc/init.d/networking restart

安装需要的软件包

1
2
apt update
apt install htop vim net-tools git

cloud-init

(抱歉我鸽了!!!傻逼cloud-init文档真的看不懂..请跳过本部分)

从模版克隆KVM小鸡的时候,需要使用cloud-init对新的服务器进行初始化,比如:ssh key,用户名和密码,网络(貌似需要上游路由器支持dhcp),磁盘大小

红帽系(centos,fedora等):

1
yum install cloud-init cloud-utils

如果是centos6的话还要加上

1
yum install -y cloud-utils-growpart

Debian系(ubuntu):

1
apt install cloud-init cloud-utils

修改cloud-init配置,一般是在这个位置/etc/cloud/cloud.cfg
开始的:

1
2
disable_root: 0
ssh_pwauth: 1

dsmode

经过两次踩坑验证,确认是cloud-init的配置存在问题:

  1. ip没有正确分配(毕竟没有去设置,谁知道你是dhcp还是静态,网卡名是啥。。)
  2. 用户账号ssh使用密码无法登陆,但是使用公钥可以登陆,进入系统后查看sshd_config是允许了root可以密码登陆

克隆的小鸡开机后,cloud-init会自动在/etc/network/interfaces.d/生成50-cloud-init.cfg配置文件,而且配置网卡名为eth0,但是我的机器网卡名是ens18,导致没有生效,并且还会出错,因为重启网卡的时候,会报错ifup找不到这个设备。

cloud-init的具体用法,参见文档:https://cloudinit.readthedocs.io/en/latest/index.html
样例可以查看:https://cloudinit.readthedocs.io/en/latest/topics/examples.html?highlight=default_user

但是不得不说,cloud-init的文档写的跟shit一样,我觉得用readthedocs来作的文档都很丑,另一个例子是telethon,gitbooks的文档就很好看。
不过我搜到一份gist,gist作者也在readme中吐槽了cloud-init的狗屎文档,因为他没有在任何地方提到dsmode需要指定为local

那么什么是dsmode呢?
dsmode = datasource mode 数据源的模式

可选参数:

  • net(默认是这个)
    cloud-init初始化的时候会从gateway(或者其他某台指定的机器)去拉取这台正在初始化的机器的metadata(元数据)。
    比如阿里云的可以从http://100.100.100.200/拉取,具体url的endpoint可以查看文档
  • local
    即读取本地的配置文件定义的metadata

所以我们在cloud-init的配置文件/etc/cloud/cloud.cfg中添加:

1
dsmode: local

网络配置

参考:https://cloudinit.readthedocs.io/en/latest/topics/network-config-format-v1.html#subnet-ip
网络的配置文件:
/etc/cloud/cloud.cfg.d/custom-networking.cfg
静态配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
network:
version: 1
config:
- type: physical
name: ens18
subnets:
- type: static
address: 192.168.23.14/26
gateway: 192.168.23.1
dns_nameservers:
- 1.1.1.1
- 8.8.8.8

用户配置

配置如下:

1
2
3
4
5
#cloud-config
chpasswd:
list: |
root:password
expire: False

plain_text_passwd: ‘ubuntu’?

清空系统记录

1
2
3
4
5
6
7
8
9
apt clean all
rm -f /etc/ssh/ssh_host_*
rm -rf /root/.ssh/
rm -f /root/anaconda-ks.cfg
rm -f /root/.bash_history
unset HISTFILE
rm -rf /var/mail/*
rm -f /etc/udev/rules/70-persistent-*-rules
rm -f /var/lib/dhcp/dh*.leases*

因为安装debian时,安装过程要求我们创建的用户,这时要删掉:

1
userdel -r [username]

-r,删除用户的家目录

完了后,poweroff手动关机

转换模版

到web管理界面,右键刚刚关机的VM,转换成模版即可。

克隆小鸡

右键刚刚生成的模版,点clone,会问你创建链接克隆(linked clone)还是全量克隆(full clone)
区别:

  • 链接克隆(linked clone)
    克隆出的系统必须依赖于原始系统,如果原始系统出现任何问题,克隆出的系统也会出问题
  • 全量克隆(full clone)
    指克隆出的系统和原始系统一模一样,可以独立运行。

选择full clone吧。
根据需要,调整一些系统信息:
cloud-init里面设置用户密码、ssh key、网络信息


cidr用的/26,表示子网掩码是255.255.255.192
硬件里面修改硬盘大小、内存、CPU,注意硬盘大小设置的是增量大小,也就是说只能增加,不能减少。

之后开机就行了。
控制台(VNC)可以看到cloud-init的初始化过程。
我截到了一张初始化ssh key的过程图(打码的部分刚好是个meoww哦,不知道你们能不能看出来鸭~

ssh连上去后,查看硬盘分区情况,初始化是成功生效了的

但是不知道为什么,如果用密码登陆就是不正确,可能是模版的/etc/sshd/sshd_config设置有问题。(二次确认)
而且cloud-init设置的ip没有生效。

模版备份

可以通过备份,将kvm虚拟机导出成文件,方便迁移和恢复。
步骤:虚拟机 - 备份,备份模式建议按下图选择, 然后点备份按钮

生成的vma.gz文件位置:
/var/lib/vz/dump/
命名规则:
vzdump-qemu-{vmid}-{year_month_day_hour_minute_second}.vma.gz
比如:
vzdump-qemu-100-2018_10_10-23_22_33.vma.gz

(完)

ps:我觉得我可能回去买vpsrus那台独服,没准可以练习下如何创建proxmox跨机房的集群。(默默地看了下钱包