ProxmoxVE教程

本文最后更新于:2023年12月20日 上午

ProxmoxVE

使用虚拟机安装Openwrt

  • 正常创建Linux虚拟机,硬盘可以不用进行设置,最终虚拟机设置如下:

    image-20231209191802964

  • 上传Openwrt的img镜像,复制镜像地址。

    image-20231209191559642

  • 虚拟机导入镜像磁盘文件

    1
    qm importdisk 101 /var/lib/vz/template/iso/openwrt-x86-64-generic-ext4-combined-efi.img local-lvm
  • 设置硬盘

    image-20231209192001087

  • 调整引导顺序

    image-20231209192123989

  • 启动虚拟机

使用LXC容器安装Openwrt

要点、必须是-rootfs.img-rootfs.img.gz或者-rootfs.tar.gz的文件
-rootfs.img-rootfs.img.gz需要解包后打包
-rootfs.tar.gz可以直接使用,如果使用img镜像文件,则需要进行转换。

img镜像文件转tar.gz操作步骤

  • 安装解包软件

    1
    apt install squashfs-tools
  • 解压

    1
    gzip -d openwrt-x86-64-generic-squashfs-rootfs.img.gz
  • 解包img文件

    1
    unsquashfs openwrt-x86-64-generic-squashfs-rootfs.img
  • 进入目录,重新打包为PVE的CT模板,即tar.gz文件

    1
    2
    cd squashfs-root/
    tar -czf ../openwrt-x86-64-generic-rootfs.tar.gz *
  • 上传或复制到PVE对应目录,一般为/var/lib/vz/template/cache

安装OpenWrt

  • 在pve节点处,选择local(pve)的存储桶,选择CT模板,上传*rootfs.tar.gz系统镜像。

  • 使用命令行创建一个id为200,名称为OpenWrt的LXC容器

    1
    pct create 200 local:vztmpl/openwrt-x86-64-generic-rootfs.tar.gz --rootfs local:1 --ostype unmanaged --hostname OpenWrt --arch amd64 --cores 6 --memory 1024 --swap 0 --onboot yes -net0 bridge=vmbr1,name=eth0

    参数说明:

    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
    28
    29
    local:vztmpl/openwrt-x86-64-generic-rootfs.tar.gz
    容器模板, local:vztmpl/ 指向 /var/lib/vz/template/cache/目录,是pve的默认模板存放目录,webUI上传的模板就存在该位置,可根据需要改为其他目录,

    --rootfs local-lvm:1
    根磁盘位置,local-lvm可以根据实际情况修改为其他存储位置,1表示空间大小为1G。

    --ostype unmanaged
    系统类型,之后可在设置文件中修改。

    --hostname OpenWrt
    容器名称,之后可在设置文件中修改

    --arch amd64
    系统架构,amd64 | arm64 | armhf | i386

    --cores 6
    分配给容器的核心数

    --memory 1024
    分配给容器的内存大小

    --swap 0
    分配给容器的交换区大小

    --onboot yes
    开机自启动虚拟机

    -net0 bridge=vmbr0,name=eth0
    容器网络设置,这里设置网络0为容器中增加网卡eth0,桥接到主机的vmbr0接口
  • 修改OpenWrt的LXC配置文件

    1
    cat /etc/pve/lxc/200.conf

    在其中添加以下数据。

    1
    2
    3
    # openwrt.common.conf是PVE自带的openwrt配置文件示例,内含一些基本设置
    lxc.include: /usr/share/lxc/config/openwrt.common.conf
    lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
  • 启动OpenWrt即可

可能的问题

uhttp未启动无法访问OpenWrt主页

​ 有些时候可能会遇到uhttpd未启动的情况,使用netstat -nap查看没有80端口开放,可以使用下面命令手动启动服务。

1
/usr/sbin/uhttpd -f -h /www -r OpenWrt -x /cgi-bin -u /ubus -t 60 -T 30 -k 20 -A 1 -n 3 -N 100 -R -p 0.0.0.0:80 -p [::]:80 &

