【Ubuntu / WordOps】Webログだけじゃ甘い!Ubuntuのシステムログを /mnt/ramdisk に呑み込ませてSSDの寿命を死守する

この記事は約17分で読めます。
この記事が役立ったらブックマーク! あとで読み返したり、環境構築時のリファレンスに活用できます
B! はてなブックマークに追加

WordOpsやUbuntuで自宅サーバーを運用していて、Webサーバー(Nginx / PHP)のログをRAMディスク(/mnt/ramdisk)へ逃がした方……実はそれだけではまだ不十分です!

UbuntuはOSの標準機能として、バックグラウンドで絶え間なくシステムログ(journald・syslog・auth.log)をSSDへ書き込み続けています。SSHのアクセス試行(海外からのブルートフォース攻撃)やサービスの動作ログなど、放っておくと年間で恐ろしい量のTBW(総書き込み量)を消費します。

今回は、Ubuntu本体のシステムログもすべて /mnt/ramdisk へ集約&完全RAM化し、SSDの書き込み摩耗を極限までゼロに近づける「究極の長寿命化テクニック」を解説します!

1. Webログだけじゃない!SSDをこっそり削る「Ubuntuのシステムログ」とは?

NginxやPHPのログをRAMディスク化しても、SSDの書き込み量が思っていたより減らない場合、原因はUbuntu本体(OS層)のログにあります。

主に以下の3つが24時間365日、SSDにアクセスし続けています。

  • systemd-journald(システムログ本体): Ubuntuの標準ログ機能。/var/log/journal/ 以下にバイナリ形式で大量のログを書き込みます。
  • rsyslog(syslog / auth.log 等): SSHのログイン試行(auth.log)やカーネルメッセージ(syslog)をテキストファイルとして出力します。
  • Dockerコンテナの標準出力(※Docker利用時): /var/lib/docker/containers/ 以下にJSON形式でコンテナのログが溜まり続けます。

今回は、これらをすべて /mnt/ramdisk(tmpfs)へ呑み込ませることで、OSレベルでのSSD書き込みをほぼゼロに抑え込みます!

2.【STEP 1】Ubuntu本体のシステムログ(journald)をRAM化する

まずは最大の大物である systemd-journald の保存先を、ストレージ(SSD)からRAM(メモリ)上へと切り替えます。

設定ファイル /etc/systemd/journald.conf を編集します。

Bash
sudo nano /etc/systemd/journald.conf

ファイル内の [Journal] セクションに以下のように記述(またはアンコメント)します。

INI
[Journal]
# ログの保存先をストレージではなくRAM(メモリ)のみに指定
Storage=volatile

# メモリの使用上限(例: 最大64MBまで)
RuntimeMaxUse=64M

# ログの保持期間(任意)
MaxRetentionSec=3days

保存して閉じたら、journaldサービスを再起動して設定を反映します。

Bash
sudo systemctl restart systemd-journald

💡 これでどうなる?
/var/log/journal/ へのSSD書き込みが完全に停止し、以降のシステムログはすべてメモリ上で処理・保持されるようになります!

3.【STEP 2】rsyslog(auth.log / syslog 等)の出力先をRAMディスクへ逃がす

SSHの不正アクセスログ(auth.log)などが書き込まれる rsyslog の出力先も /mnt/ramdisk/logs/system/ へ変更します。

設定ファイル /etc/rsyslog.d/50-default.conf を編集します。

Bash
sudo nano /etc/rsyslog.d/50-default.conf

主要なログの出力先を /mnt/ramdisk/logs/system/ に書き換えます。

【変更例】

Plaintext
auth,authpriv.*                 /mnt/ramdisk/logs/system/auth.log
*.*;auth,authpriv.none          -/mnt/ramdisk/logs/system/syslog
kern.*                          -/mnt/ramdisk/logs/system/kern.log
mail.*                          -/mnt/ramdisk/logs/system/mail.log

4.【STEP 3】Dockerのログ膨張を抑制する(※Docker使用者向け)

Dockerを使っている場合、コンテナが出力するログ(STDOUT / STDERR)がストレージを圧迫します。 ログの最大サイズを制限して、無駄な書き込みを防ぎましょう。

/etc/docker/daemon.json を作成・編集します。

Bash
sudo nano /etc/docker/daemon.json

以下の設定を追記します。

JSON
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

Dockerサービスを再起動します。

Bash
sudo systemctl restart docker

5. 【最重要】Systemdサービスへの組み込み & logrotate自動退避

RAMディスク(tmpfs)はサーバーを再起動すると中身がすべて消失するため、起動時にログフォルダを自動生成する処理を、既存の ramdisk-init.service に組み込みます。

① 既存の Systemd サービス(ramdisk-init.service)の更新

前回の記事で作成した ramdisk-init.service を開きます。

Bash
sudo nano /etc/systemd/system/ramdisk-init.service

