PVE反向代理后VNC无法访问的问题

昨天在nginx上给pve做了一下反向代理,在测试完登录成功后便没多在意以为没问题了。今天在登录pve后访问虚拟机console后发现无法连接,后从官方文档找到reverse proxy 文档,发现配置内容中少了两项:

 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade"; 

nginx文档中描述,此配置是用于做websocket连接的代理选项。

PVE下安装ESXI测试环境

启用嵌套虚拟化

验证节点CPU是否支持硬件辅助虚拟化

# cat/proc/cpuinfo |grep -E '(vmx|svm)'

有结果输出则CPU支持硬件辅助虚拟化,Intel的VTX(vmx)、AMD的AMD-V(SVM)

启用嵌套虚拟化

如果重载模块后 cat /sys/module/kvm_intel/parameters/nested 输出仍然为N,需要重启节点。

  • Intel编辑修改/etc/modprobe.d/kvm-intel.conf,重载模块
# vim /etc/modprobe.d/kvm-intel.conf 
options kvm ignore_msrs=y options kvm-intel nested=Y ept=Y
# modprobe -r kvm-intel kvm; modprobe kvm kvm-intel
  • AMD同intel一样,只是模块名称不同。
# vim /etc/modprobe.d/kvm-amd.conf 
options kvm ignore_msrs=y options kvm-amd nested=Y ept=Y 
# modprobe -r kvm-amd kvm; modprobe kvm kvm-amd

虚拟机设置

在启用嵌套虚拟化后,虚拟机的CPU类型需要设置为host

# qm set <vmid> --cpu cputype=host

或在web界面中直接修改

安装esxi

创建虚拟机的要求

  1. OS Type :Other
  2. CPU Type:host
  3. Network Type: VMWare vmxnet3
  4. NUMA:禁用 (启用NUMA无法启动到安装界面,failed to resolve circular relocation)
  5. SCSI Controller Type: Default (LSI 53C895A)

esxi创建虚拟机默认情况会无法启动,需要打开虚拟化嵌套

vim /etc/vmware/config  
vmx.allowNested = "TRUE"

pve集群中使用zfs replication做HA

这两天因为QNAP NAS意外断电,造成共享的NFS文件系统出现问题,而PVE原有的共享存储都是位于该NAS共享的NFS上。先是发现集群中vm的性能出奇的差,从vnc console登录进系统的时候都要卡许久,后发现大部分nginx转发的后端都出现502、503等无法访问的问题。在QNAP中检查修复文件系统后,服务才恢复正常。 所以想着还是找多两块硬盘,在两节点上各加一块,做ZFS Pool,在集群中使用zfs replicaion 做HA。

创建ZFS pool

要使用replication功能,必须使用ZFS文件系统。在每个节点中创建相同名称的zfs池。需要注意的是,在WEB UI中无法在不同节点中创建相同名称的ZFS存储,所以需要登录到每个节点中创建zfs pool,这里使用的是单硬盘。

# fdisk /dev/sda    ##如果是未分区的硬盘可以忽略
>> 进到 fdisk中按o清空分区表,按w保存退出
#  zpool create -f pve-cluster-zfs /dev/sda

在节点中创建完zfs pool后,就可以在web ui中添加存储。 在web管理页面中,点击Datacenter–Storage–Add–ZFS,填写ID <ZFS_REP>(后面创件虚拟机使用存储),ZFS pool选择先前创建的 pve-cluster-zfs。

创建测试虚拟机

创建新的虚拟机,HARD DISK Storage存储选中Datacenter中创建的ZFS_REP,大小设置为1G即可。

选中刚创建完的虚拟机,点击Replication–Add,将Schedule设置为”*/1″,每分钟创建同步一次。 一分钟后,应看到该任务被执行,如

2021-07-01 23:05:00 102-0: start replication job 2021-07-01 23:05:00 102-0: guest => VM 102, running => 0 2021-07-01 23:05:00 102-0: volumes => ZFS_REP:vm-102-disk-0 2021-07-01 23:05:01 102-0: create snapshot ‘replicate_102-0_1625151900‘ on ZFS_REP:vm-102-disk-0 2021-07-01 23:05:01 102-0: using secure transmission, rate limit: none 2021-07-01 23:05:01 102-0: full sync ‘ZFS_REP:vm-102-disk-0’ (replicate_102-0_1625151900) 2021-07-01 23:05:02 102-0: full send of pve-cluster-zfs/[email protected]replicate_102-0_1625151900 estimated size is 29.1K 2021-07-01 23:05:02 102-0: total estimated size is 29.1K 2021-07-01 23:05:02 102-0: TIME SENT SNAPSHOT pve-cluster-zfs/[email protected]replicate_102-0_1625151900 2021-07-01 23:05:03 102-0: successfully imported ‘ZFS_REP:vm-102-disk-0’ 2021-07-01 23:05:03 102-0: end replication job

