个人 archWsl2 使用经验

Image of the author

CrazySpottedDove github

informant

informant 是一个用于查看arch资讯的命令

informant list
# 列出新闻
informant check
# 检查未读新闻并显示
informant read <>
# 查看新闻内容

informant会自动添加到sudo pacman -Syu的钩子中,以避免我在更新系统时错过官方对于可能破坏系统的更新的公告。

添加定制脚本到环境变量

编写了一些定制化脚本。使用:

sudo ln -s ~/path/to/myScript.sh /usr/local/bin/scriptShortName

来建立符号链接。/usr/local/bin一般用于存放用户个人的一些内容,这可避免与/usr/bin中的系统依赖产生冲突。

解决wslg与arch兼容问题

No X11 display socket

使用xeyes时报错Error: Can't open display: :0

使用如下方法解决。

ls -la /tmp/.X11-unix
# output
total 0
drwxrwxrwt 2 root root  40 Jan 10 15:34 .
drwxrwxrwt 8 root root 160 Jan 10 15:34 ..

sudo rm -r /tmp/.X11-unix
rm: remove directory '/tmp/.X11-unix'? y

ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix

查看空间占用

du -h --max-depth=1

配置环境变量

~/.zsh_profile中添加

export PATH="${PATH}:/home/username/<...>"

卸载okular后发现wps无法打开

wps 打开需要依赖 phonon-qt6-vlc 。由于卸载 okular 时选择的 -Rs 将它当作其它软件不需要的依赖,将它删去了,就会导致 wps 无法启动。运行:

sudo pacman -S phonon-qt6-vlc

即可让 wps 正常使用。

xdg-open 的默认浏览器打开方式发生改变

仍未解决。目前发现,.zshrc中的BROWSER被设置为wslview,但是在/usr/share/applications中找不到wslview.desktop,而尝试使用

xdg-settings set default-web-browser

时会报错:BROWSER已经设置,无法改变xdg-settings

目前的解决方案:

#在/usr/share/applications中
#推测某次滚动更新导致了chromium.desktop被安装到这里
sudo rm chromium.desktop
#接下来该步需谨慎,之前是检测了系统没有wslview这个命令,于是下载测试,发现有明显卡顿,选择删除
pacman -R wslu
#修改.zshrc,保证 BROWSER 变量有正确的值,xdg-open 能够正确打开浏览器。
export BROWSER=edge
# 此处edge这样获得:
sudo ln -s /mnt/c/Program\ Files\ \(x86\)/Microsoft/Edge/Application/msedge.exe /usr/local/bin/edge

我的另一个想法是,在其它脚本中减少对xdg-open的调用,直接选择对应应用,可能更为清晰,也更不容易出问题。

然而,这样做后,涉及xdg-open调用的内容都变成使用edge了,于是删除

# 修改.zshrc
# export BROWSER=edge

取消这一点后,可以 customize xdg-open命令。修改~/.config/mimeapps.list

[Default Applications]
inode/directory=code.desktop
x-scheme-handler/http=edge.desktop
x-scheme-handler/https=edge.desktop
text/html=edge.desktop
x-scheme-handler/about=edge.desktop
x-scheme-handler/unknown=edge.desktop

这是告诉它网页用edge打开。

然后,我们在~/.local/share/applications创建edge.desktop文件

[Desktop Entry]
Name=Edge
Exec=edge %u
Type=Application
MimeType=x-scheme-handler/unknown;x-scheme-handler/about;text/html;x-scheme-handler/http;x-scheme-handler/https;

最后,在命令行更新桌面程序数据库和xdg-open的默认浏览器:

update-desktop-database ~/.local/share/applications
xdg-settings set default-web-browser edge.desktop

这样就大功告成了。xdg-open将会默认使用edge.desktop打开网页。经测试,速度正常。

中文输入法问题

在 arch 中,可以通过

sudo pacman -S fcitx fcitx-libpinyin

来获取经典的输入法 fctix 以及它的中文拼音拓展。在.zshrc中,需要加入:

# 配置输入法
140 export GTK_IM_MODULE=fcitx
141 export QT_IM_MODULE=fcitx
142 export XMODIFIERS=@im=fcitx

