🔤

en_USで頑張るArch Linux日記 6日目:ssh中のシャットダウン禁止、自動ログイン, 画面ロック無効化, サスペンド

に公開

en_USで頑張るArch Linux日記の6日目です。

今日は電源関連を設定していきます。

ssh接続中にシャットダウンするのを防ぐ

筆者の環境では他のPCからsshで接続していると、30分くらいで勝手にシャットダウンしてしまいます。
かなりウザいので、こいつを止めます。

Ask Ubuntuで紹介されているpam_session.shというシェルスクリプトを使わせてもらいました。

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

このシェルスクリプトではnetstatawkを使っているので、入っていなければ入れます。

コマンド 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というディスプレイマネージャが入っているはずなので、この設定をします。

/etc/sddm.conf.d/autologin.conf
[Autologin]
User=USER-NAME
Session=hyprland
Relogin=true

上記のUSER-NAMEは自分のユーザ名に変更してください。

Refer to: https://wiki.archlinux.org/title/SDDM

画面ロックを止める

職場のPCでもないのに画面ロックするなんて頭おかしいです。
画面ロック(Hyprlock)はHypridleが呼んでいるので、こいつの設定を変更します。

~/.config/hypr/hypridle.conf
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の設定ファイルを追加

/etc/polkit-1/rules.d/enable-suspend.pkla
[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してください。

/etc/systemd/logind.conf.d/suspend.conf
[Login]
HandlePowerKey=suspend

ファイルを作成したら、下記のようにlogindサービスを再起動します。

sudo systemctl restart systemd-logind

設定作業はこれで終わりです。

動作確認

まず、sshではなくローカルのデスクトップ環境(Hyprland)の動作を確認します。

以下のように一通り確認しておくとよいでしょう。

  1. PCの電源ボタンを短く押すとサスペンド
  2. 再度PCの電源ボタンを短く押すとサスペンドから復帰
  3. コマンド sudo systemctl suspend でサスペンド
  4. キーボードでなにかキーを押すとサスペンドから復帰

次に、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/

→7日目

脚注
  1. Refer to: 電源管理/サスペンドとハイバネート - ArchWiki ↩︎

Discussion