คนมันบ้านจนตอนที่6 :ทำ Repos (ของเรา)ให้ไปใช้กะเครื่องได้ด้วย Debootstrap & Script Wget
Posted in:
มาจะกล่าวบทไปจากตอนที่แล้ว...
เป็นช่วงเวลาแห่งการรอคอยรักแท้ แม้ว่าจะแอบมีกิ๊กไปบ้าง
แต่ก็มีเป้าหมายชัดเจนว่า...จะรอแต่เธอ...Ubuntu ผู้เดียว
ถึงตัวจะใช้ Elive แต่ใจยังนึกถึง Ubuntu ครับ และแม้ว่าจะเป็นคนที่ชอบลอง
Distro ต่าง ๆ (ด้วย Qemu) และ test applications ไปเรื่อย แต่ชีวิตจริงเป็นคนรักเดียวใจเดียว
(Comp ผมมัน Spec ต่ำ ถ้าจะลง Ubuntu คงได้แค่ Ubuntu-Standard ซึ่งทำงานบน console)
อ่านเรื่องตอนที่แล้วได้ที่นี่ http://ubuntuclub.com/node/313
และเรื่องทุกตอนได้ที่นี่ http://ubuntuclub.com/blog/448
ผมก็เหมือนผู้ชายทั่วไปที่ชอบคนสวยครับ(Interface สวย) แต่คนสวยหลายคนมักไฮโซ(ต้องใช้ Comp Spec สูงๆ)
ไม่เหมาะกับโลโซอย่างผม(เครื่องเก่าครึ) ผมจึงคบกับเธอ(Elive)ดูจะไปได้ดีแม้ว่าจะมีทะเลาะ(Bug)กันไปบ้าง
แต่ก็ต้องเคลียร์กัน(Bug-Fix) ทีละเรื่อง ๆ และเพราะความเป็นเด็ก (0.69unstable) ก็ต้องอดทนกันหน่อยต้องใช้เวลา
ว่าแต่ตอนนี้มาเข้าเรื่องกันดีกว่าครับ
.....
เชื่อว่าหลายคนคงมีปัญหานี้
"จะทำ Repos อย่างไรให้ไปใช้กับเครื่องคนอื่นได้ หรือเหมาะแก่การ Back-up เผื่อต้องลงโปรแกรมใหม่"
มันเป็นปัญหาใหญ่สำหรับคนบ้านจนอย่างผมเลยที่เดียว(และในที่ ๆ ไม่มี net)
และสำหรับคนที่เปลี่ยนจากการที่ใช้ Windows มาก่อน จะพบว่า ค่อนข้างงงและสับสนกับการทำงานและติดตั้ง Packages
เพราะจากแค่ double click บนไฟล์ .exe ก็ติดตั้งได้แล้ว ต้องเปลี่ยนมาใช้วิธีการ packages management ซึ่งบน Ubuntu
นั้นใช้ Apt โดยมี aptitude เป็น Interface (จริง ๆ แล้วมี Dselect ด้วย แต่ งง...ตึ๊บ) หรืออย่าง Synaptic ที่ Click แล้วโหลดโลด
บางทีคิดว่าการใช้ apt-get, aptitude, synaptic นั้นเป็นวิธีที่สะดวกสบาย อะฮ้า ถ้าจะ Back-up ที่โหลดมาก็แค่ ไปก๊อบ *.deb
ที่ /var/cache/apt/archive/ มาแล้วก็ Burn ใส่ CD-DVD เท่านั้น
"มันไม่ง่ายไปหน่อยเหรอสหายเอ๋ย"
ด้วยการใช้วิธีข้างต้น สำหรับครั้งแรก ทุกอย่างจะ OK
จะโหลดอะไรมาก็ List ไว้ซะทุกอันและกะยัดลงไปใน CD-DVD ครั้งเดียวเป็นพอ เพราะอะไรอย่างนั้นหรือ
เพราะ Packages ที่ได้มาจาก apt (ขอเรียกย่อ ๆ ของวิธีข้างต้นละกัน) นั้นจะแก้ไขปัญหา dependencies (satified dependencies resolve)
โดยการ apt เอา packages อื่น ๆ ที่จำเป็นต้องใช้ในการติดตั้งโปรแกรมนั้นนั้น ๆ มาด้วย เช่น
ติดตั้ง package A
Dependencies: B, C, D
แต่ package C มี dependencies ที่ต้องใช้เช่น
Dependencies: L, X, Z
ติดตั้ง package A อย่างเดียวแต่กลับแถม B, C, D, L, X, Z, ...
พอจะนึกภาพอิรุงตุงนังออกใช่ไหมครับว่าถ้า "packageนั้นต้องการไอ้นั่น packageนี้ต้องการไอ้นี่" apt ก็ไปโหลดมาโลดโดยที่เราไม่ต้องไปสนใจ
ว่าอะไรเป็น dependencies ของใคร เหอะ ๆ ความสะดวกสบายอย่างนี้แหละที่ทำให้ผมต้องเหนื่อยกับมันในการหาคำตอบมา
เพราะว่าการทำ Back-up Repos ครั้งแรกมันก็ OK ดีอยู่ แต่พอเวลาเราติดตั้ง Packages พวกนั้นไปแล้วนั่นสิ ครั้งต่อมามันจะไม่ apt อย่างที่ควรจะเป็น
เพราะมันจะไม่ apt อันที่ติดตั้งอยู่แล้ว เช่น วันต่อมาผมอยากติดตั้ง package E ซึ่งมี Dependencies: C, D เป็นต้น มันก็จะโหลดมาแค่ E เท่านั้น
(เนื่องจาก C, D ติดตั้งอยู่ก่อนแล้ว apt จึงไม่ apt มาซ้ำ)
อะฮ้า เราก็ชะละลาล่ะล่าใจ Back-up Burn ตัวนั้นไป โดยคิดว่าจะไปลงเครื่องอื่นด้วย พอเอาไปใช้เครื่องอื่นก็จะฟ้องว่าไม่สามารถติดตั้ง Packages ได้
เพราะเครื่องอื่นเขาไม่มี Packages: C, D อยู่ก่อน หรือบางเครื่อง อาจมีบางตัวไม่มีบางตัว ไม่เหมือนกันสักเครื่อง เพราะปัญหา Dependencies นั่นเอง
และหากใช้ aptoncd ก็จะไปโหลด Dependencies มาอีกจำนวนหนึ่งสำหรับ aptoncd เอง(aptoncd ทำมาเพื่อใช้ร่วมกับ Gnome) ทำให้ไม่เหมาะกับ kde อีก
เป็นผลให้แผ่นที่เราจะสร้างนั้น ไม่เหมาะสำหรับเครื่องอื่น ๆ (เชื่อว่าต้องเจอปัญหานี้)
ผมจึงตั้งสมมุติฐานขึ้นมา เพราะคิดว่าถ้าจะทำ Repos ที่เหมาะกับทุกเครื่องที่ลง (K),(X)Ubuntu (Version เดียวกัน)
สมมุติฐาน: "หากทุกเครื่องมี Packages ไม่เหมือนกัน แต่จะต้อง Base-system เหมือน ๆ กัน และมีจำนวน packages ที่แน่นอนในตอนเริ่มต้น"
ทฤษฎี: "ต้องกลับไปทำระบบให้เหมือนกับ Base-system แล้วจึงใช้ apt และสร้าง Script มาเพื่อ Download เท่านั้น ไม่ต้องติดตั้งอะไรเลย"
เตรียมเครื่องมือทดลอง: debootstrap, binutils, wget (ซึ่ง 2 อันหลังมีติดตั้งอยู่แล้ว)
พระเอกของเราคือ Debootstrap และผู้ช่วยพระเอกคือ wget ขอรับ
Debootstrap มีไว้ใช้จำลองสร้างระบบพื้นฐานของ Debian (Versionเก่า-ปัจจุบัน)แต่ที่เป็น Packages ใน Ubuntu นั้นสามารถสร้างระบบ
จำลองพื้นฐานได้ต้งแต่ Horary-ปัจจุบันด้วย และเมื่อเรา Chroot เข้าไปใน envoriment นั้นเราก็สามารถทำงานเสมือนหนึ่งว่าเป็น Base-System ที่ Pure
ประโยชน์จริง ๆ คงมีมากกว่านี้แน่ ลองอ่านใน man pages ดูละกันครับ (ผมอ่านยัง...เง็ง เลย)
อธิบาย Base-System คือ ระบบพื้นฐานของ Distro นั้น ๆ อย่าง Ubuntu จะมีระบบพื้นฐานเป็น Ubuntu-Standard (ลองอ่านจากบทความเก่าผมได้)
1.ให้ Debootstrap จำลองระบบ Distro ที่ต้องการสร้างเป็น Base-system
วิธีใช้
#debootstrap feisty ./feisty-chroot ftp://archive.ubuntu.com/ubuntu (เป็นคำสั่งนะครับ ไม่ใช่ Link)
อธิบาย
Debootstrap จะอ่าน Script ว่าต้องการสร้าง Distro อะไร แล้วไป wget มาและจำลองติดตั้งระบบ(feisty)ใน Folder ที่เรากำหนดไว้
2. เปลี่ยน source.list ของระบบที่ debootstrap โหลดมา
#cp /etc/apt/source.lst ./feisty-chroot/etc/apt/source.list
3. เข้า Folder ที่ debootstrap สร้างด้วย chroot
#chroot ./feisty-chroot /bin/bash
4. สร้าง Script สำหรับ Download
#apt-get update
#apt-get -qq --print-uris install -d Packages1..2..3 > uris
#cut -f2 -d "'" uris > wget-script (เครื่องหมายระหว่าง " " คือ ' นะครับ)
#awk '{print "wget " $1}' < wget-script > ./mydlscript (หรือชื่ออื่น ๆ ก็ได้)
#rm uris wget-script
**หมายเหตุ หากใช้คำสั่งนี้โดยไม่ chroot เข้า envoriment ที่เราสร้างไว้ จะได้ผลเท่ากับ สร้าง script ใน envoriment ที่เราอยู่
เช่น (K),(X)Ubuntu-Desktop+บรรดา Packagesที่เราติดตั้งไปแล้ว
5. ออกจาก chroot และทำให้ Script นั้นใช้งานได้
#exit
#sh -x ./mydlscript
แต่ควร mv สคริปนั้นไป Folder เปล่า ๆ สั่งแห่งก่อนใช้คำสั่งนะครับ เพราะ wget จะโหลดไฟล์ลงใน Folder ปัจจุบันที่อยู่นั่น
6. ปล่อย Folder ที่สร้างด้วย Debootstrap ไว้เฉย ๆ อย่างนั้นแหล่ะ เอาไว้ใช้ในงานต่อไป
**หมายเหตุ อาจดูยุ่งยากไปนิดส์ แต่ดีครับ ที่ไม่ต้องไปแตะต้องกับระบบที่เราใช้งานอยู่ และสามารถเปลี่ยน Source.list โดยไม่ต้องกังวลอะไร
(แต่ต้องเป็น Source.list ที่อยู่ในระบบที่ Debootstrap นั้นสร้างไว้นะครับ) ทำให้โหลด Packages มาได้ครบและแบ่งปันเพื่อน ๆ ได้ด้วยทั้ง Kubuntu, Xubuntu
ส่วนข้อเสียมีอยู่เหมือนกัน เพราะ apt จาก base-system นั้นอาจต้อง apt โหลดมามากมาย ดูว่าซ้ำ ๆ กับของเดิม ๆ ที่เคยมีอยู่แล้ว แต่พอโหลดมาหลาย ๆ
packages จะทำให้ลดภาระอ้างอิง dependencies ไปได้ เพราะมักจะใช้ซ้ำ ๆ กัน แนะนำอีกว่าควรทำ List ไว้ด้วยนะครับว่า apt อะไรมาบ้าง
*สำหรับ pbuilder นั้นเอาความสามารถของ debootsrap + การสร้าง packages เหมาะสำหรับใครที่ชอบ compile packages ไว้ใช้เอง
และ packages ที่ได้นั้นมาจาก envoriment ที่มาจาก base-system (มีข้อดีกว่าการ make-อันนี้ไปลองหาอ่านเพิ่มเอานะครับ)
วิธีนี้อาจดูลูกทุ่งไปนิดส์ (ใครมีเครื่องมือที่ดีกว่า แนะนำด้วยครับ)
แต่อยากหนุนใจสหายที่เป็นมือใหม่ว่า ผมเองก็เพิ่งเริ่มศึกษา Linux ไม่นาน (6 เดือน-อย่างไม่ต่อเนื่องเพราะไม่มีคอมพ์ เพิ่งจะมีคอมพ์เมื่ออาทิตย์ก่อนเอง)
อย่าเพิ่งถอดใจกับปัญหาที่เจอ เพราะใครก็ตามที่หันมาสนใจ Linux เขาเองนั้นมี "อาณัติแห่งสวรรค์" ให้ร่วมชะตากรรมอย่างเดียวกัน
ดังนั้นปัญหาที่เจอ มันก็ต้องมีคนตอบให้ได้อยู่แล้วล่ะครับ สหายเอ๋ย...
ปล.ประโยคท้าย ๆ ออกจะแนว บ๊องส์ ๆ ไปหน่อยแฮะ :-P



วิธีถึกมา
วิธีถึกมากๆเลยตัวเอง :)
ทำเรื่องง่ายให้เป็นเรื่องที่งง :-P
จะได้ดูขลัง ๆ หน่อย โดยทำให้ งง ๆ ซับซ้อน ๆ ฮ่า ๆ ฮ่า
(บ้าไปแล้ว) :-D
ผมใช้วิธีนี้ครับ (อ้างอิงจาก www.ubuntuguide.org)
Personal Apt Repository
Personal APT Repository
ไว้ใช้แก้ปัญหา dependencies Hell!!! กับ packages ที่ไม่ได้อยู่ใน Ubuntu Repos และต้องติดตั้ง dpkg-dev เพิ่มเช่นเดียวกัน
apt ก็ไปอ่าน/เขียนทับ cache จากไฟล์ใน lib ทำให้เกิดปัญหาที่ว่าไว้ข้างต้นครับ พอเอาไปใช้เครื่องอื่น
ก็อาจเรียกหา dependencies เป็นได้
Post new comment