สร้างแพกเกจแบบขาวบริสุทธิ์ด้วย pbuilder
จากที่เขียนถึงเครื่องมือ build debian package ไว้เมื่อปีที่แล้ว ;-) เราได้พูดถึงคำสั่ง build ไปแล้วสองตัว คือ 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 สำหรับ Etch แต่ Etch กำลัง freeze ทำให้บางแพกเกจของ Etch ต่างกับ Sid ที่คุณใช้อยู่ตามปกติ (เพราะการอัปโหลดแพกเกจโดยปกติตอนที่ไม่ freeze ต้องเข้าที่ Sid ก่อน แล้วค่อยรอให้เคลื่อนเข้า Etch) และคุณก็ไม่ต้องการดาวน์เกรดลงไปเป็น Etch เพียงเพื่อจะ 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 เช่น
"sarge"[default ไม่กำหนด และจะยึดตามข้อมูลใน/etc/apt/sources.list]
รายละเอียดทั้งหมดดูได้จาก man page pbuildderrc(5)
ตามปกติถ้าไม่ตั้งค่าอะไร ค่า default ก็ใช้การได้อยู่แล้ว
แต่อาจต้องระวังเรื่องการใช้เนื้อที่ ใครแบ่งพาร์ทิชัน /var ไว้ไม่ใหญ่พออาจมีปัญหา สำหรับผม ผมไปแก้ให้มาลงที่พาร์ทิชัน /home ซึ่งกันไว้สำหรับผู้ใช้อยู่แล้ว
ค่าต่างๆ เหล่านี้ จะถูก override ด้วย ~/.pbuildderrc
ของผู้ใช้ที่เรียกได้ แต่ก็ไม่ใช่ว่าผู้ใช้จะสามารถ 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 เขาขี้เกียจอย่างสร้างสรรค์กันครับ
ก็เลยทำให้มีเครื่องมือดีๆ ให้ใช้กันอย่างนี้ :-)
เดาอย่างมีหลักการ
debian hacker "เขาขี้เกียจอย่างสร้างสรรค์"
neutron "เดาอย่างมีหลักการ" ฟังดูดี แต่ก็เดานั่นแหละ อิอิ :P
ที่จริงก็เริ่มงงตั้งแต่น้อง "หลินเทียน" กับน้อง "ลินดา" แล้วหละครับ
แต่จะพยายามดูครับผม :)
**********************
Key ID: D4CEFD37
Fingerprint: 1ED3 27F6 48C8 5C9D 4285 F24D D64E C0AF D4CE FD37
**********************
Re: สร้างแพกเกจแบบขาวบริสุทธิ์ด้วย pbuilder
หลักๆอยู่ตรงนี้ใช่มั้ยครับ
" แน่นอนว่าเรารู้จัก debootstrap มาแล้ว วิธีที่เราจะนึกถึงเป็นอันดับแรก จึงไม่พ้นการสร้าง debootstrap chroot เอาไว้จัดการกับกรณีต่างๆ ที่ว่านั้น โดยเก็บ base system ในรูป tarball ไว้ เพื่อจะได้ไม่ต้อง debootstrap บ่อยๆ อยากทดสอบเมื่อไรก็แตกออกมาเพื่อ chroot เข้าไปทำงานได้ โดยก่อนใช้อาจจะต้องปรับ base system ให้เป็นปัจจุบันก่อนด้วย "
ตัว pbuilder จะจัดการตรงนี้ให้ เราจะได้ไม่ต้องมา debootstrap หรือ tar เองให้เมื่อย :) อืมๆ classic ครับ










Recent comments
16 hours 39 min ago
1 day 22 hours ago
2 days 20 hours ago
2 days 22 hours ago
3 days 11 hours ago
5 days 19 hours ago
5 days 20 hours ago
5 days 20 hours ago
1 week 11 hours ago
1 week 2 days ago