schedule:这里设置的schedule */1只是为了快速测速看到结果用,实际使用视情况而定,如考虑虚拟机的镜像大小,网络带宽等。

创建HA

Datacenter–HA–Groups–Create,创建TESTREP组,选中HA节点并设置优先级。 Datacenter–HA–Add,选中VM102,group选择TESTREP。

# ha-manage groupadd TESTREP -nodes "node1:1,node2:2"
# ha-manager add vm:102 --state started --group TESTREP --max_relocate 2

只在部分节点上存储池需要做节点访问限制,restriction限制访问节点,storage.cfg配置如下

# vim /etc/pve/stroage.cfg
zfspool: px-zfs-z1
        pool px-zfs-z1
        content images,rootdir
        mountpoint /px-zfs-z1
        nodes pve
        sparse 1

nodes: 指定节点

如果没有做节点访问限制,虚拟机在HA迁移时候会报错:

Failed to sync data - could not activate storage 'Migration of VM between nodes failed - could not activate storage 'px-zfs-z1', zfs error: 

PVE 使用QDevice作为外部投票节点

新版PVE cluster不支持双机HA,因此cluter ha至少要三个节点以上。不过也可以使用外部投票机制,创建一个2+1的集群,外部设备仅作为投票用,不参与虚拟化其他工作。

  • 外部设备上安装 QDevice-Net
$ sudo apt install corosync-qnetd -y 

因为该设备仅作为投票用,因此找一个行能较低,功耗低的开发板足矣。这里使用一个跑在nextcloud 的rock64,尽量把剩余资源利用上。

  • 在所有PVE节点中安装corosync-qdevice
# apt install corosync-qdevice -y 
  • 在PVE集群中加入投票节点
# pvecm qdevice setup 192.168.0.249

需要注意的是,添加投票节点时,确保所有集群节点都处于在线状态,此处192.168.0.249为上面的rock64。

Ubuntu中使用cockpit管理kvm虚拟机

cockpit

使用cockpit管理kvm需要安装cockpit本身,还有cockpit-machines组件来管理虚拟机

$ sudo apt update
$ sudo apt install -y kpit cockpit-machines
$ sudo systemctl start cockpit

kvm、qemu、libvirt

安装kvm、qemu、libvirt相关工具

$ sudo apt install qemu qemu-kvm libvirt-bin  bridge-utils  virt-manager
$ sudo systemctl start libvirtd
$ sudo systemctl enable libvirtd

创建虚拟机无法启动network相关问题

在安装完成kvm后从cockpit中创建虚拟机时报错:libvirtError: Requested operation is not valid: network ‘default’ is not active,在用virsh 尝试激活default network失败。

$ sudo virsh net-start default

error: Failed to start network default
error: internal error: Failed to initialize a valid firewall backend

从错误信息中可以看到,无法初始化防火墙后端,需要安装firewalld,然后重启libvirtd

$ sudo apt update && sudo apt install firewalld -y
$ sudo systemctl enable --now firewalld
$ sudo systemctl restart libvirtd****

opensuse 安装使用 zerotier

opensuse安装编译环境

$  sudo zypper install -y gcc clang make

编译安装zerotier

$ git clone https://github.com/zerotier/ZeroTierOne
$ cd ZeroTierOne
$ make
$ sudo make install

启动并加入zerotier网络

$ sudo nohup zerotier-one &
$ zerotier-cli join <zerotier network id>

 

 

nginx反向代理出现阻止载入混合活动内容的错误

最近在访问wordpress后台时,经常出现页面加载不全,甚至是完全空白的情况。在打开浏览器调试后发现错误信息:************ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘***************‘. This request has been blocked; the content must be served over HTTPS.

了解该错误造成原因是由于新版浏览器默认禁止混合内容的载入,通过浏览器站点设置可以解决。

另外考虑近期用了给wordpress做了反向代理后才出现这种情况,所以想着是否nginx反向代理是否有设置可以解决改问题,解决方法是在nginx配置文件server或location域中添加:

