WSL常见问题

type
status
date
slug
summary
tags
category
icon
password
💡
最近在wsl上装了个ubuntu-20.04,过程折腾踩的坑总结在下面,后面会不定期更新补充
 
 

WSL的备份和迁移

解决的问题

1.需要把WSL迁移到其他电脑上工作。
2.默认情况下WSL安装位置在系统盘,系统盘容量不足。
3.像使用虚拟机软件一样备份你正在使用的WSL系统。

步骤

下面的命令都在Powershell里面执行。 开始之前你需要先记下需要迁移的WSL系统的用户名

查看需要迁移的WSL是否在运行

终止WSL运行

两条命令都可以,任选其一。

导出

将WSL系统导出到指定目录,得到一个tar格式的归档。
注意:指定目录,也就是<FileName>字段,需要给出导出的归档文件名称,只给出目录位置会报错。

注销原系统

根据你的需要自行选择是否注销原来的WSL。

导入

将导出的WSL系统导入到指定位置,需要等待一段时间。
在安装目录看到了一个vhdx文件,导入成功。
notion image
image.png

设置登录用户

新还原的WSL系统的默认用户会变成root,不能使用原来安装的软件,必须修改默认用户。
把Debian.exe 替换为你使用WSL分发版执行文件名称,如ubuntu2204.exe等等。 username是原来WSL系统的用户名。 重新启动新的WSL系统,你就可以继续使用了。

其他

设置默认发行版

要设置与 wsl 命令一起使用的默认 Linux 发行版,请输入
例如,从 PowerShell/CMD 输入 wsl -s Debian,将默认发行版设置为 Debian。 现在从 Powershell 运行 wsl npm init 将在 Debian 中运行 npm init 命令。 要在 PowerShell 或 Windows 命令提示符下运行特定的 WSL 发行版而不更改默认发行版,请使用命令 wsl -d ,将 替换为要使用的发行版的名称。

删除导出的归档文件

 
ubuntu终端背景色:R=48, G=10, B=36
 

wsl Linux子系统和windows主机文件系统互相访问

一、Windows中查看Linux子系统目录
打开文件资源管理器(快捷方式:win+e),在窗口地址栏输入
\\wsl$
敲击回车就可以看到所有的子系统的共享文件了。如图:
notion image

二、Linux子系统中查看Windows目录

在子系统命令行输入:
cd /mnt
,就可以看到windwos系统目录。如图:
notion image
 
 

在WSL中通过APT方式安装Docker

notion image
在WSL中通过APT方式安装Docker:
打开WSL终端,更新系统软件包列表。执行以下命令:
 
更新软件包列表。执行以下命令:
安装Docker Engine。执行以下命令:
验证Docker安装是否成功。执行以下命令来检查Docker版本:
如果成功显示Docker的版本信息,说明安装成功。
notion image
安装好 Docker 之后,就可以使用 Docker 来创建、运行和管理容器。
以下是一些常见的 Docker 操作和用法:
拉取镜像(Pull Image):使用 docker pull 命令从 Docker 镜像仓库中拉取镜像。例如,要拉取官方的 Ubuntu 镜像,可以执行以下命令:
docker pull ubuntu
运行容器(Run Container):使用 docker run 命令在容器中运行镜像。例如,要在 Ubuntu 镜像中运行一个交互式的 Bash 终端,可以执行以下命令:
docker run -it ubuntu bash
这将启动一个新的容器,并进入容器的 Bash 终端。你可以在容器中执行命令,就好像在一个独立的虚拟机中一样。
查看容器(List Containers):使用 docker ps 命令查看正在运行的容器。默认情况下,它只显示正在运行的容器,如果要查看所有容器,可以添加 -a 参数。
docker ps
停止容器(Stop Container):使用 docker stop 命令停止容器的运行。你需要提供容器的 ID 或名称作为参数。
docker stop <container_id>
删除容器(Remove Container):使用 docker rm 命令删除停止运行的容器。同样,你需要提供容器的 ID 或名称作为参数。
docker rm <container_id>
查看镜像(List Images):使用 docker images 命令查看已经下载到本地的镜像。
docker images
删除镜像(Remove Image):使用 docker rmi 命令删除不再需要的镜像。你需要提供镜像的 ID 或名称作为参数。
docker rmi <image_id>
docker pull镜像的默认地址:
在 Linux 系统上,默认存储路径为/var/lib/docker;在 macOS 系统上,默认存储路径为/var/lib/docker;在 Windows 系统上,默认存储路径为C:\ProgramData\Docker
查看docker pull镜像的地址:
  • Linux:docker info --format '{{.DockerRootDir}}'
  • macOS:docker info --format '{{.DockerRootDir}}'
  • Windows (PowerShell):docker info --format '{{.DockerRootDir}}'
