搭建pve环境

  1. iso 写入 U 盘,这里的 pve 版本是 proxmox-ve_7.4-1.iso
  2. 从 U 盘启动电脑
  3. 插好网线,安装 pve,设置好局域网 ip
  • 取消企业订阅

    mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak
    
  • Proxmox 软件源更换

    echo "deb https://mirrors.nju.edu.cn/proxmox/debian bullseye pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list
    
  • Debian 系统源更换

    sed -i.bak "s#ftp.debian.org/debian#mirrors.aliyun.com/debian#g" /etc/apt/sources.list
    sed -i "s#security.debian.org#mirrors.aliyun.com/debian-security#g" /etc/apt/sources.list
    apt update && apt-get install -y apt-transport-https ca-certificates  --fix-missing
    
  • lxc 源更新

    cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back
    sed -i 's|http://download.proxmox.com|https://mirrors.tuna.tsinghua.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
    systemctl restart pvedaemon.service
    
  • 安装常用软件

    apt install -y vim lm-sensors net-tools wireless-tools wpasupplicant
    
  • 其它环境设置

    # 设置ll命令
    vim $HOME/.bashrc
    # 加入下面两条文本
    alias ls='ls --color=auto'
    alias ll='ls -lh --color=auto'
    # 使配置立刻生效
    source $HOME/.bashrc
    
    # 设置合盖不睡眠(针对笔记本)
    vim /etc/systemd/logind.conf
    #HandleLidSwitch=suspend 改为 HandleLidSwitch=ignore
    
    # 然后重启
    reboot
    

如果用过腾讯云或者阿里云的话,可以将其理解为在系统外额外添加的一层防火墙,和系统内部防火墙共同发挥作用

pve 有三种防火墙:数据中心、节点、虚拟机。虚拟机很好理解,节点其实就是 pve 主机,然后一个数据中心下会挂着多个节点,对于普通用户来说,就只会存在一个节点(即 pve 主机),然后一个节点下面挂着多个虚拟机

然后要使节点防火墙生效,需要同时开启数据中心和节点的防火墙;要使虚拟机防火墙生效,需要同时开始数据中心和虚拟机的防火墙。可见要使用防火墙功能,数据中心防火墙是必须开启的。

对于虚拟机的防火墙,正常情况下都是设置 iptables 来进行限制。不过 pve 这里比较特殊,需要在虚拟机处开启防火墙,并在硬件处勾选防火墙,才能应用上 iptables 规则,否则没用。这里有两层限制,一是 pve 对虚拟机设置的访问限制,这个可以通过网页或者配置文件调整,二是 iptables 规则设置的访问限制,都通过了才会放行。个人觉得没特殊需求的话,还是直接用 pve 提供的防火墙,更为方便

pve防火墙配置文件路径在/etc/pve/firewall/

个人建议防火墙这么配置

  1. 开启数据中心、节点、虚拟机的防火墙,默认拒绝进入、允许出去
  2. 数据中心设置安全群组,加上一套白名单,存放允许访问 pve 主机以及任意虚拟机的 ip 集合
  3. 数据中心防火墙处放行白名单
  4. 各个虚拟机防火墙处放行白名单,并开放各自的公共服务端口

官方提供了教程,地址是 https://pve.proxmox.com/wiki/Upgrade_from_7_to_8

个人优化了下,流程大致如下

  1. pve 网页端数据中心配置定期备份,备份所有的虚拟机,然后linux 端写定时任务定期备份 /etc 下所有内容
  2. 虚拟机定期备份重要数据,比如 /home /root /etc /var/spool/cron/crontabs 这几个路径
  3. 步骤 1、2 处得到的数据定期备份到外置硬盘,并同步到云盘。为防止云盘的和谐,可以用 Rclone crypt 加密后进行上传
  4. 重新安装系统
  5. 清空浏览器缓存
  6. 用备份文件中的配置覆盖新系统的,涉及以下几个路径 /etc/pve/storage.cfg/etc/pve/firewall//etc/pve/nodes/<node>/host.fw
  7. 使用备份文件恢复所有的虚拟机

虽然 pve 主机可以直接访问所有的硬件,但是为了稳定性考虑一般会把服务放在虚拟机中,这样就算出错也只会影响到当前的虚拟机,而不会把整个 pve 环境搞崩掉。所以需要让虚拟机也可以访问到这些硬件,从而让各个服务使用。

这种方式比较简单,性能也还可以。

