ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WSL2中安装ArchLinux并彻底解决终端中文显示问题

WSL2中安装ArchLinux并彻底解决终端中文显示问题 去年我把开发环境从Win 双系统彻底切换成了Windows Terminal WSL2折腾完发现一个很有意思的组合在WSL2里装ArchLinux。很多人听到这个第一反应是“都WSL2了为什么不直接装Ubuntu”但真用下来Arch这种滚动更新、包管理干净、AUR香的地方在WSL2里反而比物理机更适合当作日常开发环境。唯一让我卡了整整半天的坑就是终端中文显示——默认情况下中文全是方框看起来像是编码没设对其实是字体、locale、终端模拟器三个层面都得处理。这篇文章把从零开始的操作全部记录下来包括怎么把ArchLinux的根文件系统导入WSL2、怎么初始化系统、怎么把终端中文显示彻底调通以及我遇到的几个报错的排查过程。如果你也想在Windows上搞一个干净、可控、随开随用的Arch环境那这篇可以直接照着做。1. 为什么要在WSL2里用ArchLinux而不是Ubuntu1.1 WSL2到底解决了什么问题WSL2和第一代WSL的最大区别是WSL2用的是一个真正的轻量级虚拟机跑的是完整的Linux内核所以绝大部分Linux软件都能用Docker也能原生跑CUDA、Ollama这些重依赖的也能进WSL2里折腾。对于在Windows上做开发的人来说WSL2本质上就是一个“免驱、免分区、随时销毁重建”的Linux虚拟机资源占用比完整VMWare小得多而且文件和Windows互通放D盘指定目录就行。我用WSL2的主要原因有两个。第一是公司电脑是Windows但我习惯了Linux的命令行工具链不想再装虚拟机软件拖慢内存。第二是WSL2创建的发行版可以当作“文件包”来管理不想要了直接unregister就行不影响宿主机任何东西。折腾成本低这是WSL2和ArchLinux特别搭的一个点。1.2 ArchLinux在这种场景下的独特优势很多人问在WSL2里装Ubuntu不是更方便吗wsl --install -d Ubuntu一条命令就完了。但Ubuntu的包管理太“稳”了稳定到无聊。我日常要用的一些工具要么在Ubuntu的老版本源里不是最新要么需要第三方PPA要么就得自己编译。而Arch的优势在于滚动更新所有核心软件基本都能当天拿到最新版Python、Node、Git这些对版本敏感的工具链特别舒服。pacman的依赖管理干净利落装什么包、依赖哪些库清清楚楚AUR仓库更是几乎能找到所有轮子包括一些冷门的旧版本工具。系统本身就是极简风格没有预装一堆你用不到的东西。装完base系统后你想要什么就装什么这很符合“命令行开发机”的定位。不过也要提前说清楚如果你只是想开箱即用不想折腾那Ubuntu确实更省事。Arch在WSL2里需要手动导入rootfs、初始化密钥、配置用户和systemd整个过程有一个小时左右的爬坡成本但配好之后是真的顺手。1.3 有哪些弯路可以先避开我一开始犯的错误是想着在WSL2里跑hyprland这种Wayland桌面环境。搜了一圈也看到有不少人在问ArchLinux安装hyprland的事但我的实测结论是WSL2里的WSLg只能做基础的GUI转发拿来跑跑简单的图形程序可以跑完整桌面效果很一般动画、GPU转译、输入法联动都会出问题。所以在WSL2里你最好把它当“无头服务器 终端环境”用想要桌面老老实实用虚拟机或者物理机别硬折腾。另一个弯路就是中文显示。很多人以为装个中文字体就好其实终端显示中文涉及三个环节系统有没有对应字形的字体、软件的locale编码是什么、终端模拟器用什么字体渲染。三个环节缺一不可后面我会一步步说明。2. 装ArchLinux之前先把WSL2环境弄利索2.1 虚拟化没开启一切免谈如果你执行wsl --install或者启动发行版时遇到类似“WSL2无法启动因为此计算机上未启用虚拟化”的提示那就说明Windows所在的宿主机没有开启硬件虚拟化或者Windows的虚拟机平台功能没打开。这是最常见的起步问题。先打开任务管理器 - 性能 - CPU右下角看“虚拟化”这一项。如果显示“已启用”说明BIOS层面没问题如果显示“已禁用”需要重启进BIOS/UEFI设置界面找到Intel VT-x或AMD-V/SVM开启后保存重启。这里有个细节如果你是在VMware或VirtualBox里装的Windows那还需要在虚拟机设置里开启“虚拟化Intel VT-x/EPT”之类的嵌套虚拟化选项否则WSL2同样起不来。2.2 Windows侧开启WSL2的标准流程Windows 11下最省事管理员PowerShell直接执行wsl --install执行完它会自动开启“适用于Linux的Windows子系统”和“虚拟机平台”两个Windows功能并安装好WSL内核。如果系统要求重启重启后继续。Windows 102004及以上版本则要手动开功能管理员PowerShell执行dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart执行完重启然后装WSL2内核。再执行wsl --set-default-version 2这样后续所有新安装的发行版默认都用WSL2模式。2.3 把已有发行版升级到WSL2版本如果你以前装过WSL1的发行版可以用下面的命令查看版本wsl -l -v如果VERSION列显示的是1就升级到2wsl --set-version 发行版名 2升级需要几分钟等它跑完即可。这一步其实有讲究WSL1用的是系统调用翻译层有些依赖完整Linux内核特性的软件会跑不了WSL2是完整内核ArchLinux天然适合WSL2所以一定要确保在Version: 2下面工作。除了上述还可以顺手把WSL更新到最新版wsl --update就行。新版的WSL支持wsl --manage等命令后面迁移磁盘路径会用到。3. 安装ArchLinux从bootstrap到wsl --import3.1 准备ArchLinux根文件系统ArchLinux官方没有像Ubuntu那样直接在wsl --install -d里提供的发行版包但官方提供了bootstrap镜像这是一个压缩的根文件系统可以用它作为起点。先去下载archlinux-bootstrap-x86_64.tar.gz。在官网下载页能找到国内建议直接用清华镜像wget https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/archlinux-bootstrap-x86_64.tar.gz这里我选择在已有的Ubuntu WSL发行版里做后续操作因为解压、chroot、打包这一套流程在Linux环境里最自然。当然你也可以在Windows上用tar工具解压但后续操作会麻烦很多。下载完解压到一个工作目录mkdir ~/archbuild cd ~/archbuild tar -xzf archlinux-bootstrap-x86_64.tar.gz解压后会生成一个root.x86_64目录里面就是Arch的根文件系统骨架。3.2 在临时系统里配置基础环境先要设置镜像源否则在chroot里下载软件包时会连官方服务器速度感人。编辑root.x86_64/etc/pacman.d/mirrorlist把国内镜像的注释符号去掉。我更习惯直接写一行echo Server https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch root.x86_64/etc/pacman.d/mirrorlist接下来进入chroot。bootstrap自带了arch-chroot脚本这个脚本会自动挂载必要的虚拟文件系统sudo root.x86_64/usr/bin/arch-chroot root.x86_64 /bin/bash进入后第一件事是初始化pacman密钥环。这一步不做后面pacman -S会一直报签名无效或者随便装什么包都失败pacman-key --init pacman-key --populate archlinux然后更新包数据库安装基础包pacman -Syy archlinux-keyring pacman -S base base-devel这里有个小坑。bootstrap里的/etc/pacman.conf默认开启了CheckSpace选项在chroot环境里它可能会误判磁盘空间不足导致任何写入都被拒绝。先用sed把它去掉sed -i /^CheckSpace/d /etc/pacman.conf再执行安装。base组会装上一整套Linux基础工具包括systemd、bash、coreutils这些base-devel组则是编译工具链很多AUR包的构建都依赖它。虽然WSL2环境不跑内核不需要装linux内核包但编译器、make、patch这些还是要有的。继续配置系统基础信息ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime然后编辑/etc/locale.gen把en_US.UTF-8 UTF-8和zh_CN.UTF-8 UTF-8这两行的注释符号去掉sed -i s/^#en_US.UTF-8/en_US.UTF-8/ /etc/locale.gen sed -i s/^#zh_CN.UTF-8/zh_CN.UTF-8/ /etc/locale.gen locale-gen此时先创建/etc/locale.conf写入默认语言echo LANGen_US.UTF-8 /etc/locale.conf为什么要先设成英文因为WSL2刚装完阶段中文locale配合缺字体的环境反而容易出乱码。等后面中文字体装好之后再把LANG切成中文。这个顺序是我踩过坑之后总结出来的先保证系统能稳定显示UTF-8再追求中文本地化。最后创建日常用的普通用户并加入wheel组useradd -m -G wheel -s /bin/bash dev echo dev ALL(ALL) NOPASSWD: ALL /etc/sudoers.d/dev passwd dev这个用户会在后续WSL配置中设置为默认登录用户避免每次开机都顶着root干活。3.3 打包并导入WSL2基础环境配置好后退出chrootexit把root.x86_64目录打包成tar。这一步打包参数很重要--numeric-owner是为了保留UID/GID的数字值避免因为两端用户ID不同导致文件属主错乱--xattrs是为了保留扩展属性。另外注意-C root.x86_64 .表示进入目录后打包整个内容而不是打包外层目录cd ~/archbuild sudo tar --numeric-owner --xattrs -cpf archlinux-wsl.tar -C root.x86_64 .这个tar文件就是你将来导入WSL2的“根文件系统”。把它放到一个Windows能访问的位置比如C:\Users\你的用户名\Downloads\archlinux-wsl.tar。打开PowerShell开始导入。首先创建一个目录用来存放Arch的虚拟磁盘mkdir D:\WSL\ArchLinux然后执行导入wsl --import ArchLinux D:\WSL\ArchLinux C:\Users\你的用户名\Downloads\archlinux-wsl.tar --version 2ArchLinux是这个发行版在WSL里的名字D:\WSL\ArchLinux是虚拟磁盘的存放位置最后是tar包的Windows路径。这一步执行完ArchLinux就算正式入驻WSL2了。3.4 首次进入系统后的初始化进入系统wsl -d ArchLinux第一次进去默认是root用户。先配置WSL的专属配置文件/etc/wsl.conf让WSL知道要用systemd、默认登录用户是谁[boot] systemdtrue [user] defaultdev写完保存然后退出exit在PowerShell里重启WSLwsl --shutdown等待几秒再启动wsl -d ArchLinux这次应该直接以dev用户身份进入systemd已经在后台跑起来了。可以用systemctl list-units验证一下。到这一步ArchLinux在WSL2里的“操作系统层”就完成了。接下来才是重头戏让终端的方块中文变成正常汉字。4. 终端中文显示字体、locale、终端模拟器三位一体4.1 中文乱码或方框的真正原因很多人以为终端里中文变成????或者方框是“编码没设对”其实要分两种情况如果中文显示成类似的乱码那是编码问题大概率是终端的locale不是UTF-8或者程序输出时用了错误编码。如果中文显示成一个个方框/空白比如中文变成两个方块那说明编码其实是正确的是系统里没有对应字形的字体或者终端模拟器没有正确进行字体回退。在WSL2 ArchLinux的场景里我们从头装系统默认没有安装任何CJK字体所以最常见的情况是方框。解决办法是把字体和locale两个方向一起处理。4.2 安装中文字体并验证Arch官方源里有现成的中文字体包最省心的组合是noto-fonts-cjk加上noto-fonts-emoji。前者覆盖简体中文、繁体中文、日文、韩文后者补全emojisudo pacman -S noto-fonts-cjk noto-fonts-emoji如果你觉得Noto字体太大或者更在意启动速度也可以装轻量的wqy-microhei文泉驿微米黑一套字体才几MB。不过我个人推荐Noto字重更多在终端里做代码注释也不刺眼。装完后更新字体缓存fc-cache -fv然后验证系统是否能识别中文字体fc-list :langzh正常会列出所有支持中文的字体文件。出现类似/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttc的路径就说明字体已经装好。4.3 配置locale和中文环境变量字体解决的是“有没有字形可用”locale解决的是“软件默认用什么编码和语言习惯”。虽然UTF-8编码下即使LANG为C也能显示中文但很多命令行工具比如ls、awk、python脚本里的字符串处理依赖locale判断编码所以还是得配好。先确保zh_CN.UTF-8已经在locale体系里grep zh_CN /etc/locale.gen如果被注释了去掉注释再执行sudo locale-gen。然后设置默认语言为中文sudo bash -c echo LANGzh_CN.UTF-8 /etc/locale.conf为了让当前用户的shell也拿到正确环境在~/.bashrc里追加export LANGzh_CN.UTF-8 export LC_ALLzh_CN.UTF-8不过这里有一个经验点LC_ALL强制覆盖所有locale分类某些欧美开发的命令行工具在中文locale下可能出现排序异常或者日期格式不对。你可以只设LANGzh_CN.UTF-8等遇到具体工具的locale问题再用LC_ALLen_US.UTF-8临时覆盖。我个人习惯是把全局/etc/locale.conf设成en_US.UTF-8然后只在需要中文交互的shell里用export LANGzh_CN.UTF-8这样最稳。设置完先验证一下原生输出echo 中文测试 locale如果LANG显示为zh_CN.UTF-8且echo输出正常Linux侧的中文显示就已经解决了。4.4 Windows Terminal的字体和显示设置Linux侧显示正常了Windows侧如果终端字体不配合照样是方框。尤其当你使用Windows Terminal时它会用配置里指定的字体渲染所有字符。默认的Cascadia Mono字体并不包含中文字形所以Windows Terminal会回退到系统中文字体但回退逻辑不一定每次都能正确命中会出现部分中文显示为方框的情况。解决办法是给ArchLinux这个配置文件指定一个同时包含ASCII等宽字形和CJK字形的字体。我推荐用更纱黑体Sarasa Mono SC它是专门为终端设计的等宽中文字体中文和英文对齐效果非常工整代码里夹杂中文注释时也不会乱。去GitHub下载Sarasa Mono SC的TTF版本安装到Windows字体管理器里。然后在Windows Terminal中打开设置Ctrl,在左侧配置文件列表里选中ArchLinux在外观-字体面中填写Sarasa Mono SC如果你更习惯直接改settings.json在ArchLinux的profile配置里加font: { face: Sarasa Mono SC, size: 12 }保存后终端刷新中文应该就正常了。这里有个细节修改后如果没生效检查Windows Terminal版本是否支持字体回退旧版本可能需要额外配置font下的fallbackFace字段新版本一般直接用face就能正确渲染。4.5 关于中文输入法说点实在的很多人在配完中文显示后下一个问题就是终端里能不能用中文输入法这里要说实话在纯命令行场景下你在WSL2终端里输入中文输入法其实还是Windows侧的输入法在工作。你按下CtrlShift切换到微软拼音打出来的字会直接进入Windows Terminal的输入框Linux系统只是负责接收并显示。所以如果Windows里能打字WSL终端里就能打不需要在Linux里额外装任何输入法。真正有问题的是在WSLg里跑图形界面程序比如有人想在Arch Linux里跑个微信、QQ或者LibreOffice这时候中文输入就麻烦了。WSLg对输入法的支持比较弱用fcitx5或ibus-rime都可以装但需要额外的环境变量配置而且跟在Windows桌面里的输入体验有很大差距。如果你遇到类似“微信在Archlinux里没办法输入中文”的问题我的建议是不要死磕WSLg直接用Windows版的微信客户端把中文输完在终端里用Linux工具干活这套组合才符合WSL2的定位。毕竟微软做WSL是给开发者用的不是给你在Windows里再套一层桌面环境的。5. 常见问题与排查技巧实录5.1 WSL2无法启动提示虚拟化未启用这是我被问得最多的一个问题也是最容易解决的。现象可能原因处理方法WSL2无法启动因为此计算机上未启用虚拟化BIOS里虚拟化开关没开重启进BIOS开启Intel VT-x或AMD-V/SVM任务管理器显示虚拟化已启用但WSL仍报错Windows的虚拟机平台功能没开管理员PowerShell执行dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart重启在虚拟机里安装WindowsWSL2仍然起不来宿主机没开启嵌套虚拟化在VMware/VirtualBox设置中开启嵌套虚拟化选项之前能用突然某次更新后WSL2无法启动Hypervisor启动类型被改了管理员PowerShell执行bcdedit /set hypervisorlaunchtype auto重启排查这类问题最忌讳的是一开始就在WSL配置里乱改先把虚拟化链条从BIOS到Windows功能到虚拟机平台一级级确认。5.2 pacman初始化失败或密钥报错如果你在bootstrap阶段没有执行pacman-key --init和pacman-key --populate archlinux导入WSL2后第一次跑pacman就会报各种“invalid or corrupted package (PGP signature)”错误。而且因为WSL2时钟可能没有和Windows同步签名验证会崩溃。解法是执行sudo pacman-key --init sudo pacman-key --populate archlinux sudo pacman -Sy archlinux-keyring如果提示时间不对先同步时间sudo date -s $(date)或者直接用NTPsudo timedatectl set-ntp trueWSL2里timedatectl如果报了权限错误多半是systemd没启用检查/etc/wsl.conf里的systemdtrue然后wsl --shutdown重启再试。5.3 中文显示成方框如果按照第4章的流程操作后中文依然是方框按顺序排查确认Linux侧有没有中文字体fc-list :langzh没有就装noto-fonts-cjk。确认locale生成成功locale -a | grep zh_CN没有就重新locale-gen。确认当前locale生效echo $LANG如果不是zh_CN.UTF-8手动export LANGzh_CN.UTF-8。确认Windows Terminal字体把Arch配置文件的字体改成Sarasa Mono SC看看有没有变化。另外有一个比较隐蔽的坑如果你直接从Windows里复制一段中文粘贴进终端贴出来的中文正常但自己执行ls查看中文文件名却显示转义序列那说明ls的配色或者说“引用风格”在捣乱。可以在~/.bashrc里加上export QUOTING_STYLEliteral或者直接alias lsls --colorauto --quoting-styleescape就不会看到\350\277\231这种八进制转义了。5.4 设置了wsl.conf默认用户但没生效修改/etc/wsl.conf后如果你只是重新打开一个终端窗口配置是不生效的。WSL2的虚拟机是常驻的配置文件里的[user] defaultdev只有在WSL VM重启后才读取。正确的操作是wsl --shutdown等几秒甚至十几秒确认VM完全退出再执行wsl -d ArchLinux。如果还是root登录检查wsl.conf里是不是拼成了defaultUser正确的是[user] defaultdev这种变量名很容易记混我一开始就是写成了defaultUser系统安静地忽略掉返回root折腾了十分钟才反应过来。5.5 默认装在C盘想把ArchLinux迁到D盘新版WSL支持直接迁移wsl --manage ArchLinux --move D:\ArchLinux旧版的话用导出再导入的方式wsl --export ArchLinux D:\backup\archlinux.tar wsl --unregister ArchLinux wsl --import ArchLinux D:\WSL\ArchLinux D:\backup\archlinux.tar唯一要提醒的是wsl --unregister会删除整个发行版数据和所有文件执行前一定要确认已经导出或者确认里面没有重要数据。别问我为什么会知道说多了都是泪。5.6 WSL2内网络/DNS解析异常如果你在公司网络或者代理环境下发现WSL2里ping外网域名解析不了但Windows里网络正常大概率是WSL2的resolv.conf被覆盖成了错误的DNS。在/etc/wsl.conf里加[network] generateResolvConffalse然后重启WSL手动指定DNSsudo rm /etc/resolv.conf sudo bash -c echo nameserver 223.5.5.5 /etc/resolv.confWindows 11较新版本还可以在C:\Users\你的用户名\.wslconfig里开启镜像网络模式让WSL2直接共享Windows的网络栈[wsl2] networkingModemirrored写在最后的一点体会整套环境配到现在我最满意的是ArchLinux在WSL2里的“轻”和“快”。开机进入终端的时间几乎感觉不到延迟装软件、更新系统都不影响Windows侧的工作想清理环境了直接删掉重新导入。中文字体、locale、终端字体这三层一次性配好后日常写代码、跑脚本、看日志都非常舒服。这个环境后续能玩的方向还不少比如在WSL2里面装Docker跑容器、配CUDA做Python深度学习、或者直接装Ollama跑本地大模型WSL2都能扛得住。唯一再提醒一句如果你想把这套Arch当作每天都要用的主力开发机养成定期提交配置的习惯或者干脆把/home目录单独挂到Windows侧的目录做持久化。毕竟WSL2本质还是个虚拟机文件重装Windows或者误操作unregister数据说没就没。有个备份习惯你的Arch才能陪你走得更远。
返回列表