例如:pull ubuntu官方镜像(x86):
docker pull ubuntu
这将从 Docker 镜像仓库中拉取最新的 Ubuntu 官方镜像。
默认情况下,该命令将获取 x86 架构的镜像
获取其他架构(如 ARM 架构)的镜像,可以通过在镜像名称后添加架构标签来指定。
例如:
docker pull ubuntu:arm64v8
这样将获取适用于 ARM 架构的 Ubuntu 官方镜像。
以下是拉取树莓派官方镜像的示例命令:
docker pull arm32v7/debian
这将从 Docker Hub 拉取适用于树莓派的官方 Debian 镜像(32 位 ARM 架构)。
docker pull arm64v8/ubuntu
这将从 Docker Hub 拉取适用于树莓派的官方 Ubuntu 镜像(64 位 ARM 架构)。
拉取完镜像后,你就可以使用 docker run 命令在容器中运行 Ubuntu 镜像,例如:
docker run -it ubuntu bash
这将在一个交互式的 Bash 终端中启动一个新的 Ubuntu 容器。
在成功运行 Ubuntu 镜像的 Docker 容器后,你可以执行以下一系列操作:
  1. 进入正在运行的容器:如果你在运行容器时使用了 -it 参数(如 docker run -it ubuntu bash),则你将进入一个交互式的终端会话。你可以在容器内执行命令、浏览文件系统等操作。
  1. 挂起容器:如果你想在保持容器状态的同时暂停它,可以使用以下命令挂起容器: docker pause <container_id> 这会暂停容器的所有进程,使其停止运行,但容器的状态仍然保留。
  1. 恢复挂起的容器:如果你想恢复之前挂起的容器,以便继续运行,可以使用以下命令: docker unpause <container_id> 这会解除对容器的挂起状态,使其继续运行。
  1. 停止容器:如果你想完全停止容器的运行,可以使用以下命令停止容器: docker stop <container_id> 这会向容器发送停止信号,使其停止运行并退出。
  1. 重启容器:如果你想重新启动已停止的容器,可以使用以下命令: docker start <container_id> 这会重新启动容器,并使其运行起来。
  1. 进入运行中的容器终端:如果容器正在运行,但你希望重新进入容器的交互式终端会话,可以使用以下命令: docker exec -it <container_id> bash 这将创建一个新的终端会话,并连接到正在运行的容器。
  1. 查看容器的状态:要查看容器的详细信息和状态,可以使用以下命令: docker ps -a 这会显示当前所有容器的列表,包括容器的状态、运行时间和其他相关信息。
以上是一些常见的在运行后对 Docker 容器进行操作的示例。除了这些基本操作,你还可以进行更高级的操作,如修改容器配置、复制文件到容器中、绑定挂载卷等,以满足特定的需求
Docker 的官方文档网站:https://docs.docker.com/
其他Doker相关指南:
  • Get Started:这是一个入门指南,可以帮助你开始使用 Docker。
  • Guides:这些指南涵盖了从容器基础知识到更高级的用法和最佳实践。
  • Reference:这个部分提供了 Docker 命令和配置文件的详细参考信息。
  • Docker CLI:这是 Docker 命令行接口(CLI)的完整文档,包含了各种命令和选项的说明。
  • Docker API:如果你希望使用 Docker 的 API 进行编程或自动化操作,这部分提供了 Docker API 的详细文档。
  • Dockerfile:这个部分介绍了 Dockerfile 的语法和构建过程,可以帮助你创建自定义的 Docker 镜像

