Proxmox boot error: grub/i386-pc/boot.mod not found

สาเหตุ

ปัญหาสำหรับคนใช้ Proxmox VE เท่านั้น เนื่องจากแพคเกจ grub2 ที่ติดตั้งจาก proxmox repo มันมีบั๊กไม่รู้จัก partition ของ mdraid แล้วถ้าสั่ง aptitude upgrade หรือปล่อย auto upgrade มันจะอัพ grub2 จาก proxmox repo มาทับตัว official ของ Debian เสร็จแล้วพอรีบูทเครื่อง… มันจะบูทไม่ขึ้น! อาการคือพอถึงหน้า grub จะเจอ error ประมาณนี้

error: file /grub/i386-pc/boot.mod' not found
Entering rescue mode...
grub rescue>

ตรวจสอบ

เช็คเครื่องที่ยังรันอยู่ ว่า grub เป็นรุ่นอะไร โดยสั่ง

dpkg -l "grub*" | grep ^ii

เสร็จแล้วลองเทียบรุ่นดู เลขรุ่นอาจจะไม่ตรงเป้ะนะครับ แต่พอดูออกแหละ

  • ถ้าเป็น 1.99-27+deb7u2 = grub ของ official debian wheezy = ปลอดภัย
  • ถ้าเป็น 2.02~bpo70+3 = grub ของ proxmox wheezy = อันตราย
  • ถ้าเป็น 2.02~beta2-21 = grub ของ official debian jessie = ปลอดภัย
  • ถ้าเป็น 2.02-pve1 = grub ของ proxmox jessie= อันตราย

ถ้าเป็นรุ่นอันตราย ห้ามรีบูทเครื่องเด็ดขาดจนกว่าจะแก้เสร็จ ถ้าเป็นรุ่นปลอดภัยก็อย่าลืมทำ Pinning ก่อนเพื่อความชัวร์ว่าจะไม่เผลอไปอัพเกรดทับ (ดูท้าย blog นี้)

ทางแก้

Case #1 ถ้าเครื่องยังทำงานปกติอยู่ (ยังไม่ได้รีบูท)

ติดตั้ง grub ของ official debian ทับตัวของ proxmox เสร็จแล้วอย่าลืม grub-install ให้ครบทุก disk แล้วสั่ง update-grub2 ด้วย

สคริปนี้เป็นอันของ debian wheezy ที่ใช้ซ่อมบนระบบจริง ถ้าจำนวน disk ไม่ตรงกันอย่าลืมแก้ก่อนเอาไปใช้ด้วยนะครับ

ถ้าใช้ grub-efi (จะเห็นได้จาก output ของ dpkg ข้างบน) อย่าลืมเปลี่ยนแพคเกจให้ตรงด้วยนะครับ

ถ้าใช้ jessie ก็อย่าลืมเปลี่ยนรุ่นของ grub ทุกตัวให้ตรงด้วย (เช็ครุ่นที่ถูกได้แถวนี้)

wget http://ftp.debianclub.org/debian/pool/main/g/grub2/grub-common_1.99-27+deb7u2_amd64.deb
wget http://ftp.debianclub.org/debian/pool/main/g/grub2/grub2-common_1.99-27+deb7u2_amd64.deb
wget http://ftp.debianclub.org/debian/pool/main/g/grub2/grub-pc_1.99-27+deb7u2_amd64.deb
wget http://ftp.debianclub.org/debian/pool/main/g/grub2/grub-pc-bin_1.99-27+deb7u2_amd64.deb
dpkg -i grub-common_1.99-27+deb7u2_amd64.deb grub2-common_1.99-27+deb7u2_amd64.deb grub-pc_1.99-27+deb7u2_amd64.deb grub-pc-bin_1.99-27+deb7u2_amd64.deb
grub-install /dev/sda
grub-install /dev/sdb
update-grub2

อัพเสร็จแล้วอย่าลืมทำ Pinning (ดูท้าย blog)

Case #2 เผลอรีบูทไปแล้ว ตอนนี้บูทแล้วโดน  ‘/grub/i386-pc/boot.mod’ not found อยู่