举个例子,假如我要把一块外接的三星 T7 硬盘直通给虚拟机,步骤如下

  1. pve 主机 linux 端检查硬盘列表

    ls -la /dev/disk/by-id/|grep -v dm|grep -v lvm|grep -v part
    
    # 结果大概如下
    drwxr-xr-x 2 root root 540 Mar 15 20:02 .
    drwxr-xr-x 7 root root 140 Mar 15 20:02 ..
    lrwxrwxrwx 1 root root  13 Mar 15 16:38 nvme-PM961_NVMe_SAMSUNG_256GB__S364NX0JA10277 -> ../../nvme0n1
    lrwxrwxrwx 1 root root  13 Mar 15 16:38 nvme-eui.002538ba71b4fdd8 -> ../../nvme0n1
    lrwxrwxrwx 1 root root   9 Mar 15 20:02 usb-Samsung_PSSD_T7_S6TWNS1RC08642R-0:0 -> ../../sda
    
  2. 直通三星 T7 给虚拟机 100

    qm set 100 -scsi1 /dev/disk/by-id/usb-Samsung_PSSD_T7_S6TWNS1RC08642R-0:0
    
    # 命令格式如下,X为当前尚未被占用的位置,类似的,可以用-sataX或者-ideX,只不过根据网上的说法,scsi性能最好
    # qm set 虚拟机ID -scsiX /dev/disk/by-id/硬盘列表返回的说明
    
  3. 取消直通

    qm set 100 --delete scsi1
    
  4. 注意直通后需要到对应虚拟机硬件对应硬盘取消备份(高级选项可见),否则备份时会报错

顺便提供下测试磁盘读写能力的脚本,用来判断各种方案的损耗,方便选择最优的

# 先在待测试磁盘下创建一个空文件
cd /磁盘路径 && touch testReadOrWrite && touch testReadAndWrite
# 测试磁盘的写入能力,写入1G内容
dd if=/dev/zero of=./testReadOrWrite bs=8k count=125000
# 测试磁盘的读取能力,读取1G内容
dd if=./testReadOrWrite of=/dev/null bs=8k count=125000
# 测试磁盘的读写能力,读写1G内容
dd if=./testReadOrWrite of=./testReadAndWrite bs=8k count=125000

这个也算是能让虚拟机使用外接硬盘的一种方案,简单提一下吧,方法就是 pve 主机上搭建一个 nfs 服务,把挂载的硬盘共享出去,方便其它虚拟机操作硬盘

# 宿主机安装nfs服务
apt-get install nfs-kernel-server
# 创建目录并给其设置权限,注意一定要是777,否则客户端挂载读写会出问题
mkdir 共享目录路径 && chmod 777 共享目录路径
# 编辑配置文件
vim /etc/exports
# 尾部加入以下配置
共享目录绝对路径 允许使用的IP,可以是IP段(rw,sync,insecure,no_subtree_check,no_root_squash)
# 使配置生效
systemctl restart nfs-kernel-server

# 客户端使用nfs服务
apt-get install nfs-common
mount -t nfs 服务端地址:要挂载的共享目录 本地挂载路径

我自己拿固态的测试结果如下表

写入 读取 读写
pve主机本地磁盘 653 MB/s 5.9 GB/s 606 MB/s
虚拟机本地磁盘 552 MB/s 5.6 GB/s 537 MB/s
虚拟机挂载主机nfs 457 MB/s 321 MB/s 428 MB/s

可以看到,pve 虚拟机相对于主机的读写能力,差不多下降了十分之一,因此虚拟机磁盘性能其实是有损耗的

而经过 nfs 挂载的磁盘,则是下降三分之一,特别是读取能力,直接变为十分之一,因此,如果是为了性能考虑的话,可以改成虚拟机直通外接盘的方式,而不是宿主机先挂载再通过 nfs 分享

不过,从实际应用场景来说,貌似这个速度也够用,反正2.5G的内网速度还是跟不上 nfs 挂载盘的读写速度的

