当前位置: 首页 > news >正文

多用户并行访问Linux图形界面

多用户并行访问Linux图形界面

需求背景

随着近2年公司海外业务的拓展,测试同学需要使用windows系统访问谷歌浏览器访问公司官网,公司用的aws+阿里云,阿里的还好,有云电脑这种类似函数服务的实例,不会有太多费用,但aws费用本身就贵,再加上win实例底层就不支持单用户多会话,多用户最多支持2个用户同时登录,再多需要额外付费,部门领导想节约成本,所以有了Linux系统图形化的想法,但我们研发部没有擅长运维领域的同事,所以需要我来搞,说干就干!

实施大纲

先明确需求:最终目的是让多个用户在连接到Linux图形界面,登录谷歌后访问公司官网,由于aws多数实例为例为ubuntu22.04.5,所以采取该操作系统,领导不希望图形界面占用太多带宽,节省流量费用,研究市面上多数开源图形界面xfce是最轻量的,而且由aws开源,原生支持aws实例,远程连接服务也本着轻量原则,采用dcv远程访问,查看图形界面的默认浏览器是否为谷歌浏览器,如果没有就安装谷歌,各个需求明确后需要先在本地测试

 

总结实施步骤

VMware安装虚机+Ubuntu22.04.5server系统

基础设置:设置网卡信息,允许ssh登录,添加安装源,修改时区,设置时钟同步

安装图形界面+远程连接服务

安装谷歌浏览器

添加用户后测试访问

安装步骤

我用的是VMware17,本身对host模式有bug,所以放弃只能用NAT了,硬件给给4c4G50G磁盘,安装系统比较简单,网上一大堆教程,这里不再演示了

网络设置NAT模式后,随手添加入站规则、防火墙规则

image

image

基础设置

虚拟网关地址要从.2开始,改成1无法联网,这是VMware对真实网关的保护机制

image

设置网卡信息
cat /etc/netplan/01-static-network.yaml
# This file is generated from information provided by the datasource.Changes
# to it will not persist across an instance reboot.To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: true
optional: true
addresses: [192.168.10.30/24]
gateway4: 192.168.10.2
nameservers:
addresses: [8.8.8.8,192.168.10.2]

允许ssh登录
vim /etc/ssh/sshd_config
PermitRootLogin yes

systemctl restart sshd

添加apt源
cat /etc/apt/sources.list
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse

deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse

安装基础命令
apt update &&apt -y install chrony net-tools

设置时钟同步

timedatectl set-timezone Asia/Shanghai

vim /etc/chrony/chrony.conf
confdir /etc/chrony/conf.d
pool ntp.org.cn iburst
pool ntp.aliyun.com iburst
pool ntp.tencent.com iburst
sourcedir /run/chrony-dhcp
sourcedir /etc/chrony/sources.d
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
ntsdumpdir /var/lib/chrony
logdir /var/log/chrony
maxupdateskew 100.0
rtcsync
makestep 1.0 3
rtcsync
allow all
leapsectz right/UTC


systemctl enable chrony --now

安装图形界面

apt install -y xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils
reboot

安装dcv远程连接

下载对应系统服务端压缩包
wget https://d1uj6qtbmh3dt5.cloudfront.net/NICE-GPG-KEY
gpg --import NICE-GPG-KEY
wget https://d1uj6qtbmh3dt5.cloudfront.net/2025.0/Servers/nice-dcv-2025.0-20103-ubuntu2204-x86_64.tgz
tar zxf nice-dcv-2025.0-20103-ubuntu2204-x86_64.tgz
cd nice-dcv-2025.0-20103-ubuntu2204-x86_64/
dpkg -i ./nice-dcv-server_2025.0.20103-1_amd64.ubuntu2204.deb \
./nice-xdcv_2025.0.688-1_amd64.ubuntu2204.deb \
./nice-dcv-gl_2025.0.1112-1_amd64.ubuntu2204.deb \
./nice-dcv-web-viewer_2025.0.20103-1_amd64.ubuntu2204.deb

如果报错执行如下后重新安装
apt --fix-broken install
add-apt-repository universe &&add-apt-repository multiverse &&apt update
apt install -y mesa-utils libcrack2 libvdpau1 libxcb-damage0 libxcb-xkb1 libxcb-xtest0 keyutils
如果连依赖都报错只能修复后逐个安装了

