我对 Windows 和 Linux 都是新手,所以请耐心等待。
在使用了一些命令之后,rm -rf bin
我的 WSL2 发行版退出了,现在当我尝试通过 Windows 终端启动它时,我得到了以下信息:
Processing fstab with mount -a failed.
<3>WSL (10) ERROR: CreateProcessEntryCommon:570: execvpe /bin/bash failed 2
<3>WSL (10) ERROR: CreateProcessEntryCommon:579: Create process not expected to return
[process exited with code 1 (0x00000001)]
我只安装了一个发行版。
Ubuntu 20.04
Windows 11 Version 10.0.22000 Build 22000
WSL 版本:
PS C:\Users\Andreas> wsl -v
WSL version: 1.0.3.0
Kernel version: 5.15.79.1
WSLg version: 1.0.47
MSRDC version: 1.2.3575
Direct3D version: 1.606.4
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.22000.1335
我没有使用 Docker,我的/etc/passwd
外观如下:
PS C:\Users\Andreas> wsl --system -d Ubuntu-20.04 -u root cat /mnt/wslg/distro/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
landscape:x:110:115::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:111:1::/var/cache/pollinate:/bin/false
bunny:x:1000:1000:,,,:/home/bunny:/bin/bash
postgres:x:112:120:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
fwupd-refresh:x:113:121:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
我努力了
wsl --update
我可以修复该问题吗?还是需要重新安装?
答案1
您可能需要重新安装,但让我们来解决这个问题:
问题始于
rm -rf bin
。好吧,这可能是灾难性的,具体取决于具体是如何做到的。例如,如果您在主目录中并执行该命令,则
~/bin
只会删除目录的内容(如果存在)。即使你在根目录中发出命令,你的普通用户也不应能够删除
/bin
。你通常会得到:rm: cannot remove 'bin': Permission denied
但是,如果您:
- 在根目录中,或使用
/bin
和... - 以 root 用户身份运行,或使用
sudo rm -rf /bin
如果不重新安装,那将无法恢复。但是,如果您有需要恢复的重要文件,这是可以的(请参阅下面的“文件恢复”部分)。
WSL 在运行默认 shell()时遇到问题,这一事实
/bin/bash
有力地表明您确实删除了该目录。- 在根目录中,或使用
边注:
显示该命令的输出:
wsl --system -d Ubuntu-20.04 -u root cat /mnt/wslg/distro/etc/passwd
我很好奇(通过评论)您是从哪里想出这个命令的。这是一种我从未想过的尝试恢复的有趣方法。但您真正应该尝试的是:
wsl --system -d Ubuntu-22.04 -e ls /mnt/wslg/distro/bin
如果
/bin
主发行版(在系统发行版中安装为/mnt/wslg/distro
)中的目录为空,则您确实已损坏发行版。(通过评论确认)
文件恢复
如果您想访问旧发行版中的文件或设置,您可以在重新安装之前将其备份,然后再访问。
要做到这一点:
在 PowerShell 中,
wsl --shutdown
从 PowerShell 运行以下命令来确定虚拟驱动器的位置:
Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss\ | ForEach-Object { (Get-ItemProperty $_.PSPATH) | Select-Object DistributionName,BasePath }
在结果位置,您将找到
LocalState
包含该ext4.vhdx
文件的目录。这是包含所有 Ubuntu/WSL2 文件的虚拟驱动器。将其复制
ext4.vhdx
到安全位置。或者,检查备份文件的哈希值是否与原始文件匹配。
再次从 PowerShell,
wsl --unregister Ubuntu-20.04
(如果您的发行版名称不同,请调整此项)重新运行
ubuntu2004.exe
,这将重新创建一个新ext4.vhdx
文件并在该发行版中创建用户/密码。在新发行版中,
sudo apt update && sudo apt upgrade -y
退出并返回 PowerShell。
在 PowerShell 中,运行
wsl --mount --name olddistro <path_to_backed_up>\ext4.vhdx --vhd
重新启动 Ubuntu
您的旧发行版中的文件可在 处找到
/mnt/wsl/olddistro/
。例如,您应该可以在 处找到旧主目录中的文件/mnt/wsl/olddistro/home/<username>
。
将旧文件复制到新发行版后,你可以直接删除老的(备份)ext4.vhdx
。