dnsmasq未启动导致DHCP服务失败

OpenWrt里由于dnsmasq-full用了procd jail,和linux容器冲突导致dnsmasq启动不了,需要手动改一下把procd jail禁用。使用netstat -nap查看有没有53端口开放,修改/etc/init.d/dnsmasq,注释掉下面的部分,执行命令/etc/init.d/dnsmasq restart启动即可。

image-20231217230509522

ProxmoxVE的Openwrt组网方案

由于ProxmoxVE网络并没有DHCP服务,因此这里使用Openwrt辅助组网,最终实现目标为PVE 主机搭建192.168.121.1/24网桥,Openwrt充当DHCP服务器,同时Openwrt充当旁路由设备,最终都通过PVE网桥实现网络通信。

  • 在pve主机上创建网桥vmbr1,本机ip设置为192.168.121.1,用于pve虚拟机组网,配置文件如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    auto vmbr1
    iface vmbr1 inet static
    address 192.168.121.1/24
    ovs_type OVSBridge
    post-up echo 1 > /proc/sys/net/ipv4/ip_forward #打开IP转发
    post-up echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp #代理 ARP 允许一个主机在一个子网上代表另一个主机响应 ARP 请求,ARP 是一种用于将 IP 地址解析为 MAC(Media Access Control)地址的协议
    #转发IPv4流量到虚拟机,使虚拟机与外网联通。
    #SNAT 内网转外网,当内部虚拟器需要访问外网时走这条规则
    post-up iptables -t nat -A POSTROUTING -s '192.168.121.1/24' -o vmbr0 -j MASQUERADE # -A添加规则
  • 将Openwrt连接指该网桥ip设置为192.168.121.2,做旁旁路由,与传统旁路有不同的是,pve的网桥并没有dhcp服务,因此我们直接使用旁路用Openwrt分配ip信息。

  • 登录Openwrt管理界面,直接修改LAN接口配置,同时需要开启DHCP服务,如下所示:

    image-20231209210241860

    image-20231209210258788

ProxmoxVE配置iscsi服务

  • ProxmoxVe配置iscsi服务首先需要安装targetcli-fb

    1
    apt -y install targetcli-fb
  • iscsi需要预先创建一块固定大小硬盘,这里必须要预先分配,因为iscsi是通过文件大小进行识别的,必须首先填充到指定大小才能正确识别到磁盘大小,使用qemu-img或者dd创建一个即可,下面展示qemu-img创建命令。

    1
    qemu-img create -f qcow2 -o preallocation=falloc ./iscsi-storage-1.qcow2 100G
  • 使用root权限执行targetcli,这里介绍一下,其下目录用途

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /backstores:后端存储,提供iSCSI底层实际的物理存储设备
    /backstores/block:用于存放iSCSI服务端配置共享设备
    /backstores/fileio:用于测试目的的镜像文件
    /backstores/pscsi:对底层为
    /backstores/block
    /iscsi
    /iscsi/iqn.../tpg1:通过在/iscsi目录执行create命令生成iSCSI target名称时自动生成的与iSCSI target名称同名的目录的子目录
    /iscsi/iqn.../tpg1/acls:用于存放该存储资源的验证信息
    /iscsi/iqn.../tpg1/luns:用于存放可访问的可共享硬盘设备
    /iscsi/iqn.../tpg1/portalsL:用于存放iscsi服务端的ip地址
    /loopback
    /vhost
    /xen-pvscsi
  • 创建共享设备,命名为iscsi-1

    1
    /backstores/fileio create name=iscsi-1 file_or_dev=/mnt/badwolf/iscsi/iscsi-storage-1.qcow2
  • 进入/iscsi目录创建target名称,将会在iscsi目录下自动生成一个iqn开头的target。

    1
    /iscsi create
  • 将iSCSI共享资源池中的设备(即之前创建的共享设备)添加到该target。

    1
    /iscsi/iqn......./tpg1/luns create /backstores/fileio/iscsi-1
  • 创建用于验证访问iSCSI服务端共享存储资源的信息,后面的iqn信息可在iscsi客户端查看。

    1
    /iscsi/iqn......./tpg1/acls create iqn.1991-05.com.microsoft:desktop-*****
  • 设置登录用户名和密码,可选

    1
    2
    /iscsi/iqn......./tpg1/acls/iqn.1991-05.com.microsoft:desktop-*****/set auth userid=****
    /iscsi/iqn......./tpg1/acls/iqn.1991-05.com.microsoft:desktop-*****/set auth password=****
  • 设置iSCSI服务端的监听IP地址,默认IP地址是0.0.0.0,系统会自动开启3260端口向外提供iSCSI服务。

    1
    /iscsi/iqn......./tpg1/portals create 192.168.10.10
  • 保存配置

    1
    saveconfig
  • 重启targetd服务

    1
    systemctl restart targetd

