Ubuntu 22.04 が動作する LattePanda Sigma を移動体に搭載する際、シャットダウン操作なしに電源が切れても OS が破損しないようにするための設定手順です。
ROS2 / Docker / カスタムアプリを使用しつつ、データの永続化も維持する構成を前提としています。
なお、この記事はClaude Code (Claude Sonnet 4.6) で実機に実施した内容をもとに作成しています。
1. 前提環境
| 項目 | 内容 |
|---|---|
| ハードウェア | LattePanda Sigma |
| OS | Ubuntu 22.04.5 LTS |
| カーネル | Linux 6.8.0-107-generic |
| ストレージ | NVMe SSD(/dev/nvme0n1p2、ext4) |
| アプリ構成 | ROS2 Humble、Docker、カスタムアプリ(Python/C++等) |
2. 設定一覧と効果
| No | 設定 | 効果 |
|---|---|---|
| 1 |
/tmp を tmpfs 化 |
/tmp をRAM上に置き、ディスクへの不要な書き込みを排除 |
| 2 | fstab に noatime 追加 |
ファイル読み取り時のアクセス時刻更新書き込みを排除 |
| 3 | fstab の errors=remount-ro 確認 |
fsエラー検出時に自動で読み取り専用化し追加破壊を防止 |
| 4 | journald SyncIntervalSec=15s
|
ログのディスク同期を15秒ごとに実施(デフォルトは5分) |
| 5 | Docker ログドライバーを local に変更 |
ログの自動ローテーションでディスク圧迫と書き込み集中を防止 |
ext4 のジャーナル機能(has_journal)は Ubuntu インストール時点で有効になっており、電源断後の次回起動時にジャーナルを自動リプレイしてファイルシステム構造を修復します。
追加設定は不要です。
3. 手順
3.1. 事前準備:sshpass のインストール
もし今回の設定をリモートからパスワード認証で操作する場合は、リモートPCで sshpass を使います。
操作対象マシン上で直接作業する場合は不要です。
sudo apt-get install -y sshpass
以降のコマンドは LattePanda 上で直接実行することを前提に記載します。
3.2. /tmp を tmpfs 化
3.2.1. 効果
/tmp はプロセス間通信や一時ファイルの置き場として使われますが、内容を再起動後に保持する必要はありません。RAM 上の tmpfs に変更することで:
- ディスクへの書き込み回数を削減し、突然電源断時の書き込み途中ファイルの発生を抑える
- NVMe の書き込み寿命を延ばす
-
/tmp内のファイルが電源断で壊れても OS に影響しない
3.2.2. 手順
Ubuntu 22.04 には /usr/share/systemd/tmp.mount が用意されているが、デフォルトでは有効化されていない。
# ユニットファイルをコピーして有効化
sudo cp /usr/share/systemd/tmp.mount /etc/systemd/system/tmp.mount
sudo systemctl daemon-reload
sudo systemctl enable tmp.mount
sudo systemctl start tmp.mount
3.2.3. 確認
mount | grep /tmp
# 出力例:
# tmpfs on /tmp type tmpfs (rw,nosuid,nodev,nr_inodes=1048576,inode64)
3.3. fstab に noatime を追加
3.3.1. 効果
デフォルトでは、ファイルを読み取るたびにアクセス時刻(atime)がディスクに書き込まれます。
noatime を設定するとこの書き込みが発生しなくなり:
- 読み取り操作が書き込みを引き起こさなくなる
- ディスク I/O が減り、電源断時のリスクとなる中途半端な書き込みの機会を減らす
3.3.2. 手順
# バックアップを作成
sudo cp /etc/fstab /etc/fstab.bak
# ext4 のマウントオプションに noatime を追加
sudo sed -i 's|ext4 errors=remount-ro|ext4 noatime,errors=remount-ro|' /etc/fstab
変更後の /etc/fstab(root パーティション行):
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 noatime,errors=remount-ro 0 1
再起動せずに即時適用する場合:
sudo mount -o remount,noatime /
3.3.3. 確認
mount | grep nvme0n1p2
# 出力例:
# /dev/nvme0n1p2 on / type ext4 (rw,noatime,errors=remount-ro)
3.4. errors=remount-ro の確認(既存設定)
3.4.1. 効果
通常の Ubuntu インストールではデフォルトで設定されています。
ファイルシステムにエラーが検出されたとき、書き込みを続けて破壊を広げるのではなく、自動的に読み取り専用に切り替えます。
3.4.2. 確認
grep errors /etc/fstab
# 出力に errors=remount-ro が含まれていれば OK
手動で追加する場合は /etc/fstab の ext4 行のオプション部分に errors=remount-ro を追記してください。
3.5. systemd journald の設定
3.5.1. 効果
システムログ(journald)はデフォルトでは最大5分間メモリ上にバッファリングされた後にディスクへ書き出されます。
電源断が発生すると最大5分分のログが失われます。SyncIntervalSec=15s に設定することで:
- 電源断後に失われるログを最大15秒分に抑える
- 障害発生前後のログが残りやすくなりデバッグが容易になる
その他のオプション:
| オプション | 値 | 説明 |
|---|---|---|
Storage |
persistent |
ログを /var/log/journal/ に永続保存 |
Compress |
yes |
ログを圧縮してディスク使用量を削減 |
SystemMaxUse |
500M |
ディスク上のジャーナル最大サイズ |
RuntimeMaxUse |
64M |
メモリ上のジャーナル最大サイズ |
3.5.2. 手順
sudo tee /etc/systemd/journald.conf > /dev/null << 'EOF'
[Journal]
Storage=persistent
Compress=yes
SyncIntervalSec=15s
SystemMaxUse=500M
RuntimeMaxUse=64M
EOF
sudo systemctl restart systemd-journald
3.5.3. 確認
systemctl is-active systemd-journald
# active と表示されれば OK
cat /etc/systemd/journald.conf
3.6. Docker ログドライバーの変更
3.6.1. 効果
Docker のデフォルトログドライバー(json-file)はログローテーションが設定されていないため、長時間稼働するとログファイルが無制限に大きくなります。
local ドライバーに変更することで:
- 自動ローテーション(10MB × 5ファイル)でディスク圧迫を防止
- バイナリ形式のためテキスト JSON より書き込みが効率的
- 電源断時に大きなファイルへの書き込み途中となるリスクを軽減
Docker の ストレージドライバーは overlayfs(Copy-on-Write)がデフォルトで有効になっており、コンテナのレイヤーが原子的に管理されるため、電源断によるコンテナイメージの破損は起きにくい設計になっています。
この設定は変更不要です。
3.6.2. 手順
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json > /dev/null << 'EOF'
{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "5"
}
}
EOF
sudo systemctl restart docker
3.6.3. 確認
docker info | grep -E 'Logging Driver|Storage Driver'
# 出力例:
# Storage Driver: overlayfs
# Logging Driver: local
4. 電源断時の挙動(設定後)
電源断
│
└─ 最大15秒分のジャーナルログが失われる可能性あり
/tmp の内容は消える(揮発性のため設計通り)
次回起動
│
├─ ext4 ジャーナルリプレイ(自動)
│ └─ ファイルシステムの構造的整合性を自動修復
│
├─ errors=remount-ro の存在確認(自動)
│ └─ fsエラーがあれば読み取り専用で起動
│
└─ 通常起動へ
5. バックアップと復元
設定変更前に /etc/fstab のバックアップを作成しています。
問題が発生した場合:
# fstab を元に戻す
sudo cp /etc/fstab.bak /etc/fstab
sudo mount -o remount /
# tmp.mount を無効化する場合
sudo systemctl disable tmp.mount
sudo systemctl stop tmp.mount
# journald をデフォルトに戻す場合
sudo rm /etc/systemd/journald.conf
sudo systemctl restart systemd-journald
# Docker daemon.json を削除する場合
sudo rm /etc/docker/daemon.json
sudo systemctl restart docker
6. 補足:この設定で対処できないケース
-
書き込み中のデータ損失:電源断の瞬間にディスクへの書き込みが進行中だったデータは失われます。
アプリケーション側で原子的な書き込み(一時ファイルへ書いてからrename)や WAL(Write-Ahead Logging)を使う設計にすることで対処できます。 -
NVMe のライトキャッシュ:NVMe の内部ライトキャッシュは通常バリア命令でフラッシュされますが、ドライブによっては独自のバッファを持つ場合があります。
産業用途では電源断保護(PLP)対応の NVMe を選定することを推奨します。 - UPS(無停電電源装置)やスーパーキャパシタ:ハードウェアレベルでの対策と組み合わせることで、ソフトウェア設定だけでは防げない突然の電源断に対してさらに高い信頼性を確保できます。