แหมกลับมาใช้ Fedora ทั้งทีก็คงไม่เขียนถึง YUM repository คงจะไม่ได้ YUM จะว่าเป็นของใหม่ ก็คงไม่ใช่ YUM เป็นโปรแกรมช่วยจัดการแพคเกจที่มีอยู่ใน Fedora มานานหลายเวอร์ชันแล้วครับ แต่ผมเองไม่ได้ทดสอบหรือทดลองอะไรแหวกแนวมากนัก แต่ที่แน่ๆ YUM ใน Fedora 11 เปลี่ยนไป! ผมสังเกต Fedora หันมาใช้ XML มากขึ้นหลังจาก Fedora 9 และ Fedora 10 และที่ผ่านมาส่วนใหญ่จะถูกแทรกลงในส่วนที่ไม่กระทบกับผู้ใช้มากนัก สำหรับท่านที่ใช้ YUM ใน Fedora 11 จะพบว่ามันเปลี่ยนไป ไม่สามารถเรียกใช้ Repository เก่าได้ ก็เนื่องมาจาก repo data ของ YUM เปลี่ยนไปนั่นเอง เอาล่ะเกริ่นมามากเดี๋ยวจะเริ่มงง เรามาสร้าง YUM repository เอาไว้ใช้ในสำนักงาน/องค์กรกันดีกว่า ก่อนจะเริ่มต้นมาอ่านข้อตกลงกันก่อน เครื่องที่ผมใช้ มี IP address เป็น 192.168.0.100 นะครับ เอ้ามาเริ่มกันเลย

แปลงร่างเป็น root กันก่อนเพื่อความสะดวกครับ

su –

จากนั้นติดตั้ง Apache

yum httpd

ตั้งค่าให้ Apache เริ่มต้นตอนบูท

chkconfig –levels 235 httpd on

จากนั้น start Apache ได้เลย

/etc/init.d/httpd start

จากนั้นมาสร้างที่เก็บ repo กัน Fedora วางโครงสร้างของ repository ได้ดีมาก และสร้าง repo แบ่งออกเป็นเวอร์ชันได้ ทำให้ง่ายในการจัดการ โครงสร้างของ repo ที่เราจะสร้างกันหน้าตาเป็นแบบนี้ครับ

fedora/releases/เลขเวอร์ชัน/Everything/i386/os/Packages

สมมุติว่าเราสร้าง repo ของ Fedora 11 เราก็จะได้โครงสร้างแบบนี้ครับ

fedora/releases/11/Everything/i386/os/Packages

มาสร้างไดเรคทอรีใน /var/www กันเลยครับ

mkdir -p /var/www/fedora/releases/11/Everything/i386/os/Packages

จากนั้นให้คุณคัดลอกไฟล์ .rpm ไปไว้ที่ไดเรคทอรี Packages แล้วสั่งสร้าง repo data ดังนี้

createrepo /var/www/fedora/releases/11/Everything/i386/os/

เท่านี้ก็เรียบร้อยแล้วครับ จากนั้นให้เครื่อง client ตั้งค่า repo มาทดสอบได้เลย วิธีการตั้งค่า repo เข้าใช้งาน repo ในสำนักงานเราก็ง่ายๆ ครับ สร้างไฟล์ชื่อ officerepo.repo ลงใน /etc/yum.repo.d

nano /etc/yum.repo.d/officerepo.repo

ใส่ข้อมูลลงไปดังนี้ครับ

[office-repo]
name=Office Repo for Fedora $releasever – $basearch
failovermethod=priority
baseurl=http://192.168.0.100/fedora/releases/$releasever/Everything/$basearch/os/
#mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-$releasever&arch=$basearch
enabled=1
gpgcheck=0

