系统设置
- 1: 修改swap分区参数
- 2: 修改locale设置
- 3: 合并local-lvm和local分区
- 4: 清理不再使用的内核
- 5: 安装配置timeshift
- 6: 开启自动备份虚拟机配置文件
- 7: 恢复系统设置
- 8: 进入恢复模式修复系统
- 9: 固定网卡名称
1 - 修改swap分区参数
打开文件:
vi /etc/sysctl.conf
在文件最后增加内容:
vm.swappiness = 1
设置内存剩余多少时使用 swap 分区,数字越小代表多使用物理内存。
sysctl -p
让配置生效。
2 - 修改locale设置
修改配置
默认安装后,有时会遇到 locale 报错:
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_IDENTIFICATION = "zh_CN.UTF-8",
LC_NUMERIC = "zh_CN.UTF-8",
LC_TIME = "zh_CN.UTF-8",
LC_PAPER = "zh_CN.UTF-8",
LC_MONETARY = "zh_CN.UTF-8",
LC_TELEPHONE = "zh_CN.UTF-8",
LC_MEASUREMENT = "zh_CN.UTF-8",
LC_NAME = "zh_CN.UTF-8",
LC_ADDRESS = "zh_CN.UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
最简单的修改方案:
vi /etc/default/locale
将内容修改为:
LC_CTYPE="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"
参考资料
3 - 合并local-lvm和local分区
删除 local-lvm
lvremove pve/data
输出:
lvremove pve/data
Do you really want to remove active logical volume pve/data? [y/n]: y
Logical volume "data" successfully removed.
扩展local
lvextend -l +100%FREE -r pve/root
输出为:
Size of logical volume pve/root changed from 96.00 GiB (24576 extents) to 885.25 GiB (226624 extents).
Logical volume pve/root successfully resized.
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/mapper/pve-root is mounted on /; on-line resizing required
old_desc_blocks = 12, new_desc_blocks = 111
The filesystem on /dev/mapper/pve-root is now 232062976 (4k) blocks long.
完成后,查看修改后的状态:
df -Th
/dev/mapper/pve-root 现在是 831G 了。
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 63G 0 63G 0% /dev
tmpfs tmpfs 13G 1.9M 13G 1% /run
/dev/mapper/pve-root ext4 871G 4.0G 831G 1% /
tmpfs tmpfs 63G 66M 63G 1% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/nvme0n1p2 vfat 1022M 344K 1022M 1% /boot/efi
/dev/fuse fuse 128M 48K 128M 1% /etc/pve
tmpfs tmpfs 13G 0 13G 0% /run/user/0
对比修改前的:
df -Th
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 63G 0 63G 0% /dev
tmpfs tmpfs 13G 2.0M 13G 1% /run
/dev/mapper/pve-root ext4 94G 4.0G 86G 5% /
tmpfs tmpfs 63G 66M 63G 1% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/nvme0n1p2 vfat 1022M 344K 1022M 1% /boot/efi
/dev/fuse fuse 128M 48K 128M 1% /etc/pve
tmpfs tmpfs 13G 0 13G 0% /run/user/0
页面删除Local-LVM
管理页面上,找到 “Datacenter” -> “Storage” ,找到 local-lvm ,然后点击删除。
修改 local 属性
“Datacenter” -> “Storage” 下,选择 local, 编辑 Content ,选中所有内容。
参考资料
4 - 清理不再使用的内核
严重警告
清理内核是一个高危操作,一旦失误系统无法启动,也无法远程救援。
清理之前一定要确认已经重启,先重启再清理,先重启再清理,先重启再清理!
非必要不远程操作!
查看现有内核
日常排查组合:
echo "=== 当前运行内核 ==="
uname -r
echo -e "\n=== dpkg已安装内核包 ==="
dpkg -l | grep proxmox-kernel
echo -e "\n=== /boot内核镜像 ==="
ls -lh /boot/vmlinuz-*
echo -e "\n=== /lib/modules模块目录 ==="
ls /lib/modules/
输出例如:
=== 当前运行内核 ===
7.0.14-12-pve
=== dpkg已安装内核包 ===
ii proxmox-kernel-7.0 7.0.14-12 amd64 Latest Proxmox Kernel Image
ii proxmox-kernel-7.0.14-12-pve 7.0.14-12 amd64 Proxmox Kernel Image
ii proxmox-kernel-7.0.2-6-pve-signed 7.0.2-6 amd64 Proxmox Kernel Image (signed)
ii proxmox-kernel-helper 9.2.0 all Function for various kernel maintenance tasks.
=== /boot内核镜像 ===
-rw-r--r-- 1 root root 16M Aug 11 19:05 /boot/vmlinuz-7.0.14-12-pve
-rw-r--r-- 1 root root 16M May 20 16:55 /boot/vmlinuz-7.0.2-6-pve
=== /lib/modules模块目录 ===
7.0.14-12-pve 7.0.2-6-pve
解释,查看当前正在运行的内核(开机后正在用的):
$ uname -r
7.0.14-12-pve
查看 dpkg 数据库里已经安装的内核包(系统识别的全部内核):
$ dpkg -l | grep proxmox-kernel
ii proxmox-kernel-7.0 7.0.14-12 amd64 Latest Proxmox Kernel Image
ii proxmox-kernel-7.0.14-12-pve 7.0.14-12 amd64 Proxmox Kernel Image
ii proxmox-kernel-7.0.2-6-pve-signed 7.0.2-6 amd64 Proxmox Kernel Image (signed)
ii proxmox-kernel-helper 9.2.0 all Function for various kernel maintenance tasks.
/boot 目录实际存在的内核镜像(磁盘上真实存在的 vmlinuz/initrd):
$ ls -lh /boot/vmlinuz-* /boot/initrd.img-*
-rw-r--r-- 1 root root 88M Aug 16 18:16 /boot/initrd.img-7.0.14-12-pve
-rw-r--r-- 1 root root 88M Aug 16 08:56 /boot/initrd.img-7.0.2-6-pve
-rw-r--r-- 1 root root 16M Aug 11 19:05 /boot/vmlinuz-7.0.14-12-pve
-rw-r--r-- 1 root root 16M May 20 16:55 /boot/vmlinuz-7.0.2-6-pve
/lib/modules 已存在内核模块目录:
$ ls /lib/modules/
7.0.14-12-pve 7.0.2-6-pve
清理不用的内核
警告
尽量保留两个内核,即正常使用的内核和一个备用的内核。
当前使用的内核损坏时,至少可以通过备用内核启动,方便修复。
脚本操作
https://tteck.github.io/Proxmox/
找到 Proxmox VE Kernel Clean 这个脚本,执行:
bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/misc/kernel-clean.sh)"
也可以手工把这个脚本下载到本地,方便以后执行本地运行:
mkdir -p ~/work/soft/pve
cd ~/work/soft/pve
wget https://github.com/tteck/Proxmox/raw/main/misc/kernel-clean.sh
chmod +x kernel-clean.sh
以后运行时,就只要执行
~/work/soft/pve/kernel-clean.sh
问题修复
未重启就删除新内核
一般发生在 apt upgrade 之后,新内核被安装并完成 grup 更新,成为默认内核。然后忘了重启,就用清理内核的脚本将新内核清理掉了。重启之后,因为默认启动内核被修改为新内核,而新内核文件被误删,因此 pve 启动失败。
修复的方式,只能接上显示器和键盘,在开机后 pve 的启动菜单中选择高级选项,在列出来的内核列表中一般会有新旧两个内核。选择旧内核先启动到 pve 中。
例如,假设操作涉及到的新旧内核分别为:
- pve-kernel-7.0.14-12-pve
- pve-kernel-7.0.2-6-pve
下面开始执行被误删的新内核的清理工作:
-
清除 dpkg 残留记录
dpkg --purge pve-kernel-7.0.14-12-pve -
手动清理磁盘上残余碎片
# 检查 boot 目录有没有残缺文件: ls -lh /boot/*7.0.14-12-pve* # 如果还有残留 vmlinuz、initrd,直接删掉: rm -f /boot/*7.0.14-12-pve* # 检查 modules 目录残留: ls /lib/modules/ |grep 7.0.14-12 # 如果目录还存在,删除 rm -rf /lib/modules/7.0.14-12-pve -
更新 grub,把错误内核从引导列表清理掉
update-grub proxmox-boot-tool refresh备注: PVE 使用
proxmox‑boot‑tool管理 EFI/boot 分区,必须执行,只跑 update‑grub 不够。
重启,此时 7.0.14-12 已经被清理干净,正常会默认用 7.0.2-6 启动。
重新安装 7.0.14-12,此时 apt update 命令无效:
$ apt install pve-kernel-7.0.14-12-pve
Note, selecting 'proxmox-kernel-7.0.14-12-pve' instead of 'pve-kernel-7.0.14-12-pve'
proxmox-kernel-7.0.14-12-pve is already the newest version (7.0.14-12).
proxmox-kernel-7.0.14-12-pve set to manually installed.
Summary:
Upgrading: 0, Installing: 0, Removing: 0, Not Upgrading: 0
需要用 apt reinstall :
apt reinstall proxmox-kernel-7.0.14-12-pve
安装完成之后,立即重启,此时会默认用新的 7.0.14-12 内核启动。修复完成!
5 - 安装配置timeshift
前面在安装 pve 时,选择了留出 50G 大小的空间给 timeshift 使用。
为 timeshift 准备分区
查看当前磁盘分区情况
fdisk -l
查看当前硬盘情况:
Disk /dev/nvme0n1: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: WDC WDS500G1B0C-00S6U0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 000372CE-8B4D-4B12-974B-99C231DB3D67
Device Start End Sectors Size Type
/dev/nvme0n1p1 34 2047 2014 1007K BIOS boot
/dev/nvme0n1p2 2048 2099199 2097152 1G EFI System
/dev/nvme0n1p3 2099200 838860800 836761601 399G Linux LVM
Disk /dev/mapper/pve-swap: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/mapper/pve-root: 96 GiB, 103079215104 bytes, 201326592 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
这是一个大小为 480G 的 nvme SSD 硬盘,实际可用空间为 465G。在安装 PVE 时我将 hdsize 设置为 400G, 因此 PVE 使用的空间只有400G。从上面输出可以看到:
/dev/nvme0n1p1 34 2047 2014 1007K BIOS boot
/dev/nvme0n1p2 2048 2099199 2097152 1G EFI System
/dev/nvme0n1p3 2099200 838860800 836761601 399G Linux LVM
nvme0n1p1 是 BIOS, nvme0n1p2 是 EFI 分区,PVE 使用的是 nvme0n1p3,399G。
另外可以看到:
Disk /dev/mapper/pve-swap: 8 GiB, 8589934592 bytes, 16777216 sectors
Disk /dev/mapper/pve-root: 96 GiB, 103079215104 bytes, 201326592 sectors
swap 使用了 8G, pve root 使用了 96 G。
lsblk -f
可以看到 nvme0n1p3 是一个 LVM2,400G 的总空间中,内部被分为 pve-swap / pve-root / pve-data_tmeta
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1
|-nvme0n1p1
|-nvme0n1p2 vfat FAT32 26F2-091E 1021.6M 0% /boot/efi
`-nvme0n1p3 LVM2_member LVM2 001 foXyBZ-IPQT-wOCF-DWSN-u88a-sBVD-LaZ9zn
|-pve-swap swap 1 c5d97cb5-4d18-4f43-a36f-fb67eb8dcc84 [SWAP]
|-pve-root ext4 1.0 a0a46add-dda5-42b4-a978-97d363eeddd0 85.2G 4% /
|-pve-data_tmeta
| `-pve-data
`-pve-data_tdata
`-pve-data
剩余的大约 60G 的空间在这里没有显示。
添加 timeshift 分区
fdisk /dev/nvme0n1
输出为:
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.
在警告说磁盘使用中,重新分区不是一个好注意。不过我们是操作剩余空间,比较安全。
输入 m 获得帮助:
Command (m for help): m
Help:
GPT
M enter protective/hybrid MBR
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty MBR (DOS) partition table
s create a new empty Sun partition table
输入 F 列出未分区的剩余空间:
Command (m for help): F
Unpartitioned space /dev/nvme0n1: 65.76 GiB, 70610066944 bytes, 137910287 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
Start End Sectors Size
838862848 976773134 137910287 65.8G
这个 65.8G 就是我们之前预留的空间。
输入 n 添加新的分区,默认是利用剩余空间的全部。这里敲三次回车全部默认即可。
Command (m for help): n
Partition number (4-128, default 4):
First sector (838860801-976773134, default 838862848):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (838862848-976773134, default 976773119):
Created a new partition 4 of type 'Linux filesystem' and of size 65.8 GiB.
如果不是利用全部剩余空间,则可以通过输入 +100G 这样的内容来设置要添加的分区大小。
输入 p 显示修改之后的分区表:
Command (m for help): p
Disk /dev/nvme0n1: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: WDC WDS500G1B0C-00S6U0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 000372CE-8B4D-4B12-974B-99C231DB3D67
Device Start End Sectors Size Type
/dev/nvme0n1p1 34 2047 2014 1007K BIOS boot
/dev/nvme0n1p2 2048 2099199 2097152 1G EFI System
/dev/nvme0n1p3 2099200 838860800 836761601 399G Linux LVM
/dev/nvme0n1p4 838862848 976773119 137910272 65.8G Linux filesystem
可以看到我们新加的 nvme0n1p4 分区大小为 65.8G。
检查无误,输入 w 写入修改操作并退出。
Command (m for help): w
The partition table has been altered.
Syncing disks.
在 pve 下执行
fdisk -l
再次检查分区情况:
......
Device Start End Sectors Size Type
/dev/nvme0n1p1 34 2047 2014 1007K BIOS boot
/dev/nvme0n1p2 2048 2099199 2097152 1G EFI System
/dev/nvme0n1p3 2099200 838860800 836761601 399G Linux LVM
/dev/nvme0n1p4 838862848 976773119 137910272 65.8G Linux filesystem
至此 timeshift 分区准备OK.
格式化 timeshift 分区
mkfs.ext4 /dev/nvme0n1p4
对分区进行格式化,格式为 ext4:
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 17238784 4k blocks and 4317184 inodes
Filesystem UUID: 2411eb4e-67f1-4c7d-b633-17df1fa0c127
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424
Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done
安装 timeshift
具体参考这里:
https://skyao.net/learning-ubuntu-server/docs/installation/timeshift/install/
安装配置完成后,执行
timeshift --list
查看 timeshift 情况:
First run mode (config file not found)
Selected default snapshot type: RSYNC
Mounted '/dev/nvme0n1p4' at '/run/timeshift/5364/backup'
Device : /dev/nvme0n1p4
UUID : 2411eb4e-67f1-4c7d-b633-17df1fa0c127
Path : /run/timeshift/5364/backup
Mode : RSYNC
Status : No snapshots on this device
First snapshot requires: 0 B
No snapshots found
使用 timeshift 进行备份
设置自动备份
vi /etc/timeshift/timeshift.json
打开 timeshift 配置文件,修改以下内容
{
"schedule_monthly" : "true",
"schedule_weekly" : "true",
"schedule_daily" : "true",
"schedule_hourly" : "false",
"schedule_boot" : "false",
"count_monthly" : "2",
"count_weekly" : "3",
"count_daily" : "5",
"count_hourly" : "6",
"count_boot" : "5",
}
对于软路由机器,由于是长期开机并且改动不过,因此 schedule_monthly / schedule_weekly / schedule_daily 设置为 true,数量用默认值。
排除不需要备份的内容
默认情况下 timeshift 的配置文件中已经设置了 exclude:
{
"exclude" : [
"/var/lib/ceph/**",
"/root/**"
],
"exclude-apps" : []
}
-
/var/lib/ceph/: ceph 相关的文件 -
/root/: root 用户的 home 路径,如果使用其他用户,也需要将它们的 home 目录加入进来。
但这些是不够的,还需要增加以下内容:
-
/var/lib/vz/pve的各种文件,包括虚拟机,模版,备份,上传的iso文件等都在这里,这些文件太大,不适合用 timeshift 备份,因此必须排除。
ls /var/lib/vz dump images private snippets template- dump: 这里保存 pve backup 备份下来的虚拟机镜像文件
- images: 这里保存 pve 虚拟机镜像文件
- template: iso 子目录中保存的是上传到 pve 的各种 iso/img 文件
-
/etc/pve/qemu-server/: pve 的虚拟机配置文件,这些文件也不要用 timeshift 备份,避免恢复时把虚拟机文件也给覆盖了。虚拟机文件的备份会由下一节中提到的自动脚本进行备份。 -
/root/data/backup/pve/pveConfBackup: pve虚拟机文件的自动备份目录,详情见下一节。 -
/mnt/pve: 在 pve 下使用 nfs 存储时,远程 nfs 会自动 mount 到这个目录下,这些文件肯定也不能被 timeshift 备份。因此必须排除。
最后通过设置的 exclude 为:
{
......
"exclude" : [
"/var/lib/ceph/**",
"/root/**",
"/var/lib/vz/**",
"/etc/pve/qemu-server/**",
"/root/data/backup/pve/pveConfBackup/**",
"/mnt/pve/**"
],
}
设置自动备份虚拟机文件
见下一章,推荐完成这个操作之后再执行手工备份。
手工备份
timeshift --create --comments "first backup after apt upgrade and basic soft install"
输入为:
Estimating system size...
Creating new snapshot...(RSYNC)
Saving to device: /dev/nvme0n1p4, mounted at path: /run/timeshift/6888/backup
Syncing files with rsync...
Created control file: /run/timeshift/6888/backup/timeshift/snapshots/2023-07-25_21-10-04/info.json
RSYNC Snapshot saved successfully (41s)
Tagged snapshot '2023-07-25_21-10-04': ondemand
------------------------------------------------------------------------------
查看当前备份情况:
timeshift --list
Mounted '/dev/nvme0n1p4' at '/run/timeshift/7219/backup'
Device : /dev/nvme0n1p4
UUID : 2411eb4e-67f1-4c7d-b633-17df1fa0c127
Path : /run/timeshift/7219/backup
Mode : RSYNC
Status : OK
1 snapshots, 64.5 GB free
Num Name Tags Description
------------------------------------------------------------------------------
0 > 2023-07-25_21-10-04 O first backup after apt upgrade and basic soft install
结合备份之前看到的 timeshift 备份分区的大小为 65.8G,减去这里的 64.5 GB free,也就是这个备份用掉了 1.3 G 的磁盘空间。
6 - 开启自动备份虚拟机配置文件
准备工作
建立备份存放的目录
建立备份存放的目录,为了不被 timeshift 影响,我们将备份目录放到 root 用户的 home 目录(即 /root 目录)。由于在前面 timeshift 设置中的 exclude 中排除了 /root/**,因此我们可以将备份目录放到 /root/** 下。
建立备份目录 /root/data/backup/pve:
mkdir -p /root/data/backup/pve
cd /root/data/backup/pve
启动虚拟机conf文件备份
通过 pvetools 脚本来启用 “自动备份虚拟机 conf 文件”
/root/work/soft/pvetools/pvetools.sh

输入前面准备的备份路径 /root/data/backup/pve

备份数量输入 8 。之后虚拟机配置文件就会自动备份到这个目录了。
可以对比一下备份的原始数据和备份后的文件:
-
这是要备份的文件
$ ls /etc/pve/qemu-server/ 1000.conf 1001.conf -
这时备份好的目录
$ ls /root/data/backup/pve/pveConfBackup 20240315 $ ls /root/data/backup/pve/pveConfBackup/20240315 1000.conf 1001.conf
恢复虚拟机配置文件
在虚拟机配置文件丢失的情况下(典型例子就是用 timeshift restore 功能从备份中恢复),可以通过获取备份的文件来进行恢复。
找到备份的文件:
$ cd /root/data/backup/pve/pveConfBackup/
$ ls
20240315
$ cd 20240315
$ ls
1000.conf 1001.conf
复制到 /etc/pve/qemu-server/ 目录:
rm /etc/pve/qemu-server/*
cp /root/data/backup/pve/pveConfBackup/20240315/* /etc/pve/qemu-server/
配置 timeshift excludes
注意:必须将虚拟机配置文件备份路径加入到 timeshift excludes 中,避免在通过 timeshift 进行恢复时丢失备份的数据。
{
......
"exclude" : [
......
"/root/data/backup/pve/pveConfBackup/**",
......
],
}
7 - 恢复系统设置
8 - 进入恢复模式修复系统
背景
有时在经过错误的配置之后,pve 系统会无法使用,甚至无法进入系统和页面控制台。
此时需要有其他的方案来修复系统。
恢复模式
进入恢复模式
开机,选择 “Advanced options for Proxmox VE GNU/Linux” ,然后选择 Rescue mode。
用 root 密码登录即可。
启动集群
systemctl start pve-cluster
这是就可以访问目录 /etc/pve 来操作集群和虚拟机了。
操作虚拟机
比如关闭有问题的虚拟机:
qm stop id
修改虚拟机配置
cd /etc/pve/nodes/<node_name>/qume-server
这里能看到各个虚拟机的配置文件,打开相应的配置文件修改即可,比如取消虚拟机的开机,只要将 onboot 修改为 0.
9 - 固定网卡名称
在Proxmox VE中,当 PCIe 设备发生变化时,网络接口名称可能会重新排序,这是一个已知问题。要解决这个问题,可以通过创建持久的网络接口命名规则来固定网卡名称。
解决问题的思路
基本思路就是在网卡命名时,不要绑定不稳定的 pcie 顺序,而且绑定其他固定的属性,最常用的方案就是绑定 MAC 地址。
通常情况下,一个 pve 设备中的网卡数量和网卡 mac 地址都是固定的,除非明确更换或者增减网卡,否则不会发生变化。
这样,不管网卡和其他 pcie 设备的增减和顺序调整,都不会影响到网卡的命名,然后基于网卡名称的各种设备也就稳定了。
因此,后面将根据网卡的 mac 地址,将网卡重新命名为,暂时定义的规则为类似 en25g1 这样:
- en:前缀,表示 Ethernet 以太网网卡
- 1g:网卡速度,根据实际情况可能有 1g/2g/10g/40g/100g,分别对应千兆,2.5g网卡,万兆,40g,100g网卡
- 1:网卡序号,在同速度网卡中排列,方便起见,不以 0 开头,而是 1/2/3/4 这样表示第一/第二/第三/第四块网卡
按照这样的规则,上面的五块网卡,名称会固定为
- en1g1
- en25g1 / en25g2 / en25g3 / en25g4
这样 vmbr0 的 bridge-ports 就可以写成 en1g1 en25g1 en25g2 en25g3 en25g4,之后不管网卡顺序和pcie设备调整,都不会影响 vmbr0 的 bridge-ports 工作。
实现方案(pve9)
注意:在 Proxmox VE 9(基于 Debian 13)中,固定网卡名称的方式与 PVE 8(基于 Debian 12)有所不同,主要是因为 Debian 13 对 udev 规则的处理逻辑做了调整,传统的 70-persistent-net.rules 方式可能不再生效。
在 PVE 9 中,推荐通过 systemd 的 .link 配置文件 来固定网卡名称,这是更现代且兼容的方式。
步骤如下:
-
找出需要固定的网卡 MAC 地址
$ ip addr 2: enp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether 00:e2:69:93:ff:a0 brd ff:ff:ff:ff:ff:ff altname enx00e26993ffa0 3: nic1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000 link/ether 8c:2a:8e:88:a1:36 brd ff:ff:ff:ff:ff:ff altname enx8c2a8e88a136 -
创建 .link 配置文件
link 文件名用 enx8c2a8e88a136 这样的 altname 会方便和网卡进行对应:
vi /etc/systemd/network/10-static-enx00e26993ffa0.link内容为:
[Match] MACAddress=00:e2:69:93:ff:a0 Type=ether [Link] Name=en1g1 AlternativeNamesPolicy=macvi /etc/systemd/network/10-static-enx8c2a8e88a136.link内容为:
[Match] MACAddress=8c:2a:8e:88:a1:36 Type=ether [Link] Name=en100g1 AlternativeNamesPolicy=macAlternativeNamesPolicy=mac 会保留 altname 名字,这样同样是为了方便对应。
Type=ether 是为了避免隐患,因为 vmbr0 会继承物理网卡的 MAC,因此 Proxmox 官方建议在 [Match] 里加 Type=ether,避免这条 .link 误匹配到 bridge/bond/vlan 接口。
-
修改 vmbr0 的配置
因为一般都是远程操作,为了安全起见,重命名前后的两个网卡名字都加入到 vmbr0,以防万一出错时无法连接管理网络:
vi /etc/network/interfaces内容为:
auto en1g1 auto en100g1 auto vmbr0 iface vmbr0 inet static address 192.168.3.129/24 gateway 192.168.3.1 bridge-ports en100g1 en1g1 enp3s0 nic1 bridge-stp off bridge-fd 0 -
执行更新
update-initramfs -u -k all -
重启
reboot之后查看网卡名称发现已经固定:
2: en1g1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel master vmbr0 state DOWN group default qlen 1000 link/ether 00:e2:69:93:ff:a0 brd ff:ff:ff:ff:ff:ff altname enx00e26993ffa0 3: en100g1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master vmbr0 state UP group default qlen 1000 link/ether 8c:2a:8e:88:a1:36 brd ff:ff:ff:ff:ff:ff altname enx8c2a8e88a136 -
验证成功之后,删除 vmbr0 中不再使用的旧网卡名称
安全起见再执行一次 update-initramfs:
update-initramfs -u -k all reboot