我在 Windows 10 上的 Linux 的 Windows 子系统中使用 Ubuntu 20.04。当我键入who
命令时,我没有得到任何输出:
renniej@ratitch:~$ whoami
renniej
renniej@ratitch:~$ who
renniej@ratitch:~$
我尝试了各种方法sudo who
,who -a
但仍然没有输出。who --version
给出:
who (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Joseph Arceneaux, David MacKenzie, and Michael Stone.
我在这里做傻事吗?或者这是 WSL2 的一个特性?
简短的回答
没什么可笑的。有一个与根本原因有关的 Github 问题。虽然 WSL 团队最初将其标记为“设计”和“功能”,但去年有活动表明它是“高价值低成本”。
再说一次,最近有人注意到它是 5 年前创建的,并且没有其他用户想要修复它的“赞许”。我的猜测是,除非 WSL 采用更类似于 Systemd 的启动方法(详见下文),否则这不会改变。
解释
...或者比你想知道的更多
who
who
没有显示任何结果的原因有两个:首先,显而易见的 --
who
旨在显示(引自手册页)“谁已登录”。当您启动 WSL 时,它实际上并没有通过登录密码向您的用户发送,这就是您不会被要求输入密码的原因。其次,WSL 在启动时将自己的
/init
进程作为 PID1 运行,它具有设置以下内容的“魔力”:.exe
运行的互操作另一方面,“正常”的 Linux 系统以 Systemd 或 SysVInit(或多年来的少量其他 init 系统)启动。init 系统负责建立运行级别等。除此之外(我自己只是从 Github 问题中学习到这一点),
/var/run/utmp
构造,它是跟踪谁在使用该系统。有几种方法可以“强制”谁工作:
第一个包含在该 Github 线程中。
/var/run/utmp
首先,用类似的东西破解 a :然后,使用 强制“登录”
sudo login -f $USER
。然后您可以看到您的用户使用who
. 如果您要通过再次登录ssh
(您需要先进行设置),那么该登录名也会出现。其次,您可以在自己的 PID 命名空间中启动 Systemd:
等待几秒钟让 Systemd 启动,它会初始化
/var/run/utmp
. 技术上在这一点上你可以sudo login -f $USER
看到who
。请注意,如果没有额外的努力(超出此答案的范围),Systemd 无法完全使用,并且您必须在执行此操作后终止 Ubuntu WSL 实例才能返回稳定状态。退出 WSL,然后
wsl --terminate <distro>
(<distro>
可能在哪里ubuntu
)。一旦你开始备份,一切都会恢复正常。