en_USで頑張るArch Linux日記 6日目:ssh中のシャットダウン禁止、自動ログイン, 画面ロック無効化, サスペンド
en_USで頑張るArch Linux日記の6日目です。
今日は電源関連を設定していきます。
ssh接続中にシャットダウンするのを防ぐ
筆者の環境では他のPCからsshで接続していると、30分くらいで勝手にシャットダウンしてしまいます。
かなりウザいので、こいつを止めます。
Ask Ubuntuで紹介されているpam_session.sh
というシェルスクリプトを使わせてもらいました。
#!/bin/sh
#
# This script runs when an ssh session opens/closes, and masks/unmasks
# systemd sleep and hibernate targets, respectively.
#
# Inspired by: https://unix.stackexchange.com/a/136552/84197 and
# https://askubuntu.com/a/954943/388360
num_ssh=$(netstat -nt | awk '$4 ~ /:22$/ && $6 == "ESTABLISHED"' | wc -l)
case "$PAM_TYPE" in
open_session)
if [ "${num_ssh}" -gt 1 ]; then
exit
fi
command=mask
;;
close_session)
if [ "${num_ssh}" -ne 0 ]; then
exit
fi
command=unmask
;;
*)
exit
esac
logger "${command}ing sleep and suspend targets (num_ssh=${num_ssh})"
sudo systemctl ${command} sleep.target suspend.target
このシェルスクリプトではnetstat
とawk
を使っているので、入っていなければ入れます。
コマンド | Arch パッケージ |
---|---|
netstat |
net-tools |
awk |
gawk |
つぎにこのスクリプトへのsymlinkを/etc
に置きます。
sudo ln -s PATH/TO/pam_session.sh /etc
PATH/TO
の部分はスクリプトのパスに変更してください。
次に、このスクリプトを呼ぶように/etc/pam.d/sshd
に1行足します。
session optional pam_exec.so quiet /etc/pam_session.sh
編集するのが面倒な場合は、下記のワンライナーで追加できます。
sudo sh -c "echo 'session optional pam_exec.so quiet /etc/pam_session.sh' >> /etc/pam.d/sshd"
最後にsudo reboot
で再起動します。
これでssh中はシャットダウンしなくなるはず。
自動ログイン
ユーザが自分一人ならいちいちログインするのも面倒です。
SDDMというディスプレイマネージャが入っているはずなので、この設定をします。
[Autologin]
User=USER-NAME
Session=hyprland
Relogin=true
上記のUSER-NAME
は自分のユーザ名に変更してください。
Refer to: https://wiki.archlinux.org/title/SDDM
画面ロックを止める
職場のPCでもないのに画面ロックするなんて頭おかしいです。
画面ロック(Hyprlock)はHypridleが呼んでいるので、こいつの設定を変更します。
general {
lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances.
# before_sleep_cmd = loginctl lock-session # lock before suspend. #コメントアウト
after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
}
:
# Screenlock
listener {
# HYPRLOCK TIMEOUT
# timeout = 1800 # コメントアウト
timeout = 0 # 追加 0: disabled
}
上記のgeneral { .. }
の中にある before_sleep_cmd = ~
の行はコメントアウトする必要があるようです。
Refer to: https://www.reddit.com/r/hyprland/comments/1hjfgwa/disable_automatic_screen_lock/
電源ボタンでサスペンド
おそらく今は、電源ボタンちょん押しすると電源OFFになるはず。
EndeavorOSはOut-of-boxでサスペンドしてくれていたので、同様の動きにします。
手順は以下のとおりです。
1. ターゲットのマスクを外す
sudo systemctl unmask suspend.target
sudo systemctl status suspend.target # 確認
確認結果は下記のようになるはずです。
○ suspend.target - Suspend
Loaded: loaded (/usr/lib/systemd/system/suspend.target; static)
Active: inactive (dead) ^^^^^^
Docs: man:systemd.special(7)
Loaded:
の行の末尾がstatic
なら、意図通りマスクが外れた状態になっています。
2. polkitの設定ファイルを追加
[Allow Suspend]
Identity=unix-user:USER-NAME
Action=org.freedesktop.upower.suspend
ResultActive=yes
上記のUSER-NAME
は変更してください。
ファイルを作成したら、次のようにpolkit
サービスを再起動します。
sudo systemctl restart polkit
3. logindの設定ファイルを追加
logindの設定ファイルを追加します。
/etc/systemd/logind.conf.d/
フォルダがない場合は事前にsudo mkdir
してください。
[Login]
HandlePowerKey=suspend
ファイルを作成したら、下記のようにlogind
サービスを再起動します。
sudo systemctl restart systemd-logind
設定作業はこれで終わりです。
動作確認
まず、sshではなくローカルのデスクトップ環境(Hyprland)の動作を確認します。
以下のように一通り確認しておくとよいでしょう。
- PCの電源ボタンを短く押すとサスペンド
- 再度PCの電源ボタンを短く押すとサスペンドから復帰
- コマンド
sudo systemctl suspend
でサスペンド - キーボードでなにかキーを押すとサスペンドから復帰
次に、sshでリモートホストからログインしてサスペンドしてみましょう。
おそらく、電源ボタンでもコマンドでもサスペンドできないはずです。
コマンド sudo systemctl suspend
を実行すると、ターミナルには下記のように表示されるはずです。
Broadcast message from root@arch on pts/2 (Sat 2025-04-05 05:21:13 JST):
The system will suspend now!
Call to Suspend failed: Access denied
最後の行で、サスペンド要求が拒否されていることが分かります。
このように、リモートからssh接続中はサスペンド出来ないので、サスペンドするにはsshセッションをすべて閉じてから電源ボタンを押すようにします。
Refer to: https://www.reddit.com/r/debian/comments/1dl6scx/suspend_access_denied/
-
Refer to: 電源管理/サスペンドとハイバネート - ArchWiki ↩︎
Discussion