我的 USB 驱动器上有一个实时 Debian Squeeze 系统,其中包含一个用于镜像另一个驱动器的脚本。该脚本用于udisks
按标签安装驱动器,但它不能在串行控制台上运行。原因是与串行控制台关联的会话似乎不是“活动的”,这意味着udisks
失败并显示:
user@my-live-usb:~$ udisks --mount /dev/disk/by-label/image-data --mount-options ro
Mount failed: Not Authorized
更改allow_any
密钥/usr/share/polkit-1/actions/org.freedesktop.udisks.policy
没有帮助,所以我想知道如何告诉 ConsoleKit 串行控制台处于“活动”状态。尝试通过 DBUS 接口执行此操作失败:
user@my-live-usb:~$ dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Session7 org.freedesktop.ConsoleKit.Session.Activate
Error org.freedesktop.DBus.GLib.UnmappedError.CkSeatError.Code0: Unable to activate session
Session7 是在 /dev/ttyS0 上列出的会话。
那么如何让 ConsoleKit 将串行控制台识别为活动会话呢?
(在我的例子中,udisks版本是1.0.1+git20100614-3,consolekit是0.4.1-4。)
还值得注意的是,Debian 实时系统会自动将实时用户登录到所有 6 个视频控制台和串行控制台上。
答案1
目标是设置一个活动的 ConsoleKit 会话。您可以通过以下方式检查:
$ ck-list-sessions | grep active
active = TRUE
如果有多个 ConsoleKit 会话,则一次最多只能有一个会话处于活动状态。
如果输出类似于
$ ck-list-sessions | grep active
active = FALSE
active = FALSE
你有一个问题,因为需要一个活动的 ConsoleKit 会话来验证通过 dbus 发送消息的东西不起作用(例如 NetworkManager,即nm-applet
udisk ...)。
有多种方法可以创建(和激活)ConsoleKit 会话。显示管理器可以通过直接与 ConsoleKit 守护进程通信来设置。或者 pam 模块可以做到这一点。或者登录/X11-session-init 脚本可能会调用 ck-launch-session ,它应该创建一个活动会话(模错误)。
通常,目标应该是以这样的方式设置 ConsoleKit,以便为窗口管理器或登录 shell(不仅仅是单个脚本)获得活动会话。
要测试 ConsoleKit 系统,您可以尝试使用它ck-launch-session
来创建正确的 consolekit 会话。例如,您可以这样调用您的脚本:
$ ck-launch-session ./script
要测试 ck-launch-session 是否没有错误,您可以调用
$ ck-launch-session ck-list-sessions
并检查是否有活动会话。
错误:最近推出了 ConsoleKit 系统的更新各种各样的 虫子进入脆弱的(并且过度设计的?)ConsoleKit 生态系统。
例如,在我的 Ubuntu 11.10 系统上,我必须在系统升级后停止工作后nox11
从pam_ck_connector.so
行中删除:/etc/pam.d/common-session
ck-launch-session
--- a/pam.d/common-session Fri May 25 10:26:53 2012 +0200
+++ b/pam.d/common-session Fri May 25 10:39:41 2012 +0200
@@ -29,5 +29,5 @@
session required pam_unix.so
session optional pam_winbind.so
session optional pam_ecryptfs.so unwrap
-session optional pam_ck_connector.so nox11
+session optional pam_ck_connector.so
# end of pam-auth-update config
现在有了这个更改,我active
在通过登录启动窗口管理器时直接获得一个会话WDM
。
这意味着窗口管理器现在在活动的 ConsoleKit 会话中运行,并且从窗口管理器进程(例如,从 xterm)作为子进程启动的所有内容也是该会话的一部分,即不再需要额外的forck-launch-session
调用nm-applet
。
答案2
我的会话有问题,在哪里,is-local
在active
哪里FALSE
。
/bin/login
用于pam_ck_connector
进行适当的会话。然后我用ck-launch-session openbox
in执行 xinit ~/.xinitrc
。第二次会议被打破。
解决方案不是使用ck-launch-session
,而是在同一个虚拟终端上执行 xinit 并保持现有的第一个本地会话处于活动状态:XINITRC=/path_to_custom/xinitrc xinit -- :1 vt1