Created: 2022-12-10 20:32:54
Status: #linux

原因和安装思路

好几年没折腾服务器,VM,Docker等东西。近期进行了知识更新。win11开始,hyperv偏windows和服务器内置vm模拟(我个人更喜欢更轻便的virtualbox运行旧系统),并且发现wsl2基本上已原生支持linux。但默认只能安装应用商店的unbuntu等系列,并且会把发行版默认安装在C盘。 我想测试用用Archlinux,并且想将这些发行版统一放到D盘。
两种方式:

  1. 别人做好的ArchWSL,需要依赖别人更新,对我来说不利于理解WSL。
  2. 借助docker源自己安装导入。
    这里使用第二种方式。

为了操作简便,先安装ubuntu

  1. 应用商店安装,或是命令行:
    wsl --install -d Ubuntu
    安装完成后想怎么设置可以自己搜索

  2. 安装docker desktop,可以网页download安装或命令行:
    winget install Docker.DockerDesktop
    安装它,操作系统需要重启,重启后启动,需要确保General里面 Use the WSL 2 based engine勾选打上;并且Resources的WSL INTEGRATION里的Enable integration wth my default WSL distro勾选上,以及下面Ubuntu选上。

从docker上面拉需要的发行版,不仅是archlinux

在docker desktop里操作或命令:
docker pull archlinux 等待安装完成latest
docker create -i archlinux bash
会出现很长一串字符,我们需前8位保存一下,后面导出有用,如: 739f913a
启动这个docker
docker container start 739f913a
使用shell通过docker挂载过去
docker exec -it 739f913a /bin/bash

(archlinux专用)

sudo pacman -S reflector 使用

1、需要全球最新:下载速度进行排序,并筛选出前 100 个最近同步的镜像,最后将结果覆写到 /etc/pacman.d/mirrorlist 文件

sudo reflector --verbose --latest 100 --sort rate --save /etc/pacman.d/mirrorlist

2、国内常用的:选择在最近 同步的,并且是位于中国的12个镜像,然后根据下载速度进行排序,最后将结果覆写到 /etc/pacman.d/mirrorlist 文件

sudo reflector --verbose -c China --latest 12 --sort rate --threads 100 --save /etc/pacman.d/mirrorlist 

docker默认把archlinux挂载成root后,需要初始化一下pacmankey
pacman-key --init
更新系统
pacman -Syu
安装sudo和vim等自己需要的软件
pacman -Syu sudo vim

增加用户,
useradd -m -G wheel username
passwd username
用下面命令找到 %wheel ALL=(ALL) ALL 反注释,并让wheel用户组可以sudo
EDITOR=vim visudo
退出archlinux bash
exit

将linux发行版放到自己管理的目录

我放在D盘的 D:\Docker\wsl
cd /mnt/d/Docker/wsl
mkdir archlinux

上面退出后当前位置在ubuntu linux中从docker导出当前发行版
docker export 739f913a > /mnt/d/Docker/wsl/archlinux.tar
退出ubuntu,现在 D:\Docker\wsl 目录上应该有archlinux.tar文件
exit

导入tar文件到D:\Docker\wsl\archlinux 目录
$ wsl --import archlinux ./archlinux archlinux.tar
重启windows Terminal终端,这时候终端应该能进入archlinux了,具体archlinux的其他设置请参考其他文章
我们可以选择把docker desktop和Ubuntu都卸载掉或保留。

其他注意点

使用systemd

wsl默认使用windows自己的init,但wsl2最新版已支持systemd,有两种方式,一种是放到windows用户目录C:\Users\<UserName>\.wslconfig;第二种就是放到linux发行版的/etc/wsl.conf里。

1
2
[boot]
systemd=true

或命令:
echo -e "[user]\ndefault=$myUsername" >> /etc/wsl.conf
用top命令查一下,如果pid 1 是systemd就OK,如果是init就说明没成功

想默认用某个用户登录

可以在发行版linux里的/etc/wsl.conf里记录,

1
2
[user]
default=username

或在Windows终端Terminal的”设置”的Json文件里增加

1
2
3
"name": "archlinux",
"source": "Windows.Terminal.Wsl",
"commandline": "wsl.exe -u teirdal -d archlinux"

或启动的时候指定某个发行版用某个用户登录

1
wsl -u root -d <distro> # "-d <distro>" is only needed for non-default instances

wsl迁移当前ubuntu到其它目录的一些命令参考

输入以下命令开始导出,需要保证磁盘有足够的空间,建议安装完发行版就立刻操作,大概需要1G左右空间存储压缩包。

wsl --export Ubuntu-20.04 wsl-ubuntu20.04.tar

导出完之后需要取消注册发行版

wsl --unregister Ubuntu-20.04

等待导出完成,这里以存储在D盘为例,执行以下代码开始导入。

wsl --import Ubuntu-20.04 D:\Ubuntu-20.04 .\wsl-ubuntu20.04.tar --version 2
如果存储路径有空格就使用以下代码,将全路径加上单引号。

wsl --import Ubuntu-20.04 'D:\Program Files\Ubuntu-20.04' .\wsl-ubuntu20.04.tar --version 2
等待导入完成,这个时候登进去就是root账户,如果需要使用刚才你设置的用户执行以下代码
ubuntu2004 config --default-user <你的用户>