xfce Debian で xscreensaver を有効にすると、一時停止ボタンは機能しません。

xfce Debian で xscreensaver を有効にすると、一時停止ボタンは機能しません。

私はDebian jessieとxfceを持っています。電源ボタンを押すとシステムが一時停止します。キーボードのいずれかのキーを押すとシステムが起動し、Xscreensaverからログインプロンプトを受け取ります(画面ロックが有効になります)。電源ボタンを押してもシステムが一時停止しなくなるため、ログインする必要があります電源ボタンを使用してシステムを一時停止できます。 Xscreensaverログイン画面でシステムを一時停止する方法はありますか?

答え1

問題は(おそらく)xfceセッションの一部のプログラム、つまりシステムトレイの一部の電源マネージャプログラムが保留中のボタン押下イベントを処理していることです。画面がロックされている場合、みんなスクリーンセーバーは、一時停止ボタンを含むキー押下をブロックします。

修理する可能ボタン処理が設定されていることを/etc/systemd/logind.conf確認してくださいsystemd。その場合は、HandleSuspendKey=suspend一時systemd停止ボタンを押すと一時停止が始まります。しかし、画面がロック解除されるとどうなるかわかりません!一時停止ボタンの押下を無視するように電源マネージャプログラムに指示する必要がある場合があります。完全な回答を提供するのは難しいですが、この回答が少なくとも正しい方向に進むのに役立つことを願っています。

答え2

Xscreensaverが正しく実行されています。私が理解したところ、XGrabKeyboardXscreensaverはログインウィンドウを表示するときにキーストロークをキャッチするためにそれを使用します。簡単に言えば、通常、ロック画面では電源ボタンを使用できませんが、その理由とどのような解決策が存在する可能性があるかを調べるために、多くのドキュメントといくつかのコードを見ました。

Xscreensaverロックをバイパスするにはいくつかの例外があり、すべて低レベルのキーボードショートカットを使用する必要があります。1

バックドア#1:Ctrl-Alt-バックスペース。このキーストロークはXサーバーをシャットダウンし、一部のシステムではテキストコンソールが残ります。ユーザーがX11を手動で起動すると、テキストコンソールはログインし続けます。このキーストロークを完全に永続的に無効にするには、xorg.conf、XF86Config、またはXF86Config-4ファイル(システムで使用される名前)でDontZapフラグを設定する必要があります。詳細については、XF86Config(またはバリアント)のマニュアルを参照してください。

バックドア#2:Ctrl-Alt-F1、Ctrl-Alt-F2など、これらのキーストロークは別の仮想コンソールに切り替えて、X11を実行しているコンソールをロックします。シェルを別の仮想コンソールにログインすると、シェルは保護されません。したがって、他のコンソールにログインしたままにしないでください。 xorg.confでDontVTSwitchを設定することで、VTトランジションを完全に完全に無効にすることができますが、これによりシステムの使用がより困難になる可能性があります。

バックドア#3:Alt-SysRq-F。これはLinuxカーネルの「OOM-killer」ボタンです。選択した長期実行プログラムをランダムに終了するので、xscreensaverをターゲットにして殺すことができます。 xscreensaverはこれから自分自身を保護することはできません。以下を使用してグローバルに無効にできます。 sudo 'echo 176 > /proc/sys/kernel/sysrq'

バックドア#4:Ctrl-Alt-KP_Multiply。このキーはロック付きのすべてのX11アプリケーションを終了するため、このキーを入力するとxscreensaverが終了し、画面のロックが解除されます。この「機能」は2008年にXサーバーに登場し、2011年現在、一部のベンダーはこの機能をデフォルトに設定しています。本当にいいですね。 xorg.confでAllowClosedownGrabsをオフにして無効にすることができます。

実際にAllowClosedownGrabsロックを維持するXscreensaverプロセスを終了するか、AllowDeactivateGrabsキーボードスクレイピングを無効にして有効にするようにXorgを設定できます。2。もちろん、これによりキーボードに物理的にアクセスできる人にはロックが役に立たなくなりますが、少なくともAllowClosedownGrabsまたはAllowDeactivateGrabsショートカットを使用した後にコンピュータが停止していることを確認するために電源ボタンをテストできる必要があります。

この時点でマシンを正常に一時停止した場合、少なくともXGrabkeyboardによってキャプチャされず、サーバーの動作を制御することができるタスクを実行できる一定レベルのキーボードマッピングがあることがわかります。

このホットキーは、画面がCtrl-Alt-FXロックされているときに仮想端末を切り替えますXF86_Switch_VT_X。ここで、XFキーは1〜12です。したがって、私たちはxkbのこれらのキーが盗まれていないことを知っています。

プログラム出力の抜粋grep -r "XF86_Switch" /usr/share/X11/xkb/:

