前言
本文主要介绍在windows上的WSL环境中
(1)运行docker的过程
(2)使用远程桌面连接
(3)插入一些linux的网络知识
虚拟机的问题
运行速度慢,性能差;与宿主机的信息传递不方便(文件传输、文件共享);而且正常的虚拟机配置是无法使用主机的
这时,我们有几种使用Linux系统的方法:
(1)安装双系统。但是无法享受到windows的GUI界面,文件共享不太方便
(2)使用WSL
(3)使用docker。docker和前两者是兼容的,能同时使用。
WSL的安装及使用
WSL相当于在windows上运行的Linux虚拟机,但是相比虚拟机性能更高。缺点是没有图形化界面,但是Linux的精华就在于命令行界面,没有GUI界面倒也无所谓。而且我们之后也有解决办法。
可以参考OI wiki的说明来安装WSL。这里不多做介绍,就说两点:(1)把WSL放在一个存储空间较大的地方,它占地方大(2)windows的磁盘是以挂载的形式供WSL访问的,挂在/mnt/c
,/mnt/d
的目录下
VScode中提供了WSL的插件,用起来特别方便,这样我们点左下角的远程连接标志,就能连接到WSL,在VScode中的命令行中使用Linux环境,正常使用左上角的打开文件夹来查看WSL中的文件,享受到了windows的图形界面。在这个意义上,和远程连接服务器没有什么区别。
安装之后,可以参考笔者的文章从零开始安装linux双系统(ubuntu)深度学习环境配置踩坑全记录,来配置环境。
远程桌面连接
同样可以参考 WSL (Windows 10) - OI Wiki
基本概念
- xfce4:
XFCE4 是一个轻量级的桌面环境,旨在为 Linux 和其他类 Unix 操作系统提供快速、高效的用户界面。
xfce4-session:
会话管理器,负责启动和管理 XFCE4 桌面环境。
提供会话恢复功能,使用户在重新登录时能够恢复上次的工作状态。
xfce4-panel:
面板管理器,允许用户添加和配置面板插件。
常见的面板插件包括任务栏、系统托盘、时钟、快捷启动按钮等。 - x11协议:
客户端-服务器架构:
X11 使用客户端-服务器模型,其中 X 服务器负责管理显示硬件(如屏幕、键盘和鼠标),而 X 客户端是运行应用程序的进程。
客户端和服务器可以通过本地进程间通信(IPC)或网络连接进行通信。
网络透明性:
X11 协议设计为在网络上传输图形数据,这意味着 X 客户端可以在一台机器上运行,而 X 服务器可以在另一台机器上运行。
这种特性使得远程图形应用成为可能,例如,你可以在本地机器上运行图形应用程序,但显示在远程服务器上。
注意x11是一个协议,而下面的VNC,xrdp等是一个解决方案,xfce4仅仅是一个本地的桌面环境,和远程桌面联系不是很紧密。
- 网络知识
具体细节官网有详细说明。
主机使用一个独特的ip地址和WSL通信,就是windows cmd执行ipconfig
后图里的IPv4:
以太网适配器 vEthernet (WSL):
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : xxxxxxxxx
IPv4 地址 . . . . . . . . . . . . : xxx.xx.xx.x
子网掩码 . . . . . . . . . . . . : xxx.xxx.xxx.x
默认网关. . . . . . . . . . . . . :
WSL命令行执行ip route show | grep -i default | awk '{ print $3}'
表示从 WSL 2 看到的 WINDOWS 计算机的 IP 地址 (WSL 2 VM),和上面的结果是一样的。
WSL命令行执行ip addr show
表示WSL认为的WSL ip地址,同时也是ifconfig
命令得到的结果
io 打头的是本地的地址,用来访问本机的网络,一般为127.0.0.1,参考什么是127.0.0.1,如何使用这个IP地址
/etc/resolv.conf 文件是 Linux 和其他类 Unix 操作系统中用于配置 DNS(域名系统)解析的重要文件,通常包含以下几个配置选项:
nameserver:
含义:指定 DNS 服务器的 IP 地址。
格式:nameserver <IP地址>
search:
含义:指定域名搜索列表,用于在解析域名时自动添加后缀。
格式:search <域名1> <域名2> …
domain:
含义:指定默认的域名,用于在解析域名时自动添加后缀。
格式:domain <域名>
我们在配置远程桌面的时候可能要修改它。
连接WSL的桌面之前,首先你要保证你的WSL已经安装了xfce4桌面,下面的教程里也有这一点。
WSLg
WSL有自带的图形界面,官网有介绍,但是笔者为了模拟连接远程服务器的使用,没有用这个东西。也不了解怎么用
windows自带的远程桌面连接
在windows的搜索栏中输入“远程桌面连接”即可,输入Linux视角下自己的ip addr show
命令得到的eth0
那一段中的inet
地址
VcXsrv
使用XLaunch.exe即可,参考:搭建 WSL2 的沙雕版 GUI(VcXsrv+xfce4)
有问题的话,请看解决方案:
Windows11下使用VcXsrv+xfce4实现图形化窗口
WSL2中使用VcXsrv实现xfce4图形界面+声音传输
我在这里按照教程做并没有成功,最后按照GPT说的方法取得了成功,关键在于配置一个环境变量export DISPLAY=:0
参考:彻底理解Linux的DISPLAY变量的作用,DISPLAY环境变量
DISPLAY环境变量格式如下:host:NumA.NumB。
host指Xserver所在的主机主机名或者ip地址, 图形将显示在这一机器上, 可以是启动了图形界面的Linux/Unix机器, 也可以是安装了Exceed, X-Deep/32等Windows平台运行的Xserver的Windows机器.
如果Host为空, 则表示Xserver运行于本机, 并且图形程序(Xclient)使用unix socket方式连接到Xserver, 而不是TCP方式。
DISPLAY=:0.0
的含义如下:
:0
:这部分指定了 X 服务器的显示号(screen number)。在 X Window 系统中,多个显示器可以由不同的显示号标识。:0
通常表示第一个显示器或第一个 X 会话。如果你有多个显示器或多个 X 会话,它们可能会被标识为:1
、:2
等。.0
:这部分指定了会话号(session number)。在同一个显示器上,不同的 X 会话可以由不同的会话号标识。.0
表示第一个会话。如果有多个会话,它们可能会被标识为.1
、.2
等。
你可能还需要使用xhost +local
命令: 表示授权本地的所有用户和进程连接到 X11 显示。按理来说,此时执行sudo startxfce4
,就能看到桌面了,但是我并没有看到,不知道为什么。但是笔者执行xeyes
是可以在本地成功看到图形的,使用matplotlib
库也能在本地显示。
xrdp
XRDP(X Remote Desktop Protocol)是一种开源的远程桌面解决方案,允许用户通过 RDP(Remote Desktop Protocol)协议连接到 Linux 系统。XRDP 使得用户可以像使用 Windows 远程桌面一样,从任何支持 RDP 的客户端连接到 Linux 桌面环境。
网上相关的教程比较多:Xrdp服务安装配置实现Linux远程桌面访问
VNC
笔者认为这个方法是最好用的,但它需要远程的服务器也安装vncserver,并且设置密码。本地需要注册一个VNC账号,连接到特定的端口上。你打开远程主机的VNC时,系统会提示给你一个端口号。
远程的590x对应本地的x端口,输入地址的时候我们要用WSLip addr show
得到的地址后面接上:x
端口才能连接上!
笔者使用这个方法成功在本地看到了桌面。
安装docker
关于docker desktop的安装,官网有介绍。
参考https://yeasy.gitbook.io/docker_practice
docker的基本概念:
- 镜像 image:类似ubuntu的.iso文件,每个人都可以在本地安装一个属于自己版本,但拥有相同的初始环境,好处是省去了配环境的麻烦
- 容器 container:镜像的实例化,一个容器内部可以是一个ubuntu的环境
下载的镜像文件需要被docker load
才能被docker识别成image,本地的docker image
需要被docker run
实例化,如果你退出一个容器,那么你相当于docker stop
了该实例,但是这个实例(所有的更改)还在,你仍然可以docker start
它。执行docker exec -it
是进入容器内部,也就是进入ubuntu的命令行。
每个镜像有一个镜像名,是发行者确定的。每个容器有一个id,是一串数字,你也可以给容器起一个简单的名字,便于在命令行中引用它。
在WSL中使用
参考官网链接:https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/wsl-containers
docker常用命令
首先确保 Docker 守护进程已经在你的系统上运行(不过VScode也会帮你处理这一点!),打开Docker Desktop。
请参考https://yeasy.gitbook.io/docker_practice的超级详细讲解。
笔者常用的就几个命令,注意这些命令都是在WSL环境中执行,而不是docker容器内部,按使用顺序:
- 导入docker镜像,一般是从网上下载的.iso文件,.tar或.tar.gz文件也都可以。这样我们拥有了ubuntu环境
docker load -i 镜像文件路径
- 查看镜像和容器
docker image ls
docker container ls
docker ps -a
查看镜像/容器/进程的详细情况 - 创建docker容器
docker run -it --name <你起的容器名》 -v WSL挂载文件 ubuntu:/mnt/ <镜像名>:<标签> /bin/bash
这个命令-v把WSL挂载在ubuntu的/mnt目录下,-it
表示交互式运行,有命令行 - 进入docker容器,这样,你会进入一个已经运行的容器内部的命令行页面,与主机隔离开来。
docker exec -it my_container /bin/bash
docker exec -it 是 Docker 命令的一部分,用于在已经运行的容器中启动一个新的进程,并提供交互式的终端。这个命令非常有用,特别是在你需要进入容器内部进行调试或执行某些命令时。
-i 或 --interactive:
含义:保持 STDIN(标准输入)打开,即使没有附加。
作用:允许你在终端中输入命令并与容器进行交互。
-t 或 --tty:
含义:分配一个伪 TTY(终端)。
作用:创建一个终端会话,使得你可以看到命令的输出并进行交互。 - 与主机的双向文件传输
docker cp 主机绝对路径 容器名:/home/username/
- 删除容器
docker rm 容器id或容器名
- docker容器命令行中exit退出容器
还可以参考docker重启参数–restart=always的作用
VScode使用
每次打开VScode的时候,点击远程资源管理器(电脑形状)的扩展,你会看到下图选项,选择开发容器
,并且选择你想要连接的容器即可(如果没有可以试试连接到WSL),例如最下面的图。好处在于,你不用每次指定docker的任何命令,插件会帮你自动解决一切