服务器多用户GUI可视化登录和Docker容器可视化

avatar
作者
筋斗云
阅读量:0

服务器多用户GUI可视化登录和Docker容器可视化

1. 目的

Linux 服务器可以像windows服务器一样,支持多用户登录,同时支持可视化界面。每个用户拥有独立的home目录,同时Docker容器和部分软件共享,传输稳定且支持上网。

本文主要以Ubuntu18.04服务器为例,其他高版本系统可能不需要过多配置,实现可能更简单。

2. 多用户同时登录

2.1. 切换root用户
su 

如果root用户不存在,先创建root用户

2.2. 创建新用户

使用useradd或adduser命令来创建一个新的用户。这里以useradd为例,如果你想同时设置用户的密码,可以紧接着使用passwd命令:

useradd username passwd username 

将username替换为你想要创建的新用户名。执行passwd username后,系统会提示你输入新用户的密码两次以确认。

2.3. sudo权限

为了让新用户拥有sudo权限,你需要将该用户添加到sudoers文件中。这可以通过编辑/etc/sudoers文件来完成,推荐使用visudo命令进行编辑,因为这个命令会在保存前检查语法错误,避免因错误配置导致sudo功能失效。

visudo 

在打开的文件中,找到类似这样的一行(如果不存在就手动添加)

# User privilege specification root    ALL=(ALL:ALL) ALL username ALL=(ALL:ALL) NOPASSWD:ALL     # 在其下方添加一行,赋予你的新用户sudo权限 

或者去除NOPASSWD,该用户使用sudo时需要输入自己的密码。

username ALL=(ALL:ALL) ALL 

3. SSH登录

SSH是一种安全协议,用于在不安全的网络中建立安全的远程连接。它允许用户通过加密和认证来远程登录到远程服务器或设备,而不必担心数据被篡改或截获。

如果不需要GUI界面,或者只需要可视化文件结构,使用终端运行程序,推荐使用SSH开发,搭配vscode和remote ssh插件非常高效,适合嵌入式平台。如果在windows 使用xshell等工具,开发也简便。

3.1. 安装服务端
sudo apt-get update  sudo apt-get install openssh-server 

大部分linux系统自带ssh服务端,对于精简版linux系统需要额外安装。

3.2. 配置SSH服务

编辑SSH服务器的配置文件/etc/ssh/sshd_config,使用文本编辑器如vim或nano:

sudo nano /etc/ssh/sshd_config 

SSH也非常复杂,只介绍最常用的四个配置:

  • 端口更改:若要更改默认的22端口,可以修改Port 22为其他端口号。
  • 密钥验证:启用公钥验证,确保PubkeyAuthentication yes未被注释。
  • 密码验证:禁用密码验证以增加安全性(可选),将PasswordAuthentication no取消注释。
  • 访问控制:可以设置允许或拒绝特定IP或子网连接。

示例配置文件如下:

Port 2222 PubkeyAuthentication yes PasswordAuthentication no PermitRootLogin no 

nano 也是linux的命令行编辑器,按下ctrl+o保存,ctrl+x退出,nano比vim更强大,但是界面显示没有vim美观。

设置启动和开机启动 , systemctl 是一个命令行工具,用于控制和管理系统服务和系统单元(unit),它是 systemd 初始化系统的核心组件。systemd 是一种系统和服务管理器,旨在替代传统的 System V 初始化脚本和 Upstart 等系统。.service扩展名的服务都是可以设置开机自启动。

sudo systemctl start sshd  sudo systemctl enable sshd 
3.3. 生成SSH密钥对(可选,推荐)

在客户端机器上生成SSH密钥对(如果还没有的话):

ssh-keygen 

这会在~/.ssh/目录下创建公钥(id_rsa.pub)和私钥(id_rsa)。

3.4. 公钥发送到服务器(密钥验证)

使用ssh-copy-id命令将公钥复制到服务器:

ssh-copy-id 用户名@服务器地址 

或者手动将公钥内容添加到服务器的~/.ssh/authorized_keys文件中。

3.5. 配置SSH客户端(可选)

虽然大多数情况下直接使用ssh 用户名@服务器地址就足够了,但可以在客户端的~/.ssh/config文件中配置主机别名、端口、密钥路径等,使得连接更为便捷:

Host MyServer    HostName server.example.com   User myusername    Port 2222   IdentityFile ~/.ssh/my_key 

配置后仅需运行ssh MyServer即可连接,使用别名登录,不需要输入密码。

使用vscode远程ssh连接可以直接进入服务器内部,开发程序,安装ssh remote插件,左下角打开远程连接,添加ssh主机,就可以简单进行开发。img

4. GUI登录

