0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

munin-nodeだけでサーバのディスク溢れを検知する

0
Last updated at Posted at 2026-03-03

ねぇMunin……( ゚д゚ )クワッ!!

うちのMinipcですがディスクが16GBほどです。Linux用途なので8GBもあれば十分ジャロとか思ってたのですが、containersが気が付けば6GBも消費して、Journalが2GBとかログも増えれば最近はgoやnpm,Denoとかがガンガンディスクを消費していきます。

dnf updateに失敗したよ(´・ω:;.:...

というわけで超久々にMunin先生にご登場いただくことにしたわけですが、HTMLで吐き出されても見にくいので情報はnc(or telnet)で拾うことにしました。

サーバにmunin-nodeを入れたら終わりなので、かなり環境にやさしい方法だと思います。

サーバにmunin-nodeを入れる

まずはサーバ側での作業です。

munin-nodeのインストール

munin-nodeをインストールしてconfを書き換えます。最低限必要なのはアクセスするホストをallow(正規表現)することで、cidr_allowを使えばサブネット単位で許可を出せます。

$ sudo dnf install munin-node
$ sudo vi /etc/munin/munin-node.conf
...
allow ^127\.0\.0\.1$
allow ^::1$

# この辺に追加
cidr_allow 192.168.0.0/24
cidr_allow 192.168.1.0/24

設定を入れたら起動しておきましょう。

$ sudo systemctl enable --now munin-node

Firewallの設定

残念ながらFirewalldにはmunin-nodeのサービス定義ファイルがなかったので、4949ポートを直接開きます。

$ sudo firewall-cmd --add-port=4949/tcp --permanent
$ sudo firewall-cmd --reload

クライアントから接続する

今回やらかしたのはディスクスペースなので、muninのfetch dfというコマンドでディスク使用量を取得します。

サーバのmunin-node.confで許可したホストからコマンドを流してみましょう。コマンドはechoを使って作って、ncにリダイレクトしてサーバに流します。

$ echo "fetch df" | nc minipc.home 4949
# munin node at minipc.home
_dev_mapper_fedora_root.value 66.7628332162003
_dev_shm.value 0.00109062444694186
_run.value 0.0692793706111705
_tmp.value 0.0321238473462876
_dev_sda2.value 47.15087890625
_dev_sda1.value 1.25383260486659
_dev_md0.value 31.7416755955017
.

#始まりの行はコメントで、名前と値のペアがずっとならんで、.始まりの行で終了です。これがMuninの基本的な応答の様式です。

どんなコマンドがあるかはサーバの/etc/munin/plugins下を見てください。fetchコマンドを送るとここのコマンドが叩かれているようです。

$ ls /etc/munin/plugins/
acpi@      diskstats@           fw_packets@        interrupts@  open_files@       smart_sda@  threads@
cpu@       entropy@             hddtemp_smartctl@  irqstats@    open_inodes@      smart_sdb@  uptime@
cpuspeed@  forks@               if_enp0s20f0u1@    load@        proc_pri@         smart_sdc@  users@
df@        fw_conntrack@        if_enp1s0@         memory@      processes@        smart_sdd@  vmstat@
df_inode@  fw_forwarded_local@  if_wlo1@           netstat@     selinux_avcstat@  swap@

チェックする

こんな感じで出力を色付けしてみます。

image.png

最初Pythonでスクリプト書いたけど、ssh接続時にほんのりもさっとした気がしたので結局go_(:3」∠)_

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"

	"github.com/fatih/color"
)

const (
	thCrit = 90
	thWarn = 70
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	for scanner.Scan() {
		line := strings.TrimSpace(scanner.Text())

		if line == "" || strings.HasPrefix(line, "#") {
			continue
		}

		if strings.HasPrefix(line, ".") {
			break
		}

		fields := strings.Fields(line)
		if len(fields) < 2 {
			fmt.Printf("Invalid input: %s\n", line)
			continue
		}

		labelRaw := fields[0]
		value, err := strconv.ParseFloat(fields[1], 64)
		if err != nil {
			fmt.Printf("Invalid input: %s\n", line)
			continue
		}

		label := strings.TrimSuffix(labelRaw, ".value")

		switch {
		case value > thCrit:
			color.HiRed("%s | %-30s : %5.1f%%\n", "CRITICAL", label, value)
		case value > thWarn:
			color.HiYellow("%s | %-30s : %5.1f%%\n", "WARNING ", label, value)
		}
	}

	if err := scanner.Err(); err != nil {
		fmt.Fprintf(os.Stderr, "failed to read input: %v\n", err)
		os.Exit(1)
	}
}

ssh接続時のチェックであれば、munin-node.confへのallowの追加もfirewallの穴あけも不要です。

mihipc.home ~/.ssh/rc
echo "fetch df" | nc localhost 4949 | grep -v "^#" | sort -rk 2 | head -n 1
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?