Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Linux

แก้ไข Error "No Space Left on Device" ใน Linux

Error "No space left on device" แต่อาจมีพื้นที่ว่างจริงๆ สาเหตุหลัก 3 ประการ: 1) Disk จริงเต็ม 2) Inodes หมด 3) Deleted file ถูก process ถือครอง

1. ตรวจสอบพื้นที่จริง

df -h          # ดู disk usage ทุก partition
df -h /        # ดู root partition
du -sh /       # คำนวณขนาดจริงของ / (ใช้เวลานาน)

เปรียบเทียบ df กับ du หากต่างกันมาก → deleted file ถูก process ถือครอง

2. สาเหตุและวิธีแก้

ก. Deleted File ถูก Process ถือครอง (Common!)

ไฟล์ถูกลบแต่ process ยังเปิดอยู่ → disk space ไม่คืน

# หา process ที่ถือไฟล์ deleted
sudo lsof / | grep deleted

# Output ตัวอย่าง:
# systemd-j  123  root  4u  REG  253,0  100M  12 /var/log/journal/... (deleted)

# รีสตาร์ท service นั้น
sudo systemctl restart systemd-journald

# หรือ reload ทั้งระบบ
sudo systemctl daemon-reload

ข. Inodes หมด (มากไฟล์เล็ก)

Filesystem มี inodes จำนวนจำกัด ไฟล์เยอะมาก (cache, session, mail) → inodes หมด แต่อย่างไรก็ตาม disk space ยังเหลือ

df -i /        # ดู inode usage
# IUsed / IFree / IUse%

แก้ไข: ลบไฟล์ไม่จำเป็น (cache, log เก่า, session files)

# หาโฟลเดอร์ที่มีไฟล์เยอะที่สุด
find / -xdev -type f | cut -d/ -f2 | sort | uniq -c | sort -rn | head -20

ค. Bad Blocks / Filesystem Corruption

ดิสก์มี bad sector หรือ filesystem corrupt → OS นับ block เหล่านี้ว่าว่างแต่เขียนไม่ได้

# ต้อง boot จาก Live USB ก่อน!
sudo fsck -vcck /dev/sda2
# -v: verbose, -c: check bad blocks (read-only), -c -c: non-destructive read-write, -k: keep existing bad blocks list

เตือน: fsck บน mounted partition เสี่ยงสูญเสียข้อมูล ต้อง unmount หรือใช้ live media

3. เครื่องมือช่วยวิเคราะห์

  • ncdu: NCurses Disk Usage - UI แบบ TUI เร็ว สวย (sudo apt install ncdu)
  • baobab (GNOME Disk Usage Analyzer) - GUI
  • filelight (KDE) - GUI แบบ concentric rings

4. ป้องกันล่วงหน้า

  • ตั้งค่า logrotate สำหรับ /var/log
  • จำกัด journal size: SystemMaxUse=500M ใน /etc/systemd/journald.conf
  • ตั้งค่า cron ทำความสะอาด /tmp, cache ทุกวัน
  • Monitor ด้วย df -h และ df -i ใน cron/scheduler

ส่วนใหญ่ "No space left" แต่อยู่ที่ Inodes หมด หรือ deleted file ถูกถือครอง ไม่ใช่ disk จริงเต็ม!