Proxmox VE安装Jellyfin

这里直接使用LXC容器安装Jellyfin:

  • 创建debian或者ubuntu的LXC容器,使用无特权容器,虽然官方建议使用特权容器,但是有方法可以使得无特权容器成功开启硬件直通。

  • 挂载存储设备

    • 打开LXC配置文件

      1
      2
      vim /etc/pve/lxc/108.conf
      # 108是LXC容器的id,修改为自己的
    • 映射存储设备

      1
      2
      3
      mp0: /mnt/pve/media,mp=/mnt/media
      #mp0 是第一个挂载点,如果需要挂载多个的话,按照顺序就是 mp1,mp2,mp3
      #/mnt/pve/media 就是宿主机上的存储路径,mp=/mnt/media 就是映射到 LXC 里的路径,后续 JellyFin 就是从这个路径去读文件了。
  • 共享核显开启硬件加速

    • 首先在LXC里查看video 和 render 组 id

      1
      2
      3
      # egrep 'video|render' /etc/group
      video:x:44:
      render:x:106:
    • 在pve主机上查看video 和 render 组 id

      1
      2
      3
      # egrep 'video|render' /etc/group
      video:x:44:
      render:x:105:
    • 需要配置好 idmap

      idmap是一种权限映射机制,它可以将LXC内的uid映射到宿主机上,例如u 0 100000 1005 是说把 LXC 容器里的 uid 0-1004 这 1005 个 uids 映射到 host 上的 100000-101004,格式也就是 LXC起始uid host起始uid 数量

      因此,我们需要将LXC主机的44映射到主机44,LXC主机的106映射到宿主机105,最终要覆盖0-65535,因此在/etc/pve/lxc/108.conf文件内写入以下内容,

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      lxc.cgroup2.devices.allow: c 226:0 rwm
      lxc.cgroup2.devices.allow: c 226:128 rwm
      # 226:0和226:128是通过ls -al /dev/dri 获取到的card0和renderD128设备号,一般不会有变化
      lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
      lxc.idmap: u 0 100000 1000
      lxc.idmap: u 1000 1000 1
      lxc.idmap: u 1001 101001 64535
      lxc.idmap: g 0 100000 44
      lxc.idmap: g 44 44 1
      lxc.idmap: g 45 100045 60
      lxc.idmap: g 105 103 1
      lxc.idmap: g 106 100106 894
      lxc.idmap: g 1000 1000 1
      lxc.idmap: g 1001 101001 64535
    • 在pve主机上配置subuid和subgid

      1
      2
      3
      4
      5
      6
      echo 'root:1000:1' >> /etc/subuid
      cat >> /etc/subgid <<EOF
      root:44:1
      root:105:1
      root:1000:1
      EOF

    ​ 如果没问题的话,启动容器,ls -al /dev/dri 看到的对应组就正确了,而且是 0660 权限!

    image-20240628163726786

  • 官网安装jellyfin

    1
    curl https://repo.jellyfin.org/install-debuntu.sh | sudo bash
  • 开启硬件加速

    硬件加速选择QSV或者VAAPI都可以,下面全开。

    image-20240628162547054