แบบ TL;DR: บูทเข้า rescue ไปลง grub ตัว official ที่อยู่ในแผ่นติดตั้ง Debian เสร็จแล้วอย่าลืม grub-install + update-grub2 ด้วย

แบบยาวๆ

  1. โหลดแผ่นติดตั้ง Debian มา เช่น debian-7.8.0-amd64-netinst.iso แล้วไรท์ หรือถ้าอยากบูทจาก usb ก็ใช้ rufus สร้างโดยเลือกไฟล์ iso มาเขียนครับ
  2. บูทเข้าแผ่นติดตั้ง แล้วเลือก Rescue mode (อาจจะซ่อนอยู่ในเมนู Advanced)
  3. พวกคอนฟิกพื้นฐานจะคล้ายกับตอนติดตั้ง กด next รัวๆได้เลย network ก็ช่างหัวมัน
  4. พอถึงหน้าที่ให้เลือก Root filesystem ให้เลือก Assemble RAID Array > Automatic เสร็จแล้วเลือก /dev/mdX อันที่เป็น / ของเรา
  5. พอถึงหน้าที่ให้เลือกว่าจะรัน shell ที่ไหน เลือกเป็น Execute shell in installer environment
  6. ก้อปไฟล์ 4 ตัวจาก /cdrom/pool/main/g/grub2/ มาแปะใน root filesystem เรา ซึ่งน่าจะอยู่ที่ /target แหละนะ (ถ้าไม่มี mount มือโลด)
    cd /cdrom/pool/main/g/grub2/
    cp grub-common* grub-pc* grub2-common* /target/
    exit
    
  7. เสร็จแล้ว exit ออกมาแล้ว Execute shell in /dev/mdX แทน
  8. ติดตั้งไฟล์ที่ก้อปออกมาเมื่อกี้โดย dpkg -i grub*.deb แล้ว grub-install ลง hardisk ให้ครบ + update-grub2 ด้วย
    cd /
    dpkg -i grub*.deb
    grub-install /dev/sda
    grub-install /dev/sdb
    update-grub2
    exit
    
  9. reboot!
  10. พอบูทขึ้นแล้วอย่าลืมทำ Pinning

การทำ Pinning เพื่อป้องกันการ upgrade ในอนาคต

Debian 7 Wheezy

cat << EOF > /etc/apt/preferences.d/grub-bugfix
Package: grub-common grub2-common grub-pc grub-pc-bin
Pin: release c=main
Pin-Priority: 1001

Package: grub-common grub2-common grub-pc grub-pc-bin
Pin: release c=pve-no-subscription
Pin-Priority: -1
EOF

Debian 7 Wheezy (สำหรับคนที่ใช้ EFI)

cat << EOF > /etc/apt/preferences.d/grub-bugfix
Package: grub-common grub2-common grub-efi-amd64 grub-efi-amd64-bin
Pin: release c=main
Pin-Priority: 1001

Package: grub-common grub2-common grub-efi-amd64 grub-efi-amd64-bin
Pin: release c=pve-no-subscription
Pin-Priority: -1
EOF

Debian 8 Jessie

cat << EOF > /etc/apt/preferences.d/grub-bugfix
Package: grub-common grub2-common grub-pc grub-pc-bin
Pin: release c=main
Pin-Priority: 1001

Package: grub-common grub2-common grub-pc grub-pc-bin
Pin: release c=pvetest
Pin-Priority: -1
EOF

ตรวจสอบว่า Pin ถูกต้อง

apt-cache policy grub-common grub2-common grub-pc grub-pc-bin

ถ้าการ Pin ถูกต้อง output ควรจะประมาณนี้ (ดูตรง Package pin)

grub-common:
  Installed: 1.99-27+deb7u2
  Candidate: 1.99-27+deb7u2
  Package pin: 1.99-27+deb7u2
  Version table:
     2.02~bpo70+3 1001
        500 http://mirror.applebred.net/debian-pve/ wheezy/pve-no-subscription amd64 Packages
 *** 1.99-27+deb7u2 1001
        500 http://ftp.debianclub.org/debian/ wheezy/main amd64 Packages
        100 /var/lib/dpkg/status
