Saturday, February 18, 2012

FreeBSD: system administrators tasks, package

ทุกข์ - อุปาทานในขันธ์ ๕
เจ็บนี้อีกนาน เจ็บจริงๆ
ความที่ใช้งานในสภาพแวดล้อมรุนแรง ความร้อนสูง ฝุ่นเยอะ ใช้งานต่อเนื่องนาน ... ฯลฯ ดังนั้นจึงเกิดกรณีที่เครื่องดับโดยไม่ทันได้ สั่งเสีย อะไรเลย กล่าวคือ ยังไม่ได้ unmount file systems และ shutdown operating system

ผลน่ะหรือ เมื่อเปิดเครื่องมาอีกครั้ง ก็จำต้องลงไปสู่ single user mode และสั่ง

# fsck -y

เท่านั้นเอง ซึ่งมันเป็นเหตุให้ บางส่วนของข้อมูล หายไป แล้วเราก็ไม่รู้ด้วยว่า ส่วนไหน หายไป โดยดูจาก messages ระหว่างที่ทำ ฟี้สกี้, fsck -y, นั้นแล้วบอกได้ว่า

อ้อ ส่วนนี้เน้าะ ที่หายไป ไม่เป็นไร นั่นมันแฟ้มขยะ ...

ไม่มีทางบอกได้เลยในขณะนั้น

ในครั้งนี้ ที่มันเกิดเหตุขึ้นมา ก็เพราะไปเผลอทำ portupgrade เข้า ข้อมูลส่วนที่ขาดหายไปจึงเป็นเพียง, เท่าที่รู้, package informations, ของหลายๆ packages เท่านั้น

ก็ยังนับว่าโชคดีไม่ใช่น้อยเลย

ที่ว่า ไม่ใช่น้อยนั้น ก็เพราะทุกครั้งที่ลงโปรแกรมผ่าน ports มักจะเก็บ binaries เอาไว้ในรูปแบบของ package เสมอ ก็ลำบากเพียงสั่ง

# make package

ก่อนสั่ง

# make clean

เท่านั้นเอง การนี้ มีข้อเสียคือเปลืองเนื้อที่ใน hard disk นอกนั้นแล้ว ไม่ว่าจะคิดในแนวไหนก็ล้วนแต่เป็นข้อดีไปทั้งสิ้น

กับอุบัติเหตุครั้งนี้ทำให้แฟ้มบางแฟ้มเสียหาย เวลาใช้งาน แม้จะไม่มีผลอะไร เพราะโปรแกรมที่ลง ก็ยังอยู่ครบ แต่เมื่อจะทำ portupgrade กลับพบว่า มีปัญหา เพราะเขาบอกว่า บางโปรแกรม นั้น ยังไม่ลง ทั้งๆที่ก็ได้ลงไปแล้ว  .... ฐานข้อมูลส่วนนี้ หายไปนั่นเอง หายไปจากอุบัติเหตุดังกล่าวมาแล้ว

ก็เลยตรวจดูว่ามีโปรแกรมไหนบ้าง ที่ package info[rmations] หายไปด้วยคำสั่ง

# pkg_info

แล้วดูผลลัพธ์ ที่บอกว่า

pkg_info: the package info for package '.....' is corrupt

นั่นแหละ โปรแกรม ..... นั่นแหละ ฐานข้อมูลเสียหาย

แก้ไม่ยาก ก็ลงโปรแกรมนั้นผ่าน port เสียใหม่อีกครั้ง ก็จบ

แฮ่ เครื่องของผม มันเก่ามาก และ  กรอบ มาก ทำงานหนักอีกไม่ไหวแล้วคร้าบ เพราะมั้นตั้ง ร่วมสามสิบโปรแกรม ที่เสียหายในลักษณะนี้

ยังนับว่าโชคดี ที่มี binaries ของโปรแกรมที่ข้อมูลส่วนที่เสียหายนี้อยู่ ครั้งที่สั่ง make package โน้น

เมื่อทราบดั่งนี้แล้ว แนวทางแก้ไขก็คือ
  1. ลบโปรแกรมเดิมที่ลงไว้แล้วนั้นออกไป
  2. ลงโปรแกรมเดิมนี้ จากคำสั่ง pkg_add โดยชี้ไปยังที่เก็บแฟ้มที่เราได้สร้างไว้แต่คราวสั่ง make package นั้น