虽然ssh满足基本需求,但是也无法运行可视化的软件。大部分场景是windows开发,远程连接ubuntu服务器。使用windows自带的RDP协议的远程登录工具,可以连接ubuntu服务器。ubuntu连接ubuntu服务器,还可以使用vnc协议。

本节主要介绍RDP协议的方法实现多用户同时登录。

4.1. RDP实现可视化
4.1.1. 安装xrdp:
sudo apt-get install xrdp 
4.1.2. 下载自动化脚本

在https://c-nergy.be/repository.html网站下载1.3的压缩包,里面有安装脚本(其他系统选择更高版本)

img

解压后只有一个xrdp-installer-1.3.sh脚本,该脚本会自动化配置,开机自启动。

4.1.3. XFCE轻量化

由于原生ubuntu系统比较消耗带宽,我使用了轻量级的桌面XFCE,但是测试后发现不美观(可选)

sudo apt install xfce4 echo "xfce4-session" >~/.xsession  sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak # 备份原文件 sudo nano /etc/xrdp/xrdp.ini sudo nano /etc/xrdp/xrdp.ini 

在[xrdp1]部分找到或添加以下行:

name=xfce lib=libvncserver.so username=ask password=ask ip=127.0.0.1 port=-1 xserverbpp=24 param1=-bs param2=-nolisten param3=tcp param4=0.0 param5=Xvnc param6=-geometry param7=1024x768 

确保xfce4-session是默认会话。保存并关闭文件。

sudo systemctl restart xrdp   # 重启 
4.1.4. windows 远程登录

打开windows 的远程登录工具,输入ubuntu服务器的ip地址,设置登录用户名和密码就可以登录。

imgimg 如果不选择XFCE,远程连接就是ubuntu默认桌面,操作界面与正常ubuntu有点奇怪

img

​ 如果登录失败,在设置中共享更改如下img 如果还失败,检测防火墙是否开启

sudo ufw status 

​ 如果显示开启,则需要关闭或者允许端口通过。

sudo ufw disable  # 关闭防火墙 sudo ufw allow 53/udp  # 允许UDP 53端口 sudo ufw allow 22/tcp  # 允许TCP 22端口 sudo ufw allow 123/tcp 123/udp  # 同时允许TCP和UDP的123端口 

但是RDP协议有点卡,在局域网都比较卡。经过搜索资料,很难做优化,需要较大的带宽。

4.1.5. Linux 远程登录

使用Linux远程连接,可以使用自带的remmina软件,可以直接在软件商店安装。

img 支持RDP和VNC协议,选择RDP协议,然后添加连接

img 还可以设置远程连接的分辨率,ubuntu连接比windows连接更流畅。

img 在服务器一栏填写ip地址,然后是用户名和密码,色深需要设置为RemoteFX(32 bpp),其他可能不兼容。

img 正常输入后就可以登录

img 熟悉的界面,在连接时还可以保存,设置为默认模式,比windows登录流畅,推荐使用ubuntu远程登录。

4.2. Docker容器可视化

有两种方式,优先考虑第一种方式。

4.2.1. 数据卷挂载

基于Docker搭建ORB-SLAM3相关开发环境构建的镜像,不具备可视化的功能,当开发运行一些可视化程序时会报错杀死进程。这是因为构建的镜像没有图形界面功能,比如运行rviz:

img 上面的镜像我额外增加了其他功能,比如创建了一个devuser用户,密码是123。运行rviz时,显示没有可视化的图形界面。

这个错误信息表明没有图形界面环境的Docker容器中运行一个需要图形界面支持的应用程序(在这个例子中是rviz)。Docker容器默认不提供图形界面,因此需要额外的设置来使图形应用在容器中运行。使用数据集挂载调用主机的资源实现可视化。

在具有图形界面的Linux宿主机上运行Docker容器,可以通过X11转发使容器内的应用使用宿主机的显示服务。这通常涉及以下步骤:

  • 确保宿主机安装了X11服务器:大部分Linux发行版默认已安装。
  • 启动Docker容器时启用X11转发:使用-e DISPLAY和-v /tmp/.X11-unix参数来允许容器访问宿主机的显示服务。命令较长,建议在构建镜像时设置CMD命令,启动一个脚本,配置相关环境变量。
docker run -it --rm \ -e DISPLAY=$DISPLAY \ -v /tmp/.X11-unix:/tmp/.X11-unix \ --device /dev/dri:/dev/dri \ your_image_name 

注意 --rm会将停止的容器删除,一般用来简单验证功能,因为容器不能重名。

  • 安装必要的库和设置权限:在Dockerfile中或容器启动后安装必要的库(如libgl1-mesa-glx、libegl1等),并确保容器内的用户属于video群组。

img

上面的方法实际是宿主机监听docker 容器,然后进行可视化。由于docker容器是隔离,需要额外配置。上面无法出现可视化,需要与ros master通信,可以在另外终端使用docker exec 进入容器启动roscore。