grub2-common:
  Installed: 1.99-27+deb7u2
  Candidate: 1.99-27+deb7u2
  Package pin: 1.99-27+deb7u2
  Version table:
     2.02~bpo70+3 1001
        500 http://mirror.applebred.net/debian-pve/ wheezy/pve-no-subscription amd64 Packages
 *** 1.99-27+deb7u2 1001
        500 http://ftp.debianclub.org/debian/ wheezy/main amd64 Packages
        100 /var/lib/dpkg/status
grub-pc:
  Installed: 1.99-27+deb7u2
  Candidate: 1.99-27+deb7u2
  Package pin: 1.99-27+deb7u2
  Version table:
     2.02~bpo70+3 1001
        500 http://mirror.applebred.net/debian-pve/ wheezy/pve-no-subscription amd64 Packages
 *** 1.99-27+deb7u2 1001
        500 http://ftp.debianclub.org/debian/ wheezy/main amd64 Packages
        100 /var/lib/dpkg/status
grub-pc-bin:
  Installed: 1.99-27+deb7u2
  Candidate: 1.99-27+deb7u2
  Package pin: 1.99-27+deb7u2
  Version table:
     2.02~bpo70+3 1001
        500 http://mirror.applebred.net/debian-pve/ wheezy/pve-no-subscription amd64 Packages
 *** 1.99-27+deb7u2 1001
        500 http://ftp.debianclub.org/debian/ wheezy/main amd64 Packages
        100 /var/lib/dpkg/status

เป็นอันเรียบร้อยครับ ขอให้ทุกท่านโชคดี

ทำ Wi-Fi authen ผ่าน RADIUS ใช้เองที่บ้าน (WPA2-Enterprise, 802.1x)

Prerequisites

  1. Access Point ที่ทำ 802.1x ได้ (ก็ทุกตัวในโลกแหละ!!)
  2. Debian Server ที่ลง FreeRADIUS version > 2.1.8 ถ้าเก่ากว่านี้จะใช้ไม่ได้!! เพราะไม่ได้ built-in OpenSSL (งมมาตั้งหลายปี เพราะปัญหานี้นี่ล่ะ!!)

Configuration

