*** อันนี้เขียนไว้นานแล้ว แหละก็ไปแปะไว้ที่อื่น (ตอนนั้นยังไม่มี blog) ดังนั้นถ้าเคยเห็นอ่านแล้วก็อย่าแปลกใจนะ
ต้องบอกก่อนว่าเนื้อหาที่เขียนขึ้นมา หรืออาจจะเรียกว่าแปลก็ได้ เอามาจาก FreeBSD Handbook ทั้งหมด หัวข้อยังชื่อเหมือนกันเลย แต่จะพูดแบบสรุป และก็วิธีนี้สำหรับ FreeBSD 6.x นะ
Why Build a Custom Kernel?
โดยปกติ default kernel ที่มาจากแผ่น (GENERIC หรืออาจเป็น SMP) จะ support hardware จำนวนมาก การสร้าง kernel ของตัวเองนั้นส่วนมากจะให้ kernel ที่สร้างใหม่ support เฉพาะ hardware ที่มีอยู่ในเครื่อง ซึ่งจะมีข้อดีที่เห็นได้หลักๆ คือ
- boot เร็วขึ้น เพราะว่า kernel ทำการ probe hardware เฉพาะที่มันรู้จัก หรือเฉพาะที่อยู่ในเครื่อง
- ใช้ memory น้อยลง ซึ่งเหมาะกับระบบที่มี RAM น้อย
- ให้ support hardware เพิ่มเติมได้ เช่น sound cards, การทำ polling เป็นต้น
Building and Installing a Custom Kernel
directory ทั้งหมดที่เกี่ยวกับการสร้าง kernel นั้นจะอยู่ใน /usr/src/sys ซึ่งสามารถเข้าได้จาก /sys (เป็น soft link ชี้ไปยัง /usr/src/sys) และ subdirectories ที่สำคัญ ที่คุณต้องเข้าไปแก้ไข configuration file และ compile คือ arch/conf โดย arch คือ architecture ของเครื่องคุณ โดย FreeBSD จะมี i386, alpha, amd64, ia64, powerpc, sparc64, และ pc98
ในการสร้าง custom kernel จะสมมติว่าเครื่องของคุณเป็น i386 architecture และ default kernel คือ GENERIC ถ้าเครื่องของคุณเป็น architecture อื่น ต้องแก้ directory path ของ architecture ให้ตรงกับเครื่องของคุณ
ถ้าคุณไม่พบ /usr/src/sys ในเครื่องของคุณ แสดงว่าคุณยังไม่ได้ install kernel source ให้ install โดยทำตามขั้นตอนต่อไปนี้
- สั่ง sysinstall ด้วย root user จาก shell prompt
- เลือก Configure -> Distributions -> src
- เลือก base กับ sys
- เลือก OK ไปเรื่อยๆ แล้วเลือกว่าจะให้ลงจากที่ไหน (แนะนำให้ใช้จาก CD ที่ลง FreeBSD)
* การลง kernel source ยังมีอีกหลายวิธีนะ
ต่อไปจะเป็นการ copy configuration file ของ kernel โดยผมแนะนำให้เก็บตัวไว้ใน home directory ของคุณ ดังนี้
# cd /usr/src/sys/i386/conf
# cp GENERIC /root/MYKERNEL
# ln -s /root/MYKERNEL
โดยทั่วไป ชื่อ configuration file ของ kernel จะใช้ตัวใหญ่ทั้งหมด ซึ่งในที่นี้จะใช้ชื่อว่า MYKERNEL
ขั้นตอนต่อไป คือการแก้ไข MYKERNEL ตามที่ต้องการ โดยใน configuration file นั้นแต่ละบรรทัดจะมี keyword และค่าของมัน และอักษรที่ตามหลังเครื่องหมาย # จะหมายถึง comment
ใน configuration บรรทัดที่คุณต้องแก้ไขคือค่า ident ให้ตรงกับชื่อ kernel ที่คุณตั้ง เช่นในกรณีนี้คือ MYKERNEL ก็แก้เป็น
ident MYKERNEL
เกี่ยวกับค่าอื่นๆ และรายละเอียดเพิ่มเติมเกี่ยวกับ configuration file สามารถดูได้ที่ http://www.freebsd.org/doc/handbook/kernelconfig-config.html
หลังจากที่ได้ทำการแก้ไข configuration file ให้ทำการ compile และ install kernel ตัวใหม่ดังนี้
# cd /usr/src
# make buildkernel KERNCONF=MYKERNEL
# make installkernel KERNCONF=MYKERNEL
* ถ้าคุณตั้งชื่อ KERNEL เป็นชื่ออื่น ให้แก้ MYKERNEL ไปตามชื่อที่คุณตั้ง
หลังจาก install kernel เสร็จ kernel ตัวใหม่จะอยู่ที่ /boot/kernel และตัวเก่าจะอยู่ที่ /boot/kernel.old เนื่องจากถ้ามีการ install kernel ใหม่อีกครั้ง kernel.old จะถูกทับ แนะนำให้ทำการเก็บ kernel เก่าไว้ดังนี้
# mv /boot/kernel.old /boot/kernel.GENERIC
ต่อไป ก็คือ restart เครื่อง
# shutdown -r now
If Something Goes Wrong
ปัญหาที่พบส่วนมากจากการ compile kernel ใหม่เอง สามารถดูรายละเอียดได้จาก http://www.freebsd.org/doc/handbook/kernelconfig-trouble.html
ในที่นี้จะขอเอามาเฉพาะเมื่อไม่สามารถ boot ด้วย kernel ตัวใหม่ได้ หรืออาจจะมีปัญหากับ kernel ตัวใหม่ต้องการกลับไปใช้ตัวเก่า
เมื่อไม่สามารถ boot ด้วย kernel ตัวใหม่ให้ทำต่อไปนี้
- ที่ boot loader ให้เลือก option ที่ 6 "Escape to loader prompt"
- เมื่อได้ prompt ให้พิมพ์ unload kernel
- แล้วพิมพ์ boot /boot/kernel.old/kernel (ถ้าทำตามข้างบนคือเปลี่ยน kernel เก่าเป็น kernel.GENERIC ก็ใช้ boot /boot/kernel.GENERIC/kernel)
หลังจาก boot ด้วย kernel ตัวเก่า คุณสามารถดู error ได้จาก boot ที่ /var/log/messages แล้วแก้ไข configuration file และ compile kernel ใหม่ หรือถ้าคุณต้องการกลับมาใช้ kernel ตัวเก่า สามารถทำได้ดังนี้
# mv /boot/kernel /boot/kernel.bad
# mv /boot/kernel.good /boot/kernel
โดยแทนที่ kernel.good ด้วย kernel path ของตัวเก่าที่เก็บไว้
13 May 2007
Reference:
[1] FreeBSD Handbook :Chapter 8 Configuring the FreeBSD Kernel, http://www.freebsd.org/
Showing posts with label FreeBSD. Show all posts
Showing posts with label FreeBSD. Show all posts
Sunday, August 5, 2007
Saturday, August 4, 2007
portsnap vs cvsup
portsnap คือคำสั่งที่ใช้ update port ของ FreeBSD เช่นเดียวกับ cvsup แล้วมันต่างกันอย่างไรละ?!?
ความแตกต่างอย่างแรกคือ portsnap ใหม่กว่า cvsup เก่าแล้ว และ portsnap จะมีให้เลยใน FreeBSD 6.x --' (ไร้สาระจริงๆ เลยเรา)
ความแตกต่างคือ (เข้าประเด็นแล้ว)
1. portsnap จะ update ได้ปลอดภัยกว่า โดยมีเป็นการส่งแบบ signed compress snapshot ก็คือ ส่ง snapshot ที่มีการบีบอัด และก็ข้อมูลที่ส่งจะมี signature ทำให้แน่ใจได้ว่าข้อมูลที่ได้รับถูกต้องแน่นอน
2. portsnap จะ update เฉพาะที่มีการเปลี่ยนแปลง ซึ่งเหมาะกับการระบบที่มีการ update บ่อยๆ แต่ cvsup จะ update ทั้ง port tree ซึ่งทำให้ cvsup update port ช้ากว่าและใช้ bandwidth มากกว่า
3. portsnap ใช้ protocol HTTP ในการส่งข้อมูล แต่ cvsup เป็น custom protocol ใช้ port 5999 ซึ่งอาจมีปัญหากับพวก firewall
Note: จากที่ผมเคยลองมา ถ้าทิ้งไว้เป็นเดือนแล้วใช้ portsnap มันนานพอควรเลยแหละ (ไม่ได้จับเวลาทดสอบนะ) ดังนั้นผมก็ไม่รู้เหมือนกันว่าระบบที่ไม่ค่อย update port แบบนี้ควรใช้ cvsup หรือ portsnap
จากข้อดีของ portsnap ที่ได้บอกไปแล้ว ก็ขออธิบายสั้นๆ ละกัน เกี่ยวกับวิธีการใช้งาน portsnap (ถ้าอยากดูเต็มๆ ก็ไปดูที่ http://www.freebsd.org/doc/handbook/portsnap.html)
portsnap จะมีให้เลยใน FreeBSD version ไหนบ้างผมไม่แน่ใจ (ผมเริ่มใช้ตอนมันออก 6.1) แต่ถ้าในเครื่องของคุณไม่มีสามารถติดตั้งโดยใช้ port ports-mgmt/portsnap
snapshot ทั้งหมดของ portsnap ที่ download มาจะเก็บไว้ที่ /var/db/portsnap แต่ถ้าลงจาก port จะอยู่ที่ /usr/local/portsnap/
สำหรับการใช้ portsnap ครั้งแรก
1. ทำการดึง snapshot ทั้งหมดของ port
# portsnap fetch
2. ทำการ extract port ที่ fetch มา
# portsnap extract
Note: ถึงแม้ว่าในเครื่องจะมีการใช้ cvsup ก่อนหน้านี้ ก็ต้องใช้ 2 คำสั่งนี้ เพื่อเป็น baseline ให้ portsnap รู้ว่าครั้งต่อไปต้อง update อะไรบ้าง
การ update port tree ในครั้งต่อๆ ไป ก็ใช้คำสั่งบรรทัดเดียวคือ
# portsnap fetch update
Note: คำสั่งข้างบน เท่ากับ 2 คำสั่งแต่ไปนี้ portsnap fetch; portsnap update
การสั่งให้ portsnap update ด้วย cron ก็คือใช้คำสั่ง portsnap -I cron update โดย -I คือให้ fetch snapshot มา แต่ทำการ update เฉพาะไฟล์ INDEX ของ port ซึ่งจะเห็นว่าต้องสั่ง portsnap update อีกที (ตาม Handbook เหตุผลที่ใช้ -I คือป้องกันการ update port ขณะที่เราทำการติดตั้งโปรแกรม) สรุปก็คือเพิ่มบรรทัดต่อไปนี้ใน /etc/crontab
0 3 * * * root portsnap -I cron update && pkg_version -vIL=
3 August 2007
Reference:
[1] Secure FreeBSD ports tree updating, http://www.daemonology.net/portsnap/
[2] FreeBSD Handbook (A.6 Using Portsnap), http://www.freebsd.org/doc/handbook/portsnap.html
ความแตกต่างอย่างแรกคือ portsnap ใหม่กว่า cvsup เก่าแล้ว และ portsnap จะมีให้เลยใน FreeBSD 6.x --' (ไร้สาระจริงๆ เลยเรา)
ความแตกต่างคือ (เข้าประเด็นแล้ว)
1. portsnap จะ update ได้ปลอดภัยกว่า โดยมีเป็นการส่งแบบ signed compress snapshot ก็คือ ส่ง snapshot ที่มีการบีบอัด และก็ข้อมูลที่ส่งจะมี signature ทำให้แน่ใจได้ว่าข้อมูลที่ได้รับถูกต้องแน่นอน
2. portsnap จะ update เฉพาะที่มีการเปลี่ยนแปลง ซึ่งเหมาะกับการระบบที่มีการ update บ่อยๆ แต่ cvsup จะ update ทั้ง port tree ซึ่งทำให้ cvsup update port ช้ากว่าและใช้ bandwidth มากกว่า
3. portsnap ใช้ protocol HTTP ในการส่งข้อมูล แต่ cvsup เป็น custom protocol ใช้ port 5999 ซึ่งอาจมีปัญหากับพวก firewall
Note: จากที่ผมเคยลองมา ถ้าทิ้งไว้เป็นเดือนแล้วใช้ portsnap มันนานพอควรเลยแหละ (ไม่ได้จับเวลาทดสอบนะ) ดังนั้นผมก็ไม่รู้เหมือนกันว่าระบบที่ไม่ค่อย update port แบบนี้ควรใช้ cvsup หรือ portsnap
จากข้อดีของ portsnap ที่ได้บอกไปแล้ว ก็ขออธิบายสั้นๆ ละกัน เกี่ยวกับวิธีการใช้งาน portsnap (ถ้าอยากดูเต็มๆ ก็ไปดูที่ http://www.freebsd.org/doc/handbook/portsnap.html)
portsnap จะมีให้เลยใน FreeBSD version ไหนบ้างผมไม่แน่ใจ (ผมเริ่มใช้ตอนมันออก 6.1) แต่ถ้าในเครื่องของคุณไม่มีสามารถติดตั้งโดยใช้ port ports-mgmt/portsnap
snapshot ทั้งหมดของ portsnap ที่ download มาจะเก็บไว้ที่ /var/db/portsnap แต่ถ้าลงจาก port จะอยู่ที่ /usr/local/portsnap/
สำหรับการใช้ portsnap ครั้งแรก
1. ทำการดึง snapshot ทั้งหมดของ port
# portsnap fetch
2. ทำการ extract port ที่ fetch มา
# portsnap extract
Note: ถึงแม้ว่าในเครื่องจะมีการใช้ cvsup ก่อนหน้านี้ ก็ต้องใช้ 2 คำสั่งนี้ เพื่อเป็น baseline ให้ portsnap รู้ว่าครั้งต่อไปต้อง update อะไรบ้าง
การ update port tree ในครั้งต่อๆ ไป ก็ใช้คำสั่งบรรทัดเดียวคือ
# portsnap fetch update
Note: คำสั่งข้างบน เท่ากับ 2 คำสั่งแต่ไปนี้ portsnap fetch; portsnap update
การสั่งให้ portsnap update ด้วย cron ก็คือใช้คำสั่ง portsnap -I cron update โดย -I คือให้ fetch snapshot มา แต่ทำการ update เฉพาะไฟล์ INDEX ของ port ซึ่งจะเห็นว่าต้องสั่ง portsnap update อีกที (ตาม Handbook เหตุผลที่ใช้ -I คือป้องกันการ update port ขณะที่เราทำการติดตั้งโปรแกรม) สรุปก็คือเพิ่มบรรทัดต่อไปนี้ใน /etc/crontab
0 3 * * * root portsnap -I cron update && pkg_version -vIL=
3 August 2007
Reference:
[1] Secure FreeBSD ports tree updating, http://www.daemonology.net/portsnap/
[2] FreeBSD Handbook (A.6 Using Portsnap), http://www.freebsd.org/doc/handbook/portsnap.html
Subscribe to:
Comments (Atom)