Docker运行Easyconnect

深信服的 EasyConnect 客户端非常垃圾,不但会在开机时以 root 自动启动,还会往系统安装自己的 CA 根证书。这给使用者带来极大的安全隐患。今天分享一种方案,将其封印到 Docker 容器里,消除隐患。

安全隐患

我发现该软件有三个问题。

第一,依赖已经废弃的系统特性

如果你在新版的 macOS 上打开 EasyConnect,你会收到如下提醒:
notion image
依赖已经废弃的系统特性
而在最新的 macOS Big Sur 上,该软件已经无法正常工作。

第二,偷偷安装自己的 CA 根证书

notion image
偷偷安装自己的 CA 根证书
跟深信服沟通后我们得到如下达复:
该受信任根证书签发给了本地回环地址 127.0.0.1 一张证书,用于用户使用浏览器登陆 SSLVPN 过程中, 浏览器和SSLVPN客户端之间建立安全的https通信时使用。
在系统中导入该受信任根证书,是为了消除证书告警,为用户提供更好的使用体验
避免无法正常使用浏览器方式登陆SSLVPN,无其他特殊用途。
并得到如下承诺:
1.该Sangfor Technologies Inc.根证书私钥信息保存在内网,并由专人保管,不会泄露出去。
2.该Sangfor Technologies Inc.根证书只用于颁发给127.0.0.1 用于SSLVPN BS登陆使用,不会签发其它证书做其他用途
不管你信不信,反正我是不信的。请务必删除此 CA 证书

第三,配置开机自动启动的进程

进程名叫 EasyMonitor,以 root 帐号启动,你的一举一动它都有能力监听。你还不能关掉,关掉就无法使用 VPN 功能了。
notion image
开机自启的 EasyMonitor 进程
反馈给深信服,还不知道什么时候改;所在公司更是不太可能更换 VPN 服务商。怎么办?只有自己动手了。

Docker 运行 X11 程序

方案也是非常简单,在 Docker 容器里同时运行 EasyConnect 和 Socks5 代理。然后配置宿主机的工具,在需要访问公司内网的时候走 Socks5 代理就行。
这样就可以把 EasyConnect 隔离到一个受控的容器环境,再也不用担心它做恶了。
实现这个目标,需要克服一个问题——如何在 Docker 中运行 X11 程序。
我们知道,macOS 并非原生支持 Docker。我们所用的 Docker 也是一台 Linux 虚拟机。在 Docker 中运行 mysql/redis/nginx 这类的命令行程序是没有问题的;但 Firefox/EasyConnect 这样依赖 X11 图形系统的程序能不能在 Docker 中运行呢?答案是肯定的。
简单 Google 了一下,我找到了一篇文章1
X11 系统天生就支持远程显示。简单来说,机器 A 上的 Firefox 进程可以把显示的内容通过网络传给机器 B 并在 B 的屏幕上展示。macOS 可以运行 X11 显示服务器为 docker 中的程序绘制 GUI 界面。
为此,需要安装 XQuartz2,这是苹果官方的 X11 显示服务。安装后还得开启网络服务支持。
notion image
开启 XQuartz 的网络支持
最后需要注销当前用户并重新登录才能生效。我们先实验一下 XQuartz 的功能。我们以 Firefox 为例:
不出意外的话,你会看到 Firefox 的界面。但是,这个 Firefox 界面比较粗糙,没有适配 macOS 的高清屏。苹果已经不再为 XQuartz 开发新功能。要啥自行车。

Docker 运行 EasyConnect

