Thursday, April 26, 2012

Linux Troubleshooting: Boot

boot เครื่องใหม่และกำหนด kernel parameter เพิ่ม "init=/bin/bash" เข้าไป

วิธีนี้จะทำให้หลังจาก boot kernel เสร็จมันจะ execute /bin/bash แทนที่จะเป็น init
และมันจะไม่ execute rc script ตัวใหนเลย แต่เราจะสามารถใช้ shell บน terminal ได้

ตอนที่ boot โดยใช้ init=/bin/bash (หรือ init=/bin/sh )
root file system จะ mount เป็น read only เราจะไม่สามารถแก้ไขอะไรบน file system ได้

ลองใช้ คำสั่ง "ls > /tmp/x" ดูนะครับ จะเห็นว่ามันไม่สามารถสร้างไฟล์ได้

จะต้อง remount มันให้เป็นแบบ read/write ก่อน โดยการใช้คำสั่ง

# mount -o remount,rw /

หลังจากนั้น ลองใช้คำสั่ง "ls > /tmp/x" จะเห็นว่ามันสามารถสร้างไฟล์ /tmp/x ขึ้นมาได้

หลังจาก filesystem mount เป็นแบบ read/write แล้ว เราก็จะสามารถแก้ไข ลำดับ หรือ script
ที่ init จะ execute ได้

สมมตว่า สงสัยว่า rc script ที่ชื่อ /etc/rcS.d/S06hwclockfirst.sh เป็นตัวทำให้เครื่องหยุดทำงาน
ก็ลอง rename มันชื่ออื่นก่อน เช่น

# cd /etc/rcS.d
# mv S06hwclockfirst.sh _S06hwclockfirst.sh

เปลี่ยนชื่อไฟล์ ให้ตัวอักษรตัวแรก ไม่เป็น 'S' -- สำหรับ Start หรือ 'K' -- Kill สำหรับ
stop script จะทำให้ในขั้นตอนของการ boot up หรือ shutdown เครื่อง มันไม่ execute script
เหล่านั้น

rename โดยให้ยังคงชื่อเดิมเอาไว้เพราะในครั้งต่อไป เราอาจจะต้อง rename มันกลับเป็นชื่อเดิมอีกครั้ง
ผมใช้วิธีการเพิ่ม '_' เข้าไปหน้าชื่อ

หลังจากนี้ ก็ต้อง reboot เครื่อง แต่จะใช้คำสั่ง reboot หรือ shutdown ไม่ได้เพราะเราไม่ได้ boot เครื่อง
โดยใช้ init ตามปกติ ... ผมไม่แน่ใจว่ามีคำสั่งใหนบ้างที่จะ force reset มันได้ โดยไม่ไป execute script
ผมใช้วิธีการกดปุ่ม reset หรือ ปุ่ม power เลย

แต่ก่อนที่จะทำอย่างนั้น เพื่อความสบายใจว่า เรา mount filesystem เป็นแบบ read/write อยู่ อาจจะทำให้
file เสียหายถ้ากดปุ่ม reset เลย ก็ใช้วิธีการ remount ให้มันกลับเป็น แบบ read only ก่อน

# sync
# mount -o remount,ro /

แล้วค่อยกดปุ่ม reset ครับ

คราวนี้ให้มัน boot แบบ verbose ตามปกติแล้วดูว่ามันไปหยุดที่ใหน
แล้ว reboot เครื่องใหม่ โดยใช้ init=/bin/bash อีกครั้ง
เข้าไปดูว่ามันหยุดที่ script ตัวใหน
ใช้ คำสั่ง grep หรือ more สำหรับ ดูข้อมูลในไฟล์ได้ ว่า script ตัวใหน
เป็นตัวพิมพ์ string ล่าสุดออกมาก่อนที่มันจะหยุดไป
หลีกเลี่ยงการใช้ editor แบบ nano/vi/... นะครับ :)

ที่มา http://debianclub.org/node/736

Tuesday, April 17, 2012

Fix Can't locate perl Install.pm debian



$ perl Makefile.PL
Can't locate inc/Module/Install.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl .) at Makefile.PL line 5.
BEGIN failed--compilation aborted at Makefile.PL line 5.

$ sudo apt-get install libmodule-install-perl

thanks
http://www.bioperl.org/wiki/Tutorial:Installing_Perl_modules#Debian