来实现输入法的环境变量配置。

此外,输入法的默认字体可能非常抽象,我们修改/home/dove/.config/fcitx/conf/fcitx-classic-ui.config

Font = Microsoft YaHei
MenuFont = Microsoft YaHei

最后,设置一个启动项:

#fcitx-init.sh
#还没搞清楚自启动钩子,先这么凑合
#!/bin/bash
if [ ! -f /tmp/fcitx-init ]; then
    touch /tmp/fcitx-init
    fcitx 2>/dev/null &
fi

# in terminal
chmod +x ~/myScripts/fcitx-init.sh
sudo ln -s ~/myScripts/fcitx-init.sh /usr/local/bin/fcitx-init

最后在.zshrc加上

fcitx-init

让yazi预览图片

第一种方案是,暂时选择使用 chafa 来预览像素化的图片,这对于 pdf 文件惨不忍睹。

新的解决方案是,选择使用 wezterm 终端代替 windows terminal 终端,并使用 ssh 的方式连接 wsl, 而非直接打开 wsl,这样可以避免 ConPTY 带来的问题。

最新的 windows terminal 版本已经可以支持 yazi 的图片预览功能了。因此,可以不使用 wezterm。

在 wsl 内:

sudo systemctl start sshd

# 检查
sudo systemctl status sshd
# output
 sshd.service - OpenSSH Daemon
     Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; preset: disabled)
     Active: active (running) since Tue 2025-01-07 18:06:56 CST; 9s ago
 Invocation: c7837ffeb6c64f64a595369e682200bc
   Main PID: 27047 (sshd)
      Tasks: 1 (limit: 38317)
     Memory: 1.7M
        CPU: 5ms
     CGroup: /system.slice/sshd.service
             └─27047 "sshd: /usr/bin/sshd -D [listener] 0 of 10-100 startups"

Jan 07 18:06:56 HH systemd[1]: Starting OpenSSH Daemon...
Jan 07 18:06:56 HH sshd[27047]: Server listening on 0.0.0.0 port 22.
Jan 07 18:06:56 HH sshd[27047]: Server listening on :: port 22.
Jan 07 18:06:56 HH systemd[1]: Started OpenSSH Daemon.

然后在 cmd 中:

wezterm ssh dove@127.0.0.1

即可完成登录。

然而,ssh 与 直接 wsl 打开在一些方面有所不同。一是对 DISPLAY 变量并没有直接设置,二是不再包含 windows 中的环境变量。不过,由于quickcode.sh脚本,之前的远程登录服务器被保留,因此 vscode 中依旧可以使用 windows 中的环境变量。目前发现需要做的就是添加对 DISPLAY 变量(gui应用)的配置和 PULSE_SERVER 变量(mpv)的配置:

# ~/.zprofile
export DISPLAY=:0
export PULSE_SERVER=unix:/mnt/wslg/PulseServer

wezterm 的配置

通过 winget 直接下载了 wezterm,它的配置在用户目录下,为.wezterm.lua.

local wezterm = require 'wezterm'
local config = {}

config.background = {
    {
        source = {
            File = 'D:/Pictures/Life/arch-chan-opacity-judged.jpg'
        },
        opacity = 1,
        height = 'Cover',
        horizontal_align = 'Center',
        vertical_align = 'Middle',
        repeat_x = 'NoRepeat',
        repeat_y = 'NoRepeat',
    }
}

config.colors = {
    foreground = "#DCDCDC",
    background = "#282C34",
    cursor_bg = "#DCDCDC",
    cursor_border = "#DCDCDC",
    cursor_fg = "#282C34",
    selection_bg = "#264F78",
    scrollbar_thumb = "#797979",
    ansi = {
        "#282C34", "#E06C75", -- 柔和红
        "#98C379", "#E5C07B",
        "#61AFEF", "#C678DD", "#56B6C2", "#DCDCDC",
    },
    brights = {
        "#5A6374", "#EC8A88", -- 亮红
        "#4EC9B0", "#D7BA7D",
        "#569CD6", "#C586C0", "#9CDCFE", "#FFFFFF",
    },
}
-- 滚动条尺寸为 15 ,其他方向不需要 pad
config.window_padding = { left = 0, right = 15, top = 0, bottom = 0 }
-- 启用滚动条
config.enable_scroll_bar = true