调通 docker + XQuartz 组合后,我们就要处理 EasyConnect 的问题了。
在这里我要特别感谢 Hagb 同学,他慷慨地跟大家分享了自己在 EasyConnect 容器化的实战经验,并开放了源码3
Hagb 同学还为大家准备好了 docker 镜像,大家可以在其基础上定制自己的工具。该镜像为大家解决了包依赖、防火墙规则配置、Socks5服务配置等几乎所有的问题,基本达到了开箱即用的效果。
执行如下命令
其中$IP是你本机的IP,$SOCK5_HOST$SOCK5_PORT是 Socks5 服务配置。稍等片刻,就能看到 EasyConnect 的登录界面了。
特别需要注意的是-v ~/.config/bvpn:/root参数, 其含义是将~/.config/bvpn目录映射到容器的/root目录。EasyConnect 会把登录信息记录到/root/.config/bvpn/easy_connect.json,下次再登录的时候就不用重复填写了。(这也是 Hagb 同学为大家提供的便利)
如果一切顺利,你会在本机的$SOCK5_PORT端口上获取一个 Socks5 代理服务。
 
 
访问公司 web 服务,可以使用 SwitchyOmega 等工具设置一个 Socks5 代理。访问公司内网的 git/ssh 服务,则需要在你的~/.ssh/config添加如下配置
更多细节请参考 Proxy SSH Over SOCKS (the easy way)4

一键脚本

我写了一个脚本,一键启动 EasyConnect 并配好各项配置,在退出的时候自动清理配置,非常方便。
好了,到此就介绍的差不多了。欢迎有需要的同学尝试。我还写了一篇自动登录EasyConnect的文章5,供大家参考。

WSL安装Chrome

首先运行如下命令配置 locale
找到 *zh_CN.UTF-8 UTF-8* 并取消注释,然后保存并退出。
运行命令 sudo locale-gen 进行编译

设置默认语言是中文

编辑文件 /etc/default/locale
将文件内容更改如下,重启 wsl 生效。

WSL中使用中文输入法

在WSL(Windows Subsystem for Linux)中使用输入法,你可以参考以下步骤:

