本文基于Proxmox Virtual Environment 7.4

1、镜像写入

使用的工具是UltraISO

写入方式选择RAW

2、换源

使用清华源

① 软件源

1
sed -i 's|http://ftp.debian.org/debian|https://mirrors.tuna.tsinghua.edu.cn/debian/|g' /etc/apt/sources.list

② CT Templates

备份源文件

1
cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back

换源

1
sed -i 's|http://download.proxmox.com|https://mirrors.tuna.tsinghua.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm

生效

1
systemctl restart pvedaemon.service

③ 禁用企业源

1
sed -i 's|deb https://enterprise.proxmox.com/debian/pve|# deb https://enterprise.proxmox.com/debian/pve|g' /etc/apt/sources.list.d/pve-enterprise.list

3、去除订阅弹窗

备份原文件以 .backup 结尾并修改原文件

1
sed -i.backup -z "s/res === null || res === undefined || \!res || res\n\t\t\t.data.status.toLowerCase() \!== 'active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js

重启服务

1
systemctl restart pveproxy.service

4、配置无线

① 设置无线

我的网卡是 Intel® Dual Band Wireless-AC 3165,进入系统默认就能看到我的无线设备接口: wlo1,驱动已经有了

1
ip link show

安装以下包

1
apt install wireless-tools wpasupplicant

设置无线密码

1
vim /etc/wpa_supplicant/wpa_supplicant.conf

内容如下,可以配置多个 ssid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ctrl_interface=/run/wpa_supplicant
update_config=1

network={
ssid="<无线名称1>"
psk="<无线密码1>"
# 优先级,数字大的优先级高
priority=10
}

network={
ssid="<无线名称2>"
psk="<无线密码2>"
# 优先级,数字大的优先级高
priority=9
}

如果只是想使用无线访问管理后台,编辑配置文件 /etc/network/interfaces

增加以下配置

1
2
3
auto wlo1
iface wlo1 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

重载配置即可

1
ifreload -a

② 配置无线nat规则

如果希望既可以通过有线网络为虚拟机分配ip,又可以通过无线网络为虚拟机分配ip,则需要加入以下配置(无线下使用的是nat)

设置 nftables

1
vim /etc/nftables.conf

末尾加入nat转换规则,将内网的IP地址转换为外网IP地址

1
2
3
4
5
table ip nat {
chain postrouting {
type nat hook postrouting priority 0; policy accept; masquerade
}
}

启用 nftables 服务

1
2
systemctl enable nftables.service
systemctl start nftables.service

编辑配置文件 /etc/network/interfaces

以下是我原来的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
auto lo
iface lo inet loopback

iface enp2s0 inet manual

auto vmbr0
iface vmbr0 inet static
address 192.168.2.2/24
gateway 192.168.2.1
bridge-ports enp2s0
bridge-stp off
bridge-fd 0

iface wlo1 inet manual

修改以后

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
auto lo
iface lo inet loopback

iface enp2s0 inet manual

auto vmbr0
iface vmbr0 inet static
address 192.168.2.2/24
gateway 192.168.2.1
bridge-ports enp2s0
bridge-stp off
bridge-fd 0

#下面是变动部分

auto wlo1
iface wlo1 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

auto vmbr1
iface vmbr1 inet static
address 10.1.1.1/24
bridge-ports none
bridge_stp off
bridge_fd 0
# 启用ip转发
post-up echo 1 > /proc/sys/net/ipv4/ip_forward

重载网络

1
ifreload -a

再补充一点,上面的配置是有线无线可以同时使用,但是如果只使用无线,断开有线,PVE有IP地址但是无法访问,我的解决方案是修改vmbr0,改为DHCP上网

1
2
3
4
5
auto vmbr0
iface vmbr0 inet dhcp
bridge-ports enp2s0
bridge-stp off
bridge-fd 0

参考图(网卡要全部设置为自动启动)

5、创建虚拟机

① 网络

创建虚拟机的时候,如果使用无线网络,需要注意以下网络配置,手动配置ip地址,网关为 10.1.1.1