add_header Content-Security-Policy upgrade-insecure-requests;

然后重启nginx即可,这样在不同的电脑上就不用调整每个浏览器的设置

OpenSuse 编译 deepin-screen-recorder

安装依赖库

 sudo zypper install -y libqt5-qtbase-devel libqt5-linguist-devel xcb-util-devel libdframeworkdbus-devel dtkgui-devel dtkwidget-devel libqt5-qtx11extras-devel libqt5-qtmultimedia-devel procps-devel libXcomposite-devel libXtst-devel libXcursor-devel 
sudo ln -s /usr/bin/lupdate-qt5 /usr/bin/lupdate
sudo ln -s /usr/bin/lrelease-qt5 /usr/bin/lrelease
sudo ln -s /usr/bin/qmake-qt5 /usr/bin/qmake

拉取deepin-screen-recorder

$ git clone https://github.com/linuxdeepin/deepin-screen-recorder
$ cd deepin-screen-recorder
$ git checkout master

拉取回来的默认分支为uos,需要切换到master分支

  • 修改istream.tcc在#include后添加 #undef min
vim /usr/include/c++/10/bits/istream.tcc 
#undef min
  • 修改以下文件,引用QPainterPath
  1. src/utils.cpp
  2. src/widgets/shapeswidget.cpp
  3. src/widgets/tooltips.cpp
#include <QPainterPath>

编译

$ mkdir build
$ cd build
$ qmake ..
$ make -j$(nproc)
$ sudo make install 

PVE修改虚拟机ID

前段时间在pve上做redis实验的时候创建的虚拟机,发现原有创建时ID与先前认为的规范不一致,所以需要修改为正确的ID。

关闭需要修改ID的虚拟机

使用虚拟机名称过滤停止虚拟机实例

# for vm in `qm list |grep redis |awk '{print $1}'`; do qm unlock  $vm;qm stop $vm; done

重命名虚拟机配置文件

进入到/etc/pve/nodes/pve,KVM虚拟机对应目录为qemu-server,lxc容器为lxc,重命名旧配置文件为新ID名称。这次目的只是为了修改虚拟机ID,所以不用做其他操作。

如果是修改了相应的磁盘信息之类的,则需要修改配置文件中相应的项。

# mv 331.conf 131.conf

因为在这里多台虚拟机都是连续的ID号,所以使用for来重命名

# for i in {1..6};do mv 33$i.conf 13$i.conf; done

 

esxi启用ssh客户端

在esxi中查看ssh客户端是否启用

esxcli network firewall ruleset list --ruleset-id sshClient

如果结果非true,使用下面的指令启用ssh客户端

esxcli network firewall ruleset set --ruleset-id sshClient --enabled=true

如果不启用ssh客户端,则无法在esxi中使用ssh连接到其他机器,亦无法使用scp拷贝文件

系统启动前进入fsck修复文件系统

当linux系统运行时候,无法对已挂载文件系统进行尝试性修复,所以当一个ext(n)根文件系统出现损坏时候,需要在开机时使其执行fsck修复根文件系统。

在/下创建名为forcefsck的文件,重启后将执行fsck文件系统修复。

# touch /forcefsck
# reboot

进入系统之后,默认情况下/forcefsck已被移除,如未移除,需要手动移除该文件,避免每次进入系统前都执行fsck。

# rm /forcefsck

 

Debian 10 安装Qtile

目前qtile包由于过旧,在新版debian/ubuntu源中已被移除,所以要使用源码安装qtile。

安装依赖库

如果没有安装pip,先安装pip

# sudo apt install python3-pip

然后安装依赖:

# sudo pip3 install xcffib
# sudo pip3 install --no-cache-dir cairocffi
# sudo apt install libpangocairo-1.0-0

安装Qtile

# git clone https://github.com/qtile/qtile.git
# cd qtile
# sudo pip3 install .
# sudo pip3 install qtile

初始化及启动

复制默认配置文件到个人配置文件夹:

# cp /usr/local/lib/python3.7/dist-packages/libqtile/resources/default_config.py ~/.config/qtile/config.py

在lightdm(或其他如sddm、gdm桌面管理器)中添加Qtile会话:

# sudo vim /share/xsession/qtile.desktop
[Desktop Entry]
Name=Qtile
Comment=Qtile Session
Exec=/usr/local/bin/qtile
Type=Application
Keywords=wm;tiling

 