修改配置

cd /etc/dcv
cp dcv.conf dcv.conf.bak
cat dcv.conf
[license]
[log]

[session-management]
# 禁用自动创建控制台会话(避免占用)
create-session = false
# 启用虚拟会话(必须)
virtual-session = true
# 每个用户允许的最大并发会话数(0 = 不限制)
max-concurrent-sessions-per-user = 0
# 会话自动终止时间(秒),0 = 永不超时
session-termination-timeout = 0

[webserver]
# 端口配置
https-port = 8443
#启用 Web 访问(webviewer 已装,所以默认开)
web-use-https = true

[session-management/defaults]
[session-management/automatic-console-session]
[display]
[connectivity]
[security]

 

解决依赖

apt update &&apt -y install v4l2loopback-dkms v4l2loopback-utils
选ok

image

lsmod | grep v4l2loopback

vim /lib/systemd/system/dcvserver.service
ExecStartPre=modprobe v4l2loopback

#虚拟会话随着服务重启后就会消失,持久会话在非aws环境需要购买许可证,方便起见在service文件设置自动建立会话,并指定存储目录为各自用户家目录,各用户相互隔离
ExecStartPost=+/bin/bash -c 'sleep 2 &&dcv create-session --owner test1 --type virtual --storage-root /home/test1 --init "/usr/bin/startxfce4" test1 &&dcv create-session --owner test2 --type virtual --storage-root /home/test2 --init "/usr/bin/startxfce4" test2 &&dcv create-session --owner test3 --type virtual --storage-root /home/test3 --init "/usr/bin/startxfce4" test3 &&dcv create-session --owner test4 --type virtual --storage-root /home/test4 --init "/usr/bin/startxfce4" test4'

添加用户,建议用adduser代替useradd,自动建立家目录,默认shell是/bin/bash,不用修改

adduser test

adduser test2

adduser test3

adduser test4

启动服务

systemctl daemon-reload
systemctl enable dcvserver.service --now &&systemctl status dcvserver.service --now
netstat -an |grep ":8443"
本地浏览器访问https://虚机IP:8443

安装谷歌浏览器

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
dpkg -i ./google-chrome-stable_current_amd64.deb
如有报错先修复后安装
apt --fix-broken install
dpkg -i ./google-chrome-stable_current_amd64.deb
echo $?
google-chrome-stable --version
安装中文字体支持
apt update &&apt install -y fonts-noto-cjk fonts-wqy-zenhei fonts-wqy-microhei

验证访问

同时登陆2个用户访问浏览器

image

image

 额外需求

找到测试同学验证发现登录公司官网某些子页面失败,咨询前端说页面需要3D渲染功能,服务器没有显卡,但查看aws的windows实例没有显卡,而windows的cpu可以接替显卡做3D渲染工作,也是webGL功能,具体原理不展开讲,感兴趣的可自己研究,但是dcv服务本身对该功能支持并不友好,在各个浏览器启动参数指定加载webGL也只是一瞬间能识别,随后有不可用,正常显示应如下图

image

通过研究确定可行的替代方案为nomachine或xrdp服务,但是nomachine安装后发现客户端无法连接服务,查看错误日志说寻找官网10.1失败,但我设置的网关为10.2,仔细ai说最新版nomachine为安全考虑会强制认定网关,老版本不会出现该问题,但官网没有历史版本,又没有GitHub仓库,只能使用xrdp了,这种windows原生的远程服务我觉得比vnc更友好,且同样支持多用户登录,开搞!

安装xrdp

apt update &&apt install -y xrdp

echo "xfce4-session" >/home/test/.xsession

echo "xfce4-session" >/home/test2/.xsession

echo "xfce4-session" >/home/test3/.xsession

echo "xfce4-session" >/home/test4/.xsession

chown -R test:test /home/test/

chown -R test2:test2 /home/test2/

chown -R test3:test3 /home/test3/

chown -R test4:test4 /home/test4/

安装后默认开启启动

systemctl status xrdp

ss -tnl |grep 3389

验证访问

由于虚机和本机使用同样的端口,无法让测试通过端口转换来访问我的虚机图形界面,只能在我本地电脑验证,登录谷歌后启用webGL重启浏览器即可,随后访问需要3d渲染的官网页面可以正常加载,另外3个用户也可以同时访问,到此Linux系统多用户登录的需求已完美解决!

image