常见问题

  • 硬件解码,图像发灰

    硬件解码发灰是因为在不支持HDR的显示器播放HDR视频不会出现画面发灰的情况,此时可以开启jellyfin色彩映射功能。

    image-20240628162014272

    如果开启后,报播放器错误,那是因为缺少驱动程序,可使用apt-get install intel-opencl-icd进行安装

Proxmox VE安装黑群晖

  • PVE正常创建虚拟机

    • 操作系统选择不适用任何介质
    • 系统默认
    • 磁盘总线选择SATA
    • CPU默认
    • 内存默认
    • 网络模型选择Intel E1000
  • 上传黑群晖引导磁盘img,并将其转换为转化为pve支持格式qcow2

    • 转换磁盘格式为qcow2格式

      1
      qemu-img convert -p -O qcow2 DS918_7.21-69057.img DS918_7.21-69058.qcow2
    • 虚拟机导入磁盘,注意将虚拟机id修改为自己的id,我这里id是108

      1
      2
      3
      4
      qm importdisk 108 DS918_7.21-69057.img HDD
      # 这里直接导入img格式,经测试也是可以的
      # 108表示DSM虚拟机在pve上的id编号
      # HDD表示存储位置为HDD,请修改为自己的
  • 修改引导顺序为导入的磁盘,启动,会跑一些代码,等待结束后,去路由器找到虚拟机的ip地址,直接访问。

  • 上传官方镜像,安装即可

    image-20240628095001822

参考链接

黑群DSM7.X引导文件(2024年4月11日更新)

小技巧

Proxmox VE 6.3 / 6.4 / 7.0 / 7.1 / 7.2 / 7.3 / 7.4 / 8.0 去掉未订阅的提示

1
2
3
4
sed -i_orig "s/data.status === 'Active'/true/g" /usr/share/pve-manager/js/pvemanagerlib.js
sed -i_orig "s/if (res === null || res === undefined || \!res || res/if(/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
sed -i_orig "s/.data.status.toLowerCase() !== 'active'/false/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
systemctl restart pveproxy

确认无误后,重启服务器

1
reboot

Proxmox开启独显直通

修改/etc/default/grub文件,并在里面找到GRUB_CMDLINE_LINUX_DEFAULT=”quiet” 这一行 将这一行替代成下面,目的是开启底层的硬件直通功能。

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

然后找到配置文件/etc/modules 在结尾添加内容,打开pci硬件的直通

1
2
3
4
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

Proxmo挂载NTFS格式硬盘

编辑 /etc/fstab 文件,添加如下行:

其中 UUID=**** 是指定卷(分区)的 UUID,可以使用 blkid 命令查看 UUID 。

1
UUID=**** /data ntfs3

Debian取消休眠

1
2
3
4
5
6
查看状态
systemctl status sleep.target
关闭休眠
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
查看状态
systemctl status sleep.target

Proxmox权限管理

​ 由于Proxmox默认是系统root用户登录,可能会存在某些安全隐患,因此这里可以设置普通用户身份。

  • 创建用户组,在数据中心–权限–群组,可以创建用户组

    image-20231217195938622

  • 给用户组分配权限,在数据中心–权限,可以添加用户组权限,路由选择/,角色选择Administrator

    image-20231217195958998

  • 在数据中心–权限–用户可以添加新用户,其中领域Proxmox VE authentication server表示使用Porxmox内置用户管理,与Linux登录用户不是同一类型用户,可以重命;Linux PAM standard authentication表示使用LInux内置用户管理,实际上与Linux登录系统使用的同一套,此处用户即为LInux系统用户,root用户就是此种类型。群组选择上面创建好的群组

  • 创建好用户后,在数据中心–权限–用户–root,禁用root用户,把已启用的复选框去掉即可。

    image-20231217200137454

有些选项可能必须使用root用户才能更改,因此我们可以使用sudo pveum usermod root@pam -enable 1启用root用户,密码即为Linux系统root密码,记得用完再将root用户禁用回去。


ProxmoxVE教程
https://genioco.github.io/2023/08/01/Guide/ProxmoxVE教程/
作者
BadWolf
发布于
2023年8月1日
许可协议