Disk Space Management — df และ du

ดิสก์เต็มคือปัญหาที่ทำให้ Service หยุดทำงานได้ทันที ตั้งแต่ Database ไม่สามารถเขียน Transaction Log, Web Server ไม่สามารถสร้างไฟล์ชั่วคราว ไปจนถึง System ที่ไม่สามารถ Boot ได้เลย Linux มีเครื่องมือหลักสองตัวสำหรับตรวจสอบ Disk Space คือ df ที่แสดงพื้นที่ใช้งานของแต่ละ Filesystem และ du ที่วิเคราะห์ว่าไดเรกทอรีหรือไฟล์ใดกินพื้นที่มากที่สุด

บทความนี้อธิบายการใช้งาน df และ du ตั้งแต่การอ่านค่า Disk Usage, การหา Directory ที่กินพื้นที่มาก, การตั้งค่า Alert เมื่อ Disk เกิน Threshold รวมถึงเทคนิคหา Large Files และ Clean up พื้นที่บน Production Server

df — ดู Disk Space ทุก Filesystem

df (Disk Free) แสดงพื้นที่ว่างและพื้นที่ที่ใช้งานของ Filesystem ที่ Mount อยู่ทุกตัว เหมาะสำหรับตรวจสอบภาพรวม Disk ทั้งระบบอย่างรวดเร็ว

# แสดงทุก Filesystem ในหน่วย Human-readable
df -h

# แสดงเฉพาะ Filesystem ที่เกี่ยวกับ Local Disk (ไม่รวม tmpfs, devtmpfs)
df -h --exclude-type=tmpfs --exclude-type=devtmpfs

# แสดงเป็น Inodes (จำนวนไฟล์) แทนขนาด
df -i

# แสดง Filesystem ที่มีไฟล์อยู่ใน Path นั้น
df -h /var/log

# แสดงในหน่วย MB/GB เฉพาะ
df -m    # Megabytes
df -BG   # Gigabytes (ปัดขึ้น)

อ่านค่าผลลัพธ์ของ df

# ตัวอย่าง Output
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   18G   30G  38% /
/dev/sda2       100G   72G   23G  76% /var
tmpfs           3.9G     0  3.9G   0% /dev/shm

# คำอธิบาย
# Filesystem  — ชื่อ Device หรือ Filesystem
# Size        — ขนาดทั้งหมด
# Used        — ขนาดที่ใช้งานแล้ว
# Avail       — ขนาดที่ยังเหลือ
# Use%        — เปอร์เซ็นต์การใช้งาน
# Mounted on  — Mount Point

# กฎเบื้องต้น:
# Use% < 70%  → ปกติ
# Use% 70-85% → ควรวางแผนเพิ่มพื้นที่
# Use% > 90%  → ควรดำเนินการทันที
# Use% 100%   → เร่งด่วน — Service อาจหยุดทำงาน

ตรวจสอบ Inodes

# Inode เต็มก็ทำให้สร้างไฟล์ใหม่ไม่ได้ แม้ Disk จะยังมีพื้นที่
df -i

# ตัวอย่าง Output
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda1      3276800 125420 3151380    4% /
/dev/sda2      6553600 6553599       1  100% /var/spool

# ถ้า IUse% = 100% → สร้างไฟล์ใหม่ไม่ได้
# วิธีแก้: ค้นหาและลบไฟล์ขนาดเล็กจำนวนมาก
find /var/spool -type f | wc -l    # นับจำนวนไฟล์
find /var/spool -type f -mtime +30 -delete   # ลบไฟล์เก่า

du — วิเคราะห์ Directory ที่กินพื้นที่

du (Disk Usage) แสดงขนาดของแต่ละไดเรกทอรีและไฟล์ เหมาะสำหรับหาว่าอะไรกินพื้นที่มากที่สุดใน Filesystem

# แสดงขนาดทุก Subdirectory ใน /var
du -h /var