เหมือนเป็นธรรมเนียมปฏิบัติเวลาผมใช้ Linux ตระกลูไหนต้องทำ custom repository ได้นั่นหมายถึงการ distribute และการ contribute แพคเกจใหม่ๆ ให้กับ Linux distro นั้นๆ ทางอ้อม ซึ่งผมเองทำประจำอยู่แล้ว แต่ไม่ได้เอาแพคเกจตัวเองเข้าต้นน้ำสักที เอาเป็นว่าอยู่อย่างพอเพียง build แจกกันเล่นไปเรื่อยๆ นี่แหละครับสนุกกว่า ใช้ได้บ้าง ไม่ได้บ้างก็อย่างว่ากันนะครับ วันนี้ก็เลยมาแนะนำ ThaiOpenSource for Fedora repository กันครับ ผมเพิ่มทำเสร็จเมื่อเช้ามีแพคเกจอยู่ 4 ตัวครับ ให้ลองค้นหากันดูเอาเองว่าแพคเกจชื่ออะไร ;) เอาละมา config YUM repo กันเลย ให้สร้างไฟล์ที่ชื่อ thaiopensource.repo ลงใน /etc/yum.repo.d

su -c ‘nano /etc/yum.repo.d/thaiopensource.repo’

จากนั้นใส่ข้อมูลลงไปดังนี้

[thaiopensource]
name=ThaiOpenSource.Org for Fedora $releasever – $basearch
failovermethod=priority
baseurl=http://thaiopensource.org/fedora/releases/$releasever/Everything/$basearch/os/
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
enabled=1
gpgcheck=0

แลัว update repo data ในเครื่องได้เลยครับ โดยใช้คำสั่ง

su -c ‘yum update’

ใช้ Fedora ทั้งทีแต่ใช้ YUM บน command line ไม่เป็นนี่ก็น่าเสียดายนะครับ คล้ายๆ กับใช้ aptitude บน Ubuntu ไม่เป็นนั่นแหละครับ :) เอาล่ะ วันนี้จะมาบอกเทคนิคการใช้งาน YUM กันง่ายๆ

แสดงรายชื่อ repo ที่เรามีอยู่ในเครื่อง ใช้คำสั่ง

yum repolist

แสดงรายชื่อ package ที่ติดตั้งได้

yum list available

ติดตั้งแพคเกจ

yum install packagename

อัพเดทแพคเกจ

yum update packagename

ตรวจสอบว่า package ใดอัพเดทได้

yum check-update

ค้นหา  package

yum search word

ติดตั้ง package rpm โดยใช้ YUM

yum –nogpgcheck localinstall filename.rpm

ติดตั้ง RPM ที่อยู่นอก YUM repo (ดาวน์โหลดแล้วติดตั้ง)

rpm -Uvh filename.rpm

หมดแล้ว ขอให้มีความสุขในการใช้ YUM ครับ :)

หลายท่านอาจชอบใช้ comand line ในการติดตั้งแพคเกจผ่านทาง YUM หรือ APT เอาเป็นว่าชอบใช้เครื่องมือไหนก็ใช้ตามที่ท่านคุ้นเคย หากท่านที่เคยใช้ Fedora Core 3 และ Ubuntu ในเวอร์ชันแรกๆ อาจจะเคยใช้ YUM หรือ APT ในการติดตั้งผ่านกลุ่มของ Package ไม่ใช้จาก Meta Package นะครับ อืมมม ยกตัวอย่างง่ายๆ หากคุณต้องการติดตั้ง DNS Server คุณไม่จำเป็นต้องจำชื่อแพคเกจที่ต้องใช้ แต่คุณสามารถติดตั้งได้ง่ายๆ ผ่านเครื่องมือจัดการแพคเกจนี่แหละครับ มาเริ่มที่ Ubuntu กันก่อน ใครจำ package ที่จะต้องใช้ในการติดตั้ง DNS Server ได้บ้าง ยกมือขึ้น! ถ้าจำไม่ได้ใช้ Group Install ผ่าน tasksel ได้ครับ ใช้คำสั่ง

sudo tasksel install dns-server

เท่านี้ก็ติดตั้ง DNS Server ได้แล้ว หากต้องการทราบว่ามี tasks อะไรบ้างใช้คำสั่งนี้ครับ

sudo tasksel –list-tasks

หากคิดอะไรไม่ออกจริงๆ ใช้คำสั่งนี้ครับ

sudo tasksel

