สร้างแพกเกจแบบขาวบริสุทธิ์ด้วย pbuilder

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

เราได้พูดถึงคำสั่งสำหรับ build debian package ไปแล้วสองตัว คือ dpkg-buildpackage และ debuild ซึ่งตัวแรกจะใช้สร้าง .deb ส่วนตัวหลังจะเรียกตัวแรก ตามด้วยการตรวจสอบคุณภาพด้วย lintian/linda พร้อมทั้งเซ็นกำกับ (ถ้าระบุ) ..ครบทุกขั้นตอน

การ build ด้วย debuild เสมอ จะช่วยให้แน่ใจได้ว่าไม่พลาดอะไรไป ไม่ว่าจะเป็น option ต่าง ๆ ที่ใช้ build หรือเป็นความผิดพลาดใน rules เอง หรือกระทั่งความผิดพลาดที่เกิดจากการเซ็ตระบบระหว่าง build เช่น การเผลอไปลิงก์กับไลบรารีใน /usr/local/lib ที่คุณคอมไพล์จากซอร์สเอง แทนที่จะลิงก์กับไลบรารีของ debian ซึ่งความจู้จี้ของลินดาจะช่วยชีวิตคุณไว้ได้ แต่เมื่อคุณ maintain แพกเกจไประยะหนึ่ง ก็จะพบกับกรณีบางอย่าง ที่ทำให้นึกถึงเครื่องมือช่วยเพิ่มเติมอีก เช่น

แน่นอนว่าเรารู้จัก debootstrap มาแล้ว วิธีที่เราจะนึกถึงเป็นอันดับแรก จึงไม่พ้นการสร้าง debootstrap chroot เอาไว้จัดการกับกรณีต่าง ๆ ที่ว่านั้น โดยเก็บ base system ในรูป tarball ไว้ เพื่อจะได้ไม่ต้อง debootstrap บ่อย ๆ อยากทดสอบเมื่อไรก็แตกออกมาเพื่อ chroot เข้าไปทำงานได้ โดยก่อนใช้อาจจะต้องปรับ base system ให้เป็นปัจจุบันก่อนด้วย

โฮะโหย.. ช่างเป็นแผนการที่แนบเนียนเสียนี่กระไร แต่จะบอกให้ว่ามีคนคิดระบบนี้มาเรียบร้อยแล้ว และสร้างเป็นแพกเกจให้คุณสั่งติดตั้งใช้งานได้ง่าย ๆ เลย ระบบที่ว่านั้น เรียกว่า pbuilder (ย่อมาจาก personal builder)

# aptitude install pbuilder

ตั้งค่า base system tarball ที่จะสร้าง รวมทั้งตำแหน่งที่เก็บข้อมูลต่าง ๆ ได้ที่ /etc/pbuilderrc เช่น

BASETGZ
แฟ้ม base tarball ที่จะใช้ [default=/var/cache/pbuilder/base.tgz]
BUILDPLACE
ไดเรกทอรีที่จะใช้แตก base เพื่อ build ใน chroot [default=/var/cache/pbuilder/build/]
MIRRORSITE
แหล่ง mirror ที่จะใช้ดาวน์โหลดแพกเกจต่าง ๆ ทั้งขณะ debootstrap และสำหรับ base system ที่แตกจาก tarball [default ดึงมาจาก /etc/apt/sources.list]
BUILDRESULT
ไดเรกทอรีที่จะเก็บแฟ้มผลลัพธ์จากการ build [default=/var/cache/pbuilder/result/]
DISTRIBUTION
distribution ของ base tarball เช่น "etch" [default ไม่กำหนด และจะยึดตามข้อมูลใน /etc/apt/sources.list]

รายละเอียดทั้งหมดดูได้จาก man page pbuilderrc(5) ตามปกติถ้าไม่ตั้งค่าอะไร ค่า default ก็ใช้การได้อยู่แล้ว แต่อาจต้องระวังเรื่องการใช้เนื้อที่ ใครแบ่งพาร์ทิชัน /var ไว้ไม่ใหญ่พออาจมีปัญหา สำหรับผม ผมไปแก้ให้มาลงที่พาร์ทิชัน /home ซึ่งกันไว้สำหรับผู้ใช้อยู่แล้ว

ค่าต่าง ๆ เหล่านี้ จะถูก override ด้วย ~/.pbuilderrc ของผู้ใช้ที่เรียกได้ แต่ก็ไม่ใช่ว่าผู้ใช้จะสามารถ maintain base tarball ได้เอง เพราะอย่างน้อย การ debootstrap หรือ chroot ก็ต้องอาศัยสิทธิ์ root แต่สิ่งที่ผู้ใช้ธรรมดาจะสั่งได้ ก็คือการใช้ base tarball ที่ root ดูแลนั้น มา build package

พูดซะยืดยาว เริ่มลงมือกันดีกว่า พอตั้งค่าต่าง ๆ แล้ว เวลาจะสร้าง tarball ก็

# pbuilder create

รอ debootstrap สักพัก ก็จะได้ base system tarball รอไว้แล้ว

การ build package ถ้าคุณเคยใช้ debuild มาแล้ว การสั่ง build ใน pbuilder ก็แค่เปลี่ยนคำสั่งเป็น pdebuild เท่านั้นเอง

$ cd /path/to/source
$ pdebuild

จะเป็นการแตก base tarball แล้ว chroot เข้าไปในนั้นเพื่อ build แพกเกจ (การ chroot จำเป็นต้องทำผ่าน sudo ดังนั้น อย่าลืมกำหนด sudoers ด้วย) โดยเริ่มจาก base system เปล่า ๆ แล้วติดตั้ง Build-Depends ก่อนลงมือ build เมื่อได้ผลลัพธ์เก็บไว้ในที่ที่กำหนดแล้ว ก็ลบ base system ที่แตกออกมานั้นทิ้งให้ด้วยโดยอัตโนมัติ

จะเห็นว่า ด้วยขั้นตอนแบบนี้ ถ้าขาด Build-Depends รายการไหนไป ไม่มีทางหลุดรอดแน่ ๆ รวมทั้งการ build ก็ไม่มีทางเกิดการลิงก์กับสิ่งแปลกปลอมนอกระบบ debian ด้วย

แต่ base system ก็มีการปรับรุ่นอยู่เสมอ ๆ ดังนั้น ถ้าคุณต้องการอัปเดต base system ก็ทำได้โดยสั่ง:

# pbuilder update

จะเป็นการแตก base tarball แล้ว chroot เข้าไปอัปเกรดแพกเกจด้วย apt แล้วแพ็ก tarball กลับ

ในกรณีที่คุณต้องการเปลี่ยน distribution ของ base tarball เช่น จาก sid เป็น etch ก็เพิ่มตัวเลือก

# pbuilder update --distribution etch --override-config

ตัวเลือก --override-config จะแทนที่บรรทัดใน sources.list ของ base system ใน tarball เป็น distribution ที่กำหนดด้วย

แก้ปัญหาได้หลายเรื่องเชียวแหละ ช่วยป้องกันข้อผิดพลาดต่าง ๆ ได้ด้วย พวก debian hacker เขาขี้เกียจอย่างสร้างสรรค์กันครับ ก็เลยทำให้มีเครื่องมือดี ๆ ให้ใช้กันอย่างนี้ :-)