img

4.2.2. VNC+noVNC实现web浏览器登录(需要单独配置)

VNC+noVNC实现web浏览器远程登录容器内部,有多种方式可以实现,比如使用docker compose启动多个容器,容器之间端口绑定,或者基于基础镜像安装VNC相关的服务,本节使用已经构建的镜像,启动容器后,安装相关服务,然后将容器提交为新的镜像,只要拷贝镜启动新的容器就可以快速实现。

首先启动一个容器

docker exec -it <container_id_or_name> /bin/bash 

安装相关程序和服务,不要切换到root用户,root用户和一般用户的家目录不一样

sudo apt update sudo apt install -y xfce4 xfce4-goodies tightvncserver wget python3-numpy 

配置 VNC 服务器并设置密码:

vncserver :1 

需要输入输入法和密码,至少6位数,密码设置为123456

然后创建一个启动

nano ~/.vnc/xstartup 

添加以下内容:

#!/bin/bash xrdb $HOME/.Xresources startxfce4 & 

​ 增加权限

chmod +x ~/.vnc/xstartup 

​ 如果报错,检测是否存在目录,没有则手动创建

安装noVNC和 和 websockify:

cd /opt wget https://github.com/novnc/noVNC/archive/v1.2.0.tar.gz tar -xvzf v1.2.0.tar.gz mv noVNC-1.2.0 noVNC wget https://github.com/novnc/websockify/archive/v0.9.0.tar.gz tar -xvzf v0.9.0.tar.gz mv websockify-0.9.0 noVNC/utils/websockify 

创建一个启动脚本 start_vnc.sh,内容如下:

#!/bin/bash # 启动 VNC 服务器 vncserver :1 -geometry 1280x800 -depth 24 

​ 启动 noVNC

/opt/noVNC/utils/novnc_proxy --vnc localhost:5901 --listen 6080 

​ 保存文件并赋予执行权限:

nano /usr/local/bin/start_vnc.sh chmod +x /usr/local/bin/start_vnc.sh 

配置 VNC 服务自启动(某些不支持systemd服务的系统,可选择)

创建一个 systemd 服务文件 /etc/systemd/system/vncserver.service

nano /etc/systemd/system/vncserver.service 

添加以下内容:

[Unit] Description=VNC Server After=syslog.target network.target  Type=simple User=root  # 如果不是root用户,请替换为合适的用户名 PAMName=login PIDFile=/root/.vnc/%H:%i.pid ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :1 > /dev/null 2>&1 || :' ExecStart=/usr/local/bin/start_vnc.sh ExecStop=/usr/bin/vncserver -kill :1  [Install] WantedBy=multi-user.target 

保存并关闭文件。然后启用并启动服务:

systemctl daemon-reload systemctl enable vncserver systemctl start vncserver 

确认防火墙设置(可选择),如果你的容器中有防火墙,确保允许 VNC 和 noVNC 的端口:

ufw allow 5901/tcp ufw allow 6080/tcp 

​ 提交容器为新的镜像,退出容器并提交容器为新的镜像:

docker commit <container_id_or_name>  orb-slam3-vnc-web 

使用新的镜像运行一个新的容器:

docker run -d -p 5901:5901 -p 6080:6080 orb-slam3-vnc-web  /usr/local/bin/start_vnc.sh 

​ 如果不加上/usr/local/bin/start_vnc.sh,需要手动在bash中运行start_vnc.sh脚本:

img 因此不必编写新的DOCKFILE构建新的镜像,因为非常慢,网络也会超时。

现在只需要在浏览器中输入ip地址+6080端口号就可以访问,密码是123456

本机输入 http://localhost:6080/vnc.html

img 如果端口冲突或者某些网络桥接原因可能导致运行失败,需要了解docker 网络相关知识。

5. 其他

-d -p 5901:5901 -p 6080:6080 orb-slam3-vnc-web /usr/local/bin/start_vnc.sh

 ​	如果不加上/usr/local/bin/start_vnc.sh,需要手动在bash中运行start_vnc.sh脚本:  [外链图片转存中...(img-P7fRiBbr-1719629594682)]	因此不必编写新的DOCKFILE构建新的镜像,因为非常慢,网络也会超时。  现在只需要在浏览器中输入ip地址+6080端口号就可以访问,密码是123456  本机输入 http://localhost:6080/vnc.html  [外链图片转存中...(img-bI5Wkh2D-1719629594682)]	如果端口冲突或者某些网络桥接原因可能导致运行失败,需要了解docker 网络相关知识。  ### 5. 其他  解决多用户同时登录Linux服务器,其他方式如noMachine、tight VNC等未尝试,可能网络更流畅。感兴趣可以配置,在此处补充。 

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!