Files
pve_toss_notes/4.PVE制作虚拟机模板.md
T

459 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 0.前期准备
将虚拟机制作成模板,可以在后续新建虚拟机时快速从模板中创建,减少系统安装配置时间。
本文将使用 Debian 的云镜像 `debian-11-genericcloud-amd64.qcow2` 作为虚拟机模板镜像。
访问 [Debian Official Cloud Images](https://cloud.debian.org/images/cloud/) 官方网站,下载最新版 `Bullseye` 云镜像以及对应的校验文件:
![下载镜像](img/Template/download_genericcloud_image_qcow2.png)
该虚拟机模板主要作为内网 DNS 服务器使用,并会安装 Adguard Home 。
## 1.创建虚拟机
### 1.1.常规
登录到 PVE 后台后,进入新建虚拟机流程,并勾选底部 “高级” ,打开虚拟机创建页面的高级选项。
节点即本机,`VM ID``名称` 可以自由定义。
![虚拟机名称](img/Template/vm_id.png)
### 1.2.操作系统
无需使用任何安装介质。
操作系统类别选择 `Linux` 、版本选择 `5.x - 2.6 Kernel` 即可。
![虚拟机操作系统](img/Template/vm_os.png)
### 1.3.系统
系统部分需要修改一些内容,以满足 Debian 使用 `UEFI` 启动需求。
显卡使用 `SPICE` ,机型使用 `q35` SCSI 控制器选择 `VirtIO SCSI single` ,勾选 `Qemu代理` 选项。
在固件处需要针对 `UEFI` 进行调整,BIOS 选择 `OVMF (UEFI)` ,勾选 `添加EFI磁盘` EFI 存储选择 `local-lvm`
![虚拟机系统](img/Template/vm_system.png)
### 1.4.磁盘
一般情况下,如果该虚拟机仅为 ADH 服务器,`16G` 的磁盘空间足够使用。
由于使用 Cloud Image 制作虚拟机模板,此处删除所有磁盘:
![虚拟机磁盘](img/Template/vm_hd.png)
### 1.5.CPU
CPU类别选择 `host` ,核心根据物理 CPU 核心数进行酌情设置,推荐启用 `NUMA`
![虚拟机CPU](img/Template/vm_cpu.png)
### 1.6.内存
内存一般 2G 足够使用,关闭 `Ballooning` 设备选项:
![虚拟机内存](img/Template/vm_mem.png)
### 1.7.网络
在 PVE 的 [网络设置](./1.PVE初始化配置.md#3配置-pve-网桥和管理网口) 中,曾创建了一个没有桥接任何物理网口的内部网桥。
并且该网桥接口为主路由 RouterOS 的 LAN 的成员接口。
因此 Debian 虚拟机的网络设备选择该内部网桥即可,演示环境为 `vmbr4`
![虚拟机网口](img/Template/vm_network_port.png)
取消网口的 `防火墙` ,并根据虚拟机 vCPU 数,指定 `Multiqueue` 的数量,演示环境为 `2`
![虚拟机网卡多队列](img/Template/vm_network_queue.png)
### 1.8.确认
接下来查看设置总览,确认无误,即可点击 “完成” :
![虚拟机确认](img/Template/vm_confirm.png)
## 2.调整虚拟机硬件参数
### 2.1.删除虚拟机光驱
此时,查看虚拟机详情页,可以看到我们刚才创建的 Debian 虚拟机,删除 `CD/DVD驱动器`
![虚拟机删除光驱](img/Template/vm_delete_cd.png)
### 2.2.虚拟机导入磁盘镜像
使用 SSH 工具登录 PVE 服务器,并进入 `tmp` 目录,创建一个文件夹:
```bash
# 进入 tmp 目录
cd /tmp
# 创建文件夹
mkdir Debian
# 进入文件夹
cd Debian
```
将 Debian 云镜像 `debian-11-genericcloud-amd64.qcow2` 上传到该文件夹中,并检查 `hash`
```bash
# 检查文件是否存在
ls -la
# 计算文件 hash
sha512sum debian-11-genericcloud-amd64.qcow2
```
确认无误后,将 Debian 云镜像导入刚才创建的虚拟机中,命令中的 `VM ID` 需要根据实际情况替换,演示为 `1000`
```bash
# 将 qcow2 镜像导入虚拟机中
qm importdisk 1000 debian-11-genericcloud-amd64.qcow2 local-lvm
# 输出结果为以下类似内容表示成功
Successfully imported disk as 'unused0:local-lvm:vm-1000-disk-1'
```
![虚拟机新磁盘](img/Template/vm_unused_hd.png)
鼠标 **双击** 该未使用的磁盘,勾选 `IO thread` ,点击添加按钮:
![虚拟机使用该磁盘](img/Template/vm_enable_hd.png)
刚导入的磁盘只有 `2G` 磁盘空间,为了后续方便使用,先给磁盘扩容 `16G` 的磁盘空间。
鼠标 **单击** 选中该磁盘,选择页面顶部 `Disk Action` 菜单的子菜单 `Resize`
![虚拟机磁盘扩容](img/Template/vm_hd_resize.png)
在弹出的对话框中,给该磁盘增加 `16G` 磁盘空间:
![虚拟机磁盘增加16G](img/Template/vm_hd_16g.png)
### 2.3.虚拟机添加CloudInit设备
为了能够正确使用 Cloud-Init 初始化系统,需要给 Debian 虚拟机添加 `CloudInit设备`
点击顶部 `添加` 按钮,选择 `CloudInit设备`
![虚拟机添加ci](img/Template/vm_cloudinit.png)
`总线/设备` 选择 `SCSI` ,编号为 `1` ,存储选择 `local-lvm`
![虚拟机ci参数](img/Template/vm_ci_details.png)
### 2.4.虚拟机添加串行端口
有些云镜像需要用到 `serial` 端口作为视频输出端口,不然虚拟机无法启动,因此给 Debian 虚拟机添加串行端口。
点击顶部 `添加` 按钮,选择 `串行端口`
![虚拟机添加串口](img/Template/vm_serial.png)
串行端口编号为 `0`
![虚拟机串口参数](img/Template/vm_serial_details.png)
虚拟机硬件设备修改完成后,如下图所示:
![虚拟机全部硬件](img/Template/vm_hardware_all.png)
## 3.调整虚拟机配置参数
进入左侧虚拟机 `选项` 菜单,可以看到当前虚拟机的配置参数。
通常情况下,Debian 虚拟机的配置参数需要修改以下几个:
1. 开机自启动(模板无需修改,克隆的虚拟机需要修改)
2. 启动/关机顺序(模板无需修改,克隆的虚拟机需要修改)
3. 引导顺序(仅模板需要修改)
4. 使用平板指针(仅模板需要修改)
### 3.1.修改引导顺序
鼠标 **双击** `引导顺序` 选项,进入编辑界面。
`scsi0` 设备处,勾选前面的 “已启用” 复选框,并使用行首的排序功能,将该设备拖拽到第一个。
然后点击 `OK` 按钮:
![虚拟机引导顺序](img/Template/vm_boot.png)
### 3.2.修改平板指针设置
关闭 `使用平板指针` 选项,可以一定程度上降低虚拟机的 CPU 使用率。
![虚拟机平板指针](img/Template/vm_tablet.png)
## 4.设置Cloud-Init
进入左侧虚拟机 `Cloud-Init` 菜单,可以看到当前虚拟机的初始化参数。
根据之前的网络规划,内网的 IP 地址段为 `172.16.1.0/24` ,因此 Debian 虚拟机模板的参数如下:
|参数|值|说明|
|--|--|--|
|用户|fox|新系统的管理员账户|
|密码|********|使用强密码|
|DNS域|fox.lab|内网域名(可选)|
|DNS服务器|`172.16.1.1 127.0.0.1`|本机DNS服务器,用空格隔开|
|SSH公钥|无|使用秘钥登录服务器,暂不使用|
|IP配置(net0)|`ip=172.16.1.240/24,gw=172.16.1.1`|模板的 IP 设置|
**说明:**
修改 `Cloud-Init` 参数时,需要在虚拟机关机情况下修改才会生效。
`DNS服务器` 设置部分,如果先设置了 `127.0.0.1` 作为虚拟机 DNS 服务器,后续其他 DNS 的 IP 地址将被虚拟机忽略。
此时内网没有其他 DNS 服务器存在,因此 `DNS服务器` 先设置为 `172.16.1.1 127.0.0.1` IP 之间用空格隔开。
在使用 Debian 模板克隆出新虚拟机之后,再对新虚拟机调整 IP 设置比较好。
`Cloud-Init``IP配置` ,如下图所示:
![CI网络配置](img/Template/vm_ci_network.png)
## 5.配置Debian系统
此时可以将 Debian 虚拟机开机,并使用 `Cloud-Init` 中设置的账号密码进行登录。
### 5.1.启用SSH密码登录
因为 Debian 的云镜像默认使用秘钥登录,因此切换到左侧菜单的 `控制台` 进行操作:
![登录Debian操作系统](img/Template/os_login.png)
在 Debian 服务器的命令行界面,使用 `nano` 编辑器编辑 `sshd` 服务的配置文件,使用以下命令:
```bash
## 编辑 ssh 配置文件
sudo nano /etc/ssh/sshd_config.d/fox_sshd.conf
```
在编辑器对话框中输入以下内容,注意命令中间的空格:
```bash
PasswordAuthentication yes
PermitEmptyPasswords no
```
`nano` 编辑器常用操作方法有:
- 在编辑文件时,可以用键盘 `方向键` 移动光标位置
- 在保存文件时,按下键盘 `ctrl 和 x` 组合键,再按下键盘 `y` 键,即可保存
然后,重启 SSH 服务:
```bash
## 重启 sshd
sudo systemctl restart ssh.service
```
就可以像往常一样,通过 SSH 工具远程访问 Debian 虚拟机了。
### 5.2.配置系统软件源
使用 SSH 工具登录 Debian 虚拟机,常用 SSH 工具可以看之前的文章中的 [SSH 工具推荐](./0.PVE系统安装.md#03ssh工具) 。
首先需要对 Debian 系统的软件源进行修改,这里使用 USTC 的软件源。
如果以后系统版本发生变化,参考使用 snullp 大叔开发的 [配置生成器](https://mirrors.ustc.edu.cn/repogen/) 。
逐条执行以下命令:
```bash
## 进入系统源配置文件目录
cd /etc/apt/
## 备份旧的系统源配置文件
sudo mv sources.list sources.list.bak
## 创建新的系统源配置文件
sudo nano sources.list
```
`nano` 编辑器对话框中输入以下内容(注释了 `deb-src` 以便加快软件源同步速度),并保存:
```bash
deb https://mirrors.ustc.edu.cn/debian/ bullseye main contrib non-free
# deb-src https://mirrors.ustc.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.ustc.edu.cn/debian/ bullseye-updates main contrib non-free
# deb-src https://mirrors.ustc.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib non-free
# deb-src https://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.ustc.edu.cn/debian-security/ bullseye-security main contrib non-free
# deb-src https://mirrors.ustc.edu.cn/debian-security/ bullseye-security main contrib non-free
```
更新软件源的同步内容,并更新系统,逐条执行以下命令:
```bash
## 清理不必要的包
sudo apt clean && sudo apt autoclean && sudo apt autoremove --purge
## 更新软件源
sudo apt update
## 更新系统
sudo apt dist-upgrade
```
接下来安装系统必要软件,Adguard Home 将采用 `snap` 形式安装,逐条执行以下命令:
```bash
## 安装系统软件
sudo apt install qemu-guest-agent zsh git curl htop lm-sensors fail2ban vim tmux unattended-upgrades apt-listchanges powermgmt-base
## 安装网络工具
sudo apt install iperf iperf3 iftop lsof dnsutils
## 安装 snap
sudo apt install snapd
## 安装 Adguard Home
sudo snap install adguard-home
```
Adguard Home 安装完成后,先停止其服务:
```bash
## 停止 Adguard Home
sudo snap stop adguard-home
```
### 5.3.配置系统网卡
使用 `Cloud-Init` 并给虚拟机分配了 IP 地址后,虚拟机的网卡还会从路由器的 DHCP 再获取一个 IP 地址。
这个功能在给虚拟机添加网卡设备时很有用,但本 Debian 虚拟机模板的使用场景只需要一个静态 IP 地址,因此需要禁用网卡自动获取 IP 地址的功能。
执行以下命令对网卡的配置文件进行修改:
```bash
## 修改 Debian 网卡配置文件
sudo nano /etc/network/interfaces
```
`nano` 编辑器对话框中,将 `source-directory /run/network/interfaces.d` 这行内容 “注释” 掉,参考如下内容:
```bash
## 网卡配置文件示例
# Cloud images dynamically generate config fragments for newly
# attached interfaces. See /etc/udev/rules.d/75-cloud-ifupdown.rules
# and /etc/network/cloud-ifupdown-helper. Dynamically generated
# configuration fragments are stored in /run:
# source-directory /run/network/interfaces.d ## 在这行前面增加注释符 # 来注释
```
将配置保存,可将系统重启。
在系统重启完成后,使用以下命令检查系统的 IP 地址状态:
```bash
## 检查系统 IP 地址状态
ip a
```
如果系统网卡有且仅有一个 IP 地址,且该 IP 地址与 `Cloud-Init` 中设置的 IP 地址相同,则表示系统网卡已正确设置。
### 5.4.调整系统内核参数
由于该 Debian 虚拟机模板将用于克隆内网 DNS 服务器,因此需要调整一部分系统内核参数来简单优化性能。
执行以下命令对 `sysctl` 的配置文件进行修改:
```bash
## 调整系统内核参数
sudo nano /etc/sysctl.conf
```
在配置文件末尾输入以下内容,注意命令中间的空格:
```bash
net.core.default_qdisc = fq_codel
net.ipv4.tcp_congestion_control = bbr
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv4.tcp_fastopen = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_notsent_lowat = 131072
net.ipv4.tcp_ecn = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_dsack = 1
net.ipv4.icmp_ratelimit = 50
```
保存该配置文件后,重启系统或者使用以下命令让配置生效:
```bash
## 让内核参数生效
sudo sysctl -f
```
### 5.5.调整系统时间
默认情况下的 Debian 云镜像的系统时间可能不正确,使用以下命令将系统时区设置为中国时区:
```bash
## 设置系统时区
sudo timedatectl set-timezone Asia/Shanghai
```
设置完成后,使用以下命令检查系统时间:
```bash
date -R
```
Debian 普通镜像常用 `systemd-timesyncd.service` 来同步时间,而 Debian 云镜像使用 `chrony.service` 来同步时间。
为了使用国内的 NTP 服务器,需要对 `chrony.service` 进行配置。
执行以下命令对 `chrony` 的配置文件进行修改:
```bash
## 编辑 chrony 配置文件
sudo nano /etc/chrony/chrony.conf
```
在编辑器对话框中,将 `pool 2.debian.pool.ntp.org iburst` 这行内容 “注释” 掉,并添加国内的 NTP 服务器,参考如下内容:
```bash
## chrony 服务配置文件示例
# Use Debian vendor zone.
# pool 2.debian.pool.ntp.org iburst ## 在这行前面增加注释符 # 来注释
# Use Custom vendor zone.
pool ntp.tencent.com iburst
pool ntp.aliyun.com iburst
```
保存该配置文件后,重启 `chrony` 服务:
```bash
## 重启 chrony 服务
sudo systemctl restart chrony.service
```
再检查系统 NTP 服务器是否被正确修改:
```bash
## 检查系统 NTP 服务器
chronyc sources -V
```