システムログ用フォルダ /mnt/ramdisk/logs/system の作成処理を追加した以下のコードに差し替えます。

Bash
[Unit]
Description=Initialize RAM Disk Temp and Log Directories for WordPress, Nginx, MariaDB and System
DefaultDependencies=no
# RAMディスクを含むローカルファイルシステムがマウントされたら即座に実行
After=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes

# 1. 必要な親フォルダを一括作成(logs/system を追加!)
ExecStartPre=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/mysql /mnt/ramdisk/logs/nginx /mnt/ramdisk/logs/php /mnt/ramdisk/logs/system

# 2. WordPress用およびNginx用の子フォルダを作成
ExecStart=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp/main /mnt/ramdisk/php_tmp/tech /mnt/ramdisk/nginx/client_body /mnt/ramdisk/nginx/proxy /mnt/ramdisk/nginx/fastcgi /mnt/ramdisk/nginx/uwsgi /mnt/ramdisk/nginx/scgi

# 3. WordPress・Nginx・ログ用フォルダの権限を設定
ExecStartPost=/usr/bin/chown -R www-data:www-data /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/logs
ExecStartPost=/usr/bin/chmod -R 775 /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/logs

# 4. MariaDB用フォルダの所有者を mysql に変更
ExecStartPost=/usr/bin/chown -R mysql:mysql /mnt/ramdisk/mysql
ExecStartPost=/usr/bin/chmod -R 750 /mnt/ramdisk/mysql

[Install]
WantedBy=multi-user.target
Bash
[Unit]
Description=Initialize RAM Disk Temp and Log Directories for WordPress, Nginx, MariaDB and System
DefaultDependencies=no
# Execute immediately once local filesystems, including RAM Disk, are mounted
After=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes

# 1. Create parent directories at once (Added logs/system!)
ExecStartPre=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/mysql /mnt/ramdisk/logs/nginx /mnt/ramdisk/logs/php /mnt/ramdisk/logs/system

# 2. Create subdirectories for WordPress and Nginx
ExecStart=/usr/bin/mkdir -p /mnt/ramdisk/php_tmp/main /mnt/ramdisk/php_tmp/tech /mnt/ramdisk/nginx/client_body /mnt/ramdisk/nginx/proxy /mnt/ramdisk/nginx/fastcgi /mnt/ramdisk/nginx/uwsgi /mnt/ramdisk/nginx/scgi

# 3. Set ownership and permissions for WordPress, Nginx, and log directories
ExecStartPost=/usr/bin/chown -R www-data:www-data /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/logs
ExecStartPost=/usr/bin/chmod -R 775 /mnt/ramdisk/php_tmp /mnt/ramdisk/nginx /mnt/ramdisk/logs

# 4. Change ownership and permissions for MariaDB directory to mysql
ExecStartPost=/usr/bin/chown -R mysql:mysql /mnt/ramdisk/mysql
ExecStartPost=/usr/bin/chmod -R 750 /mnt/ramdisk/mysql

[Install]
WantedBy=multi-user.target

読み込ませて即時反映します。

Bash
sudo systemctl daemon-reload
sudo systemctl start ramdisk-init.service
sudo systemctl restart rsyslog

② logrotateでストレージ側へ日次圧縮退避

RAMディスク内の容量オーバーを防ぐため、1日1回ログを圧縮して保管フォルダ(/var/log/archive/)へ移動させます。

/etc/logrotate.d/ramdisk-logs を作成・編集します。

Bash
sudo nano /etc/logrotate.d/ramdisk-logs
Plaintext
/mnt/ramdisk/logs/nginx/*.log
/mnt/ramdisk/logs/php/*.log
/mnt/ramdisk/logs/system/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data www-data
    olddir /var/log/archive
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
        systemctl reload rsyslog > /dev/null 2>&1 || true
    endscript
}

退避用ディレクトリを作成しておきます。

Bash
sudo mkdir -p /var/log/archive

6. まとめ:Ubuntuログ完全RAM化でSSDの書き込みはこう変わる!

これで、Webアプリケーション(Nginx / PHP)だけでなく、Ubuntu OS本体が吐き出すシステムログまで含めた「完全ログRAMディスク化」が完成しました!

設定完了後、以下のコマンドでSSDの累計書き込み量(Data Units Written)を確認し、数日後の増え方を観察してみてください。

Bash
# ※smartctlが入っていない場合は sudo apt install smartmontools でインストール
sudo smartctl -a /dev/nvme0n1 | grep "Data Units Written"

【実行例】

Bash
Data Units Written:                 84,369,317 [43.1 TB]

ログのランダム書き込みが消えたことで、SSDの摩耗スピードが目に見えて遅くなることを実感できるはずです。

「大切な自宅サーバーを10年単位で稼働させたい」「SSDのTBWを極限まで節約したい」という方は、ぜひこのOS層ログのRAMディスク化に挑戦してみてください!

コメント

タイトルとURLをコピーしました