LINUX.ORG.RU

Gentoo, systemd, sudo и управление питанием

 , ,


1

1

Ставлю себе на рабочий ноутбук Gentoo. Всё чётко по Handbook собрал базовую систему. Вместо OpenRC поставил Systemd. Работает как часы.

Захотелось дать своему пользователю выключать, перезагружать ноутбук из консоли. Прописал в конфигурацию sudo:

Cmnd_Alias POWER = /usr/bin/systemctl poweroff, \
                   /usr/bin/systemctl halt, \
                   /usr/bin/systemctl reboot

hamsteri ALL=(ALL) ALL
hamsteri ALL=(ALL) NOPASSWD: POWER

Проблема: не хочет выключать и перезагружать:

$ systemctl reboot
Failed to execute operation: Access denied
Failed to start reboot.target: Access denied

Если дать права администратора, то работает:

$ sudo systemctl reboot
Подскажите, куда копать и как это поправить.

Cmnd_Alias POWER = /usr/bin/systemctl poweroff, \
/usr/bin/systemctl halt, \
/usr/bin/systemctl reboot

Это не будет работать, sudo не смотрит в аргументы.

Захотелось дать своему пользователю выключать, перезагружать ноутбук из консоли.

Ты logind настроил? pam_systemd.so в PAM добавил? Сессия создаётся? У тебя где-то здесь проблема, потому что политики безопасности systemd по умолчанию разрешают единственному активному пользователю перезагружать систему без дополнительных привилегий.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 2)

Вместо OpenRC поставил Systemd. Работает как часы.

Толстовато, но системди-хейтерам только повод дай :)

Fedorast ()

Из коробки должно работать без привилегий (для локального пользователя).

anonymous ()
Ответ на: комментарий от Hamsteri

Может получиться так, что он создаст больше проблем, чем решит (если у тебя кастомное окружение). Если так, то твою исходную задачу можно решить, просто создав симлинки на systemctl с именами poweroff и reboot. Их можно будет прописать в sudoers, а systemctl умеет различать, с каким именем он был вызван.

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

Я думал проще будет правило для polkit сделать:

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.suspend" ||
        action.id == "org.freedesktop.login1.suspend-multiple-sessions" ||
        action.id == "org.freedesktop.login1.hibernate" ||
        action.id == "org.freedesktop.login1.hibernate-multiple-sessions")
    if (subject.isInGroup("wheel")) {
        return polkit.Result.YES;
    } else {
        return polkit.Result.AUTH_ADMIN;
    }
});
Правило polkit.service подхватило. Systemctl должен хотя бы запросить у меня пароль для выполнения операции. А мне он всё равно пишет:
$ systemctl reboot
Failed to execute operation: Access denied
Failed to start reboot.target: Access denied

Hamsteri ()
Ответ на: комментарий от Hamsteri

Не тот сценарий опубликовал. Я использовал это:

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.reboot" ||
        action.id == "org.freedesktop.login1.reboot-multiple-sessions" ||
        action.id == "org.freedesktop.login1.power-off" ||
        action.id == "org.freedesktop.login1.power-off-multiple-sessions")
    if (subject.isInGroup("wheel")) {
        return polkit.Result.YES;
    } else {
        return polkit.Result.AUTH_ADMIN;
    }
});

Hamsteri ()
Ответ на: комментарий от Hamsteri

Надо наверно было добавить в USE флаг «policykit» и пересобрать пакеты с этим флагом:

# emerge --ask --changed-use --deep @world

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] sys-apps/systemd-226-r2  USE="policykit*" 
[ebuild   R    ] net-misc/modemmanager-1.4.14  USE="policykit*"

Hamsteri ()
Ответ на: комментарий от Hamsteri

Проблема решена! Теперь пользователи из группы 'wheel' могут выключать и перезагружать систему.

Для этого потребовалось:

  • написать правило для polkit;
  • включить поддержку polkit у systemd.
Hamsteri ()
Ответ на: комментарий от intelfx

sudo не смотрит в аргументы

Неверно.

anonymous ()
Ответ на: комментарий от anonymous

Анон, не кури так много. Зачем меня кастовать, если тут аж два тега, на которые я подписан? Или ты меня скастовал на sudo? ~_^

Но, да, polkit, pam и logind, туда копать.

r3lgar ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.