/usr/share/X11/xkb/compat/xfree86:    interpret  XF86_Switch_VT_1 {
/usr/share/X11/xkb/symbols/srvr_ctrl:   symbols[Group1]= [ F1, F1, F1, F1, XF86_Switch_VT_1 ]

このファイルを見ると、キーボードキャッチをキャンセルし、アクティブクライアントを終了するためのキーの組み合わせも含まれています。

したがって、ロック画面中に電源ボタンを一時停止する方法がある場合は、電源ボタンのカスタムxkbキーが必要になることがあります。また、Ungrab現在アクティブなすべてのスナッチをキャンセルするためにも使用する必要があります。

今としてはこれが私が差し上げることができるすべてです。特に、Ungrab以下のように、電源ボタンのxkbキーマッピングと使用するキーマッピングについて、いくつかの新しい質問が発生する可能性があります。

コミット7d2543a3cb3089241982ce4f8984fd723d5312a1からサム

Add four new private XKB actions for debugging:
    * PrGrbs: print active grabs to the log file
    * Ungrab: ungrab all currently active grabs
    * ClsGrb: kill clients with active grabs
    * PrWins: dump the current window tree to the log file

To use these, you need to modify your XKB maps, e.g. the following to
have Ctrl+Alt+(F9-F12) mapped to the above:
 - compat/xfree86:
    interpret XF86LogGrabInfo {
        action = Private(type=0x86, data="PrGrbs");
    };
    interpret XF86Ungrab {
        action = Private(type=0x86, data="Ungrab");
    }
    interpret XF86ClearGrab {
        action = Private(type=0x86, data="ClsGrb");
    }
    interpret XF86LogWindowTree {
        action = Private(type=0x86, data="PrWins");
    }

 - symbols/pc:
    key <FK09> {        type="CTRL+ALT", [ Return, XF86LogGrabInfo      ]   };
    key <FK10> {        type="CTRL+ALT", [ Return, XF86Ungrab           ]   };
    key <FK11> {        type="CTRL+ALT", [ Return, XF86ClearGrab        ]   };
    key <FK12> {        type="CTRL+ALT", [ Return, XF86LogWindowTree    ]   };

編集する:ACPIの電源ボタンイベントは正しく機能できますが、次の理由で処理されません。XGrabServer4xscreensaverで使用されるロック5

XGrabServer機能は要求処理を無効にし、この要求が到着した接続を除く他のすべての接続を閉じます。

この問題を解決する唯一の方法は、オプションを有効にしてAllowClosedownGrabsキーCtrl+Alt+Keypad-Multiplyの組み合わせを使用することです。6

AllowDeactivateGrabsおよびAllowClosedownGrabsオプションを使用すると、ユーザーはスクリーンセーバー/ロックプログラムで使用されているキャッチを削除できます。

これが本当にうんざりしたい場合は、電源ボタンをサポートするxscreensaver用のパッチを書くことができます(おそらくACPIイベントを受け取り、もう一度XUngrabServerイベントをエクスポートすること)。システムが回復したら、もう一度キャッチする必要があります。それ以外の場合、ロックは意味がありません。これが他のセキュリティにどのような影響を与えるかわかりません。

編集2:xfce4-power-manager-settings電源ボタンを押すとオフになるように設定してテストし、画面がロックされても動作します。これは、ACPI処理には電源ボタンのスキャンコードのみが必要で、ウィンドウマネージャレベルでは処理する必要がないためだと思います。

電源ボタンを設定するテストは、Suspendxscreensaverによってキャプチャされブロックされます。

私は次を読んだ7pm-suspend、xscreensaverの実行中に直接邪魔されないことを確認するためにテストすることにしました。

xfce4-power-manager は pkexec を使用して pm-suspension を呼び出します。 pkexecを使用すると、他のユーザー(この場合はroot)でプログラムを実行できます。

まずsudo ls、パスワードを入力し、ユーザーに一時的なsudo権限を与えました。

次に、次のコマンドを実行します。

sleep 60 && xscreensaver-command -lock &
sleep 60 && sudo pm-suspend

画面がロックされた後、システムは期待どおりに一時停止しました。

私は、ストップがウィンドウマネージャレベルで処理され、xfce4-power-managerxkbキーマップを使用してウィンドウマネージャレベルで処理できるキーコードに変換されたスキャンコードを処理すると思います。これはクロールされ、実行がブロックされた理由を説明します。pm-suspend8

udev キーマップが正しい。前述したように、カーネルレベルにはKEY_SLEEP(RAMの一時停止)とKEY_SUSPEND(ディスクの一時停止、休止状態とも呼ばれる)のみがあります。

X.org レベルでは、/usr/share/X11/xkb/keycodes/evdev に KEY_SLEEP と KEY_SUSPEND が割り当てられます。その後、/usr/share/X11/xkb/symbols/inet が XF86Sleep および XF86Suspend にマップされ、イメージ名が evdev として指定されます。

正しく読むと、私のシステムでもこれに似ています。

grep -r "Suspend" /usr/share/X11/xkb/

出力:

/usr/share/X11/xkb/geometry/everex:    indicator "Suspend"  { left=112; };
/usr/share/X11/xkb/keycodes/evdev:  indicator 7  = "Suspend";
/usr/share/X11/xkb/symbols/inet:    key <I213>   {      [ XF86Suspend           ]       };
/usr/share/X11/xkb/server-0.xkb:    indicator 7 = "Suspend";
/usr/share/X11/xkb/server-0.xkb:    key <I213> {         [     XF86Suspend ] };

編集3:xfce4-power-managerこの場合は、ACPIを使用する代わりに直接停止するように設定してみてください。

/etc/acpi/events/powerbtnこれを正しく処理するには、呼び出すシェルスクリプトを作成する必要があります。バラよりLinuxでノートブックを一時停止して休止状態にする方法

xscreensaver-command -lockシステムの再起動時に画面がロックされていることを確認するには、中断する前にスクリプトでそれを使用する必要があります。 Xscreensaverは画面がロックされているかどうかを確認し、ロックされているxscreensaver-command: already locked.場合に出力します。

答え3

それでも興味がある人は、数日前に保留中のキーを処理するためにシステムインフラストラクチャを使用していないラップトップで同様の問題が発生しました(長い話であり、ここではあまり関係ありません)。とにかく私の解決策は、システム全体の反応にacpidを使用することでした。

1)マイウィンドウマネージャ(openbox)はOSDメッセージを表示し、xscreensaver-command lockを実行して一時停止キー(XF86Sleep)に応答します。

2)acpidは一時停止キー(event = button / sleep SBTN)に応答し、2秒間休止状態を維持し、uswsuspでs2ramを実行します(例:https://wiki.debian.org/Uswsusp)

関連情報