แก้คอนฟิกของ FreeRADIUS ใน /etc/freeradius/

  1. eap.conf แก้บรรทัดต้นๆ เลย
    eap {
        default_eap_type = peap
        ...
  2. clients.conf เพิ่มต่อท้ายลงไป
    client NETWORK/MASK {
        secret = SECRET
        shortname = NAME
        nastype = other
    }

    โดย NETWORK/MASK ก็ IP ของ Access Point ที่จะอนุญาตให้มา authen ส่วน secret กับ shortname นี่ตั้งตามใจชอบ จำ secret ไว้ด้วย เดี๋ยวต้องใช้

  3. users
     "USERNAME" Cleartext-Password := "PASSWORD"

    ตรงไปตรงมา username กับ password ที่จะใช้ login ตอนต่อ Wi-Fi

  4. radiusd.conf อันนี้แถม แก้ให้เก็บ log การ login แต่ละครั้งด้วย
    log {
        ...
        auth = yes
        ...
    }

แก้คอนฟิก Access Point ตามนี้

  1. Security Mode: WPA2-Enterprise
  2. WPA Algorithms: AES
  3. RADIUS Server: IP ของ RADIUS Server
  4. RADIUS Port: 1812
  5. RADIUS Shared Secret: ใส่ secret ที่ตั้งตอนข้อ 2.

Connecting

สำหรับ Android ก็เข้าหน้า Wi-Fi settings แล้วกดต่อได้เลย กรอกๆตามนี้

  1. EAP Method: PEAP
  2. Phase 2 authentication: MSCHAPV2
  3. CA/User certificate: (unspecified)
  4. Identity: username ที่กรอกตอนข้อ 3.
  5. Anonymous Identity: เว้นว่าง
  6. Password: ที่กรอกตอนข้อ 3.

ส่วน IOS ก็จิ้มต่อได้ทันที กรอกแค่ Username/Password แล้วกด Accept certificate ทีนึง ผ่าน!

ส่วนถ้าใช้ Windows ตัวใครตัวมันครับ ยังทำไม่ผ่านเหมือนกัน *o*

Linux – ลบไฟล์เล็กๆจำนวนมหาศาล

เรื่องมันมีอยู่ว่า Hosting ที่ดูแลอยู่โดน spam mail มหาศาลเข้าไป โฟลเดอร์ spool เลยเต็มไปด้วยเมล์ นับๆแล้วรวมกันได้ 530,367 ฉบับ แปลว่ามีไฟล์อยู่ 530,367 ไฟล์ แต่ละไฟล์ขนาดไม่เกิน 1 KB

ทีนี้ปัญหามันเกิดเมื่อต้องการลบโฟลเดอร์นี้ทิ้ง ทีนี้ partition แบบ ext3 มันจัดการไฟล์แบบนี้ได้ห่วยแตกมากๆ ลองลบด้วยหลายๆวิธีก็ไม่สำเร็จ

  • rm -rf dirname # ลองรันทิ้งไว้ชั่วโมงนึง (ไปกินข้าวมา) กลับมาเช็คจำนวนไฟล์ยังเท่าเดิมเป้ะ
  • find dirname -delete # ลองรันทิ้งไว้ 5 นาที ผลคือจำนวนไฟล์เท่าเดิมเช่นเคย

นั่งงมๆอยู่นาน เลยลองถามไปใน twitter ได้ @sourcode มาร่วมปวดหัวด้วยกัน จนสุดท้ายลองเล่นกับ shell script แทน ได้ผลแฮะ

# ls -1 dirname > list
# for i in `cat list`; do rm -f dirname/$i; done

ขอบคุณ bash อีกครั้ง อันที่จริงยังลบไม่เสร็จนะครับ ตอนนี้รันมา 15 นาที ไฟล์หายไป 100,000 กว่าๆแล้ว เหลืออีก 400,000 กว่าไฟล์เอง

ป.ล. @manatsawin ได้ส่งโค้ด python มาให้ลองเหมือนกัน พอดีผมลอง shell script อันบนแล้วสำเร็จซะก่อนเลยไม่ได้ลอง ยังไงก็ขอบคุณเช่นกันครับ

import glob,os; for i in glob.glob("*"): os.remove(i)

ดูแล้วสั้นกว่า bash เยอะเลย

Debian Mirrors in Thailand

อันนี้คือที่ผมใช้อยู่ครับ เอาไปใส่ในไฟล์ /etc/apt/sources.list

deb http://mirror1.ku.ac.th/debian/ lenny main contrib non-free
deb http://mirror1.ku.ac.th/debian/ lenny-proposed-updates main contrib non-free
deb http://debian.thaios.net/debian/ lenny main contrib non-free
deb http://debian.thaios.net/debian/ lenny-proposed-updates main contrib non-free
deb ftp://ftp.debianclub.org/debian/ lenny main contrib non-free
deb ftp://ftp.debianclub.org/debian/ lenny-proposed-updates main contrib non-free
deb http://linux.thai.net/debian/ lenny main contrib non-free
deb http://linux.thai.net/debian/ lenny-proposed-updates main contrib non-free
deb http://neutron.debianclub.com/debian/ lenny main contrib non-free
deb http://neutron.debianclub.com/debian/ lenny-proposed-updates main contrib non-free
deb http://debian.lru.ac.th/debian/ lenny main contrib non-free
deb http://debian.lru.ac.th/debian/ lenny-proposed-updates main contrib non-free
deb http://mirror.in.th/osarchive/debian/ lenny main contrib non-free
deb http://mirror.in.th/osarchive/debian/ lenny-proposed-updates main contrib non-free
deb http://mirror1.ku.ac.th/debian-security/ lenny/updates main contrib non-free

ส่วนใหญ่เอามาจากที่นี่ครับ http://debianclub.org/mirrors