setup(200-599)¶
200_netplan_disable_nm.sh¶
このスクリプトは、ネットワーク管理を systemd-networkd に統一するために、以下の処理を行います。
1) 競合サービスの無効化
NetworkManager, wpa_supplicant, wpa_supplicant@${WIFI_INTERFACE}.service
2) systemd-networkd の有効化
systemctl enable/start systemd-networkd
3) eth0 を DHCP4 有効にする netplan ファイルの作成 → 適用
- 新規作成時:600 パーミッションで保存 →
netplan apply - 既存と差分あり:上書き保存 →
netplan apply - 差分なし:スキップ
注意
- リモート実行時の断: 本処理はネットワークレイヤを切り替えるため、SSH セッションが切断される可能性があります。コンソールでの実行を推奨します。
- DNS 構成:
renderer: networkdに切り替えると、systemd-resolvedや NetworkManager のresolv.conf管理と競合しません。別スクリプトでresolv.confを immutable 化している場合は整合に注意してください。 - Wi-Fi 管理: Wi-Fi は
systemd-networkd+.network/wpa_supplicant@.service等で別途構成します(本ファイルは eth0 のみを扱います)。
300_hostapd_dnsmasq.sh¶
このスクリプトは、Wi-Fi インタフェース($WIFI_INTERFACE)で AP(アクセスポイント)モードを構成するため、hostapd と dnsmasq の設定ファイルを 冪等に作成/更新します。
あわせて /etc/default/hostapd の DAEMON_CONF を指定し、mask 解除を行います。
設定ファイルの詳細内容はソースを参照
処理の流れ
1) hostapd.conf の作成/更新(冪等)
- 期待する内容文字列を生成し、既存と diff 比較して差分があれば上書き
- /etc/default/hostapd の DAEMON_CONF="<path>" を sed で設定
- systemctl unmask hostapd を実施
2) dnsmasq.conf の作成/更新(冪等)
- 期待する内容(interface=$WIFI_INTERFACE, dhcp-range=192.168.4.2,192.168.4.20,..., dhcp-option 3/6 = $AP_IP など)を生成し、差分があれば上書き
注意
- 規制域・チャネル:
country_code=JPとチャネル設定は電波法に従って選定してください。rfkillのブロック解除も確認を。 - DHCP の重複: 既に他の DHCP サーバが動作している環境では衝突に注意してください。
- セキュリティ:
PASSPHRASEは十分に強固な値を使用し、配布範囲や電波到達範囲にも注意してください。
400_ap_start_wifi_or_ap.sh¶
このスクリプトは、ブート後に Wi-Fi 接続を試行し、失敗したら AP を起動する処理を自動化します。
ヘルパースクリプトを配置し、oneshot サービス(wifi-or-ap.service)と タイマー(wifi-or-ap.timer)を作成・有効化します。
タイマーは 起動30秒後に実行し、さらに 5分間隔で再実行します(OnUnitActiveSec=5min)。
処理の流れ
1) シンボリックリンクの作成
2) systemd ユニットの作成(差分あれば更新)
3) systemd タイマーの設定(毎回書き込み)
Note
「ブート時のみ」実行にしたい場合 は、タイマーの OnUnitActiveSec=5min を削除してください(現状は5分間隔で再実行されます)。
500_wifi_manager.sh¶
このスクリプトは、Flask 製の Wi-Fi マネージャ(wifi_manager.py) を Web ルートへ配置し、テンプレート index.html をコピー、権限/グループ を整えた上で systemd サービス(wifi-manager.service)を作成・有効化します。
処理の流れ
1) テンプレート用のディレクトリ作成
2) wifi_manager.py の配置(冪等)
- 変更がある場合のみ cp → "$WIFI_MANAGER_APP" へ更新
3) index.html の配置(冪等)
- "$WEB_TEMPLATES_DIR/$(basename "$INDEX_HTML_FILE")" に差分更新
4) 権限調整
- chgrp -R www-data "$WEB_ROOT"
- chmod -R 775 "$WEB_ROOT"
- usermod -a -G www-data "$USERNAME"(要再ログイン)
5) systemd ユニット生成(差分更新)
- 内容は、ソースファイルを参照
注意
- 起動ユーザは root(
User=root)。非 root 実行にしたい場合はUser=を適切なユーザに変更し、権限/ポートも合わせて設計してください。 - グループ反映:
usermod -a -G www-data "$USERNAME"は 再ログイン後に反映されます。 - 起動順:
After=wifi-or-ap.serviceにより、存在すればその後に起動します(無ければ無視されます)。 - ポート番号:リッスンポートはアプリ実装に依存します。必要に応じてリバースプロキシ(nginx など)やファイアウォールを設定してください。
550_boot_optimize.sh¶
このスクリプトは、バックグラウンド更新・起動サービスを最小化し、リソース消費と予期しない変更を抑えるための最適化を行います。
主な内容は snapd の更新抑止とソケット起動化、不要サービスのマスク、fstrim のタイマー化、Raspberry Pi の Bluetooth HCI 無効化 です。
処理の流れ
1) snapd 最適化
- lxd を無効化、関連アクティベータをマスク
- 自動更新を10年保留
- 現在のスナップを手動更新(初回のみ長め)
- snapd.seeded.service を無効化(手動で必要時に更新)
- ソケット起動化(常駐停止)
2) 不要サービスのマスク
- cloud-init 一式:cloud-init-local.service / cloud-init.service / cloud-config.service / cloud-final.service
- Raspberry Pi EEPROM 自動更新:rpi-eeprom-update.service
- ネットワークフック:networkd-dispatcher.service
- fstrim サービス:fstrim.service(→ タイマーに任せる)
3) fstrim をタイマーで実行 - 週1回実行(デフォルト)
4) Bluetooth (HCI UART) 無効化(Pi)
注意
- セキュリティ更新: snap の自動更新を長期保留するため、手動で定期的な
snap refresh実行を推奨します。 - cloud-init: 画像初期化やメタデータ依存の環境では cloud-init を無効化しないでください。イメージ配布後の端末でのみ無効化する運用が安全です。
- Raspberry Pi 専用項目:
rpi-eeprom-update.serviceとhciuart.serviceは Pi 向けです。他環境では無視されます(エラーは|| trueで握りつぶし)。 - ソケット起動:
snapdは要求時に自動起動します。常時常駐が必要な運用の場合はsnapd.serviceを再度 enable してください。