วิธีเข้า Command Line เมื่อ CentOS/RHEL เข้า GUI ไม่ได้เพราะพื้นที่ดิสก์เต็ม (แก้ผ่าน GRUB)


อาการของปัญหา

เมื่อพื้นที่ดิสก์ของระบบ โดยเฉพาะพาร์ทิชัน / หรือ /var เต็ม อาจทำให้ระบบไม่สามารถเข้าสู่หน้าจอ GUI ได้ โดยพบอาการดังนี้

  • ค้างที่หน้า Boot
  • ค้างที่ข้อความ Started GNOME Display Manager
  • หน้าจอดำหลังจากบูต
  • ล็อกอินเข้า GUI ไม่ได้
  • ระบบรีบูตวนซ้ำ

สาเหตุส่วนใหญ่เกิดจากไฟล์ Log ใน /var/log มีขนาดใหญ่มากจนพื้นที่ดิสก์เหลือ 0%


ขั้นตอนที่ 1: เข้าเมนู GRUB

  1. รีบูตเครื่อง
  2. เมื่อหน้าจอ GRUB ปรากฏขึ้น ให้เลือก Kernel ที่ต้องการบูต
  3. กดปุ่ม e เพื่อแก้ไขรายการบูตชั่วคราว

ขั้นตอนที่ 2: แก้ไข Kernel Parameter

ค้นหาบรรทัดที่ขึ้นต้นด้วย

linux

หรือ

linuxefi

ตัวอย่าง:

linux ($root)/vmlinuz-5.x.x root=/dev/mapper/cs-root ro quiet

เลื่อนไปท้ายบรรทัด แล้วเพิ่มข้อความ:

init=/bin/bash

ตัวอย่าง:

linux ($root)/vmlinuz-5.x.x root=/dev/mapper/cs-root ro quiet init=/bin/bash

ขั้นตอนที่ 3: บูตเข้าสู่ Shell

กด

Ctrl + X

หรือ

F10

ระบบจะบูตเข้าสู่ Command Line โดยตรงและไม่โหลด GUI


ขั้นตอนที่ 4: ทำให้ Root Filesystem เขียนได้

โดยปกติระบบจะ Mount แบบ Read-only จึงต้องเปลี่ยนเป็น Read-Write ก่อน

mount -o remount,rw /

ตรวจสอบว่าใช้งานได้:

mount | grep ' / '

ขั้นตอนที่ 5: ตรวจสอบพื้นที่ดิสก์

df -h

ตัวอย่าง:

Filesystem      Size  Used Avail Use%
/dev/sda3        20G   20G     0 100%

ขั้นตอนที่ 6: ค้นหาโฟลเดอร์ที่ใช้พื้นที่มาก

ตรวจสอบขนาดของ /var

du -xh /var --max-depth=1 | sort -h

ตัวอย่าง:

5.1G /var/log

ตรวจสอบไฟล์ Log ที่มีขนาดใหญ่

du -ah /var/log | sort -rh | head -30

ขั้นตอนที่ 7: ลบหรือเคลียร์ Log

ลบ Log เก่าที่ไม่จำเป็น:

rm -f /var/log/messages-*

หรือเคลียร์เฉพาะไฟล์ขนาดใหญ่:

truncate -s 0 /var/log/messages

ลบ Journal เก่า:

journalctl --vacuum-time=7d

หรือจำกัดขนาด:

journalctl --vacuum-size=500M

ขั้นตอนที่ 8: ตรวจสอบพื้นที่อีกครั้ง

df -h

เมื่อมีพื้นที่ว่างเพียงพอแล้ว ระบบจะสามารถบูตเข้า GUI ได้ตามปกติ


ขั้นตอนที่ 9: รีบูตเครื่อง

exec /sbin/init

หรือ

reboot -f

ตั้งค่า Logrotate เพื่อป้องกันปัญหาในอนาคต

แก้ไฟล์:

vi /etc/logrotate.d/rsyslog

เพิ่มค่า:

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        /usr/bin/systemctl -s HUP kill rsyslog.service >/dev/null 2>&1 || true
    endscript
}

ความหมาย:

  • daily : หมุน Log ทุกวัน
  • rotate 30 : เก็บย้อนหลัง 30 วัน
  • compress : บีบอัด Log เก่า
  • delaycompress : บีบอัดหลังจากหมุนครั้งถัดไป

สรุป

  1. เข้า GRUB และกด e
  2. เพิ่ม init=/bin/bash
  3. กด Ctrl + X
  4. mount -o remount,rw /
  5. ตรวจสอบพื้นที่ด้วย df -h
  6. ค้นหาไฟล์ขนาดใหญ่ใน /var/log
  7. ลบหรือเคลียร์ Log
  8. รีบูตเครื่อง
  9. ตั้งค่า Logrotate เพื่อป้องกันไม่ให้พื้นที่เต็มอีก

,