安装输入法

  1. 在Ubuntu中,使用命令行安装dbus-x11、im-config、fonts-noto、fcitx、fcitx-pinyin、fcitx-sunpinyin和fcitx-googlepinyin等输入法相关的包[2][6]:

    设置输入法

    1. 在Ubuntu中,使用命令行设置输入法为fcitx输入法[2][6]:
      1. 如果fcitx输入法无法配置输入法或无法启动,你可以尝试在命令行中输入fcitx-autostart[2][6]。

        重启WSL

        1. 在Ubuntu中,使用命令行重启WSL[2][6]:

          测试输入法

          1. 在Ubuntu中,你可以尝试在文本编辑器或其他应用程序中切换到中文输入法进行测试[6]。
          以上步骤应该能帮你在WSL中启用中文输入法。如果你在实际使用中遇到问题,欢迎继续提问。
           
          以下未验证通过
          安装输入法
          如果没有图形界面
           
          启用输入法
           
           

          WSL安装VSCode

          在Ubuntu上安装Visual Studio Code主要可以通过以下步骤实现:

          方法一:图形安装

          1. 在Ubuntu桌面找到应用中心[1];
          1. 在软件中心中,搜索Visual Studio Code[1];
          1. 在页面中可以直接选择安装[1]。

          方法二:命令安装

          1. 在终端命令行中依次输入以下命令:
            1. 耐心等待一会儿之后,终端窗口上会出现Installation done,vscode就安装完成了[2]。
            1. 接着我们在安装的路径下,找到可执行文件code,并输入命令./code就可以打开vscode了[2]。

            方法三:通过Ubuntu软件商店直接安装

            1. 在桌面左下角应用程序中心找到“ubuntu软件”,点击进入[2];
            1. 在搜索框搜索“visual studio code”,找到“visual studio code”并点击进入[2];
            1. 点击“安装”按钮,即可安装成功[2]。
            以上三种方法都可以实现在Ubuntu上安装Visual Studio Code,你可以根据自己的需求和熟悉程度来选择合适的安装方法。
            参考资料

            WSL挂载ext4分区

            GET-CimInstance -query "SELECT * from Win32_DiskDrive"
            GET-CimInstance -query "SELECT * from Win32_DiskDrive”
            \\.\PHYSICALDRIVE1
            wsl --mount <DiskPath>

            Mounting an unpartitioned disk

            If you have a disk that doesn't have any partitions, you can mount it directly using the wsl --mount command. First you need to identify the disk.
            1. Identify the disk - To list the available disks in Windows, run:
              1. PowerShellCopy
                The disks paths are available under the 'DeviceID' columns. Usually under the \\.\PHYSICALDRIVE* format.
            1. Mount the disk - Using PowerShell, you can mount the disk using the Disk path discovered above, run:
              1. PowerShellCopy
                notion image
            Mounting a partitioned disk
            If you have a disk that you aren't sure what file format it is in, or what partitions it has, you can follow the steps below to mount it.
            1. Identify the disk - To list the available disks in Windows, run:
              1. PowerShellCopy
                The disks paths are listed after 'DeviceID', usually in the \\.\PHYSICALDRIVE* format.
            1. List and select the partitions to mount in WSL 2 - Once the disk is identified, run:
              1. PowerShellCopy
                This will make the disk available in WSL 2. (In the case of our example, the <DiskPath> is \\.\PHYSICALDRIVE*.
            1. Once attached, the partition can be listed by running the following command inside WSL 2:
              1. BashCopy
                This will display the available block devices and their partitions.
            Inside Linux, a block device is identified as /dev/<Device><Partition>. For example, /dev/sdb3, is the partition number 3 of disk sdb.
            Example output:
            BashCopy
            Identifying the filesystem type
            If you don't know the type of filesystem of a disk or partition, you can use this command:
            BashCopy
            This will output the detected filesystem type (under the TYPE="<Filesystem>" format).
            Mount the selected partitions
            Once you have identified the partitions you want to mount, run this command on each partition:
            PowerShellCopy
            Note
            If you wish to mount the entire disk as a single volume (i.e. if the disk isn't partitioned), --partition can be omitted.
            If omitted, the default filesystem type is "ext4".
            Access the disk content
            Once mounted, the disk can be accessed under the path pointed to by the config value: automount.root. The default value is /mnt/wsl.
            From Windows, the disk can be accessed from File Explorer by navigating to: \\wsl$\\<Distro>\\<Mountpoint> (pick any Linux distribution).
            Unmount the disk
            If you want to unmount and detach the disk from WSL 2, run:
            PowerShellCopy
            Mount a VHD in WSL
            Note
            WSL from the Microsoft Store introduces a new argument to directly mount a VHD: wsl --mount --vhd <pathToVHD>
            You can also mount virtual hard disk files (VHD) into WSL using wsl --mount. To do this, you first need to mount the VHD into Windows using the Mount-VHD command in Windows. Be sure to run this command with administrator privileges. Below is an example where we use this command, and also output the disk path. Be sure to replace <pathToVHD> with your actual VHD path.
            PowerShellCopy
            You can use the output above to obtain the disk path for this VHD and mount that into WSL following the instructions in the previous section.
            You can also use this technique to mount and interact with the virtual hard disks of other WSL distros, as each WSL 2 distro is stored via a virtual hard disk file called: ext4.vhdx. By default the VHDs for WSL 2 distros are stored in this path: C:\Users\[user]\AppData\Local\Packages\[distro]\LocalState\[distroPackageName], please exercise caution accessing these system files, this is a power user workflow. Make sure to run wsl --shutdown before interacting with this disk to ensure the disk is not in use.
            notion image
            Command line reference
            Mounting a specific filesystem
            By default, WSL 2 will attempt to mount the device as ext4. To specify another filesystem, run:
            PowerShellCopy
            For example, to mount a disk as fat, run:
            Copy
            Note
            To list the available filesystems in WSL2, run: cat /proc/filesystems
            When a disk has been mounted via WSL2 (Linux file system), it is no longer available to mount via an ext4 driver on the Windows file system.
            Mounting a specific partition
            By default, WSL 2 attempts to mount the entire disk. To mount a specific partition, run:
            Copy
            This only works if the disk is either MBR (Master Boot Record) or GPT (GUID Partition Table). Read about partition styles - MBR and GPT.
            Specifying mount options
            To specify mount options, run:
            PowerShellCopy
             

            压缩虚拟磁盘

            diskpart
            select vdisk file="C:\Users\huoch\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx”
            compact vdisk

            离线安装WSL和Linux发行版

            安装kali-linux

            管理员权限运行
            运行结果如下
            Loading...

            没有找到文章