我似乎不小心删除了 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/passwd
tetemp
sudo
我至少看到了两条前进的道路。要么创建一个新的实例(并复制文件),要么尝试恢复损坏的实例:
首先,在测试实例中尝试之后,我能仍可使用路径在 Windows 下访问实例
\\wsl$\Ubuntu
。这不会让您修复/etc/passwd
,但至少可以让您从实例中复制出需要恢复的任何文件。您可以安装与从商店安装的完全相同的 Ubuntu 发行版的第二个实例:
以管理员身份启动 PowerShell
跑步:
Get-ChildItem -Recurse 'C:\Program Files\WindowsApps\' | Where-Object {$_.Name -eq 'install.tar.gz' }
输出将具有
install.tar.gz
用于创建原始实例的位置。创建将要创建新实例的目录。我使用类似 的内容
%userprofile%\WSL\NewUbuntu
。从常规的非管理员 PowerShell 运行
wsl --import NewUbuntu ".\path\to\WSL\NewUbuntu" "<path_with_tarball>\intall.tar.gz" --version 2`
使用 启动新实例
wsl -d NewUbuntu
。默认情况下,您将使用root
。使用以下命令添加常规用户:
adduser <username> usermod -aG adm,dialout,cdrom,floppy,sudo,audio,dip,video,plugdev,netdev <username>
这是为 WSL 上的 Ubuntu 中的默认用户创建的组集。
/etc/wsl.conf
按照所述创建,使该用户成为 WSL 中的默认用户这个答案。
现在您应该能够将文件从旧实例 (
\\wsl$\Ubuntu
) 复制到新实例 (\\wsl$\NewUbuntu
)。最后,要删除旧副本,当然您已将所有重要文件取出
wsl --unregister <distroname>
。
我能想到的一些可能的选择可能会让你修复/恢复现有实例。我没有一步一步地测试这些,但这里的大部分内容都是我曾经做过的:
我不推荐这个,因为它有潜在的最终使实例处于不稳定状态:
- 使用以下命令将实例转换为 WSL1
wsl --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。
- 使用以下命令将实例转换为 WSL1
或者,使用另一个实例来修复第一个:
使用 创建损坏实例的 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