当机器没有头脑时,用户不再拥有特权。

核心问题是:任何不在真实物理/本地显示器上运行的gnome会话,或者不在该显示器上进行阴影处理(例如NXserver的阴影模式),都存在权限问题。即使以root身份运行也是如此!
对于VNC/非阴影NX会话的问题行为有什么修复方法吗?
我已经很久没有升级我的家用Ubuntu无头服务器了,现在遇到了很多问题,这些问题在之前的Ubuntu版本中我都不记得有过。
一些细节:
- 我从ubuntu-11.04-server-amd64.iso开始安装,然后在其上安装了ubuntu-desktop。 - uname -a: Linux MiddleEarth 2.6.38-8-server #42-Ubuntu SMP Mon Apr 11 03:49:04 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux - 硬件配置为Intel D920,2GB内存,显卡是一款无风扇的nvidia 6600,3个Gigabit网口,1个100mbit网口,没有连接显示器、键盘和鼠标。

第一轮

当我用一个连接着的显示器进行测试/设置时,一切都很顺利,无论是坐在显示器前还是从我的台式机(VNC进入vino)中观看。

然而,没有显示器就会出现问题:

[未解决/放弃]

第一个问题是vino非常固执,不喜欢在GDM启动之前/期间加载。但由于这是一个无头系统,我实际上并不需要它默认启动X(即更改初始级别),所以这个问题也没什么意义了。然而,我清楚地记得这在早期的Ubuntu版本(我想是v9.04)中非常容易做到。它也工作正常;但现在却不行了!... 总之,我完全放弃了那个想法。

[已解决]

然后是 Unity/effects messing VNC(通过作弊解决了 by cheating)。

[未解决]

我最初转到NXserver,希望以下问题可能与tightvnc或vino有关,但没有那么幸运。(注意:阅读 round2)

当通过VNC(或NXserver)远程登录时,我的用户帐户失去了挂载/卸载硬盘的能力。

Screenshot: Unable to mount 750GB_RAID1

当通过VNC(或NXserver)远程登录时,我的用户帐户无法访问一些特权配置选项,例如:
- 在“系统 -> 管理 -> 用户和组”中无法执行任何操作(例如“添加”用户或“高级设置”)。 - 在“系统 -> 管理 -> 登录屏幕”中无法使用“解锁”功能。 - gparted无法获取有关文件系统的任何信息。 - 等等(其他各种管理/配置对话框也无法正常工作)。
我只能猜测这可能与在实际物理监视器设备未连接时未正确分配用户权限有关。为什么在Ubuntu 11.04中会出现这种情况,我不清楚;我不记得在以前的Ubuntu版本中有这种行为。
请注意,硬盘挂载问题对于内部/静态硬盘来说并不是问题(因为它们是静态的,所以我只需将它们添加到fstab中)。但对于可移动的USB媒体来说确实非常麻烦。
至于其他问题,我还没有找到解决办法... 我知道你在想什么...通过SSH登录,sudo su,然后完全在root下运行vncserver?

Screenshot: (as root) gparted fails to find fs info

惊喜!root的图形界面也坏了:gparted无法获取信息,用户和组完全变灰(这与我的常规用户不同)。奇怪的是,登录屏幕管理程序似乎工作正常。

第二轮

