删除了 WSL 中的所有用户

删除了 WSL 中的所有用户

我似乎不小心删除了 WSL Ubuntu 20.04 LTS 设置上的所有用户。现在,我创建了一个新的用户“tetemp”,我希望我没有这样做。不幸的是,我无法重新添加用户“root”。

以下是当前条目密码

tetemp:x:1000:100::/home/tetemp:

当我尝试添加“root”用户时,出现以下错误:

$ adduser root
adduser: Only root may add a user or group to the system.
$ sudo adduser root
sudo: unknown user: root
sudo: unable to initialize policy plugin

我无法更改密码,因为它是只读的。

  • 我如何才能重新获得“root”用户的访问权限?
  • 是否可以删除“tetemp”用户。

谢谢您的帮助。

答案1

这很难。如果没有用户,通常的wsl -u root恢复机制将无法工作,而添加后,它就成为默认用户(没有权限)。root/etc/passwdtetempsudo

我至少看到了两条前进的道路。要么创建一个新的实例(并复制文件),要么尝试恢复损坏的实例:

  • 首先,在测试实例中尝试之后,我仍可使用路径在 Windows 下访问实例\\wsl$\Ubuntu。这不会让您修复/etc/passwd,但至少可以让您从实例中复制出需要恢复的任何文件。

    您可以安装与从商店安装的完全相同的 Ubuntu 发行版的第二个实例:

    1. 以管理员身份启动 PowerShell

    2. 跑步:

       Get-ChildItem -Recurse 'C:\Program Files\WindowsApps\' | Where-Object {$_.Name -eq 'install.tar.gz' }
      
    3. 输出将具有install.tar.gz用于创建原始实例的位置。

    4. 创建将要创建新实例的目录。我使用类似 的内容%userprofile%\WSL\NewUbuntu

    5. 从常规的非管理员 PowerShell 运行

      wsl --import NewUbuntu ".\path\to\WSL\NewUbuntu" "<path_with_tarball>\intall.tar.gz" --version 2`
      
    6. 使用 启动新实例wsl -d NewUbuntu。默认情况下,您将使用root

    7. 使用以下命令添加常规用户:

      adduser <username>
      usermod -aG adm,dialout,cdrom,floppy,sudo,audio,dip,video,plugdev,netdev <username>
      

      这是为 WSL 上的 Ubuntu 中的默认用户创建的组集。

    8. /etc/wsl.conf按照所述创建,使该用户成为 WSL 中的默认用户这个答案

    现在您应该能够将文件从旧实例 ( \\wsl$\Ubuntu) 复制到新实例 ( \\wsl$\NewUbuntu)。

    最后,要删除旧副本,当然您已将所有重要文件取出wsl --unregister <distroname>

我能想到的一些可能的选择可能会让你修复/恢复现有实例。我没有一步一步地测试这些,但这里的大部分内容都是我曾经做过的:

  • 我不推荐这个,因为它有潜在的最终使实例处于不稳定状态:

    • 使用以下命令将实例转换为 WSL1wsl --set-version Ubuntu 1
    • 在 Windows 中,导航到 WSL1 覆盖文件系统的位置%userprofile%\AppData\Local\Packages\Canonical...\LocalState\rootfs\etc\passwd
    • 修复/etc/passwd使用处理 Linux 行尾的 Windows 应用程序的问题。同样,这可能会有问题,因为它最终可能会导致 WSL 中的文件系统损坏最简单、最安全的做法可能是删除passwd文件,因为我们相信这样做会让您再次以 UID 0 登录,然后重新创建用户root
    • 如果需要,将其转换回 WSL2。
  • 或者,使用另一个实例来修复第一个:

    • 使用 创建损坏实例的 tarball wsl --export Ubuntu fixme.tar

    • 返回上面的第一个选项,我们在那里创建了一个新实例并执行这些步骤。但将该实例命名为“UbuntuTemp”之类的名称。

    • 在这个新的(临时)实例中:

      mkdir ~/fixme
      cd ~/fixme
      sudo tar --xattrs-include="security.capability" -xvf /mnt/c/path/to/fixme.tar
      sudo cp /etc/passwd ~/fixme/etc/passwd
      sudo tar --xattrs -cvf /mnt/c/path/to/fixed.tar .
      
    • 退出临时 Ubuntu 实例。

    • 在 PowerShell 中,为您的固定 Ubuntu 实例创建一个目录,然后:

      wsl --import Ubuntu20_04 "path/you/just/created" "path/to/fixed.tar" --version 2
      
    • 使用 启动已修复(希望如此)的实例wsl -d Ubuntu20_04

    • /etc/wsl.conf使用per将常规用户设置为默认用户这个答案

    • 假设它正常工作,使用以下命令将实例设置为默认实例:

      wsl --set-default Ubuntu20_04
      

相关内容