Alpine Linux仮想マシンに構築した Pi-hole 広告ブロックDNSを自宅で運用して3ヶ月が経過、早くもストレージを埋め尽くされそうになっていたことに気づき、慌てて logrotate を導入したり、 SQLite DBへのクエリログ保持期間を短く設定しました。
運用3ヶ月で肥大したログとDB
Prometheus(関連記事はこちら)で監視中のダッシュボードで、他のノードに比べてストレージの使用率が高くなっているのが、このPi-hole仮想マシンです。
ターミナルを開いて現在の状況を確認。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
resolv11:~$ uname -a Linux resolv11 6.6.21-0-virt #1-Alpine SMP PREEMPT_DYNAMIC Thu, 07 Mar 2024 10:55:08 +0000 x86_64 Linux resolv11:~$ cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.20.0_alpha20231219 PRETTY_NAME="Alpine Linux edge" resolv11:~$ sudo df -h Filesystem Size Used Available Use% Mounted on devtmpfs 10.0M 0 10.0M 0% /dev shm 487.4M 6.5M 481.0M 1% /dev/shm /dev/sda3 4.1G 2.9G 985.4M 75% / tmpfs 195.0M 276.0K 194.7M 0% /run efivarfs 256.0K 44.2K 206.8K 18% /sys/firmware/efi/efivars /dev/sda1 263.5M 280.0K 263.2M 0% /boot/efi tmpfs 487.4M 9.8M 477.7M 2% /tmp resolv11:~$free -h total used free shared buff/cache available Mem: 974Mi 360Mi 428Mi 16Mi 366Mi 613Mi Swap: 511Mi 0B 511Mi resolv11:~$ sudo fdisk -l Found valid GPT with protective MBR; using GPT Disk /dev/sda: 10485760 sectors, 1024M Number Start (sector) End (sector) Size Name 1 2048 542719 264M 2 542720 1591295 512M 3 1591296 10483711 4342M |
元々数GBしか割り当てていないシステムですが、この短期間にすくすく成長したファイルは何なのか、システム内の大容量ファイルを検索。
|
1 2 3 4 5 6 |
resolv11:~$ sudo find / -type f -not -path '/proc/*' -exec du -sh {} + | sort -rh | head -n 5 1.7G /var/log/pihole/pihole.log 249.1M /etc/pihole/pihole-FTL.db 147.4M /var/log/prometheus/pihole-exporter.log 106.3M /var/log/lighttpd/access-pihole.log 32.6M /usr/libexec/gcc/x86_64-alpine-linux-musl/13.2.1/cc1 |
これを元に対処すべきファイルを以下にピックアップ。大きく分けてPi-holeのSQLite DBファイルと、Pi-holeとPrometheusエクスポータのログファイル群です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/etc/ └── pihole └── pihole-FTL.db 249M /var/log/ ├── pihole │ ├── FTL.log 450k │ └── pihole.log 1.7G ├── lighttpd │ └── access-pihole.log 106M └── prometheus ├── node-exporter.log 21k └── pihole-exporter.log 147M |
まず、pihole-FTL.dbはPi-holeのWebUIにある Long-term Data 機能で閲覧可能なクエリログです。
さらに、Pi-holeのWebUIでは Tools → Tail FTL.log でpihole-FTLサービスのログファイルを、
Tools → Tail pihole.log でクエリの生ログが閲覧可能です。
もう1つのlighttpdはPi-holeのWebサーバ機能のログ。ついでにprometheus関連では、Pi-holeに特化したエクスポータがかなり話好きなのでこれも併せて対処します。
Pi-holeデータベースの抑制
Pi-holeがデータべースにクエリログを保持する日数は、設定ファイル /etc/pihole/pihole-FTL.conf の MAXDBDAYS パラメータにセットすれば良さそう(デフォルトは 365 )。
但し、ドキュメンテーションによると、別のパラメータ MAXNETAGE がデフォルトで MAXDBDAYS の値を参照するので、過去のIPアドレスやホスト名の保持日数を司るこのパラメータは、あらためて長めの数字をセットしました。
|
1 2 |
MAXDBDAYS=7 MAXNETAGE=365 |
これでサービスを再起動すれば、追加した設定が反映されるはず。
|
1 2 3 4 5 6 7 8 9 |
resolv11:~$ sudo vi /etc/pihole/pihole-FTL.conf resolv11:~$ sudo rc-service pihole-FTL restart * Caching service dependencies ... [ ok ] Stopped FTL started! resolv11:~$rc-service pihole-FTL status [ ok ] pihole-FTL is running |
サービスログ FTL.log にも確かに追加した設定が見受けられるも、肝心のSQLite DBファイルは小さくならなず、むしろ微増。
|
1 2 3 4 5 6 |
[2024-06-06 12:53:34.397 13578M] Starting config file parsing (/etc/pihole/pihole-FTL.conf) [2024-06-06 12:53:34.397 13578M] SOCKET_LISTENING: only local [2024-06-06 12:53:34.398 13578M] AAAA_QUERY_ANALYSIS: Show AAAA queries [2024-06-06 12:53:34.398 13578M] MAXDBDAYS: max age for stored queries is 7 days [2024-06-06 12:53:34.398 13578M] MAXNETAGE: Removing IP addresses and host names from network table after 365 days |
SQLite DBファイルを取り出してDB Browser for SQLiteで確認すると、一番古いレコードのUNIXタイムスタンプは確かに7日前のもの。
さらに調べて見つけたのがこちらのフォーラムTipでは、Pi-holeの設定に依らずSQLite DBにSQL文を直接発行して、指定日数より古いレコードを消しているのですが、 DELETE 文に VACUUM 文を発行していました。
早速、Alpine Linuxにsqliteパッケージをインストールの後、サービスを止めて VACUUM 文を試してみると、劇的に小さくなりました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
resolv11:~$ sudo apk add sqlite (1/1) Installing sqlite (3.46.0-r0) Executing busybox-1.36.1-r21.trigger OK: 509 MiB in 172 packages resolv11:~$ ls -l /usr/bin/sqlite3 -rwxr-xr-x 1 root root 1761464 May 23 23:48 /usr/bin/sqlite3 resolv11:~$ sudo rc-service pihole-FTL stop Stopped resolv11:~$ ls -lh /etc/pihole/pihole-FTL.db -rw-rw-r-- 1 pihole pihole 249.8M Jun 6 15:16 /etc/pihole/pihole-FTL.db resolv11:~$ sudo sqlite3 /etc/pihole/pihole-FTL.db SQLite version 3.46.0 2024-05-23 13:25:27 Enter ".help" for usage hints. sqlite> .table addinfo_by_id counters ftl network_addresses aliasclient domain_by_id message queries client_by_id forward_by_id network query_storage sqlite> VACUUM; sqlite> .exit resolv11:~$ ls -lh /etc/pihole/pihole-FTL.db -rw-rw-r-- 1 pihole pihole 21.5M Jun 6 15:17 /etc/pihole/pihole-FTL.db resolv11:~$ sudo rc-service pihole-FTL start FTL started! |
Pi-holeがレコードを削除する際に VQCUUM しないのなら、 MAXDBDAYS でいくら抑制してもまたSQLite DBファイルサイズが増えるのはおそらく必定。またしばらく様子を見て、必要なら次のようなクリーンアップスクリプトを定期的に実行するようスケジュールジョブに登録するつもり。
|
1 2 3 |
sudo rc-service pihole-FTL stop sudo sqlite3 /etc/pihole/pihole-FTL.db "VACUUM;" ".exit" sudo rc-service pihole-FTL start |
logrotateを導入して各種ログを抑制
SQLite DBに続いてログファイルの抑制には、logrotateを導入します。
手順は以前、Alpine LinuxベースのUnbound DNSを構築した時と同じ。
パッケージをインストールすると、 /etc/periodic/daily に起動スクリプトが配置されます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
resolv11:~$ sudo apk add logrotate (1/3) Installing libacl (2.3.2-r0) (2/3) Installing logrotate (3.21.0-r1) (3/3) Installing logrotate-openrc (3.21.0-r1) Executing busybox-1.36.1-r21.trigger OK: 507 MiB in 171 packages resolv11:~$ tree /etc/periodic/ /etc/periodic/ ├── 15min ├── daily │ └── logrotate ├── hourly ├── monthly └── weekly |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/sh if [ -f /etc/conf.d/logrotate ]; then . /etc/conf.d/logrotate fi if [ -x /usr/bin/cpulimit ] && [ -n "$CPULIMIT" ]; then _cpulimit="/usr/bin/cpulimit --limit=$CPULIMIT" fi $_cpulimit /usr/sbin/logrotate /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0 |
各種ログローテーション定義のうちlighttpdは、logrotateインストール時にセットされた模様。
|
1 2 3 4 5 6 7 |
resolv11:~$ls -l /etc/logrotate.d/ -rw-r--r-- 1 root root 171 Apr 12 2023 acct -rw-r--r-- 1 root root 140 Mar 11 21:17 acpid -rw-r--r-- 1 root root 160 Dec 6 2023 chrony -rw-r--r-- 1 root root 398 Feb 23 19:21 lighttpd -rw-r--r-- 1 root root 66 Sep 2 2023 open-vm-tools -rw-r--r-- 1 root root 43 Mar 6 19:28 openrc |
そして、Pi-holeの公式GitHubにlogrotateのテンプレートが用意されているので、
[blogcar url=”https://github.com/pi-hole/pi-hole/blob/master/advanced/Templates/logrotate”]
これを元に、残るPi-holeとPrometheusのログローテーション定義を次のように記述。
|
1 2 3 4 5 6 7 8 9 10 11 |
/var/log/pihole/*.log { su root root daily missingok copytruncate rotate 7 compress delaycompress notifempty nomail } |
|
1 2 3 4 5 6 7 8 9 10 |
/var/log/prometheus/pihole-exporter.log { daily missingok copytruncate rotate 7 compress delaycompress notifempty nomail } |
なお、cronを再起動させただけではうまくlogrotateしてくれず、システムログには毎時Permission Errorが吐出。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Jun 7 02:00:00 resolv11 cron.info crond[2813]: USER root pid 15509 cmd run-parts /etc/periodic/15min Jun 7 02:00:00 resolv11 cron.info crond[2813]: USER root pid 15510 cmd run-parts /etc/periodic/hourly Jun 7 02:00:00 resolv11 cron.info crond[2813]: USER root pid 15511 cmd run-parts /etc/periodic/daily Jun 7 02:15:00 resolv11 cron.info crond[2813]: USER root pid 15544 cmd run-parts /etc/periodic/15min Jun 7 02:30:00 resolv11 cron.info crond[2813]: USER root pid 15577 cmd run-parts /etc/periodic/15min Jun 7 02:39:00 resolv11 cron.err crond[12988]: root: Permission denied Jun 7 02:45:00 resolv11 cron.info crond[2813]: USER root pid 15608 cmd run-parts /etc/periodic/15min Jun 7 03:00:00 resolv11 cron.info crond[2813]: USER root pid 15640 cmd run-parts /etc/periodic/15min Jun 7 03:00:00 resolv11 cron.info crond[2813]: USER root pid 15641 cmd run-parts /etc/periodic/hourly Jun 7 03:15:00 resolv11 cron.info crond[2813]: USER root pid 15673 cmd run-parts /etc/periodic/15min Jun 7 03:30:00 resolv11 cron.info crond[2813]: USER root pid 15704 cmd run-parts /etc/periodic/15min Jun 7 03:39:00 resolv11 cron.err crond[12988]: root: Permission denied Jun 7 03:45:00 resolv11 cron.info crond[2813]: USER root pid 15735 cmd run-parts /etc/periodic/15min |
最終的にはシステムを一度再起動させることで、この不具合は解消され、logrotateも機能するようになりました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
resolv11:~$ ls -l /var/log/pihole -rw-r--r-- 1 pihole pihole 4181 Jun 11 08:59 FTL.log -rw-r--r-- 1 pihole pihole 60090 Jun 8 01:35 FTL.log-20240608.gz -rw-r--r-- 1 pihole pihole 4066 Jun 9 02:00 FTL.log-20240609.gz -rw-r--r-- 1 pihole pihole 450 Jun 10 02:00 FTL.log-20240610.gz -rw-r--r-- 1 pihole pihole 10033 Jun 11 02:00 FTL.log-20240611 -rw-r----- 1 pihole pihole 6932848 Jun 11 09:05 pihole.log -rw-r----- 1 pihole pihole 142303870 Jun 11 08:57 pihole.log-20240608.gz -rw-r----- 1 pihole pihole 1176056 Jun 9 02:00 pihole.log-20240609.gz -rw-r----- 1 pihole pihole 2146802 Jun 10 02:00 pihole.log-20240610.gz -rw-r----- 1 pihole pihole 25814870 Jun 11 02:00 pihole.log-20240611 resolv11:~$ ls -l /var/log/prometheus/ -rw-r--r-- 1 promethe promethe 26965 Jun 7 10:27 node-exporter.log -rw-r--r-- 1 promethe promethe 898880 Jun 11 09:03 pihole-exporter.log -rw-r--r-- 1 promethe promethe 64865 Jun 8 02:00 pihole-exporter.log-20240608.gz -rw-r--r-- 1 promethe promethe 89733 Jun 9 02:00 pihole-exporter.log-20240609.gz -rw-r--r-- 1 promethe promethe 88507 Jun 10 02:00 pihole-exporter.log-20240610.gz -rw-r--r-- 1 promethe promethe 3052800 Jun 11 02:00 pihole-exporter.log-20240611 -rw-r--r-- 1 promethe promethe 4584521 Jun 11 09:04 pihole-exporter.log.1.gz resolv11:~$ sudo df -h Filesystem Size Used Available Use% Mounted on devtmpfs 10.0M 0 10.0M 0% /dev shm 487.4M 6.0M 481.5M 1% /dev/shm /dev/sda3 4.1G 1.1G 2.8G 28% / tmpfs 195.0M 276.0K 194.7M 0% /run efivarfs 256.0K 44.2K 206.8K 18% /sys/firmware/efi/efivars /dev/sda1 263.5M 280.0K 263.2M 0% /boot/efi tmpfs 487.4M 7.0M 480.5M 1% /tmp |
これによりシステムストレージも、使用率75%から28%へ大きく減少して一安心です。







