Windows WSL 技巧
Windows WSL 技巧
用命令下载发行版本
wsl --list --online
wsl --install -d <DistroName>
wsl --install -d Ubuntu-24.04用文件管理器打开当前路径
explorer.exe .wsl ubuntu 默认打开 root
在 WSL (Windows Subsystem for Linux) 中,默认以非 root 用户身份运行。如果你希望每次打开 WSL Ubuntu 时默认以 root 用户身份运行,可以按照以下步骤操作:
打开 WSL: 首先,打开你的 WSL 终端。
打开 WSL 的配置文件: 在 WSL 终端中,输入以下命令来编辑配置文件:
sudo nano /etc/wsl.conf如果
/etc/wsl.conf文件不存在,这个命令会创建一个新的文件。添加或修改配置: 在
wsl.conf文件中,添加或确保以下内容存在:[user] default=root这里
[user]部分指定了用户配置,而default=root表示默认用户为 root。保存并关闭文件: 如果你使用的是
nano编辑器,可以通过按Ctrl+X,然后按Y确认保存,最后按Enter键来保存并退出。重启 WSL: 为了使更改生效,需要重启 WSL。在 Windows 命令提示符或 PowerShell 中运行以下命令:
wsl --shutdown然后重新启动 WSL。
请注意,以 root 用户身份运行 WSL 并不总是推荐的做法,因为这可能带来安全风险。确保你了解以 root 用户运行的后果,并在需要时才这样做。
设置默认为 root 用户方法二
# 进入安装的 apps 目录
cd "C:\Program Files\WindowsApps"
# 查找 ubuntu 目录
dir CanonicalGroupLimited*
# 我们需要在这几个文件夹中找到含有:buntu<版本号>.exe文件
# 我的是在 CanonicalGroupLimited.Ubuntu22.04LTS_2204.2.45.0_x64__79rhkp1fndgsc 这个文件夹下面
d---- 2023/5/10 22:15 CanonicalGroupLimited.Ubuntu22.04LTS_2204.2.45.0_neutral_~_79rhkp1fndgsc
d---- 2023/5/10 22:15 CanonicalGroupLimited.Ubuntu22.04LTS_2204.2.45.0_neutral_split.scale-100_79rhkp1fndgsc
d---- 2023/5/10 22:15 CanonicalGroupLimited.Ubuntu22.04LTS_2204.2.45.0_neutral_split.scale-125_79rhkp1fndgsc
d---- 2023/5/10 22:15 CanonicalGroupLimited.Ubuntu22.04LTS_2204.2.45.0_neutral_split.scale-150_79rhkp1fndgsc
d---- 2023/5/10 22:15 CanonicalGroupLimited.Ubuntu22.04LTS_2204.2.45.0_x64__79rhkp1fndgsc
# 修改为默认 root
.\ubuntu2204.exe config --default-user root重置 WSL 用户密码
忘记密码时,在 Windows PowerShell 中以 root 身份直接重置,无需重启 WSL:
# 重置 Ubuntu 24 的 ssx 用户密码
wsl -d Ubuntu-24.04 -u root passwd ssx
# 重置 Ubuntu 22 的 ssx 用户密码
wsl -d Ubuntu-22.04 -u root passwd ssxWSL 中获取宿主机 IP
WSL 每次启动的时候都会有不同的 IP 地址,所以并不能直接用静态的方式来设置代理。WSL2 会把 IP 写在 /etc/resolv.conf 中,因此可以用这条指令获得宿主机 IP 。
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
# WSL2 自己的 IP 可以用
hostname -I | awk '{print $1}'转移 wsl 系统数据到其他盘
如果你想将WSL里面的数据存储到D盘上,你可以通过导出当前的WSL分发,然后将其导入到D盘上的新位置来实现。以下是整个流程的步骤:
查看当前 ubuntu 所在路径可以尝试以下命令
请将
*Ubuntu*替换为您的 WSL 发行版的实际名称,如果您的发行版不是 Ubuntu。如果你不确定包的确切名称,可以留下*通配符,这将匹配任何可能的包名称。这条命令会在当前用户的
AppData\Local\Packages文件夹内递归搜索所有名称中包含Ubuntu的文件夹,并列出所有找到的ext4.vhdx文件。运行这个命令之后,你应该能够看到包含 WSL2 文件系统的.vhdx文件的完整路径。
dir $env:LOCALAPPDATA\Packages\*Ubuntu* -Recurse -Filter ext4.vhdx打开 PowerShell:打开PowerShell作为管理员。
列出当前的WSL分发:你需要确定你想要移动的WSL分发的名称。
wsl --list --verbose关闭所有的WSL实例:在进行下一步之前确保所有的WSL实例都已经关闭。
wsl --shutdown导出WSL分发:将你想要移动的WSL分发导出到一个tar文件。例如,如果你的分发名称是Ubuntu,你可以使用以下命令:
wsl --export Ubuntu D:\path\to\save\ubuntu.tar # 我的命令 wsl --export Ubuntu-24.04 D:\ubuntu2404.tar把
D:\path\to\save\ubuntu.tar替换成你想要保存tar文件的实际路径。注销WSL分发:这一步会删除当前的WSL分发,所以确保你已经成功导出了分发。
wsl --unregister Ubuntu # 我的命令 wsl --unregister Ubuntu-24.04在新位置创建一个文件夹:在D盘上选择或创建一个新的文件夹来存放你的WSL分发。
mkdir D:\path\where\you\want\wsl # 我的命令 mkdir D:\data\wsl\ubuntu-24.04导入WSL分发:将分发导入到你在D盘上创建的新位置。
wsl --import Ubuntu D:\path\where\you\want\wsl D:\path\to\save\ubuntu.tar # 我的命令 wsl --import Ubuntu-24.04 D:\data\wsl\ubuntu-24.04 D:\ubuntu2404.tar确保替换路径为你实际想要使用的路径。
启动新的WSL分发:一旦导入完成,你就可以启动你的新WSL分发了。
wsl -d Ubuntu # 我的命令 wsl -d Ubuntu-24.04设置默认用户(如果需要):如果新导入的分发默认用户是root,你需要修改WSL配置文件来更改默认用户。可以在 linux 内编辑
etc\wsl.conf文件,并添加以下内容:[user] default=<你的用户名>替换
<你的用户名>为你的非root用户的用户名。然后重启WSL。wsl --shutdown wsl -d Ubuntu
通过这些步骤,你可以将WSL分发的默认数据存储位置更改到D盘上的指定目录。这样,WSL将使用新的位置来存储和访问所有文件。
查看内存被什么占用
# 总览:重点看 available(真实可用) 和 swap
free -h
# 占用内存最高的进程
ps aux --sort=-%mem | head -16
# 按进程名汇总 RSS(MB),看清同名进程总和(如多个语言服务器)
ps aux | awk 'NR>1 {n=$11; sub(".*/","",n); rss[n]+=$6; cnt[n]++} END {for(i in rss) printf "%9.1f MB %3d个 %s\n", rss[i]/1024, cnt[i], i}' | sort -rn | head
# 查谁在用 swap
for f in /proc/*/status; do awk -v p=$(basename $(dirname $f)) '/^Name:/{n=$2} /^VmSwap:/{if($2+0>0) print $2/1024" MB", n, p}' "$f" 2>/dev/null; done | sort -rn | head
buff/cache占用大是正常的(可回收),看available才是真实可用。如果swap被打满、load average飙高,多半是进程太多(开了多个 IDE 语言服务器 / AI 会话),优先关掉不用的会话。
配置 WSL 内存与 swap 分配
WSL2 默认最多用宿主机一半内存。在 Windows 用户目录新建/编辑 C:\Users\<用户名>\.wslconfig:
[wsl2]
# 内存上限,宿主 64G 时给 WSL 48G、留 16G 给 Windows
memory=48GB
# 磁盘 swap,当后备
swap=8GB
localhostForwarding=true
[experimental]
# 把空闲内存逐步还给 Windows
autoMemoryReclaim=gradual改完在 Windows PowerShell 重启 WSL 生效(会关闭所有 WSL 会话,先存好工作):
wsl --shutdown配置 zram 压缩 swap
磁盘 swap 被打满时进程跑在磁盘上会很卡。zram 把 swap 数据压缩后放在内存里,快几十倍,比单纯加磁盘 swap 更对症。
先确认内核支持 zram(微软默认内核已带):
modprobe zram && ls /sys/class/zram-control && zramctl
# 查可用压缩算法
cat /sys/block/zram0/comp_algorithm微软默认 WSL 内核只编译了
lzo / lzo-rle,没有zstd(CONFIG_CRYPTO_ZSTD未开、也没有对应模块,modprobe zstd会直接失败)。要 zstd 必须自己编译 WSL 内核(开CONFIG_CRYPTO_ZSTD,再用.wslconfig的kernel=指定自编译内核)。lzo-rle 速度更快、压缩率约 2.5:1,当 swap 够用,一般不必折腾 zstd。
启用了 systemd 的发行版(/etc/wsl.conf 里 systemd=true),用 systemd service 持久化。
新建启动脚本 /usr/local/sbin/zram_swap.sh:
#!/bin/sh
# 开机启用 zram 压缩 swap,优先级高于磁盘 swap
modprobe zram
echo lzo-rle > /sys/block/zram0/comp_algorithm
echo 16G > /sys/block/zram0/disksize
mkswap /dev/zram0 >/dev/null
swapon -p 100 /dev/zram0新建 /etc/systemd/system/zram-swap.service:
[Unit]
Description=zram compressed swap
After=local-fs.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/zram_swap.sh
ExecStop=/sbin/swapoff /dev/zram0
[Install]
WantedBy=multi-user.target赋权并启用:
chmod +x /usr/local/sbin/zram_swap.sh
systemctl daemon-reload
systemctl enable --now zram-swap.service
# 验证:zram0 优先级 100,磁盘 swap 当后备
swapon --showzram
disksize建议设内存上限的 1/3 左右(如 48G 上限设 16G)。它压缩后约占 6G 物理内存,别设太大以免挤占进程内存。