如果其它设备想直接访问 PVE 内部的虚拟机,比如说通过10.1.1.1,10.1.1.2等直接访问宿主机和各个虚拟机(以下同样是关于无线网络部分的补充)

在家里路由器上新增一条静态路由规则

  • 目的网络地址:10.1.1.0
  • 子网掩码:255.255.255.0
  • 网关地址:192.168.2.41

其中网关地址:192.168.2.41 为PVE宿主机通过无线,在路由器获取的ip

目的网络地址为上面自行设置的网段:10.1.1.0/24

之后就可以通过10.1.1.1,10.1.1.2等直接访问宿主机和各个虚拟机了

补充一点

上面的访问服务方式是通过内网IP+端口访问服务,比如:10.1.1.2:8080 ,如果通过PVE宿主机的IP,192.168.2.41:8080 则无法访问服务。

如果有公网IP地址,希望可以实现外网访问,可以在PVE宿主机加入以下nat转换规则

将通过wlo1网卡的tcp流量,访问8080端口转发到10.1.1.2,这样通过 192.168.2.41:8080 一样也可以访问虚拟机内的服务了(重启失效)

1
iptables -t nat -A PREROUTING -i wlo1 -p tcp --dport 8080 -j DNAT --to-destination 10.1.1.2

② Docker

如果LXC容器需要安装使用docker,只需要保证创建虚拟机的时候勾选了无特权的容器,开启了嵌套即可。(默认就是这样,不需要其它改动)

6、启用 IOMMU

未启用,需要手动开启(BIOS已经开启了VT-D)

Intel CPU,使用GRUB引导(默认),执行以下命令(加入了开启PT模式)

1
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"/g' /etc/default/grub

更新 grub

1
update-grub

查看 /etc/modules 下是否有以下模块,没有则添加

1
2
3
4
vfio 
vfio_iommu_type1
vfio_pci
vfio_virqfd

更改任何相关模块后,需要刷新 initramfs

1
update-initramfs -u -k all

重启系统验证 IOMMU 是否已启用

1
dmesg | grep IOMMU

root@pve:~# dmesg | grep IOMMU
[ 0.039715] DMAR: IOMMU enabled

7、一些额外补充

① 调整CPU的运行模式

1
apt install cpufrequtils

通过输入命令 cpufreq-info,在输出的最后可以看到CPU当前的运行模式,频率的范围,当前的CPU频率

current policy: frequency should be within 800 MHz and 2.50 GHz.
The governor “ondemand” may decide which speed to use
within this range.
current CPU frequency is 844 MHz.

通过输入命令

1
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

查看可选的CPU模式

通过输入命令

1
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

查看当前的调节器

可选的CPU模式

  • conservative:这种模式类似于ondemand模式,但是它会对CPU频率进行相对缓慢的调整,以达到更平滑的性能和更长的电池寿命。Google官方内核,kang内核默认模式。
  • ondemand:这是系统默认的模式,它根据CPU的负载情况来动态地调整频率。在CPU负载较高时,频率会升高以提供更好的性能,而在CPU负载较低时,频率会降低以节省能源。一般官方内核默认的方式都是Ondemand。
  • userspace:这种模式将变频策略的决策权交给用户态应用程序,这样用户可以根据自己的需求自定义CPU频率。
  • powersave:这是一种省电模式,CPU通常以最低频率运行,以节省电能。这种模式适用于电池电量较低或需要长时间使用电池的场景。
  • performance:这是一种性能模式,CPU会一直运行在最高频率,不考虑电量消耗。这种模式适用于需要最高性能的场景,如游戏或视频编辑等。
  • schedutil:这是一个新的交互模式,它被认为是interactive模式的升级版。它可以根据负载情况和其他因素来自动调整CPU频率,以达到更好的性能和更长的电池寿命。

修改文件 /etc/init.d/cpufrequtils,大约在43行位置

ENABLE=”true”
GOVERNOR=”ondemand”
MAX_SPEED=”0”
MIN_SPEED=”0”

