如何为手动安装的 WSL 发行版设置默认用户?

sch*_*ine 11 windows linux user-accounts windows-subsystem-for-linux

我已经使用wsl --exportand克隆了一个 WSL 发行版wsl --import,但是现在,运行wsl newdistro总是让我以 root 身份登录。我知道该lxrun命令已被弃用并希望避免它。文档建议使用distroname.exe config,但这不起作用,因为这个没有相应的可执行文件。

Not*_*1ds 14

在撰写本文时,至少有三种(我们称之为 3.5)在 WSL 实例中更改/设置默认用户的不同方法。虽然已经提到的两个仍然有效,但有一种微软推荐的方法在这个问题中尚未提到。

方法 1 - /etc/wsl.conf

当前Microsoft 推荐的在实例中设置用户名的方法是在实例中创建/etc/wsl.conf具有以下设置的用户名:

[user]
default=username
Run Code Online (Sandbox Code Playgroud)

当然,将用户名更改为您的默认用户名。

这比基于注册表的方法更安全且不易出错。

方法 2 - 注册表项

根据@harrymc 的回答设置注册表项。

方法 3 - LxRunOffline

使用LxRunOffline设置注册表项,如@Jaime回答中所述。最终这与方法 2 具有相同的效果。

半方法 4 - 通过wsl命令行参数选择运行时用户

在启动任何 WSL 实例时,可以通过以下方式选择用户名:

wsl -u usernamewsl -d distroname -u username等。

例如,wsl -d Ubuntu -u root


har*_*ymc 8

正常的命令语法例如:

ubuntu config --default-user new_user_name
Run Code Online (Sandbox Code Playgroud)

但是,这不适用于由以下命令启动的导入发行版:

wsl --distribution <DistributionName>
Run Code Online (Sandbox Code Playgroud)

试试这个未记录的方法:

  • 使用regedit并导航到密钥:
    HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss
  • 检查其子键以查找在项目中具有正确名称的分布 DistributionName
  • 创建或修改命名的 DWORD 项DefaultUid并将其设置为默认用户的用户 ID (uid)。这里 root 用户是 id0而第一个用户 id 是 1000 ( 0x3e8)。

如果这对您的设置不起作用,您需要运行:

wsl --distribution ubuntu -u user_name
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅:

  • 使用“wsl --import”创建的副本不包含该可执行文件。我做了“wsl --export Ubuntu UbuntuFile”,然后做了“wsl --import Ubuntu2 UbuntuDirectory UbuntuFile”。`UbuntuDirectory` 的内容是 `rootfs`、`temp`、`fsserver` 和 `UbuntuFile`。没有可执行文件。 (2认同)

小智 5

通过以下方式验证要在Linux 控制台id中设置为默认用户的 uid :

username@host:~$ id
uid=1000(username) gid=1000(username) groups=1000(username),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),1001(docker)
username@host:~$ 
Run Code Online (Sandbox Code Playgroud)

通过以下方式验证Powershell中的发行版名称wsl -l -v

PS C:\WINDOWS\system32> wsl -l -v
  NAME                   STATE           VERSION
* ubuntu-20.04           Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2
PS C:\WINDOWS\system32>
Run Code Online (Sandbox Code Playgroud)

在Powershell中编辑注册表:

Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq ubuntu-20.04  | Set-ItemProperty -Name DefaultUid -Value 1000
Run Code Online (Sandbox Code Playgroud)

现在应该好了。