我看到最近的 GNU/Linux 正在使用 ConsoleKit 和 PolicyKit。它们是为了什么?它们是如何工作的?
最好的答案应该解释每个人试图解决什么样的问题,以及他们如何设法解决它。
我是 GNU/Linux 的长期用户,从那时起这些东西还不存在。我一直在使用 Slackware 和最近的 Gentoo。我是一名高级用户/管理员/开发人员,所以答案可以(并且应该!)尽可能详细和准确。我想了解这些东西是如何工作的,这样我就可以以最好的方式使用它们(作为用户或开发人员)。
我们的系统有点迟钝。top
报告控制台套件守护进程占用 18-30% 的 CPU 和大约 50% 的内存。只有两个用户登录,一个在 X 上,一个通过 ssh。
任何想法如何解决这个问题?
运行 Debian。uname
报告:
Linux Bulls5 2.6.32-5-686 #1 SMP Sun Sep 23 09:49:36 UTC 2012 i686 GNU/Linux
前几行top
:
9456 root 20 0 2006m 1.8g 2020 S 19 50.2 1788:50 console-kit-dae
1501 messageb 20 0 425m 397m 796 S 0 10.6 230:20.64 dbus-daemon
3799 tomcat6 20 0 932m 450m 7208 S 0 12.0 106:36.35 java
24383 postgres 20 0 48312 7956 5640 S 0 0.2 0:00.44 …
Run Code Online (Sandbox Code Playgroud) 我在 Arch Linux 机器上安装了 systemd(并且没有安装 sysvinit)。但是,我无法使用 consolekit(dbus 接口)关闭/重新启动。# systemctl {shutdown,reboot}
工作得很好,所以我猜是因为 consolekit 不知道如何联系pid 1
进程。
我在 USB 驱动器上有一个实时的 Debian Squeeze 系统,其中包含我用来对另一个驱动器进行映像的脚本。此脚本用于udisks
按标签安装驱动器,但它不适用于串行控制台。原因是与串行控制台关联的会话似乎不是“活动的”,这意味着udisks
失败:
user@my-live-usb:~$ udisks --mount /dev/disk/by-label/image-data --mount-options ro
Mount failed: Not Authorized
Run Code Online (Sandbox Code Playgroud)
更改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
Run Code Online (Sandbox Code Playgroud)
Session7 是在 /dev/ttyS0 上列出的那个。
那么如何让 ConsoleKit 将串行控制台识别为活动会话呢?
(就我而言,udisks 版本是 1.0.1+git20100614-3,consolekit 是 0.4.1-4。)
值得一提的是,Debian 实时系统会自动将实时用户登录到所有 6 个视频控制台和串行控制台上。
首先,我使用带有独立 Openbox 的 Debian 测试系统。我没有 systemd,只有 sysvinit,而且我当然不会使用 systemd。
昨天我的 Debian 机器开始返回如下消息:
Jun 14 18:08:10 morfikownia login[4722]: pam_unix(login:session): session opened for user morfik by LOGIN(uid=0)
Jun 14 18:08:10 morfikownia dbus[4391]: [system] Activating service name='org.freedesktop.ConsoleKit' (using servicehelper)
Jun 14 18:08:10 morfikownia dbus[4391]: [system] Activated service 'org.freedesktop.ConsoleKit' failed: Failed to execute program org.freedesktop.ConsoleKit: Success
...
Jun 14 18:08:19 morfikownia pulseaudio[4855]: [pulseaudio] sink.c: Default and alternate sample rates are the same.
Jun 14 18:08:19 morfikownia pulseaudio[4855]: [pulseaudio] source.c: Default and alternate sample rates are …
Run Code Online (Sandbox Code Playgroud) 如果我在不关闭所有程序的情况下关闭我的机器会伤害吗?我通常手动关闭所有这些,但从其他人那里听说这真的不再需要了(即 Linux 会在关闭计算机之前正确关闭程序)。我通常在关闭电脑时运行 Thunderbird、VIM(没有打开未保存的文件)和浏览器窗口等应用程序。而且我会确保在关闭时不会向 USB 写入任何内容。
运行 Arch Linux 并使用 ConsoleKit 关闭。
好的,首先,这不是我面临的问题,但我想更好地理解这一点。
如果我想从命令行关闭/重启我的机器,我需要调用:
$ sudo poweroff
$ sudo reboot
Run Code Online (Sandbox Code Playgroud)
也就是说,我需要 root 权限才能进行这些 ACPI 调用。
但是,我启动了我的 DE,(我使用 XFCE)而不授予它 root 权限:$ startxfce4 --with-ck-launch
现在,我知道该--with-ck-launch
参数有助于 XFCE 关闭/重新启动我的系统,但我不明白如何。
什么允许 ConsoleKit 在没有 root 权限的情况下关闭?它如何在没有超级用户权限的情况下更改运行级别?既然有可能,我如何在没有 root 权限的情况下从控制台关闭我的机器?
consolekit ×8
shutdown ×3
debian ×2
linux ×2
systemd ×2
arch-linux ×1
daemon ×1
login ×1
openbox ×1
polkit ×1
privileges ×1
sysvinit ×1
udisks ×1