重启服务

1
2
systemctl daemon-reload
/etc/init.d/cpufrequtils restart

将默认的 ondemand 改为了 conservative ,实测功耗并没有什么变化,但是调度很慢,我觉得用作软路由的话不推荐这个模式。

② 无特权的容器映射目录

因为创建docker时候使用的是无特权的容器,在宿主机使用命令

创建一个 mp0 的挂载点,将宿主机内的/mnt/share/ 目录映射到LXC容器中的/share 目录

1
pct set 100 -mp0 /mnt/share/,mp=/share

会出现LXC容器中映射出来的目录都被映射到 nobody(uid=65534),在容器内没有修改这个目录的权限

root@ubuntu:~# ls -ld /share/
drwxr-xr-x 3 nobody nogroup 4096 Mar 29 03:42 /share/

这里可以参考PVE官方文档:Using local directory bind mount points,将容器内的用户和组ID,需要映射到主机上的ID

通过查看宿主机root的默认从属用户

1
cat /etc/subgid

root@pve:~# cat /etc/subgid
root:100000:65536

可以看到root的默认从属用户起始id为100000,数量65536个

默认lxc容器内root(id=0)映射为宿主机的 id 100000,递增65536个,即LXC容器内用户id 0-65535对应服务器100000-165535

root@ubuntu:~# id
uid=0(root) gid=0(root) groups=0(root)

开始修改

在宿主机上修改LXC容器配置文件

1
vim /etc/pve/lxc/100.conf

加入以下映射

1
2
3
4
5
6
7
8
9
# 将lxc容器中 id 0到1005 映射为宿主机 id 100000到101005
lxc.idmap: u 0 100000 1005
lxc.idmap: g 0 100000 1005
# 将lxc容器中 id 1005 映射为宿主机 id 1005 的实体用户
lxc.idmap: u 1005 1005 1
lxc.idmap: g 1005 1005 1
# 将lxc容器中 id 1006到65535 映射为宿主机 id 101006到165535
lxc.idmap: u 1006 101006 64530
lxc.idmap: g 1006 101006 64530

因为 LXC 是使用 root 用户创建的 CT,需要修改宿主机的/etc/subuid/etc/subgid,将宿主机上的UID 1005映射到容器内的UID 0,并允许root用户在容器内使用该UID

在宿主机上执行命令

1
2
bash -c 'echo "root:1005:1" >> /etc/subuid'
bash -c 'echo "root:1005:1" >> /etc/subgid'

最后,修改宿主机上绑定挂载点目录的所有者,以匹配LXC容器可访问的 uid 和 gid:

1
chown -R 1005:1005 /mnt/share

重启容器,再次查看

root@ubuntu:~# ls -ld /share/
drwxr-xr-x 4 1005 1005 4096 Mar 29 04:27 /share/

③ 网卡驱动

我的有线网卡是8111,默认安装的驱动是 r8169 的驱动,可以通过命令查看

有说默认驱动的性能不行,如果有需要的话可以试试

1
lspci -knn | grep -A 3 Ethernet

如果想将驱动从 r8169 更改为 r8168,需要从官方下载源码自己编译

官网驱动程序源码:Realtek PCIe FE / GBE / 2.5G / Gaming Ethernet Family Controller Software

解压,进入源码目录

1
tar -jxvf r8168-8.051.02.tar.bz2

编译还需要安装对应版本的 pve-headers,可以通过以下命令

1
apt search $(uname -r)

搜索符合自己要求的版本(没有类似于 pve-headers-5.15.102-1-pve_5.15.102-1_amd64 开头的文件的话,直接去源里面找,比如 bullseye 的清华源),然后安装

安装编译需要的工具

1
apt install make gcc -y

先执行一下编译

1
make && make install

没有出现报错,执行安装脚本(直接连接主机操作)

1
./autorun.sh

安装结束后查看驱动是否替换成功

1
lspci -vvv | grep r816

root@pve:~# lspci -vvv | grep r816
Kernel driver in use: r8168
Kernel modules: r8168