โปรแกรมจะให้คุณเลือก tasks ที่คุณต้องการติดตั้งมีเยอะแยะให้คุณได้เลือกเลยล่ะครับ :)

เอาล่ะมาถึง Distro ที่ใช้ YUM อย่าง Fedora, Centos, RedHat Enterprise กันบ้าง YUM มีคำสั่งในการสั่งติดตั้งแพคเกจในลักษณะกลุ่มแพคเกจแบบนี้เช่นกัน หากคุณต้องการติดตั้ง DNS Server ที่นึกไม่ออกว่าใช้แพคเกจชื่ออะไร ใช้คำสั่งนี้ได้เลยครับ

yum groupinstall "DNS Name Server"

หากต้องการอัพเดท DNS Server ใช้คำสั่งนี้ได้เลย

yum groupupdate "DNS Name Server"

หากคิดอะไรไม่ออกนึกชื่อ Group ไม่ออกก็ใช้คำสั่งนี้ครับ

yum grouplist

ก็จะแสดงรายชื่อกลุ่มของแพคเกจมาให้ ง่ายๆ แค่นี้เอง ติดตั้งแพคเกจบน command line ใครว่ายากคร้าบบบบบบ

ผมพยายามหา package manager เจ๋งๆ มาใช้งานทั้งตัว package และตัวโปรแกรมที่ทำหน้าที่ sync และ update package บนเครื่อง server และเครื่อง desktop ได้ซึ่งตอนนี้ผมจับ 4 distro หลักคือ openSolaris, Debian, Ubuntu และ Fedora เอาเป็นว่ายุบรวมเหลือเพียง 2 package manager ละกันครับ ซึ่งลักษณะการ fetch package คล้ายคลึงกันคือ การสร้าง database repo (meta data ของ package ที่มีอยู่ใน repo server ที่เราเลือกเอาไว้) อยู่ในเครื่องเรา กับไม่ได้สร้าง database repo ในเครื่องเรา วิธีการสังเกตง่ายๆ คือ การค้นหาหรือติดตั้งโปรแกรมที่เคยติดตั้งไปแล้ว (กรณีที่เก็บ package เป็น archive ไว้) package manager จะติดตั้งหรือค้าหาได้ทันที ไม่จำเป็นต้องเชื่อมต่อ internet เพื่อเข้าไป fetch ของ database repository อีกรอบหนึ่ง

ซึ่ง aptitude เป็น package manager ที่ชอบเก็บ database repo ข้อดีก้อคือกรณีเกิดการ broken database บน repo server เราสามารถใช้ repo database ในเครื่องเราสืบค้นข้อมูล package ได้ ซึ่งแตกต่างจาก yum ซึ่งพบใน fedora และ delivered distro ของ fedora เจ้าโปรแกรม yum เป็นส่วนเสริมในการจัดการ package rpm ซึ่ง yum ไม่เก็บข้อมูล repo database ในเครื่องเรา เวลาติดตั้งหรือค้นหา package ต้อง fetch หาจาก repo server ซึ่งค่อนข้างจะมีน้อยและกระจัดกระจาย ด้วยการจัดการ repo database แบบนี้ทำให้ yum ก้อมีข้อดีอย่างหนึ่งคือเราจะได้ข้อมูล package ที่สดใหม่อยู่ตลอดเวลา และรู้ว่าอะไรควรจะอัพเดทหรือไม่อัพเดท แต่ข้อเสียคือมันต้องใช้ internet คลอดเวลาค้นหา package ที่เราจำชื่อไม่ค่อยจะได้ อันนี้ผมเป็นบ่อยเพราะผมชอบค้นใน repo มากกว่าการนั่งเดาชื่อ package หรือชื่อโปรแกรมที่ผมจะติดตั้ง ซึ่งกรณีเกิด broken repo database บน repo server ก้อเตรียมทำใจได้เลยครับ เพราะจะ fetch อะไรไม่ได้และก้อต้องจำใจใช้ โปรแกรมเก่าๆ ต่อไป

