无法修复 WSL 内部的错误,因为它导致 WSL 崩溃

无法修复 WSL 内部的错误,因为它导致 WSL 崩溃

旧问题:“删除了 zsh,但忘记将 shell 改回 bash,现在 Ubuntu 崩溃了(wsl)”请注意,@steeldriver 的回答也适用于我的新问题。

我一直试图在我的 Ubuntu 终端 20.04 (wsl) 上安装 zsh。我将 shell(使用chsh)更改为 zsh,但随后删除了 zsh。然后我忘记将 shell 改回 bash。现在 Ubuntu 在启动后立即崩溃。如何在不卸载 + 重新安装的情况下避免崩溃?

答案1

如果你可以以 root 身份登录 WSL 计算机,即

wsl -u root

或者(如果你有多个 WSL 发行版)

wsl -d <distrib> -u root

可以通过在命令提示符中运行来获取;然后您可以从<distrib>那里为您的用户帐户执行wsl -lchsh

chsh -s /bin/bash <username>

其中<username>替换为用户的实际登录名。

答案2

wsl -u root, 作为@steeldriver 的回答建议,对于以 root 身份访问 WSL 实例并修复问题当然是完全有效的。

我还会为未来的读者提供一些非 root 选项:

在这个特定的问题中,用户的 shell 设置为 Zsh,但已被卸载:

wsl -e bash

-e/--exec参数启动指定的可执行文件代替中定义的 shell /etc/passwd。然后,当然chsh可以从 WSL 内部发出。

或者我们可以直接用以下方式简化它:

wsl -e chsh -s /usr/bin/bash

...直接改变外壳。

最后,对于那些对某个启动文件进行了错误编辑而无法启动的用户:

wsl ~ -e bash --noprofile --norc

这将启动 Bash(在默认用户目录中)而不处理启动文件,以便您可以找到问题并修复它。

答案3

使用安装的 usb/dvd 启动并在机器中安装硬盘驱动器,然后编辑其上的文件 /etc/shadow。您需要将 sde3 更改为驱动器上的根目录,最有可能是安装 efi 的单驱动器系统中的 sda2。我将向您展示备份驱动器上的过程。

root@zeus-H370M:~# mount /dev/sde3 /mnt
root@zeus-H370M:~# cat /mnt/etc/passwd | grep zeus
zeus:x:1000:1000:Zeus,,,:/home/zeus:/bin/bash

这里我向您展示了我的文件,它的最后部分设置了您的登录 shell,将其从 /bin/zsh 更改为 bash,就像我在文件中所做的那样。您需要在命令前面使用 sudo,而不是 cat,将其替换为 nano。完成后保存文件,然后在终端中使用 sudo reboot 重新启动系统。

实际安装的过程是取出您的安装驱动器并从机器上启动,就像要进行另一个安装一样。因为 Ubuntu 允许您尝试,所以您可以这样做。进入桌面后,转到活动并输入终端以启动该程序,当它打开时,您使用我显示的命令来安装 / 分区并使用 nano 编辑所需的文件。这个安装在单驱动器 SATA 驱动器机器上的驱动器将是 /dev/sda,分区 /dev/sda1、/dev/sda2(如果设置为单分区 EFI 安装)或仅仅是 /dev/sda1(用于 MBR 单分区安装)。在 EFI 上,您需要安装 2 才能编辑 MBR 上的文件,安装了 1 个分区。编辑文件将其改回 bash,当您重新启动机器时,它又完整了,您可以登录。如果您能找到在 Windows 中安装驱动器的过程,您可能能够安装它并进行编辑。

相关内容