# แสดงเฉพาะ Summary (ขนาดรวมของแต่ละ Directory ชั้นแรก)
du -sh /var/*

# แสดง N ระดับลึก (--max-depth)
du -h --max-depth=1 /var

# แสดงและเรียงขนาดจากมากไปน้อย
du -sh /var/* | sort -rh | head -20

# แสดงขนาดรวมทั้งหมดของ Directory
du -sh /var/log

หา Directory ที่กินพื้นที่มากที่สุด

# หา Directory 10 อันดับใหญ่สุดใน /
du -h --max-depth=1 / 2>/dev/null | sort -rh | head -10

# หา Directory 10 อันดับใหญ่สุดใน /var
du -h --max-depth=2 /var 2>/dev/null | sort -rh | head -10

# หา Directory ทั้งระบบที่ใหญ่กว่า 1GB
du -h / 2>/dev/null | grep '^[0-9.]*G' | sort -rh | head -20

# หา File เดี่ยวที่ใหญ่กว่า 100MB
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -20

ค้นหาและลบไฟล์ที่ไม่จำเป็น

# หา Log ไฟล์เก่ากว่า 30 วัน
find /var/log -name "*.log" -mtime +30

# ลบ Log ไฟล์เก่ากว่า 30 วัน
find /var/log -name "*.log" -mtime +30 -delete

# หา Core Dump Files (มักใหญ่มาก)
find / -name "core" -type f 2>/dev/null
find / -name "core.*" -type f 2>/dev/null

# ลบ Temp ไฟล์เก่ากว่า 7 วัน
find /tmp -type f -mtime +7 -delete
find /var/tmp -type f -mtime +30 -delete

# ดู Package Cache (Debian/Ubuntu)
du -sh /var/cache/apt/archives/

# ล้าง Package Cache
sudo apt clean        # ลบ Package ที่ดาวน์โหลดไว้ทั้งหมด
sudo apt autoclean    # ลบเฉพาะ Package เก่าที่ไม่มีใน Repo แล้ว
sudo apt autoremove   # ลบ Package ที่ไม่ได้ใช้งาน

ตรวจสอบ Disk Usage บน Docker

# ดู Disk Usage ของ Docker ทั้งหมด
docker system df

# ดูรายละเอียด
docker system df -v

# ล้าง Docker ที่ไม่ใช้งาน (Image, Container, Network, Volume)
docker system prune

# ล้าง Volume ที่ไม่ได้ใช้ด้วย (ระวัง — อาจลบข้อมูล)
docker system prune --volumes

# ลบเฉพาะ Image ที่ไม่มี Tag (dangling images)
docker image prune

Script แจ้งเตือนเมื่อ Disk เกิน Threshold

#!/bin/bash
# /usr/local/bin/check-disk.sh
# แจ้งเตือนเมื่อ Disk Usage เกิน 85%

THRESHOLD=85
HOSTNAME=$(hostname)
ALERT_EMAIL="[email protected]"

while IFS= read -r line; do
    usage=$(echo "$line" | awk '{print $5}' | sed 's/%//')
    mount=$(echo "$line" | awk '{print $6}')

    if [ -n "$usage" ] && [ "$usage" -ge "$THRESHOLD" ]; then
        echo "Disk $mount is ${usage}% full on $HOSTNAME" \
            | mail -s "[Alert] Disk Space Warning on $HOSTNAME" "$ALERT_EMAIL"
    fi
done < <(df -h | tail -n +2 | grep -v tmpfs)

# เพิ่มใน Crontab รันทุกชั่วโมง
# 0 * * * * /usr/local/bin/check-disk.sh

เครื่องมือเสริม: ncdu — Interactive Disk Usage

ncdu (NCurses Disk Usage) เป็น Interactive version ของ du ที่ใช้งานง่ายกว่า สามารถนำทางและลบไฟล์ได้โดยตรงจากภายใน Terminal

# ติดตั้ง ncdu
sudo apt install ncdu      # Ubuntu/Debian
sudo dnf install ncdu      # RHEL/Rocky

# สแกน Directory ปัจจุบัน
ncdu

# สแกน Directory เฉพาะ
ncdu /var

# สแกนทั้งระบบ (ข้าม /proc /sys /dev)
ncdu / --exclude /proc --exclude /sys --exclude /dev

# คำสั่งใน ncdu:
# ↑↓   — เลื่อน
# Enter — เข้า Directory
# d     — ลบไฟล์/Directory
# q     — ออก

ตรวจสอบ Disk อย่างรวดเร็วเมื่อ Disk เต็ม

# Step 1: ดูภาพรวมว่า Partition ไหนเต็ม
df -h

# Step 2: หา Directory ใหญ่สุดใน Partition ที่เต็ม
du -h --max-depth=1 /var 2>/dev/null | sort -rh | head -10

# Step 3: เจาะลงไปใน Directory นั้น
du -h --max-depth=1 /var/log | sort -rh | head -10

# Step 4: หาไฟล์ขนาดใหญ่
find /var/log -type f -size +100M 2>/dev/null | xargs ls -lh

# Step 5: ล้างทันที
# ถ้าเป็น Log ไฟล์ที่ไม่จำเป็น:
> /var/log/large-app.log    # Truncate แทนลบ (ถ้า Service ยังใช้ไฟล์อยู่)
# ถ้า Service ไม่ได้ใช้:
rm /var/log/large-app.log

# Step 6: ตรวจสอบ Deleted Files ที่ยังถูก Process ถือ Handle อยู่
lsof | grep deleted | awk '{print $1, $2, $7, $9}' | sort -k3 -rh | head -10
# Process ที่ถือ Handle ไฟล์ที่ลบแล้ว จะคืนพื้นที่ก็ต่อเมื่อ Process ปิดหรือ Restart

สรุป

df -h ใช้สำหรับดูภาพรวมพื้นที่ Disk ทุก Filesystem และควรตรวจสอบทั้ง Use% และ IUse% เพราะ Inode เต็มก็ทำให้สร้างไฟล์ใหม่ไม่ได้เช่นกัน du -sh /path/* | sort -rh เป็น Pattern ที่ใช้บ่อยที่สุดสำหรับหาว่า Directory ใดกินพื้นที่มาก เมื่อพบ Disk ใกล้เต็มให้ตรวจสอบตามลำดับ df → du → find แล้วล้างผ่าน apt clean, log rotation หรือลบไฟล์ที่ไม่จำเป็น การตั้ง Cron Script แจ้งเตือนเมื่อ Disk เกิน 85% เป็น Best Practice บน Production Server

แนะนำบริการ DE

การจัดการ Disk Space บน Server จริงต้องการสิทธิ์ Root เพื่อตรวจสอบและล้างไฟล์ในทุก Directory Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบพร้อม Storage ที่ปรับขนาดได้ และรองรับการ Resize Disk Volume โดยไม่ต้อง Downtime เหมาะสำหรับ Production Server ที่ต้องการความยืดหยุ่น

หากต้องการโฮสต์เว็บไซต์โดยมีระบบจัดการ Storage อัตโนมัติ Cloud Hosting ของ DE มีระบบแจ้งเตือนเมื่อพื้นที่ใกล้เต็มและสามารถ Upgrade Quota ได้ผ่าน Control Panel