เราทราบว่า โปรกรมดังกล่าว ดูได้ หรือ รู้ได้จากคำสั่ง pkg_info แล้วบรรทัดไหที่ขึ้นต้นด้วย pkg_info: ก็ นั่นแหละ โปรกรมนั้นแหละ ที่ฐานข้อมูลมันเสียหาย เราก็กรองเอามา ดังนี้

# pkg_info | grep ^pkg_info >  packages-info-brokens

จากนั้นก็ส่งไปเก็บไว้ในแฟ้ม ชื่อ packages-info-brokens อีกทีหนึ่ง โดยการ redirection ธรรมดาๆ

ตัวอย่างของแฟ้มที่ ฐานข้อมูลเสียหายก็ประมาณนี้

pkg_info: the package info for package 'mousepad-0.2.16_8' is corrupt
pkg_info: the package info for package 'mplayer-1.0.r20111218_3' is corrupt
pkg_info: the package info for package 'org-mode.el-emacs23-7.4' is corrupt
pkg_info: the package info for package 'p5-Compress-Raw-Bzip2-2.048' is corrupt
pkg_info: the package info for package 'p5-Parse-Yapp-1.05' is corrupt
pkg_info: the package info for package 'p5-Switch-2.16' is corrupt
pkg_info: the package info for package 'p5-XML-DOM-1.44' is corrupt
pkg_info: the package info for package 'p5-XML-RegExp-0.03' is corrupt
pkg_info: the package info for package 'p5-XML-XQL-0.68' is corrupt
pkg_info: the package info for package 'p5-YAML-Syck-1.19' is corrupt
pkg_info: the package info for package 'qt4-network-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-opengl-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-porting-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-qt3support-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-script-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-sql-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-sqlite-plugin-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-svg-4.7.4' is corrupt
pkg_info: the package info for package 'qt4-uic3-4.7.4' is corrupt
pkg_info: the package info for package 'smplayer-0.6.10' is corrupt
pkg_info: the package info for package 'wxgtk2-common-2.8.12' is corrupt
pkg_info: the package info for package 'wxgtk2-contrib-2.8.12' is corrupt
pkg_info: the package info for package 'wxgtk2-contrib-common-2.8.12' is corrup

ตัวโปรแกรมนั้น จะอยู่ระหว่างเครื่องหมาย single quote ก็ง่ายเลย ใช้ awk(1) เขียน sh script มาจัดการได้เลย ง่ายๆสำหรับการลบออก

#  awk -F\' 'BEGIN {print "#\!/bin/sh\nset -x\n"} {print "/usr/sbin/pkg_delete -f "$2}' packages-info-brokens > z-d-pkgs-brokens

และการลงโปรแกรมที่ได้ลบออกไปด้วย

#  awk -F\' 'BEGIN {print "#\!/bin/sh\nset -x\n"} {print "/usr/sbin/pkg_add -ifF /kaitag/packages/All/"$2".tbz"}' packages-info-brokens > z-a-pkgs-brokens


แล้วก็กำหนด permission mode ให้เป็น +x ทั้งคู่


# chmod +x z-d-pkgs-brokens z-a-pkgs-brokens


ที่สุดก็ลำบากเพียงสั่ง


# ./z-d-pkgs-brokens
# ./z-a-pkgs-brokens


เท่านั้นเอง ก็ได้แต่หวังว่า คงพอเกิดประโยชน์กับเพื่อนๆบ้าง และ หวังว่าคงเกิดประโยชน์แต่เพียงประเทืองปัญญา แต่ไม่ได้หวังว่าจะได้ใช้ น่ะครับ
อ้อ ลืมไป ปกติ เวลาสั่ง make package นั้น binaries จะเก็บไว้ใน /usr/ports/packages/ ครับ แต่ ผมกำหนดให้ไปเก็บที่ /kaitag/packages/ ครับ และเขาจะนำไปเก็บภายใต้ ..../All/ นั้น อีกเตาหนึ่ง

ลืมไปอีกครับ  ยังคงลืมไป (ติดใจอยากอยู่ต่อ) เราต้องทำ pkgdb -F ด้วย เพื่อให้ฐานข้อมูลส่วนที่ขาดหายไปนี้ กลับมามีคืนดั่งเดิม

ทุกข์ ควรกำหนดรู้

    No comments:


    View My Stats