在 pve 中,若虚拟机空间不够,可以后续进行增加,但是增加后可能会发现可用空间未变大,这个可能是逻辑卷只使用了一部分空间的缘故,要确定这个,可以通过以下步骤

  1. 确认物理卷和逻辑卷的大小,可以通过下面指令观察物理卷和逻辑卷大小

    # 输出物理卷和逻辑卷大小
    sudo fdisk -l
    # 输出逻辑卷大小
    df -h
    

    假设得到以下输出,为方便分析,省略了一部分

    user@homeserver:~$ sudo fdisk -l
    ...
    Disk /dev/sda: 60 GiB, 64424509440 bytes, 125829120 sectors
    Disk model: QEMU HARDDISK   
    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: F7D28B52-D513-4798-BC32-EC077F1859ED
    
    Device       Start       End   Sectors Size Type
    /dev/sda1     2048      4095      2048   1M BIOS boot
    /dev/sda2     4096   4198399   4194304   2G Linux filesystem
    /dev/sda3  4198400 104855551 100657152  48G Linux filesystem
    
    
    Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 23.102 GiB, 25765609472 bytes, 50323456 sectors
    user@homeserver:~$ 
    user@homeserver:~$ 
    user@homeserver:~$ df -h
    Filesystem                         Size  Used Avail Use% Mounted on
    udev                               3.9G     0  3.9G   0% /dev
    tmpfs                              795M  1.5M  794M   1% /run
    /dev/mapper/ubuntu--vg-ubuntu--lv   24G   11G   13G  46% /
    tmpfs                              3.9G     0  3.9G   0% /dev/shm
    tmpfs                              5.0M     0  5.0M   0% /run/lock
    tmpfs                              3.9G     0  3.9G   0% /sys/fs/cgroup
    /dev/sda2                          2.0G  209M  1.6G  12% /boot
    /dev/loop1                          64M   64M     0 100% /snap/core20/2182
    /dev/loop2                          92M   92M     0 100% /snap/lxd/24061
    /dev/loop0                          64M   64M     0 100% /snap/core20/1828
    /dev/loop4                          40M   40M     0 100% /snap/snapd/21184
    /dev/loop3                          50M   50M     0 100% /snap/snapd/18357
    tmpfs                              795M     0  795M   0% /run/user/1000
    

    通过 /dev/sda3 4198400 104855551 100657152 48G Linux filesystem 确认物理卷大小为48G

    通过 Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 23.102 GiB, 25765609472 bytes, 50323456 sectors 确认逻辑卷大小为23.1G,与 df -h 输出中的 /dev/mapper/ubuntu--vg-ubuntu--lv 24G 11G 13G 46% / 差不多一致

    并且可以判断,总空间60G还有差不多10G未分配

    以及逻辑卷名称为 /dev/mapper/ubuntu--vg-ubuntu--lv

  2. 拓展逻辑卷,使其达到物理卷的大小

    # 查看未分配给逻辑卷的空间,可以通过观察下面命令输出中的 "Free PE / Size" 一行确认
    sudo vgdisplay
    # 拓展逻辑卷
    sudo lvextend -l +100%FREE 逻辑卷名称
    # 确认根文件系列类型,观察type字段便可以确认
    df -T /
    # 调整文件系统大小,如果根文件系统是 ext4 类型,使用下面命令
    sudo resize2fs 逻辑卷名称
    

如果小主机性能比较强,且散热比较弱,导致噪音大,可以考虑降低功耗来减轻声音,操作步骤如下

  1. 安装安装 ryzenadj,项目地址 https://github.com/FlyGoat/RyzenAdj

    cd ~ && mkdir ryzenadj && cd ryzenadj
    apt install -y build-essential cmake libpci-dev git
    git clone https://github.com/FlyGoat/RyzenAdj.git
    cd RyzenAdj
    rm -r win32
    mkdir build && cd build
    cmake -DCMAKE_BUILD_TYPE=Release ..
    make
    if [ -d ~/.local/bin ]; then ln -s ryzenadj ~/.local/bin/ryzenadj && echo "symlinked to ~/.local/bin/ryzenadj"; fi
    if [ -d ~/.bin ]; then ln -s ryzenadj ~/.bin/ryzenadj && echo "symlinked to ~/.bin/ryzenadj"; fi
    
  2. 运行软件

    /root/ryzenadj/RyzenAdj/build/ryzenadj --stapm-limit=12000 --fast-limit=12000 --slow-limit=12000
    # 查看限制结果
    ./ryzenadj --info
    
  3. 由于重启后失效,可以设置脚本,让其开机时自动添加限制,修改文件 vim /etc/rc.local ,写入以下内容,并在 exit 0 前写入要执行的命令

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    # Your command here
    
    # 开机自动限制功耗
    /root/ryzenadj/RyzenAdj/build/ryzenadj --stapm-limit=12000 --fast-limit=12000 --slow-limit=12000
    
    exit 0
    
  4. 使自启动脚本生效

    chmod +x /etc/rc.local
    

相关内容