This is G o o g l e's cache of http://www.debianclub.org/node/76 as retrieved on 21 Jan 2007 00:46:25 GMT.
G o o g l e's cache is the snapshot that we took of the page as we crawled the web.
The page may have changed since that time. Click here for the current page without highlighting.
This cached page may reference images which are no longer available. Click here for the cached text only.
To link to or bookmark this page, use the following url: http://www.google.com/search?hl=en&q=cache%3Ahttp%3A%2F%2Fwww.debianclub.org%2Fnode%2F76&btnG=Search


Google is neither affiliated with the authors of this page nor responsible for its content.

User login

Links

debianclub.com
debian.org
ubuntuclub.com
blognone.com

Syndicate

Syndicate content

สร้างแพกเกจแบบขาวบริสุทธิ์ด้วย 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 ครับ