-- 取消 Windows 原生标题栏
config.window_decorations = "INTEGRATED_BUTTONS|RESIZE"

-- 设置字体
config.font = wezterm.font_with_fallback({
  { family = "Fira Code", weight = "Regular" }, -- 正常字体
  { family = "Fira Code", weight = "ExtraBold" },    -- 加粗字体
  "Symbols Nerd Font",                          -- 备用字体
})

-- 启用文本加粗
config.bold_brightens_ansi_colors = true
config.font_size = 12.0 -- 调整字体大小

-- 取消关闭时的提醒
config.window_close_confirmation = 'NeverPrompt'

wezterm.on('gui-startup', function(cmd)
  local tab, pane, window = wezterm.mux.spawn_window(cmd or {})
  window:gui_window():maximize() -- 最大化窗口
end)

config.keys = {
    {
        key = 'd',
        mods = 'SHIFT|ALT',
        action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain'},
    },
    {
        key = 's',
        mods = 'SHIFT|ALT',
        action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain'},
    },
    {
        key = 'j',
        mods = 'ALT',
        action = wezterm.action.ActivatePaneDirection('Left'),
    },
    {
        key = 'l',
        mods = 'ALT',
        action = wezterm.action.ActivatePaneDirection('Right'),
    },
    {
        key = 'i',
        mods = 'ALT',
        action = wezterm.action.ActivatePaneDirection('Up'),
    },
    {
        key = 'k',
        mods = 'ALT',
        action = wezterm.action.ActivatePaneDirection('Down'),
    },
    {
        key = 'w',
        mods = 'ALT',
        action = wezterm.action.CloseCurrentPane { confirm = false },
    }
}

config.mouse_bindings = {
    {
        event = { Down = { streak = 1, button = 'Right' } },
        mods = 'NONE',
        action = wezterm.action_callback(function(window, pane)
            local selection = window:get_selection_text_for_pane(pane)
            if selection and #selection > 0 then
                -- 如果有选中内容,则复制到剪贴板
                window:perform_action(wezterm.action.CopyTo 'Clipboard', pane)
                window:perform_action(wezterm.action.ClearSelection, pane)
            else
                -- 如果没有选中内容,则粘贴剪贴板内容
                window:perform_action(wezterm.action.PasteFrom 'Clipboard', pane)
            end
        end),
    },
}
return config

直接安装 docker

archwsl 支持不使用 DockerDesktop 来使用 docker.

sudo pacman -S docker
#systemd enabled
sudo systemctl start docker.service
sudo systemctl enable docker.service
# 将用户添加到 docker 组中
sudo usermod -aG docker $USER
# 重新登录
# 检查 docker 能否使用
docker ps -a
# expected output
# CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

同时,安装docker-buildx使用新版构建器。

sudo pacman -S docker-buildx

配置 pacman 源

sudo rankmirrors -n 5 /etc/pacman.d/mirrorlist
# 将结果写入 /etc/pacman.d/mirrorlist

为了让sudo(sudo pacman -Syu)可以享受网络代理,在/etc/sudoers中添加

# 规定可以传递到 sudo 的环境变量
Defaults env_keep += "http_proxy https_proxy no_proxy"

网络与 docker 网络

wsl 原生 docker 网络配置

锁定使用旧版本软件

yazi 在某一次更新后,在 wezterm 中使用会有明显延迟并报错。更新的版本中,预览也无法正常工作了。因此,需要锁定它的版本。

首先,访问 Arch Linux Archive。在其中找到需要的包,然后复制你需要的版本的 url。

然后,在 /etc/pacman.conf 中,设置 IgnorePkg:

# for example
IgnorePkg = yazi

这一步是为了防止系统更新的时候将旧版本的软件又更新了。

最后,使用命令

# 最后一个参数为对应的 url
sudo pacman -U https://archive.archlinux.org/packages/y/yazi/yazi-0.4.2-2-x86_64.pkg.tar.zst