web-dev-qa-db-ja.com

シャットダウン、停止などのためのArch LinuxのデフォルトのPolkit特権は何ですか?なぜそうなのですか?

Arch Linuxでは、systemdを使用すると、次のコマンドはすべてsystemctlへのシンボリックリンクです。

/usr/bin/telinit
/usr/bin/poweroff
/usr/bin/runlevel
/usr/bin/reboot
/usr/bin/halt
/usr/bin/shutdown

承認に関する彼らの行動は混乱していると思います。

$ shutdown
Must be root.
$ halt
Must be root.
$ telinit 3
# Asks for Polkit authorization

poweroffrebootも承認を要求しません。 poweroffは実際にはシステムの電源をオフにしません。ラップトップはオンのままで、画面に電源がオフになっていることを示すテキストが表示されます-無期限に。

私はPolkitのルールをいじったことがないので、なぜその動作がそうなのか疑問に思います。

  • すべてのコマンドは、wheelのメンバーである私の非root管理者ユーザーで試されました。
  • /etc/polkit-1/rules.dには、デフォルトのルールセットのみが含まれているようです。

    # tail /etc/polkit-1/rules.d/*
    // DO NOT EDIT THIS FILE, it will be overwritten on update
    //
    // Default rules for polkit
    //
    // See the polkit(8) man page for more information
    // about configuring polkit.
    
    polkit.addAdminRule(function(action, subject) {
        return ["unix-group:wheel"];
    });
    

よく調べてみると、/usr/share/polkit-1/actions/org.freedesktop.login1.policyには、poweroffrebootsuspend、およびhibernateのセクションがあり、allow_activeはいに設定します。ただし、shutdownのセクションはありません。これが原因である場合、なぜそうなのですか?

4
muru

これはかなり複雑です。コマンドを列挙した順に説明しましょう。

  1. telinit

    telinitに対するさまざまな引数は、systemctlのさまざまな(異なる)サブコマンドに直接変換されます。 telinit(8) (systemdパッケージからのドキュメント)によると:

    2、3、4、5

    SysVランレベルを変更します。これは、runlevel2.targetrunlevel3.target、...のアクティベーション要求に変換され、systemctl isolate runlevel2.targetsystemctl isolate runlevel3.target、..と同等です。

    したがって、これらのコマンドはsystemctl isolateに変換され、それ自体がpolkitアクションorg.freedesktop.systemd1.manage-unitsによって制御されます。そのアクションの特権は、デフォルトで管理者認証を必要とします—アクティブなセッション、非アクティブなセッション、および任意のセッション外のプロセスの両方に対して。

    (BTW、デフォルトでは、polkitはwheelグループ内のすべてのユーザーを管理者として扱うように構成されています。したがって、自分で認証するように求められました。)

  2. haltpoweroffreboot

    コマンドpoweroffrebootは2つのステップで機能します。

    • root以外のユーザーの下で呼び出され、logindが使用可能な場合、logindは、polkitアクションorg.freedesktop.login1.*を使用してアクションを実行するように求められます。
    • それ以外の場合は、systemctl poweroffまたはsystemctl rebootとほぼ同等のものが実行されますが、polkitを参照せずに実行されます。

    haltも同様ですが、常に2番目のルートになります(systemctl haltとほぼ同等)。 logindを介して停止する方法はありません。

    「ほぼ同等」に注意してください。あなたがする場合

    • ログインしていない非ルートの下のpoweroff
    • ログインしていない非ルートの下のreboot
    • halt非ルートの下で、

    「ルートでなければならない」というメッセージが表示されます。 polkitを介してorg.freedesktop.systemd1.manage-unitsを認証する代わりに。同時に、systemctl poweroffsystemctl reboot、またはsystemctl haltを使用すると、polkitを介して認証する機会が与えられます。これはおそらくバグです。

  3. shutdown

    このツールを使用して、遅延電源オフ、停止、または再起動をスケジュールできます。引数なしで呼び出された場合、1分の遅延が意味されます。デフォルトのアクションは電源オフです。から shutdown(8)

    時間文字列は、24時間形式で指定された、シャットダウンを実行する時間を指定する時間/分の「hh:mm」の形式のいずれかです。または、構文「+ m」で、mから指定された分数を参照することもできます。 「now」は「+0」のエイリアスです。つまり、即時シャットダウンをトリガーします。時間引数が指定されていない場合、「+ 1」が暗黙指定されます。

    タイムアウトとウォールメッセージが指定されていない場合、shutdownpoweroffhalt、またはrebootのいずれかと同等です(#2を参照)。

    タイムアウトまたはウォールメッセージのいずれかが指定されている場合、shutdownにはroot権限が必要です。

  4. poweroffの電源がオフにならない

    それは本当にすべきです。これはおそらくカーネルのバグです。

4
intelfx