使用nginx反向代理qbittorrent-nox

qbittorrent-nox设置

  • 修改qbittorrent-nox web ui监听地址

使用qbittorrnet-nox使用帮助查看了一下,没有看到有相关的监听地址选项,只有端口的设置,登入到qbittorrent-nox 的web ui中可以修改监听的ip地址,默认为*

到tools-options-Web UI-Web User Interface (Remote control)中将IP address:修改为127.0.0.1,重启后即无法从外部地址访问qbittorrent-nox。

  • 重启qbittorrent-nox

使用systemd服务重启qbittorrent-nox,具体使用方法参阅Dedian 10 使用qbittorrent-nox web

 sudo systemctl start qbittorrent-nox

nginx反向代理

  • 添加反向代理配置

 location /qbit/ {
    proxy_pass http://127.0.0.1:8080/;
    proxy_http_version      1.1;
    proxy_set_header        X-Forwarded-Host        $http_host;
    http2_push_preload on; # Enable http2 push
  }
  • 启用nginx_http_auth_basic认证

    • 使用htpasswd创建认证文件  # htpasswd -c /etc/nginx/qbit.passwd qbit
    • 在nginx反向代理qbittorrent-nox块中使用创建的认证信息
 location /qbit/ {
    auth_basic "Welcome Qbittorrent"; 
    auth_basic_user_file /etc/nginx/qbit.passwd;
    proxy_pass http://127.0.0.1:8080/;
    proxy_http_version      1.1;
    proxy_set_header        X-Forwarded-Host        $http_host;
    http2_push_preload on; # Enable http2 push
  }
  • 重启nginx

#systemctl restart qbittorrent-nox

到此即可使用nginx访问qbittorrnet-nox的web ui了,http://yourdomain/qbit

 

Dedian 10 使用qbittorrent-nox web

下载安装包

sudo apt install qbittorrent qbittorrent-nox

创建用于运行qbittorrent-nox的用户及组

sudo adduser --system --group qbittorrent-nox

也可以将系统原有用添加到qbittorrent-nox组中,此处用户主要用于qbittorrnet-nox 的systemd启动脚本

添加qbittorrent-nox服务,设置开机自启及启动

sudo vi /lib/systemd/system/qbittorrent-nox.service
[Unit]
Description=qBittorrent Command Line Client
After=network.target

[Service]
Type=forking
User=qbittorrent-nox
Group=qbittorrent-nox
UMask=007
ExecStart=/usr/bin/qbittorrent-nox -d --webui-port=8090
Restart=on-failure

[Install]
WantedBy=multi-user.target

webui-port用于浏览器访问的端口,可以自行更改(非root用户需使用1024-65535以上未被使用的端口)

sudo systemctl daemon-reload
sudo systemctl enable qbittorrent-nox
sudo systemctl start qbittorrent-nox

修改web访问用户及密码

使用8090端口访问qbittorrent web页面,默认用户admin,密码adminadmin

在tools-options-Web UI中找到Authentication,修改username及password。

Windows 10 下使用wsl2编译Openwrt

装备环境-准备并安装wsl

  • 启用wsl

    使用powershell或windows组建添加或删除启用wsl(Windows Subsystem Linux)及虚拟机平台(VirtualMachinePlatform)

    powershell:

    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

    windows组件:

    在windows组件中勾选wsl及VirtualMachinePlatform即可

    使用wsl2依赖于VirtualMachinePlatform,如使用wsl v1无需启用该组件

  • 安装wsl2并安装linux发行版本

    使用wsl2需要升级wsl内核,下载并安装wsl内核,然后到microsoft商店安装linux发行版本(如ubuntu)。

编译openwrt

  • 迁移wsl发行版本(系统分区空间充足的可忽略)

    获取LxRunOffline对系统中wsl发行版本进行目录迁移。

    1. 查看wsl发行版本

      lxrunoffline l

      Ubuntu

    2. 迁移wsl发行版本目录

      lxrunoffline m -n Ubuntu -d d:\test
    3. 确认转移

      lxrunoffline di -n Ubuntu

      d:\test

  • 启用windows大小写区分特性

    fsutil.exe file setCaseSensitiveInfo d:\test enable

    在启用大小写区分前写入的数据保持原有特性,新写入文件才拥有大小写区分特性

  • 获取openwrt源码开始编译

    将openwrt源码拉取到wsl用户目录,执行编译即可

    $ make menuconfig
    $ make V=s