เอาล่ะแล้วจะมี package manager ที่ผมชอบบ้างมั๊ย เท่าที่ลองเล่น หลายๆ distro รวมถึง opemSolaris ด้วยแล้วก้อมีจุดดีจุดเด่นแตกต่างกัน ด้วยลักษณะการจัดการ repo server และข้อมูล meta data ที่เก็บด้วย แต่ผมมีโครงสร้าง meta data ที่น่าสนใจอยุ่ตัวหนึ่งลองมาดูกันมั๊ยครับ

<dict>
    <key>bundleIdentifier</key>
    <string>com.nullriver.iphone.Launcher</string>
    <key>name</key>
    <string>Launcher</string>
    <key>version</key>
    <string>0.2</string>
    <key>location</key>
    <string>http://iphone.nullriver.com/zips/Launcher-0.2.zip</string>
    <key>size</key>
    <string>14581</string>
    <key>description</key>
    <string>A simple third party application launcher.</string>
    <key>scripts</key>
    <dict>
        <key>preflight</key>
        <array>
            <array>
                <string>If</string>
                <array>
                    <array>
                        <string>InstalledPackage</string>
                        <string>com.kroo.mobilelauncher</string>
                    </array>
                </array>
                <array>
                    <array>
                        <string>AbortOperation</string>
                        <string>Please uninstall MobileLauncher first.</string>
                    </array>
                </array>
            </array>
        </array>
        <key>install</key>
        <array>
            <array>
                <string>CopyPath</string>
                <string>Launcher.app</string>
                <string>/Applications/Launcher.app</string>
            </array>
            <array>
                <string>CopyPath</string>
                <string>DisplayOrder.plist</string>
                <string>/System/Library/CoreServices/SpringBoard.app/DisplayOrder.plist</string>
            </array>
        </array>
        <key>uninstall</key>
        <array>
            <array>
                <string>RemovePath</string>
                <string>/Applications/Launcher.app</string>
            </array>
        </array>
    </dict>
</dict>

ข้างบนเป็นกรณีศึกษาของผมคือ plist ของ Nullriver Installer บน iPhone นะครับ เจ้า Nullriver Installer นี้ฮิตมากเพราะทำงานคล้ายๆ กับ synaptic คือติดโปรแกรมผ่านทาง internet ได้อ้อถ้ามีเครื่องใน office ก้อติดผ่าน wifi ได้ครับ เจ๋งมั๊ย และที่สำคัญไฟล์ package ที่เอามาติดตั้งไม่จำเป็นต้องอยู่ที่เครื่อง repository ก้อได้ (ตัวหนา) คือเครื่อง repo server ที่อยู่ใน office เป็นเพียง meta data (repo database) เท่านั้น จะติดตั้งก้อวิ่งไป download package เพื่อเอามาติดตั้งอีกที แต่ Nullriver Installer ไม่ได้ทำงานแค่นี้มันยังสามารถเก็บ repo database ในเครื่อง iPhone ด้วย นั่นหมายความว่าคุณสามารถ browse repo ได้โดยไม่ต้องเชื่อมต่อ internet อันนี้สิครับเจ๋งจริง แต่ด้วยความที่โครงสร้างของตัว repo server และ package list (plist) สามารถสร้างและแก้ไขได้ง่าย ทำให้เกิดธุรกิจทำ repo ของ iPhone โดยใช้โครงสร้าง repo ของ Nullriver เยอะมาก ปัญหาที่ตามมาคือ package ซ้ำซ้อนกันไงครับ เอาล่ะปัญหานี้กำลังถูกแก้ไขโดยโครงการ AppTapp ของ Nullriver นั่นแหละครับ ซึ่งอาจแฝงการตลาดเข้าไปด้วยก้อได้อันนี้ผมไม่ทราบนะครับ :) ว่าจะมีหรือเปล่า แต่ที่แน่นอนคือ Nullriver Installer หรือ AppTpp ในอนาคตเป็นที่น่าจับตามองครับ สำหรับ package manager บน android ผมยังไม่ได้ดูเลยครับว่าเป็นยังไง ใครพอจะทราบก้อบอกเล่าแลกเปลี่ยนความรู้กันได้ครับ :)