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

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

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

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

  • คุณลืมใส่แพกเกจบางตัวใน Build-Depends: แต่ปรากฏว่ามัน build ผ่าน เพราะคุณได้ติดตั้งแพกเกจดังกล่าวไว้แล้วในระบบของคุณ แต่เมื่อผู้ใช้ apt-get source ไป build เอง ก็อาจ build ไม่ผ่านได้ กลายเป็นบั๊กที่เรียกว่า FTBFS (Fails To Build From Source) ซึ่งเดเบียนถือว่าเป็นบั๊กร้ายแรง
  • คุณต้องการ build package สำหรับ testing แต่สมมุติว่า testing กำลัง freeze ทำให้บางแพกเกจของ testing ต่างกับ unstable ที่คุณใช้อยู่ตามปกติ (เพราะการอัปโหลดแพกเกจโดยปกติตอนที่ไม่ freeze ต้องเข้าที่ unstable ก่อน แล้วค่อยรอให้เคลื่อนเข้า testing) และคุณก็ไม่ต้องการดาวน์เกรดลงไปเป็น testing เพียงเพื่อจะ build package นั้น

แน่นอนว่าเรารู้จัก 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 เขาขี้เกียจอย่างสร้างสรรค์กันครับ ก็เลยทำให้มีเครื่องมือดี ๆ ให้ใช้กันอย่างนี้ :-)

Topic: 

Comments

> รายละเอียดทั้งหมดดูได้จาก man page pbuildderrc(5)
> ค่าต่าง ๆ เหล่านี้ จะถูก override ด้วย ~/.pbuildderrc ของผู้ใช้ที่เรียกได้
ต้องเป็น pbuilderrc นะครับ ... (ตัว d เกินมาตัวครับ)
___
Neutron: Linux Addict!

แก้ละครับ :)

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้