Prompt
laptopに入ってるUbuntuで、閉じるとスリープしてデーモンとかSSHとか全部止まるのを変えたいね!(今はtty環境で開いている)
その悩み、めちゃくちゃ分かるよ!せっかく Ubuntu をサーバー化して運用しようと思っても、ノートPCを閉じるたびにスリープされて SSH が切断されるのはストレスだよね。
ノートPCを閉じたときの動作(Lid Switch)は、Ubuntu のベースシステムである systemd の設定で管理されているんだ。tty 環境(GUIなし)でも、設定ファイルを一行書き換えるだけで、「閉じても眠らないタフな Ubuntu」 に変身させられるよ。
還元主義的に、設定の手順を解剖しよう!
1. logind.conf を編集する
Ubuntu のログインや電源管理を司る systemd-logind というデーモンの設定ファイルを書き換えるよ。
-
ターミナルで以下のコマンドを叩いて、設定ファイルを開こう。
Bash
sudo nano /etc/systemd/logind.conf -
ファイルの中から以下の行を探してね(たいてい
#でコメントアウトされているはず)。#HandleLidSwitch=suspend -
これを以下のように書き換えて、コメントアウトの
#を外そう。HandleLidSwitch=ignore
2. 設定を反映させる
ファイルを保存(Ctrl + O → Enter)して閉じたら(Ctrl + X)、設定を反映させるために systemd-logind を再起動するか、OS自体を再起動しよう。
Bash
# デーモンを再起動して反映
sudo systemctl restart systemd-logind
※ SSH 越しに実行すると一瞬接続が怪しくなることがあるけれど、基本的にはこれで反映されるよ。
3. その他の Lid 設定オプション
実は他にもいくつか設定項目があるんだ。状況に合わせて使い分けてみて。
| 設定項目 | 動作 |
|---|---|
ignore | 何もしない(画面が閉まっても動き続ける) |
suspend | スリープ(デフォルト) |
poweroff | 電源を切る(過激!) |
lock | 画面をロックするだけ |
もし「電源に繋がっているときだけ眠らないでほしい」なら HandleLidSwitchExternalPower=ignore も設定しておくといいかもしれないね。
豆知識:ノートPCの排熱問題
ノートPCを閉じたまま長時間デーモンを動かしたりコンパイル(Rust とか!)を回したりする場合、「熱」 には注意が必要だよ。
多くのノートPCはキーボード面からも排熱するように設計されているから、閉じたままフル稼働させるとディスプレイのパネルが熱でダメージを受けることがあるんだ。サーバー用途で回し続けるなら、少しだけ隙間を開けておくか、風通しの良い場所に置くのがエンジニアの優しさだね。
見落とされがちな視点:Wake-on-LAN
もし「普段はスリープさせておいて、必要な時だけ SSH で叩き起こしたい」なら、ignore ではなく Wake-on-LAN (WoL) を設定するという高度な技もあるよ。でも、君が今やろうとしているのは「常時稼働サーバー」化だと思うから、今回の ignore 設定がベストなはずだ!
結論
/etc/systemd/logind.conf の HandleLidSwitch=ignore。これだけで、君の Ubuntu laptop は立派な常時稼働ノードになるよ。
これで、ノートPCを閉じて部屋の隅に置いたまま、メインマシンから SSH でガシガシ開発ができるね!
次は、「ノートPCを閉じたままでも CPU の温度をターミナルで監視するスクリプト」 を書いてみる?それとも、「バッテリーの寿命を延ばすために、80%で充電を止める設定(Ubuntu版)」 について調べてみる?
Would you like me to provide a simple bash script to monitor CPU temperature and fan speed on your Ubuntu laptop?
Prompt
残念ながら、これはうまく機能しない。
ちなみに特殊な事情で、GRUBの起動オプションに、
GRUB_CMDLINE_LINUX_DEFAULT="modprobe.blacklist=pinctrl_broxton intremap=nosid intel_idle.max_cstate=1 i915.enable dc=0"
を付与しているので、なにか影響があるかもしれない。
その GRUB_CMDLINE_LINUX_DEFAULT の設定、かなり「歴戦のエンジニア」感があるね!
intel_idle.max_cstate=1 や i915.enable_dc=0 を入れているということは、おそらく Apollo Lake や Gemini Lake 世代の CPU(Celeron N3450 とか)を積んだ機体で、省電力状態に入るとフリーズしてしまう、あるいは画面がブラックアウトするといった低レイヤーの不安定さと戦ってきた証拠だ。
情報工学的に言うと、その機体は 「電源管理周りの ACPI 実装がかなりピーキー」 な可能性があるよ。logind.conf が無視されるのは、カーネルが Lid(蓋)の開閉イベントを正しく systemd に伝えていないか、あるいは別のレイヤーが強制的にサスペンドを叩き込んでいるからかもしれない。
「閉まらない Ubuntu」を完成させるために、より低レイヤーからのアプローチを試してみよう!
1. 最終手段:systemd のサスペンド機能を「物理的に」潰す
logind.conf が効かないなら、OS 全体の「スリープ機能」そのものをマスク(無効化)してしまうのが、サーバー運用における最も確実な「核爆弾」的解決策だよ。
以下のコマンドを順番に実行してみて。
Bash
# スリープ、サスペンド、休止状態の全ターゲットを無効化(マスク)する
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
解説:
これで OS は「スリープという概念」そのものを認識できなくなる。蓋を閉じても、システムがサスペンドを実行しようとした瞬間に systemd がそれをブロックするんだ。
2. Lid イベントが本当に届いているか確認する
もし上記でもダメなら、そもそもハードウェアからの「蓋が閉まった」という信号を OS がどう受け取っているか、生のイベントを監視してみよう。
-
acpidが入っていなければインストール。Bash
sudo apt install acpid -
イベントをリッスンする。
Bash
acpi_listen -
この状態で ノート PC をそっと閉じて、すぐ開ける。
結果の判断:
-
何か表示された(
button/lid LID close等)→ カーネルまでは届いている。logindか電源管理ツールが犯人。 -
何も表示されない → 君が設定している
modprobe.blacklist=pinctrl_broxtonやpinctrl系の制限によって、GPIO 経由の蓋スイッチイベント自体がカーネルに届いていない可能性がある。
3. UPower の設定を確認する
もし Ubuntu デスクトップ版を最小インストールなどで入れている場合、UPower というデーモンが logind.conf を無視して独自に動いていることがあるんだ。
-
設定ファイルを開く。
Bash
sudo nano /etc/UPower/UPower.conf -
以下の項目を探して
falseになっているか確認(あるいは書き換え)。IgnoreLid=true(※これは「Lid を無視するか?」という設定なので、
trueにすると閉じてもスリープしなくなる)
豆知識:なぜあの GRUB オプションが必要なのか
君が設定している intel_idle.max_cstate=1 は、CPU が深い眠り(C-State)に入るのを力技で防ぐものだね。
実はノート PC の蓋を閉じる動作は、ハードウェア的には 「究極の省電力状態への移行トリガー」 だ。君の機体は、省電力機能(C-State や i915 の DC State)にバグがあるため、蓋を閉じて「あ、スリープしなきゃ」と CPU が判断した瞬間に、カーネルパニックやハングアップを起こして、結果として SSH が死んでいる可能性もあるんだ。
見落とされがちな視点:BIOS / UEFI の設定
ごく稀に、OS の設定を全て無視して 「ハードウェア(マザーボード)が直結で電源を切る」 仕様のラップトップが存在するよ。
もし上記の手順を試しても SSH が切れるなら、BIOS 画面に入って Power Management や Deep Sleep といった項目がないかチェックしてみて。
次のステップ:
まずは systemctl mask で物理的にスリープを封印してみるのが一番の近道だ!
もしこれを実行しても SSH が切断されるなら、それは「スリープ」しているのではなく、「蓋を閉じた瞬間にカーネルがクラッシュしている」 という非常に情報工学的に燃える(?)状況かもしれない。
Would you like me to show you how to check the kernel logs (dmesg or journalctl) after a forced reboot to see if a kernel panic occurred at the exact moment the lid was closed?
Prompt
1番を一度スキップして、
2. button/lid LID close, button/lid LID openが表示された。
battery PNP0C0A:00 00000081 00000001,battery PNP0C0A:00 00000080 00000001が1秒程度の間隔で交互に表示される
3. IgnoreLid=falseだった。
acpi_listen でイベントが確認できたのは大きな前進だね!カーネルはちゃんと「蓋が閉まった」ことを検知できている。つまり、ハードウェアと OS の通信パイプは生きているということだ。
一方で、battery PNP0C0A が 1 秒間隔で交互に表示されているのは、少し 「ACPI のノイズ(おしゃべり)」 が激しい状態だね。これは低価格帯のラップトップや、君が GRUB で対策しているような電源管理に癖がある機体によく見られる挙動なんだ。
「閉じても眠らない Ubuntu」を完成させるために、残りのピースを埋めていこう!
1. UPower の設定を修正する
UPower.conf が IgnoreLid=false だったということは、UPower が systemd-logind の設定を無視して「蓋が閉まったからスリープしろ!」と命令を出している 可能性が非常に高いよ。
-
再び設定ファイルを開く。
Bash
sudo nano /etc/UPower/UPower.conf -
IgnoreLid=trueに書き換える。解説: これで UPower に対し「蓋の開閉イベントは無視しろ」と明示的に伝えられる。
-
UPower を再起動して反映。
Bash
sudo systemctl restart upower
2. スキップした「第 1 の手段」:システムレベルの封印
logind.conf や UPower.conf はあくまで「ポリシー(方針)」の設定だ。しかし、システムには 「何があってもサスペンドを許さない」 という強力な封印術がある。それが前回スキップした mask だよ。
もし上の UPower の修正でも SSH が切れるなら、迷わずこれを実行してほしい。
Bash
# スリープ機能を司るユニットを物理的に無効化する
sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
なぜこれが強力なのか?
disable は「自動起動しない」だけだけど、mask はそのユニットを /dev/null にリンクさせる。これにより、他のどんなサービスやハードウェアイベントが「スリープしろ!」と叫んでも、実行エンジンが物理的にその命令を読み込めなくなるんだ。
3. 「バッテリー・フラッピング」の懸念
acpi_listen で見えた 1 秒間隔のバッテリーイベントは、システムが 「バッテリー残量が不安定(あるいは急激に変化した)」 と誤認する原因になる。
君の機体は intel_idle.max_cstate=1 を入れていることから、電圧制御が非常にシビアなんだと思う。
もしスリープを阻止できても、システムが「バッテリー異常」と判断して緊急シャットダウン(Critical Discharge)を試みる可能性がある。その時は UPower.conf 内の CriticalPowerAction を Nothing に変える必要があるかもしれないね。
豆知識:modprobe.blacklist=pinctrl_broxton の影響
君がブラックリストに入れている pinctrl_broxton は、Intel SoC のピン制御(GPIO)を司るドライバだね。
実はノート PC の Lid スイッチ(蓋の磁気センサー)はこの GPIO 経由で報告されることが多いんだ。acpi_listen でイベントが見えているので完全に死んでいるわけではないけれど、ドライバを止めているせいで 「イベントは飛ぶが、電源管理レイヤーへの通知が中途半端に壊れている」 状態になっている可能性は否定できないよ。
見落とされがちな視点:tty のコンソール消灯
「スリープしていないけれど、SSH が切れる」場合、ネットワークドライバが省電力モード(WiFi Power Management 等)に入ってしまっているケースも考えられる。
SSH が切れた後、蓋を開けて dmesg を叩いたときに wlan0: deauthenticated とか suspend entry といったログが出ていないかチェックするのが、次のデバッグの鍵になるよ。
次のステップ:
まずは IgnoreLid=true にして UPower を再起動、ダメなら systemctl mask。
もしこれでもダメなら、いよいよ 「蓋を閉じた瞬間にネットワークカードが電源オフになっている説」 を疑ってみようか。
Would you like me to provide a command to disable WiFi Power Management, which often causes SSH disconnects on laptops?
Prompt
IgnoreLid=true程度では、お休みモードになってしまうので、最終手段を強行した結果、無事にスリープしないようになった!
けれど、これには代償もつくよね。たとえば、明示的にスリープしようとしても、できなかったり
「最終手段」の強行、お疲れ様!ついに Ubuntu が 「不眠のサーバー」 として覚醒したね。
君の予感通り、systemctl mask は 「機能そのものを物理的に破壊(/dev/null へ接続)」 する強烈な手段だから、いくつかの「代償(副作用)」が伴うよ。情報工学的に言えば、OS の電源管理インターフェースを一つ潰したことになるんだ。
還元主義的に、これから直面するであろう「代償」と「付き合い方」を解剖してみよう。
1. 「意図的なスリープ」も封印される
最大かつ明白な代償はこれだね。
-
GUI / CUI 両方で不可: デスクトップ環境のメニューから「サスペンド」を選んでも反応しなくなるし、コマンドラインで
systemctl suspendを叩いてもUnit suspend.target is masked.と拒絶される。 -
対策: もし一時的にスリープさせたい状況になったら、一旦
unmaskする必要があるんだ。Bash
sudo systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target
2. バッテリー消費とディスプレイの寿命
ノート PC を閉じていても、システムはフル稼働(S0 状態)を維持している。
-
ディスプレイの「点灯」: tty 環境(コンソール)の場合、蓋を閉じてもバックライトが点灯したままの機種がある。これは液晶パネルの寿命を縮めるし、バッテリーを激しく消費する。
-
解決策: 以下のコマンドで、手動でディスプレイ出力をオフにできるよ。
Bash
# コンソール画面を即座に消灯させる(何かキーを叩けば復帰する) setterm --blank force
3. サーマル・スロットリング(熱問題)
以前も少し触れたけれど、ここが一番物理的に怖いポイントだ。
-
熱の籠もり: ラップトップは「蓋が開いていること」を前提に放熱設計されているものが多い。
-
GRUB 設定の影響: 君は
intel_idle.max_cstate=1を入れているから、CPU は常に高電圧・高クロックで待機している。つまり、通常よりも熱を持ちやすい。 -
リスク: 蓋を閉じた状態で重いコンパイル(Rust とか)を回すと、熱が逃げ場を失い、CPU が自身の保護のために性能を極端に落とす(スロットリング)、あるいは最悪の場合、熱暴走で強制シャットダウンする可能性がある。
4. 電源ボタンの挙動
スリープをマスクすると、電源ボタンを「短押し」した時の挙動(通常はスリープ)も不安定になるか、無視されるようになるよ。
- 期待される挙動: ボタンを押しても何も起きない、あるいは設定によっては即座にシャットダウンが始まる。
豆知識:vbetool でバックライトだけ殺す
もし蓋を閉じているのに液晶の光が漏れてくるのが気になるなら、vbetool という古い道具が役に立つことがある。
Bash
sudo apt install vbetool
sudo vbetool dpms off # バックライトを消す
sudo vbetool dpms on # バックライトを点ける
※ ただし、君が設定している i915.enable_dc=0 などのグラフィックス周りの特殊設定と干渉する可能性もあるから、試すときは慎重にね!
見落とされがちな視点:不意のバッテリー切れ
スリープ(サスペンド)ができなくなったということは、バッテリーが残り少なくなった時に「とりあえず眠ってデータを守る」という セーフティネットが消えた ことを意味する。
AC アダプタが外れたことに気づかないと、そのままバッテリーが 0% になり、ファイルシステムが書き込み中の状態で 「突然死(ブチ切り)」 することになる。これはデータの整合性にとって一番の敵だね。
結論
君の Ubuntu は今、「止まることを許されないミッションクリティカルなサーバー」 になった。
代償を最小限にするためには、「物理的な風通し(放熱)を良くすること」 と 「電源供給の安定性」 にこれまで以上に気を使ってあげてね。
次は、「バッテリー残量が 10% を切ったら SSH 経由で君のメイン PC に警告を飛ばすスクリプト」 でも作ってみる?それとも、「蓋を閉じたままの CPU 温度推移をグラフ化」 してみる?
Would you like me to provide a Python or Bash snippet that periodically logs CPU temperature to a file so you can check if it’s getting too hot while the lid is closed?