(注意:我不知道这是否对结果有影响。在第一轮和第二轮之间的某个时刻,我应用了帖子#21和#24中提到的更改,请参阅this thread

常规的tightvnc/NXServer会话具有相同的行为,但是...

[部分解决方案/实际问题仍然存在]

在NXClient连接设置中,当我选择“影子”模式(影子将您连接到本机显示器,即桌面影子)时...

在此会话中一切都完美运行!

我注意到的一件事是它立即要求我输入一个钥匙环密码...也许整个混乱与gnome使用的钥匙环系统有关?

但是,如果我使用常规(非影子)NX连接或常规vnc连接,则问题又出现了。

P.S. 在我写第一轮和第二轮之间有几天时间(我将其保存在本地的txt文件中)。我正在测试各种建议,看看哪个会起作用,这就是为什么我不确定那个xorg.conf VNC设备编辑或者nomodeset设置是否起了作用。

[编辑 2011-06-10]

NX服务器和GDM

在写这篇文章时,我已经设置系统自动登录,所以阴影连接很简单地就起作用了。当我之后禁用并重新启动系统时,NX出现了一个错误,但是通过一点谷歌搜索,我找到了 this thread 这个帖子。

以下是我在 /usr/NX/etc/server.cfg 上取消注释和更改的内容:

EnableAdministratorLogin = "1"
EnableSessionShadowing = "1"
EnableInteractiveSessionShadowing = "1"
EnableSessionShadowingAuthorization = "0"
EnableDesktopSharing = "1"
EnableInteractiveDesktopSharing = "1"
EnableFullDesktopSharing = "1"
EnableAdministratorDesktopSharing = "1"
EnableDesktopSharingAuthorization = "0"
EnableSystemDesktopSharingAuthorization = "0"

(如果是一个更公共的网络,比如大学/大型办公室,我可能会使用稍微严格一些的设置,但这些对我来说很合适。)
重新启动后,我使用nxclient登录到桌面的“shadow”(本地显示)设置,并获得了GDM!:D
不幸的是,在“shadow”会话中剪贴板无法工作(在其他/常规会话中可以正常工作)
[编辑 2011-06-11] 偶然发现Xvfb,但在这种情况下也存在相同的问题。
Xvfb :2 -ac -screen 0 1280x1024x32 -pixdepths 8 24  2>&1 >/dev/null &
export DISPLAY=:2
gnome-session --session=2d-gnome 2>&1 >/dev/null &
x11vnc --display :2 --passwd blahblah
3个回答

我找到了罪魁祸首。
在全新安装的测试中,确认这是一个错误。

我提交了一个错误报告

简而言之,问题是:polkit身份验证对话框将显示在DISPLAY :0上,而不是VNC / NX会话所在的DISPLAY :1上。

解决方法可能是使用libpam-keyring在登录时自动进行身份验证。
或者...算了吧,那可能行不通,将所有策略工具设置从“auth_admin”更改为“yes”可能会修复该问题,当然这也会使policyKit变得无用... 叹气


1你能否更改你的Xorg.conf文件,将显示:0移除掉?我看不到为什么X需要在那里运行。这样VNC/NX就可以使用DISPLAY :0了。 - user606723

我认为这是正确的PolicyKit行为。

活动非活动和其他用户的策略是不同的,所以当您通过NX连接时,您既不是活动(本地控制台上处于活动会话的客户端),也不是非活动(本地控制台上处于非活动会话的客户端),而是被视为任意用户。

您可以使用以下命令查看不同类型用户在策略控制下的操作的默认策略:

pkaction --verbose

如您所见,Any 类型的用户在与 Active 用户相比方面受到了限制。
为了解决这个问题,您可以修改默认策略。以下是我建议的一个 awk 脚本,用于创建一个策略工具文件并将其放置在正确的位置。脚本内容如下:
#!/usr/bin/awk -f

/^[^ ]/ {
  action = substr($0, 1, length($0) - 1)
}
/^ / {
  if ($1 == "description:") {
    $1 = ""
    description = substr($0, 2)
    if (description == "")
      description = action
  } else if ($1 == "implicit") {
    if ($2 == "any:")
      any = $3
    else if ($2 == "inactive:")
      inactive = $3
    else if ($2 == "active:") {
      active = $3
      print ""
      print "[" description "]"
      print "Identity=unix-group:admin"
      print "Action=" action
      print "ResultActive="   active
      print "ResultInactive=" active
      print "ResultAny="      active
    }
  }
}

假设你将其命名为create-policy。将其设置为可执行文件,然后执行脚本。
pkaction --verbose | ./create-policy > local.pkla 

然后移动生成的文件:
sudo mv local.pkla /var/lib/polkit-1/localauthority/50-local.d/

你现在应该拥有与本地会话用户相同的权利。

我在使用NX时遇到了类似的问题,并找到了以下的讨论主题: 为什么我在使用NX时会出现Unity而不是Classic界面? 我编辑了我的Windows NX客户端,将桌面设置为Unix和自定义,然后设置运行以下命令:
gnome-session --session=classic-gnome

选择了新的虚拟桌面
之后一切就准备就绪了。