<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SpaLinux.com &#187; Kernel</title>
	<atom:link href="http://spalinux.com/category/kernel/feed" rel="self" type="application/rss+xml" />
	<link>http://spalinux.com</link>
	<description>Resources for Relaxing Linux System Administrators</description>
	<lastBuildDate>Mon, 26 Jul 2010 09:51:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>การใช้งาน DRBD เบื้องต้น</title>
		<link>http://spalinux.com/2010/02/basic_using_drbd</link>
		<comments>http://spalinux.com/2010/02/basic_using_drbd#comments</comments>
		<pubDate>Sat, 06 Feb 2010 11:09:40 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Backup]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Disk]]></category>
		<category><![CDATA[Filesystem]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[drbd]]></category>
		<category><![CDATA[linux ha]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1072</guid>
		<description><![CDATA[จากบทความ ติดตั้งและคอนฟิก DRBD  เราได้คอนฟิกเป็นแบบ Single-primary mode คือ ณ เวลาใดเวลาหนึ่ง มีเครื่องเดียวเท่านั้นที่สามารถ อ่าน เขียน ข้อมูลได้ ดังนั้นขณะที่เครื่องที่ 1 (centos54-a) ทำหน้าที่เป็น primary ของดิสก์ drbd0 อยู่  เครื่องที่ 2 (centos54-b) จะไม่สามารถ mount ดิสก์ drbd0 นี้ขึ้นมาใช้งานได้ ในบทความนี้จะแสดงการทดสอบใช้คำสั่งเพื่อเปลี่ยนโหมด Primary, Secondary ระหว่างเครื่องทั้งสอง ตรวจสอบสถานะบนเครื่อง centos54-a [root@centos54-a ~]# service drbd status drbd driver loaded OK; device status: version: 8.3.2 (api:88/proto:86-90) GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 [...]]]></description>
			<content:encoded><![CDATA[<p>จากบทความ <a href="http://spalinux.com/2010/02/install_and_configure_drbd">ติดตั้งและคอนฟิก DRBD </a> เราได้คอนฟิกเป็นแบบ Single-primary mode คือ ณ เวลาใดเวลาหนึ่ง มีเครื่องเดียวเท่านั้นที่สามารถ อ่าน เขียน ข้อมูลได้</p>
<p>ดังนั้นขณะที่เครื่องที่ 1 (centos54-a) ทำหน้าที่เป็น primary ของดิสก์ drbd0 อยู่  เครื่องที่ 2 (centos54-b) จะไม่สามารถ mount ดิสก์ drbd0 นี้ขึ้นมาใช้งานได้</p>
<p>ในบทความนี้จะแสดงการทดสอบใช้คำสั่งเพื่อเปลี่ยนโหมด Primary, Secondary ระหว่างเครื่องทั้งสอง</p>
<p>ตรวจสอบสถานะบนเครื่อง centos54-a</p>
<pre>[root@centos54-a ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /export  ext3</pre>
<pre>[root@centos54-a ~]# df -h /export
Filesystem            Size  Used Avail Use% Mounted on
/dev/drbd0            950M   18M  885M   2% /export</pre>
<p>ทดสอบ mount ดิสก์บนเครื่อง centos54-b</p>
<pre>[root@centos54-b ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Secondary/Primary  UpToDate/UpToDate  C</pre>
<pre>[root@centos54-b ~]# mount /dev/drbd0 /export
mount: block device /dev/drbd0 is write-protected, mounting read-only
mount: Wrong medium type</pre>
<p>ในกรณีที่ต้องการเปลี่ยนให้เครื่องที่ 2 (centos54-b) ทำหน้าที่เป็น primary  เช่นในกรณีที่ต้องการซ่อมบำรุงเครื่องที่ 1 สามารถทำได้ดังนี้</p>
<p>บนเครื่องที่ 1 ปิดเซอร์วิส DRBD</p>
<pre>[root@centos54-a ~]# <strong>service drbd stop
</strong>Stopping all DRBD resources:
.
[root@centos54-a ~]# <strong>service drbd status
</strong>drbd not loaded</pre>
<p>ตรวจสอบสถานะบนเครื่องที่ 2 หลังจากปิดเซอร์วิสบนเครื่องที่ 1</p>
<pre>[root@centos54-b ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs            ro                 ds                 p  mounted  fstype
0:r0   WFConnection  <strong><span style="color: #0000ff;">Secondary</span></strong>/Unknown  UpToDate/DUnknown  C</pre>
<p>แม้เครื่อง Primary ปิดไปแล้ว บนเครื่องที่ 2 ที่ยังอยู่ในโหมด Secondary ก็ยัง mount ดิสก์ ไม่ได้</p>
<pre>[root@centos54-b ~]# <strong>mount /dev/drbd0 /export
</strong>mount: block device /dev/drbd0 is write-protected, mounting read-only
mount: Wrong medium type</pre>
<p>ต้องเปลี่ยนสถานะบนเครื่องที่ 2 ให้เป็น primary ด้วยคำสั่ง drbdadm primary</p>
<pre>[root@centos54-b ~]# <strong>drbdadm primary all</strong></pre>
<p>ตรวจสอบสถานะบนเครื่องที่ 2</p>
<pre>[root@centos54-b ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs            ro               ds                 p  mounted  fstype
0:r0   WFConnection  <span style="color: #0000ff;"><strong>Primary</strong></span>/Unknown  UpToDate/DUnknown  C</pre>
<p>เมื่ออยู่ในโหมด primary แล้ว ก็สามารถ mount ดิสก์ขึ้นมาใช้งานได้</p>
<pre>[root@centos54-b ~]# <strong>mount /dev/drbd0 /export
</strong>[root@centos54-b ~]# <strong>df -h /export
</strong>Filesystem            Size  Used Avail Use% Mounted on
/dev/drbd0            950M   18M  885M   2% /export</pre>
<p>ทดลองสร้างไฟล์ในดิสก์ drbd0</p>
<pre>[root@centos54-b ~]# <strong>cd /export/
</strong>[root@centos54-b export]# <strong>ls
</strong>lost+found
[root@centos54-b export]# <strong>echo "hello world from node 2" &gt; test-file-on-node-2.txt
</strong>[root@centos54-b export]# <strong>ls -l
</strong>total 20
drwx------ 2 root root 16384 Feb  6 15:46 lost+found
-rw-r--r-- 1 root root    24 Feb  6 17:17 <span style="color: #0000ff;"><strong>test-file-on-node-2.txt</strong></span></pre>
<p>รันเซอร์วิส DRBD บนเครื่องที่ 1 ขึ้นมาอีกครั้ง ตอนนี้เครื่องที่ 1 จะทำหน้าที่เป็น Secondary และจะทำการ replicate ข้อมูลมาจากเครื่องที่ 2 (Primary) โดยอัตโนมัติ</p>
<pre>[root@centos54-a ~]# <strong>service drbd start
</strong>Starting DRBD resources: [ d(r0) s(r0) n(r0) ].</pre>
<pre>[root@centos54-a ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  <strong><span style="color: #0000ff;">Secondary</span></strong>/Primary  UpToDate/UpToDate  C</pre>
<p>บนเครื่องที่ 2 เปลี่ยนให้เป็นโหมด Secondary</p>
<pre>[root@centos54-b ~]# <strong>drbdadm secondary all
</strong><span style="color: #ff0000;">0: State change failed: (-12) Device is held open by someone</span>
Command 'drbdsetup 0 secondary' terminated with exit code 11</pre>
<p>หากมีการเรียกใช้ดิสก์ drbd อยู่ จะไม่สามารถเปลี่ยนโหมดจาก Primary ไปเป็น Secondary ได้ ต้อง umount ดิสก์ออกไปก่อนถึงจะเปลี่ยนโหมดได้</p>
<pre>[root@centos54-b ~]# <strong>umount /export
</strong>[root@centos54-b ~]# <strong>drbdadm secondary all</strong></pre>
<p>ตรวจสอบสถานะบนเครื่องที่ 2</p>
<pre>[root@centos54-b ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs         ro                   ds                 p  mounted  fstype
0:r0   Connected  <span style="color: #0000ff;"><strong>Secondary</strong></span>/Secondary  UpToDate/UpToDate  C</pre>
<p>เปลี่ยนโหมดบนเครื่องที่ 1 ให้เป็น Primary เพื่อเรียกใช้ดิสก์ได้</p>
<pre>[root@centos54-a ~]# <strong>drbdadm primary all
</strong>[root@centos54-a ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  <strong><span style="color: #0000ff;">Primary</span></strong>/Secondary  UpToDate/UpToDate  C</pre>
<p>mount ดิสก์ และตรวจสอบไฟล์ที่อยู่ใน drbd0 จะเห็นไฟล์ที่สร้างจากเครื่องที่ 2</p>
<pre>[root@centos54-a ~]# <strong>mount /dev/drbd0 /export
</strong>[root@centos54-a ~]# <strong>cd /export/
</strong>[root@centos54-a export]# ls -l
total 20
drwx------ 2 root root 16384 Feb  6 15:46 lost+found
-rw-r--r-- 1 root root    24 Feb  6 17:17 <strong><span style="color: #0000ff;">test-file-on-node-2.txt
</span></strong>[root@centos54-a export]# <strong>cat test-file-on-node-2.txt
</strong>hello world from node 2</pre>
<h4>ตรวจสอบไฟล์ /var/log/messages</h4>
<p>เมื่อมีปัญหาเกี่ยวกับการใช้ DBRD นอกจากการใช้คำสั่ง service เพื่อตรวจสอบสถานะแล้ว ไฟล์ /var/log/messages จะแสดงการเปลี่ยนแปลงทั้งหมดของ DRBD ที่เกิดขึ้น ซึ่งสามารถนำมาใช้ช่วยในการแก้ปัญหาได้</p>
<p>ตัวอย่างข้อความในไฟล์ /var/log/messages ที่เกิดขึ้น เมื่อมีการเปลี่ยนโหมด</p>
<pre>[root@centos54-a ~]# <strong>tail /var/log/messages
</strong>...
Feb  6 17:19:38 centos54-a kernel: block drbd0: peer( Primary -&gt; Secondary )
Feb  6 17:21:04 centos54-a kernel: block drbd0: role( Secondary -&gt; Primary )
...</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2010/02/install_and_configure_drbd">ติดตั้งและคอนฟิก DRBD</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/02/basic_using_drbd/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ติดตั้งและคอนฟิก DRBD</title>
		<link>http://spalinux.com/2010/02/install_and_configure_drbd</link>
		<comments>http://spalinux.com/2010/02/install_and_configure_drbd#comments</comments>
		<pubDate>Sat, 06 Feb 2010 09:40:46 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Backup]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Disk]]></category>
		<category><![CDATA[Filesystem]]></category>
		<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[drbd]]></category>
		<category><![CDATA[linux ha]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=1068</guid>
		<description><![CDATA[DRBD (Distributed Replicated Block Device) เป็นโปรแกรมเพื่อใช้ในการ replicate ข้อมูลดิสก์ที่อยู่คนละเครื่องกัน ผ่านทางเน็ตเวิร์ก โดยจะทำในระดับ block ของดิสก์ เมื่อมีการเปลี่ยนแปลงข้อมูลที่อยูในดิสก์เครื่องหนึ่ง (primary) การเปลี่ยนแปลงนั้นจะถูก replicate ไปยังอีกเครื่อง (secondary) โดยอัตโนมัติ DRBD ประกอบด้วยสองส่วนคือ 1. Kernel module &#8211; DRBD ทำหน้าที่ใน kernel โดยจะสร้าง virtual block device คั่นกลางระหว่าง physical disk กับ filesystem ที่สร้างอยู่ ไม่ว่าจะเป็น ext3, ext4, xfs 2. User space administration tools &#8211; เป็นโปรแกรมที่ช่วยในการจัดการ DRBD ได้ง่ายขึ้น หลักๆ จะเป็น drbdadm ในบทความนี้จะแสดงการติดตั้งโปรแกรม [...]]]></description>
			<content:encoded><![CDATA[<p>DRBD (Distributed Replicated Block Device) เป็นโปรแกรมเพื่อใช้ในการ replicate ข้อมูลดิสก์ที่อยู่คนละเครื่องกัน ผ่านทางเน็ตเวิร์ก โดยจะทำในระดับ block ของดิสก์</p>
<p>เมื่อมีการเปลี่ยนแปลงข้อมูลที่อยูในดิสก์เครื่องหนึ่ง (primary) การเปลี่ยนแปลงนั้นจะถูก replicate ไปยังอีกเครื่อง (secondary) โดยอัตโนมัติ</p>
<p>DRBD ประกอบด้วยสองส่วนคือ</p>
<p>1. Kernel module &#8211; DRBD ทำหน้าที่ใน kernel โดยจะสร้าง virtual block device คั่นกลางระหว่าง physical disk กับ filesystem ที่สร้างอยู่ ไม่ว่าจะเป็น ext3, ext4, xfs<br />
2. User space administration tools &#8211; เป็นโปรแกรมที่ช่วยในการจัดการ DRBD ได้ง่ายขึ้น หลักๆ จะเป็น drbdadm</p>
<p>ในบทความนี้จะแสดงการติดตั้งโปรแกรม DRBD และคอนฟิกเป็นแบบ Single-primary mode คือ ณ เวลาใดเวลาหนึ่ง มีเครื่องเดียวเท่านั้นที่สามารถ อ่าน เขียน ข้อมูลได้</p>
<p><span style="color: #ff0000;"><strong>คำเตือน ติดตั้งและคอนฟิก DRBD บนเครื่องทดสอบให้เข้าใจก่อน เพราะบางคำสั่งอาจกระทบข้อมูลดิสก์หรือ partition ที่มีอยู่ในเครื่องได้ ทำให้ข้อมูลเสียหายได้</strong></span></p>
<p><span id="more-1068"></span></p>
<h4>ระบบสำหรับการทดสอบ</h4>
<p>ในที่นี้จะติดตั้ง CentOS 5.4 พร้อมคอนฟิกให้สองเครื่องติดต่อ ping กันได้ และปิดคุณสมบัติ firewall ทั้งหมด</p>
<p><strong>เครื่องที่ 1</strong></p>
<ul>
<li>Hostname:   centos54-a.spalinux.com</li>
<li>IP Address: 10.3.3.51</li>
</ul>
<p><strong>เครื่องที่ 2</strong></p>
<ul>
<li>Hostname:   centos54-b.spalinux.com</li>
<li>IP Address: 10.3.3.52</li>
</ul>
<p>แก้ไขไฟล์ /etc/hosts เพื่อให้ทั้งสองเครื่องอ้างอิงจากชื่อเครื่องได้</p>
<p>ตัวอย่างคอนฟิกของเครื่องที่ 1</p>
<pre>[root@centos54-a ~]# <strong>hostname</strong>
centos54-a.spalinux.com</pre>
<pre>[root@centos54-a ~]# <strong>cat /etc/hosts
</strong># Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6</pre>
<pre>10.3.3.51       centos54-a centos54-a.spalinux.com
10.3.3.52       centos54-b centos54-b.spalinux.com</pre>
<p>ตัวอย่างคอนฟิกของเครื่องที่ 2</p>
<pre>[root@centos54-b ~]# <strong>hostname</strong>
centos54-b.spalinux.com</pre>
<pre>[root@centos54-b ~]# <strong>cat /etc/hosts
</strong># Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6</pre>
<pre>10.3.3.51       centos54-a centos54-a.spalinux.com
10.3.3.52       centos54-b centos54-b.spalinux.com</pre>
<p>ทั้งสองเครื่อง ต้องสร้าง partition สำหรับใช้เป็นดิสก์ DRBD โดยไม่ต้องสร้าง filesystem ใดๆ ทั้งสิ้นบน partition นี้ สมมติว่าเป็น /dev/sda5 บนทั้งสองเครื่อง</p>
<p>หมายเหตุ</p>
<ul>
<li>แนะนำให้สร้าง partition ทั้งสองเครื่องให้เหมือนกัน ขนาดเท่ากัน จะได้ง่ายต่อการคอนฟิก</li>
<li>สำหรับการทดสอบเริ่มต้น แนะนำให้สร้างขนาด partition เล็กๆ ก่อน จะได้ใช้เวลาในการ sync ข้อมูลไม่นานมากนัก ในบทความนี้สร้างประมาณ 1 GBytes</li>
</ul>
<h4>ติดตั้งโปรแกรม DRBD</h4>
<p>ไฟล์ติดตั้ง DRBD ในรูปแบบ rpm ของ CentOS 5.4 นั้น ไม่อยู่ในแผ่นดีวีดีติดตั้ง แต่จะอยู่ในส่วนของ extras สำหรับในเมืองไทยสามารถดาวน์โหลดได้จาก <a href="http://www.mirror.in.th/osarchive/centos/5.4/extras/">http://www.mirror.in.th/osarchive/centos/5.4/extras/</a></p>
<p>ดาวน์โหล์ด และติดตั้งไฟล์ rpm สองไฟล์ บนเครื่องทั้งสอง</p>
<ul>
<li>drbd83-8.3.2-6.el5_3.x86_64.rpm  &#8211; &#8220;User space administration tools&#8221;</li>
<li>kmod-drbd83-8.3.2-6.el5_3.x86_64.rpm  &#8211; &#8220;Kernel Module&#8221;</li>
</ul>
<p>ใช้คำสั่ง rpm เพื่อติดตั้ง</p>
<pre>[root@centos54-a ~]# <strong>rpm -ivh drbd83-8.3.2-6.el5_3.x86_64.rpm
</strong>Preparing...                ########################################### [100%]
   1:drbd83                 ########################################### [100%]
[root@centos54-a ~]# <strong>rpm -ivh kmod-drbd83-8.3.2-6.el5_3.x86_64.rpm
</strong>Preparing...                ########################################### [100%]
   1:kmod-drbd83            ########################################### [100%]</pre>
<h4>คอนฟิก DRBD บนเครื่องที่ 1 (primary)</h4>
<p>ไฟล์คอนฟิกหลักของ DRBD คือไฟล์ /etc/drbd.conf ต้องมีการแก้ไขไฟล์นี้ก่อนถึงจะเริ่มใช้งานได้ โดยมีไฟล์ตัวอย่างคอนฟิกอยู่ใน /usr/share/doc/drbd83/drbd.conf</p>
<p>ไฟล์คอนฟิก /etc/drbd.conf จากการติดตั้ง</p>
<pre>[root@centos54-a ~]# <strong>cat /etc/drbd.conf
</strong>#
# please have a a look at the example configuration file in
# /usr/share/doc/drbd83/drbd.conf
#</pre>
<p>สร้างไฟล์คอนฟิก /etc/drbd.conf บนเครื่องที่ 1 &#8220;centos54-a.spalinux.com&#8221; ดังนี้</p>
<pre>[root@centos54-a ~]# <strong>cat /etc/drbd.conf
</strong>global {
    usage-count no;
}</pre>
<pre>common {
    syncer { rate 10M; }
}</pre>
<pre>resource <strong><span style="color: #0000ff;">r0</span> </strong>{
    protocol C;</pre>
<pre>    net {
        cram-hmac-alg "sha1";
        shared-secret "<span style="color: #0000ff;"><strong>test1234</strong></span>";
    }</pre>
<pre>    on <strong><span style="color: #0000ff;">centos54-a.spalinux.com</span></strong> {
        device /dev/drbd0;
        <strong><span style="color: #0000ff;">disk /dev/sda5</span></strong>;
        <strong><span style="color: #0000ff;">address 10.3.3.51:8888</span></strong>;
        meta-disk internal;
    }</pre>
<pre>    on <strong><span style="color: #0000ff;">centos54-b.spalinux.com</span></strong> {
        device /dev/drbd0;
        <strong><span style="color: #0000ff;">disk /dev/sda5</span></strong>;
        <strong><span style="color: #0000ff;">address 10.3.3.52:8888</span></strong>;
        meta-disk internal;
    }
}</pre>
<p>คำอธิบายเบื้องต้น</p>
<ul>
<li>shared-secret เป็นการกำหนดรหัสของเครื่องที่สามารถ replicate ข้อมูลกันได้ </li>
<li>r0 เป็นชื่อ resource ของ DRBD สามารถตั้งเป็นชื่อใดๆ ก็ได้ เพื่อสื่อความหมาย</li>
<li>on ตามด้วยชื่อ hostname ที่ต้องการ replicate ข้อมูลกัน ส่วนในวงเล็บ { เป็นการกำหนดคอนฟิกของแต่ละเครื่อง</li>
<li>disk คือชื่อ partition ที่สร้างไว้สำหรับการทำ DRBD ในที่นี้คือ /dev/sda5</li>
</ul>
<p>ใช้คำสั่ง drbadm create-md เพื่อสร้าง meta data บน partition ที่จะทำเป็น DRBD</p>
<pre>[root@centos54-a ~]# <strong>drbdadm create-md all
</strong>Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.</pre>
<p>หาก partition ที่คอนฟิกเป็น DRBD มี filesystem อยู่ก่อนแล้ว จะไม่สามารถสร้าง DRBD ได้</p>
<pre>[root@centos54-a ~]# <strong>drbdadm create-md all
</strong>md_offset 1011671040
al_offset 1011638272
bm_offset 1011605504</pre>
<pre><span style="color: #ff0000;">Found ext3 filesystem</span> which uses 987964 kB
current configuration leaves usable 987896 kB</pre>
<pre>Device size would be truncated, which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
   * use external meta data (recommended)
   * shrink that filesystem first
   * zero out the device (destroy the filesystem)
<span style="color: #ff0000;">Operation refused.</span></pre>
<pre>Command 'drbdmeta 0 v08 /dev/sda5 internal create-md' terminated with exit code 40
<span style="color: #ff0000;">drbdadm create-md r0: exited with code 40</span></pre>
<p>วิธีการแก้ไขคือต้องลบข้อมูลของ filesystem บน partition /dev/sda5 นี้ออก วิธีการง่ายสุดคือใช้คำสั่ง dd</p>
<p><span style="color: #ff0000;"><strong>คำเตือน คำสั่ง dd จะลบข้อมูลทั้งหมดบน partition ที่ระบุ</strong></span></p>
<pre>[root@centos54-a ~]# <strong>dd if=/dev/zero of=/dev/sda5
</strong>dd: writing to `/dev/sda5': No space left on device
1975933+0 records in
1975932+0 records out
1011677184 bytes (1.0 GB) copied, 87.2749 seconds, 11.6 MB/s</pre>
<p>แล้วถึงสามารถสร้าง meta data ของ DRBD ได้</p>
<pre>[root@centos54-a ~]# <strong>drbdadm create-md all
</strong>Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.</pre>
<p>ใช้คำสั่ง service เพื่อรันเซอร์วิส DRBD</p>
<pre>[root@centos54-a ~]# <strong>service drbd start
</strong>Starting DRBD resources: [ d(r0) s(r0) n(r0) ]..........
***************************************************************
 DRBD's startup script waits for the peer node(s) to appear.
 - In case this node was already a degraded cluster before the
   reboot the timeout is 0 seconds. [degr-wfc-timeout]
 - If the peer was available before the reboot the timeout will
   expire after 0 seconds. [wfc-timeout]
   (These values are for resource 'r0'; 0 sec -&gt; wait forever)
 To abort waiting enter 'yes' [  20]:<span style="color: #3366ff;"><strong><span style="color: #0000ff;">yes</span></strong></span></pre>
<p>ในครั้งแรกที่รันเซอร์วิส บนเครื่อง primary โปรแกรมจะรอให้เครื่อง peer (secondary) เข้ามาเชื่อมต่อ หากไม่ต้องการให้รอ ให้พิมพ์คำว่า &#8220;yes&#8221; แล้ว [Enter]</p>
<p>ใช้คำสั่ง service status เพื่อตรวจสอบสถานะของ DRBD</p>
<pre>[root@centos54-a ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs            ro                 ds                     p  mounted  fstype
0:r0   WFConnection  <span style="color: #0000ff;"><strong>Secondary</strong></span>/Unknown  <span style="color: #0000ff;"><strong>Inconsistent</strong></span>/DUnknown  C</pre>
<p>หรืออ่านจากไฟล์ /proc/drbd โดยตรง</p>
<pre>[root@centos54-a ~]# <strong>cat /proc/drbd</strong>
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
 0: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:987896</pre>
<p>สร้างไดเรคทอรี /export สำหรับทดสอบ mount เพื่อใช้ดิสก์ drbd ที่สร้างขึ้น</p>
<pre>[root@centos54-a ~]# <strong>mount /dev/drbd0 /export
</strong>mount: block device /dev/drbd0 is write-protected, mounting read-only
mount: Wrong medium type</pre>
<p>ดิสก์นี้ยังไม่สามารถใช้ได้ ต้องใช้คำสั่ง drbdadm primary คอนฟิกให้ดิสก์ drbd บนเครื่องนี้ทำหน้าที่เป็น primary เพื่อให้สามารถ อ่าน เขียน ข้อมูลจากดิสก์ได้</p>
<pre>[root@centos54-a ~]# <strong>drbdadm primary all
</strong><span style="color: #ff0000;">0: State change failed: (-2) Refusing to be Primary without at least one UpToDate disk
</span>Command 'drbdsetup 0 primary' terminated with exit code 17</pre>
<p>หากเป็นการเรียกใช้ครั้งแรก ต้องระบุออปชั่นดังนี้</p>
<pre>[root@centos54-a ~]# <strong>drbdadm -- --overwrite-data-of-peer primary all
</strong>[root@centos54-a ~]#</pre>
<p>ตรวจสอบสถานะ drbd อีกครั้ง สังเกตว่า ฟิลด์ ro จะเปลี่ยนจาก Seconday เป็น Primary และฟิลด์ ds จะเปลี่ยนจาก Inconsistent เป็น UpToDate</p>
<pre>[root@centos54-a ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs            ro               ds                 p  mounted  fstype
0:r0   WFConnection  <span style="color: #0000ff;"><strong>Primary</strong></span>/Unknown  <strong><span style="color: #0000ff;">UpToDate</span></strong>/DUnknown  C</pre>
<p>ทดสอบการ mount ดิสก์อีกครั้ง</p>
<pre>[root@centos54-a ~]# <strong>mount /dev/drbd0 /export
</strong>mount: you must specify the filesystem type</pre>
<p>ก็ยังไม่สามารถ mount ได้ เพราะยังไม่มี filesystem บน /dev/drbd0</p>
<p>รันคำสั่ง mkfs.ext3 เพื่อสร้าง filesystem แบบ ext3</p>
<pre>[root@centos54-a ~]# <strong>mkfs.ext3 /dev/drbd0
</strong>mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
123648 inodes, 246974 blocks
12348 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=255852544
8 block groups
32768 blocks per group, 32768 fragments per group
15456 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376</pre>
<pre>Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done</pre>
<pre>This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.</pre>
<p>ทดสอบการ mount อีกครั้ง จะสามารถใช้งานได้แล้ว</p>
<pre>[root@centos54-a ~]# <strong>mount /dev/drbd0 /export</strong></pre>
<p>ตรวจสอบสถานะ DRBD</p>
<pre>[root@centos54-a ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs            ro               ds                 p  mounted  fstype
0:r0   WFConnection  Primary/Unknown  UpToDate/DUnknown  C  <span style="color: #0000ff;"><strong>/export  ext3</strong></span></pre>
<h4>คอนฟิก DRBD บนเครื่องที่ 2 (secondary)</h4>
<p>สร้างไฟล์คอนฟิก /etc/drbd.conf บนเครื่องที่ 2 เหมือนกับไฟล์ในเครื่องที่ 1</p>
<pre>[root@centos54-b ~]# <strong>cat /etc/drbd.conf
</strong>global {
    usage-count no;
}</pre>
<pre>common {
    syncer { rate 10M; }
}</pre>
<pre>resource r0 {
    protocol C;</pre>
<pre>    net {
        cram-hmac-alg "sha1";
        shared-secret "test1234";
    }</pre>
<pre>    on centos54-a.spalinux.com {
        device /dev/drbd0;
        disk /dev/sda5;
        address 10.3.3.51:8888;
        meta-disk internal;
    }</pre>
<pre>    on centos54-b.spalinux.com {
        device /dev/drbd0;
        disk /dev/sda5;
        address 10.3.3.52:8888;
        meta-disk internal;
    }
}</pre>
<p>ใช้คำสั่ง drbadm create-md เพื่อสร้าง meta data บน partition ที่จะทำเป็น DRBD</p>
<pre>[root@centos54-b ~]# <strong>drbdadm create-md all
</strong>Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.</pre>
<p>เช่นเดียวกัน หากมี filesystem อยู่บน partition ก่อนแล้ว ต้องใช้คำสั่ง dd เพื่อลบข้อมูลออก</p>
<p>ใช้คำสั่ง service เพื่อรันเซอร์วิส DRBD</p>
<pre>[root@centos54-b ~]# <strong>service drbd start
</strong>Starting DRBD resources: [ d(r0) s(r0) n(r0) ].</pre>
<p>เมื่อเริ่มต้นรันเซอร์วิส DRBD บนเครื่องที่ 2 จะเป็นการเริ่ม replicate ข้อมูลจากเครื่องที่ 1</p>
<p>ตรวจสอบสถานะ DRBD บนเครื่องที่ 2</p>
<pre>[root@centos54-b ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs          ro                 ds                     p  mounted  fstype
...    <strong><span style="color: #0000ff;">sync'ed:    42.2%</span> </strong>             (576248/987896)K
0:r0   <strong><span style="color: #0000ff;">SyncTarget</span></strong>  <strong><span style="color: #0000ff;">Secondary</span></strong>/Primary  <span style="color: #0000ff;"><strong>Inconsistent</strong></span>/UpToDate  C</pre>
<p>ตรวจสอบสถานะ DRBD บนเครื่องที่ 1</p>
<pre>[root@centos54-a ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs          ro                 ds                     p  mounted  fstype
...    <strong><span style="color: #0000ff;">sync'ed:    43.0%</span></strong>              (567032/987896)K
0:r0   <strong><span style="color: #0000ff;">SyncSource</span></strong>  Primary/<strong><span style="color: #0000ff;">Secondary</span>  </strong>UpToDate/<strong><span style="color: #0000ff;">Inconsistent</span></strong>  C  /export  ext3</pre>
<p>เมื่อ replicate ข้อมูลเรียบร้อย (synced) ข้อมูลแล้ว สถานะจะเป็นดังนี้</p>
<p>ตรวจสอบสถานะ DRBD บนเครื่องที่ 2 เมื่อ synced ข้อมูลเรียบร้อย</p>
<pre>[root@centos54-b ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   <strong><span style="color: #0000ff;">Connected</span>  <span style="color: #0000ff;">Secondary</span></strong>/Primary  <strong><span style="color: #0000ff;">UpToDate</span></strong>/UpToDate  C</pre>
<p>ตรวจสอบสถานะ DRBD บนเครื่องที่ 1 เมื่อ synced ข้อมูลเรียบร้อย</p>
<pre>[root@centos54-a ~]# <strong>service drbd status
</strong>drbd driver loaded OK; device status:
version: 8.3.2 (api:88/proto:86-90)
GIT-hash: dd7985327f146f33b86d4bff5ca8c94234ce840e build by mockbuild@v20z-x86-64.home.local, 2009-08-29 14:07:55
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   <strong><span style="color: #0000ff;">Connected</span></strong>  Primary/<strong><span style="color: #0000ff;">Secondary</span></strong>  UpToDate/<strong><span style="color: #0000ff;">UpToDate</span></strong>  C  /export  ext3</pre>
<p>หลังจาก synced ข้อมูลระหว่างเครื่องเรียบร้อย เมื่อมีการเปลี่ยนแปลงข้อมูลในดิสก์บนเครื่องที่ 1 (primary) การเปลี่ยนแปลงนั้นจะถูก replicate ไปยังเครื่องที่ 2 (secondary) โดยอัตโนมัติ</p>
<p>ตัวอย่างการใช้คำสั่ง tcpdump  ตรวจสอบ packet ที่ส่งระหว่างเครื่องเพื่อการ replicate ข้อมูลของ DRBD</p>
<pre>[root@centos54-b ~]# <strong>tcpdump -i eth0 -l -nn | grep 8888
</strong>tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:51:39.815802 IP 10.3.3.52.8888 &gt; 10.3.3.51.42180: P 2834377596:2834377604(8) ack 2893184807 win 46 &lt;nop,nop,timestamp 1772852 1818781&gt;
15:51:39.816356 IP 10.3.3.51.42180 &gt; 10.3.3.52.8888: P 1:9(8) ack 8 win 3216 &lt;nop,nop,timestamp 1828655 1772852&gt;
15:51:39.816394 IP 10.3.3.52.8888 &gt; 10.3.3.51.42180: . ack 9 win 46 &lt;nop,nop,timestamp 1772852 1828655&gt;
15:51:44.888876 IP 10.3.3.1.4117 &gt; 10.3.3.51.22: P 1560:1612(52) ack 1629 win 64271
15:51:49.815252 IP 10.3.3.51.42180 &gt; 10.3.3.52.8888: P 9:17(8) ack 8 win 3216 &lt;nop,nop,timestamp 1838655 1772852&gt;
15:51:49.815330 IP 10.3.3.52.8888 &gt; 10.3.3.51.42180: . ack 17 win 46 &lt;nop,nop,timestamp 1782853 1838655&gt;
15:51:49.815666 IP 10.3.3.52.8888 &gt; 10.3.3.51.42180: P 8:16(8) ack 17 win 46 &lt;nop,nop,timestamp 1782853 1838655&gt;
15:51:49.847300 IP 10.3.3.51.42180 &gt; 10.3.3.52.8888: . ack 16 win 3216 &lt;nop,nop,timestamp 1838696 1782853&gt;
15:51:50.937877 IP 10.3.3.51.8888 &gt; 10.3.3.52.40284: . 3903780263:3903781711(1448) ack 2834246899 win 501 &lt;nop,nop,timestamp 1839875 1683335&gt;
...
<strong><span style="color: #0000ff;">[Ctrl-C]</span></strong></pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://www.drbd.org/" target="_blank">DRBD</a></li>
<li><a href="http://www.mirror.in.th/osarchive/centos/5.4/extras/" target="_blank">CentOS 5.4 extras</a></li>
<li><a href="http://spalinux.com/2010/02/basic_using_drbd">การใช้งาน DRBD เบื้องต้น</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2010/02/install_and_configure_drbd/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>แก้ไขหน้าจอการบู๊ตของ Fedora 10</title>
		<link>http://spalinux.com/2008/12/change_booting_screen_for_fedora_10</link>
		<comments>http://spalinux.com/2008/12/change_booting_screen_for_fedora_10#comments</comments>
		<pubDate>Fri, 19 Dec 2008 16:52:48 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Linux Installation]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[booting]]></category>
		<category><![CDATA[fedora 10]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=398</guid>
		<description><![CDATA[หลังจากติดตั้ง Fedora 10 เมื่อบู๊ตเครื่องขึ้นมา จะมีแถบสี วิ่งจากซ้ายไปขวา ไปชนคำว่า Fedora 10 โดยไม่มีข้อความเกี่ยวกับการบู๊ตขึ้นมาเลย จะมีอีกทีก็หลังจากบู๊ตเสร็จ ขึ้นหน้า login ส่วนตัวผู้เขียนแล้ว ไม่ชอบหน้าจอการบู๊ตแบบนี้ คือบางครั้งหน้าจอค้างไปนาน เราไม่สามารถรู้ได้เลยว่าไปติดปัญหาที่ตรงไหน ไม่เหมือนกับการขึ้นข้อความแสดงการโหลดส่วนต่างๆ ดังนั้นเลยหาวิธีแก้ไข ให้กลับมาเหมือนเดิม หน้าจอการบู๊ต Fedora 10 คอนฟิกต่างๆ สำหรับการบู๊ตเครื่อง จะถูกระบุอยู่ในไฟล์ /boot/grub/grub.conf หรือ /etc/grub.conf เป็นลิ้งค์ไฟล์ (soft link) เชื่อมโยงอีกที [root@fc10-b1 ~]# ls -l /etc/grub.conf lrwxrwxrwx 1 root root 22 2008-12-10 06:13 /etc/grub.conf -&#62; ../boot/grub/grub.conf ตัวอย่างไฟล์ grub.conf ที่ได้จากการติดตั้ง Fedora 10 [root@fc10-b1 ~]# [...]]]></description>
			<content:encoded><![CDATA[<p>หลังจากติดตั้ง Fedora 10 เมื่อบู๊ตเครื่องขึ้นมา จะมีแถบสี วิ่งจากซ้ายไปขวา ไปชนคำว่า Fedora 10 โดยไม่มีข้อความเกี่ยวกับการบู๊ตขึ้นมาเลย จะมีอีกทีก็หลังจากบู๊ตเสร็จ ขึ้นหน้า login</p>
<p>ส่วนตัวผู้เขียนแล้ว ไม่ชอบหน้าจอการบู๊ตแบบนี้ คือบางครั้งหน้าจอค้างไปนาน เราไม่สามารถรู้ได้เลยว่าไปติดปัญหาที่ตรงไหน ไม่เหมือนกับการขึ้นข้อความแสดงการโหลดส่วนต่างๆ ดังนั้นเลยหาวิธีแก้ไข ให้กลับมาเหมือนเดิม</p>
<p><span id="more-398"></span></p>
<h4>หน้าจอการบู๊ต Fedora 10</h4>
<p>คอนฟิกต่างๆ สำหรับการบู๊ตเครื่อง จะถูกระบุอยู่ในไฟล์ /boot/grub/grub.conf หรือ /etc/grub.conf เป็นลิ้งค์ไฟล์ (soft link) เชื่อมโยงอีกที</p>
<pre>[root@fc10-b1 ~]# <strong>ls -l /etc/grub.conf
</strong>lrwxrwxrwx 1 root root 22 2008-12-10 06:13 /etc/grub.conf -&gt; ../boot/grub/grub.conf</pre>
<p>ตัวอย่างไฟล์ grub.conf ที่ได้จากการติดตั้ง Fedora 10</p>
<pre>[root@fc10-b1 ~]# <strong>cat /boot/grub/grub.conf</strong>
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
<span style="color: #0000ff;">timeout=0
</span>splashimage=(hd0,0)/grub/splash.xpm.gz
<span style="color: #0000ff;">hiddenmenu
</span>password --md5 $1$
title Fedora (2.6.27.5-117.fc10.i686)
    root (hd0,0)
    kernel /vmlinuz-2.6.27.5-117.fc10.i686 ro root=UUID=f4eb7778-f7bc <span style="color: #0000ff;">rhgb quiet</span>
    initrd /initrd-2.6.27.5-117.fc10.i686.img</pre>
<p>หน้าจอดีฟอลต์ตอนบู๊ต Fedora 10</p>
<p><img class="alignnone size-full wp-image-402" title="Fedora 10 default booting screen" src="http://spalinux.com/wp-content/uploads/2008/12/fedora_10_default_booting_screen.png" alt="Fedora 10 default booting screen" width="500" height="278" /></p>
<p>หมายเหตุ ก่อนที่จะแก้ไขไฟล์คอนฟิก แนะนำให้ copy ไฟล์ต้นฉบับสำรองไว้ เผื่อมีปัญหาจะได้แก้คืนได้</p>
<pre>[root@fc10-b1 ~]# <strong>cp /boot/grub/grub.conf /boot/grub/grub.conf.orig</strong></pre>
<h4>แก้ไขให้ขึ้นเมนูตอนบู๊ต (Boot Manager)</h4>
<p>ถ้าต้องการให้ขึ้นเมนูตอนบู๊ต เช่นเครื่องมีหลาย OS ติดตั้งไว้  ต้องแก้คอนฟิกในไฟล์ grub.conf โดยสิ่งที่ต้องแก้คือ ลบบรรทัด hiddenmenu และสามารถตั้งเวลาให้แสดงเมนูบู๊ตได้ โดยการเปลี่ยนค่า timeout (หน่วยเป็นวินาที)</p>
<p>ตัวอย่างการแก้ไขไฟล์ grub.conf เพื่อให้แสดงเมนูบู๊ตเป็นเวลา 5 วินาที แสดงเฉพาะส่วนที่เปลี่ยนแปลง</p>
<pre>[root@fc10-b1 ~]# <strong>cat /boot/grub/grub.conf</strong>
...
timeout=5
...
#hiddenmenu
...</pre>
<p>หลังจากแก้ไขไฟล์ grub.conf ทดลองรีบู๊ตเครื่อง จะมีเมนูบู๊ตขึ้นมา</p>
<p>ตัวอย่างหน้าจอเมนูบู๊ต</p>
<p><img class="alignnone size-full wp-image-403" title="Fedora 10 display boot menu" src="http://spalinux.com/wp-content/uploads/2008/12/fedora_10_display_boot_menu.png" alt="Fedora 10 display boot menu" width="500" height="375" /></p>
<h4>หน้าจอการโหลด kernel</h4>
<p>หลังจากผ่านหน้าจอเมนูบู๊ต จะเป็นการโหลด kernel เพื่อตรวจสอบอุปกรณ์ต่างๆ ของเครื่อง เช่น CPU, Memory, Disk ถ้าต้องการให้แสดงข้อความการโหลด kernel ด้วย ต้องแก้ไขไฟล์ grub.conf โดยลบคำว่า quiet ในบรรทัดของคอนฟิก kernel</p>
<p>ตัวอย่างการแก้ไขไฟล์ grub.conf  เพื่อแสดงหน้าจอการโหลด kernel</p>
<pre>[root@fc10-b1 ~]# <strong>cat /boot/grub/grub.conf</strong>
...
title Fedora (2.6.27.5-117.fc10.i686)
    root (hd0,0)
    kernel /vmlinuz-2.6.27.5-117.fc10.i686 ro root=UUID=f4eb7778-f7bc rhgb
    initrd /initrd-2.6.27.5-117.fc10.i686.img</pre>
<p>ตัวอย่างหน้าจอการโหลด kernel</p>
<p><img class="alignnone size-full wp-image-404" title="Fedora 10 display loading kernel" src="http://spalinux.com/wp-content/uploads/2008/12/fedora_10_display_loading_kernel.png" alt="Fedora 10 display loading kernel" width="500" height="278" /></p>
<h4>หน้าจอการรันโปรแกรมต่างๆ</h4>
<p>หลังจากเครื่องโหลด kernel เรียบร้อย จะมีการ mount filesystem แล้วรันโปรแกรมต่างๆ ที่ตั้งไว้ให้รันอัตโนมัติตอนบู๊ต หน้าจอนี้สามารถแสดงได้โดยการลบคำว่า rhgb ในบรรทัดของคอนฟิก kernel</p>
<p>ตัวอย่างการแก้ไขไฟล์ grub.conf  เพื่อแสดงหน้าจอการรันโปรแกรมต่างๆ</p>
<pre>[root@fc10-b1 ~]# <strong>cat /boot/grub/grub.conf</strong>
...
title Fedora (2.6.27.5-117.fc10.i686)
    root (hd0,0)
    kernel /vmlinuz-2.6.27.5-117.fc10.i686 ro root=UUID=f4eb7778-f7bc
    initrd /initrd-2.6.27.5-117.fc10.i686.img</pre>
<p>ตัวอย่างหน้าจอการรันโปรแกรมต่างๆ</p>
<p><img class="alignnone size-full wp-image-405" title="Fedora 10 display running program" src="http://spalinux.com/wp-content/uploads/2008/12/fedora_10_display_running_program.png" alt="Fedora 10 display running program" width="500" height="278" /></p>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2008/12/change_booting_screen_for_fedora_10/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>เก็บปริมาณการใช้งาน network บนลินุกซ์ด้วย conntrack-tools</title>
		<link>http://spalinux.com/2008/09/network_accounting_on_linux_by_conntrack_tools</link>
		<comments>http://spalinux.com/2008/09/network_accounting_on_linux_by_conntrack_tools#comments</comments>
		<pubDate>Fri, 19 Sep 2008 17:15:34 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[conntrack]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[network account]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=183</guid>
		<description><![CDATA[ในบทความนี้จะกล่าวถึงวิธีการคอนฟิกลินุกซ์ให้สามารถเก็บปริมาณการใช้งาน network ที่เข้าออกเครื่องได้ โดยจะเป็นรายงาน (log) แบบค่อนข้างละเอียดคือ ดูได้ว่าแต่ละ packet ที่ส่งเข้า/ออกเครื่องนั้นมีประเภทไหนบ้าง มาจาก IP Address ต้นทาง ปลายทาง จากไหน ใช้ protocol เป็น TCP หรือ UDP และใช้ Port อะไร เช่นเป็น Web, Mail, Secure Shell หมายเหตุ คุณสมบัตินี้จะคล้ายๆ กับการใช้งาน Netflow บนอุปกรณ์ Cisco Router มีหลายวิธีที่สามารถทำได้ แต่ในที่นี้จะแนะนำการใช้โปรแกรม conntrack-tools จับปริมาณการใช้งาน โดย conntrack-tools ถือว่าเป็นโปรแกรม (userspace tools) ที่ติดต่อกับ Linux kernel ในส่วนของ Connection Tracking System จุดประสงค์หลักๆ ของโปรแกรมนี้จะสามารถนำไปทำเป็น High [...]]]></description>
			<content:encoded><![CDATA[<p>ในบทความนี้จะกล่าวถึงวิธีการคอนฟิกลินุกซ์ให้สามารถเก็บปริมาณการใช้งาน network ที่เข้าออกเครื่องได้ โดยจะเป็นรายงาน (log) แบบค่อนข้างละเอียดคือ ดูได้ว่าแต่ละ packet ที่ส่งเข้า/ออกเครื่องนั้นมีประเภทไหนบ้าง มาจาก IP Address ต้นทาง ปลายทาง จากไหน ใช้ protocol เป็น TCP หรือ UDP และใช้ Port อะไร เช่นเป็น Web, Mail, Secure Shell</p>
<p>หมายเหตุ คุณสมบัตินี้จะคล้ายๆ กับการใช้งาน Netflow บนอุปกรณ์ Cisco Router</p>
<p>มีหลายวิธีที่สามารถทำได้ แต่ในที่นี้จะแนะนำการใช้โปรแกรม conntrack-tools จับปริมาณการใช้งาน โดย conntrack-tools ถือว่าเป็นโปรแกรม (userspace tools) ที่ติดต่อกับ Linux kernel ในส่วนของ Connection Tracking System จุดประสงค์หลักๆ ของโปรแกรมนี้จะสามารถนำไปทำเป็น High Availability stateful firewall ได้ แต่ในบทความนี้จะขอไม่กล่าวถึงการใช้งานคุณสมบัตินี้</p>
<p><span id="more-183"></span></p>
<p>คุณสมบัติของเครื่องที่จะสามารถคอนฟิกให้ใช้งาน conntrack-tools ได้นั้นมีดังนี้</p>
<ul>
<li>ใช้เวอร์ชั่น Linux kernel มากกว่า 2.6.18</li>
<li>ติดตั้ง Library ชื่อ libnfnetlink, libnetfilter_conntrack</li>
<li>คอนฟิกและเปิดการใช้งาน connection tracking system, nfnetlink</li>
<li>ติดตั้งโปรแกรม conntrack-tools</li>
</ul>
<p>ตัวอย่างในบทความนี้ทดสอบบน Fedora 9 ซึ่งจะติดตั้ง kernel และ Library ตามข้อกำหนดมาเรียบร้อยแล้ว สิ่งที่ต้องทำเพิ่มคือเปิดการใช้งาน Connection Tracking System และติดตั้งโปรแกรม conntrack-tools เพิ่มเติม</p>
<h4>ตรวจสอบเครื่องก่อนลงโปรแกรมเพิ่มเติม</h4>
<p>ตัวอย่างการตรวจสอบ kernel และ Library ก่อนลงโปรแกรมเพิ่มเติม</p>
<pre>[root@server ~]# <strong>uname -a
</strong>Linux server.nelisys.com 2.6.25-14.fc9.i686 #1 SMP Thu May 1 06:28:41 EDT 2008 i686 i686 i386 GNU/Linux</pre>
<pre>[root@server ~]# <strong>rpm -q libnfnetlink
</strong>libnfnetlink-0.0.33-0.1.svn7211.fc9.i386</pre>
<pre>[root@server ~]# <strong>rpm -q libnetfilter_conntrack
</strong>libnetfilter_conntrack-0.0.89-0.1.svn7356.fc9.i386</pre>
<h4>เปิดการใช้งาน Connection Tracking System</h4>
<p>ก่อนที่โปรแกรมจะสามารถจับสถิติการใช้งานได้นั้นจำเป็นต้องเปิดคุณสมบัติ Connection Tracking System โดยในที่นี้จะคอนฟิก iptables ให้ตรวจสอบ state ทุก packet ที่วิ่งเข้าออกจากเครื่อง ดังนี้</p>
<p><span style="color: #ff0000;"><strong>คำเตือน ตัวอย่างไฟล์คอนฟิกของ iptables ด้านล่างนี้เป็นการอนุญาตทุก packet ให้สามารถส่งเข้าออกเครื่องนี้ได้ทั้งหมด แนะนำให้ทดสอบทำความเข้าใจใน network ที่แยกต่างหากก่อน เพื่อความปลอดภัยของเครื่อง แล้วค่อยนำไปประยุกต์ใช้งานจริง</strong></span></p>
<p>ตัวอย่างไฟล์คอนฟิกของ iptables</p>
<pre>[root@server ~]# <strong>cat /etc/sysconfig/iptables
</strong>*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT  -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
COMMIT</pre>
<p>ใช้คำสั่ง service เพื่อรัน iptables</p>
<pre>[root@server ~]# <strong>service iptables start
</strong>iptables: Applying firewall rules:                         [  OK  ]</pre>
<p>ตรวจสอบ rules ที่ถูกสร้างขึ้น</p>
<pre>[root@server ~]# <strong>iptables -L -v -n
</strong>Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   71  5388 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW,RELATED,ESTABLISHED</pre>
<pre>Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination</pre>
<pre>Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   64  6204 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW,RELATED,ESTABLISHED</pre>
<p>ใช้คำสั่ง lsmod เพื่อดู kernel module ที่ถูกเรียกใช้งานสำหรับการทำ Connection Tracking System</p>
<pre>[root@server ~]# <strong>lsmod | grep con
</strong>nf_conntrack_ipv4      11396  2
nf_conntrack           49748  2 nf_conntrack_ipv4,xt_state</pre>
<h4>ติดตั้งโปรแกรม conntrack-tools</h4>
<p>สามารถดาวน์โหลดโปรแกรม conntrack-tools สำหรับติดตั้งบน Fedora 9 ได้จาก</p>
<p><a href="http://mirrors.kernel.org/fedora/releases/9/Everything/i386/os/Packages/conntrack-tools-0.9.6-0.1.svn7382.fc9.i386.rpm">http://mirrors.kernel.org/fedora/releases/9/Everything/i386/os/Packages/conntrack-tools-0.9.6-0.1.svn7382.fc9.i386.rpm</a></p>
<p>ตัวอย่างการติดตั้งโปรแกรม conntrack-tools</p>
<pre>[root@server ~]# <strong>rpm -ivh conntrack-tools-0.9.6-0.1.svn7382.fc9.i386.rpm
</strong>Preparing...                ########################################### [100%]
   1:conntrack-tools        ########################################### [100%]</pre>
<p>จากการติดตั้งจะมีอยู่สองโปรแกรมคือ<br />
- conntrackd จะรันเป็น daemon ในการเก็บปริมาณการใช้งาน network<br />
- conntrack เป็นโปรแกรมที่ตรวจสอบไฟล์ /proc/net/ip_conntrack</p>
<p>ในบทความนี้เราจะใช้เฉพาะ conntrackd รันเป็น daemon</p>
<h4>สร้างไฟล์คอนฟิกของ conntrackd</h4>
<p>ขั้นตอนต่อไปคือการสร้างไฟล์ /etc/conntrackd/conntrackd.conf ซึ่งเป็นไฟล์คอนฟิกของ conntrackd โดยในที่นี้จะคอนฟิกให้รันอยู่ในโหมดการเก็บสถิติการใช้งาน network accounting</p>
<p>ตัวอย่างไฟล์คอนฟิก /etc/conntrackd/conntrackd.conf ในโหมดการเก็บสถิติการใช้งาน</p>
<pre>[root@server ~]# cat /etc/conntrackd/conntrackd.conf
#
# General settings
#
General {
    #
    # Number of buckets in the caches: hash table
    #
    HashSize 8192</pre>
<pre>    #
    # Maximum number of conntracks:
    # it must be &gt;= $ cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
    #
    HashLimit 65535</pre>
<pre>    #
    # Logfile: on, off, or a filename
    # Default: on (/var/log/conntrackd.log)
    #
    LogFile off</pre>
<pre>    #
    # Syslog: on, off or a facility name (daemon (default) or local0..7)
    # Default: off
    #
    Syslog off</pre>
<pre>    #
    # Lockfile
    #
    LockFile /var/lock/conntrack.lock</pre>
<pre>    #
    # Unix socket configuration
    #
    UNIX {
        Path /tmp/sync.sock
        Backlog 20
    }</pre>
<pre>    #
    # Netlink socket buffer size
    #
    SocketBufferSize 262142</pre>
<pre>    #
    # Increase the socket buffer up to maximum if required
    #
    SocketBufferSizeMaxGrown 655355
}</pre>
<pre><strong>Stats {
</strong>    #
    # If you enable this option, the daemon writes the information about
    # destroyed connections to a logfile. Default is off.
    # Logfile: on, off, or a filename
    # Default file: (/var/log/conntrackd-stats.log)
    #
 <strong>   LogFile on</strong></pre>
<pre>    #
    # Enable connection logging via Syslog. Default is off.
    # Syslog: on, off or a facility name (daemon (default) or local0..7)
    # If you set the facility, use the same as in the General clause,
    # otherwise you'll get a warning message.
    #
    Syslog off
}</pre>
<pre>#
# Ignore traffic for a certain set of IP's: Usually
# all the IP assigned to the firewall since local
# traffic must be ignored, just forwarded connections
# are worth to replicate
#
IgnoreTrafficFor {
    IPv4_address 127.0.0.1 # loopback
}</pre>
<pre>#
# Do not replicate certain protocol traffic
#
IgnoreProtocol {
#    UDP
#   ICMP
#   IGMP
#   VRRP
    # numeric numbers also valid
}</pre>
<h4>รันโปรแกรม conntrackd</h4>
<p>รันโปรแกรม conntrackd ให้เป็น daemon ของเครื่องตามตัวอย่าง</p>
<pre>[root@server ~]# <strong>conntrackd -d</strong></pre>
<pre>[root@server ~]# <strong>ps -ef | grep conntrackd
</strong>root     17381     1  0 22:19 ?        00:00:00 conntrackd -d</pre>
<h4>ทดสอบการใช้งานและดูไฟล์ที่ถูกสร้างขึ้น</h4>
<p>ไฟล์คอนฟิกด้านบนจะสั่งให้โปรแกรม conntrackd ที่รันเก็บสถิติไว้ในไฟล์ /var/log/conntrackd-stats.log โดยจะเก็บสถิติเมื่อมีการส่งข้อมูลสิ้นสุด (close connection) ในแต่ละ packet ที่เข้าออกเครื่อง</p>
<p>ตัวอย่างไฟล์ที่ถูกสร้างขึ้น</p>
<pre>Fri Sep 19 22:24:11 2008        tcp      6 src=192.168.1.1 dst=192.168.1.9 sport=1038 dport=22 packets=15 bytes=1864
                                           src=192.168.1.9 dst=192.168.1.1 sport=22 dport=1038 packets=12 bytes=2984
Fri Sep 19 22:24:21 2008        tcp      6 src=192.168.1.1 dst=192.168.1.9 sport=1039 dport=80 packets=5 bytes=817
                                           src=192.168.1.9 dst=192.168.1.1 sport=80 dport=1039 packets=5 bytes=639
Fri Sep 19 22:24:25 2008        tcp      6 src=192.168.1.1 dst=192.168.1.9 sport=1043 dport=80 packets=6 bytes=917
                                           src=192.168.1.9 dst=192.168.1.1 sport=80 dport=1043 packets=6 bytes=2784
Fri Sep 19 22:24:25 2008        tcp      6 src=192.168.1.1 dst=192.168.1.9 sport=1044 dport=80 packets=5 bytes=718
                                           src=192.168.1.9 dst=192.168.1.1 sport=80 dport=1044 packets=4 bytes=303
Fri Sep 19 22:24:25 2008        tcp      6 src=192.168.1.1 dst=192.168.1.9 sport=1045 dport=80 packets=5 bytes=718
                                           src=192.168.1.9 dst=192.168.1.1 sport=80 dport=1045 packets=5 bytes=342</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://conntrack-tools.netfilter.org/index.html" target="_blank">conntrack-tools: Netfilter’s connection tracking userspace tools</a></li>
<li><a href="http://www.free-it.de/archiv/talks_2005/paper-11076/paper-11076.html" target="_blank">Flow based network accounting with Linux</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2008/09/network_accounting_on_linux_by_conntrack_tools/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>คอมไพล์ Linux kernel บน Fedora 9 ในรูปแบบ RPMS</title>
		<link>http://spalinux.com/2008/09/compile_linux_kernel_on_fedora_9_in_rpms</link>
		<comments>http://spalinux.com/2008/09/compile_linux_kernel_on_fedora_9_in_rpms#comments</comments>
		<pubDate>Tue, 16 Sep 2008 18:42:23 +0000</pubDate>
		<dc:creator>editor</dc:creator>
				<category><![CDATA[Kernel]]></category>
		<category><![CDATA[Linux Installation]]></category>

		<guid isPermaLink="false">http://spalinux.com/?p=162</guid>
		<description><![CDATA[โดยทั่วไป kernel ที่ติดตั้งมากับลินุกซ์เวอร์ชั่น (distribution) ต่างๆ รวมทั้ง Fedora ด้วย จะสามารถใช้งานได้เลย รองรับอุปกรณ์ hardware ได้ส่วนใหญ่หลากหลายชนิด ไม่จำเป็นต้องแก้ไขเพิ่มเติมแต่อย่างใด แต่ในบางครั้งถ้ามีอุปกรณ์รุ่นใหม่ที่ kernel ไม่รู้จัก หรือต้องการจะปรับแต่ง kernel ให้เรียกใช้งานเฉพาะสำหรับอุปกรณ์ที่เราใช้อยู่จริงๆ ทั้งนี้เพื่อประหยัด CPU/Memory ที่ถูกใช้โดยเปล่าประโยชน์ รวมทั้งเพิ่มความปลอดภัยให้กับตัวลินุกซ์เองด้วย ในบทความนี้จึงขอแนะนำวิธีปรับแต่ง kernel และคอมไพล์ใหม่ โดยจะทดสอบบน Fedora 9 คำเตือน การคอมไพล์ kernel จะใช้เนื้อที่จำนวนมากหลายกิกะไบต์ อย่าลืมเผื่อเนื้อที่ไว้ก่อนที่จะเริ่มคอมไพล์ เพราะถ้าเนื้อที่ไม่เพียงพอ การคอมไพล์จะมีปัญหา และต้องเริ่มคอมไพล์ใหม่ ซึ่งจะใช้เวลานานมาก แนะนำให้คอมไพล์ kernel ในรูปแบบ src.rpm ด้วยผู้ใช้งานธรรมดาที่ไม่ใช่ root ซึ่งสามารถดูได้ที่ วิธีการคอมไพล์ไฟล์ src.rpm ด้วยผู้ใช้งานธรรมดา ติดตั้งไฟล์ src.rpm ซึ่งเป็น kernel source ในรูปแบบไฟล์ rpm [...]]]></description>
			<content:encoded><![CDATA[<p>โดยทั่วไป kernel ที่ติดตั้งมากับลินุกซ์เวอร์ชั่น (distribution) ต่างๆ รวมทั้ง Fedora ด้วย จะสามารถใช้งานได้เลย รองรับอุปกรณ์ hardware ได้ส่วนใหญ่หลากหลายชนิด ไม่จำเป็นต้องแก้ไขเพิ่มเติมแต่อย่างใด</p>
<p>แต่ในบางครั้งถ้ามีอุปกรณ์รุ่นใหม่ที่ kernel ไม่รู้จัก หรือต้องการจะปรับแต่ง kernel ให้เรียกใช้งานเฉพาะสำหรับอุปกรณ์ที่เราใช้อยู่จริงๆ ทั้งนี้เพื่อประหยัด CPU/Memory ที่ถูกใช้โดยเปล่าประโยชน์ รวมทั้งเพิ่มความปลอดภัยให้กับตัวลินุกซ์เองด้วย</p>
<p>ในบทความนี้จึงขอแนะนำวิธีปรับแต่ง kernel และคอมไพล์ใหม่ โดยจะทดสอบบน Fedora 9</p>
<p><span id="more-162"></span></p>
<p>คำเตือน การคอมไพล์ kernel จะใช้เนื้อที่จำนวนมากหลายกิกะไบต์ อย่าลืมเผื่อเนื้อที่ไว้ก่อนที่จะเริ่มคอมไพล์ เพราะถ้าเนื้อที่ไม่เพียงพอ การคอมไพล์จะมีปัญหา และต้องเริ่มคอมไพล์ใหม่ ซึ่งจะใช้เวลานานมาก</p>
<p>แนะนำให้คอมไพล์ kernel ในรูปแบบ src.rpm ด้วยผู้ใช้งานธรรมดาที่ไม่ใช่ root ซึ่งสามารถดูได้ที่ <a href="http://spalinux.com/2008/09/compile_src_rpm_by_normal_user">วิธีการคอมไพล์ไฟล์ src.rpm ด้วยผู้ใช้งานธรรมดา</a></p>
<h4>ติดตั้งไฟล์ src.rpm ซึ่งเป็น kernel source ในรูปแบบไฟล์ rpm</h4>
<pre>[user01@server ~]$ rpm -ivh kernel-2.6.25-14.fc9.src.rpm
   1:kernel                 warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
...
########################################### [100%]</pre>
<p>หมายเหตุ ไม่ต้องสนใจ warning ที่เกี่ยวข้องกับ user, group does not exists</p>
<p>ผลลัพธ์ที่ได้จากการติดตั้งไฟล์ src.rpm จะได้ไฟล์ kernel.spec ใน SPECS/ ซึ่งจะเป็นชุดคำสั่ง (script) ในการคอมไพล์ และไฟล์ที่เป็น source code ที่อยู่ใน SOURCES/</p>
<p>ตัวอย่างผลลัพธ์ที่ได้จากการติดตั้งไฟล์ src.rpm</p>
<pre>[user01@server ~]$ cd rpmbuild/</pre>
<pre>[user01@server rpmbuild]$ ls SPECS/
kernel.spec</pre>
<pre>[user01@server rpmbuild]$ ls SOURCES/
config-debug                                   linux-2.6-e1000-ich9.patch
config-generic                                 linux-2.6-efika-not-chrp.patch
config-i586                                    linux-2.6-execshield.patch
...
linux-2.6-drm-modesetting-oops-fixes.patch     merge.pl
linux-2.6-drm-radeon-fix-oops2.patch           nouveau-drm.patch
linux-2.6-drm-radeon-fix-oops.patch            nouveau-drm-update.patch</pre>
<p>เข้าไปที่ไดเร็คทอรี SPECS/ แล้วใช้คำสั่ง rpmbuild เพื่อสร้าง kernel source tree สำหรับการคอมไพล์</p>
<p>หมายเหตุ การใช้ option &#8216;-bp&#8217; จะแตกไฟล์ source code และทำการ patch ไฟล์ต่างๆ ที่อยู่ใน SOURCES/ ตามที่ระบุในไฟล์ kernel.spec</p>
<pre>[user01@server rpmbuild]$<strong> cd SPECS/</strong></pre>
<pre>[user01@server SPECS]$ <strong>rpmbuild -bp --target=`uname -m` kernel.spec
</strong>Building target platforms: i686
Building for target i686
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.43192
+ umask 022
+ cd /home/user01/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ patch_command='patch -p1 -F1 -s'
+ '[' '!' -d kernel-2.6.25/vanilla-2.6.25 ']'
+ rm -f pax_global_header
+ cd /home/user01/rpmbuild/BUILD
+ rm -rf kernel-2.6.25
+ /bin/mkdir -p kernel-2.6.25
+ cd kernel-2.6.25
+ /usr/bin/bzip2 -dc /home/user01/rpmbuild/SOURCES/linux-2.6.25.tar.bz2
+ tar -xf -</pre>
<pre>...
...
...</pre>
<pre>config:3405:warning: trying to assign nonexistent symbol INSTRUMENTATION
.config:3450:warning: trying to assign nonexistent symbol ACPI_CUSTOM_DSDT_INITRD
.config:3464:warning: trying to assign nonexistent symbol CGROUP_MEM_CONT
.config:3480:warning: trying to assign nonexistent symbol DEBUG_IGNORE_QUIET
+ echo '# i386'
+ cat .config
+ find . '(' -name '*.orig' -o -name '*~' ')' -exec rm -f '{}' ';'
+ cd ..
+ exit 0</pre>
<h4>ตรวจสอบ kernel source tree ที่ถูกสร้างขึ้น</h4>
<pre>[user01@server SPECS]$ <strong>cd ../BUILD/kernel-2.6.25/
</strong>/home/user01/rpmbuild/BUILD/kernel-2.6.25</pre>
<pre>[user01@server kernel-2.6.25]$ <strong>ls -CF
</strong>linux-2.6.25.i686/  vanilla-2.6.25/</pre>
<h4>สร้างคอนฟิกของ kernel ที่จะใช้เป็นต้นแบบ</h4>
<p>เข้าไปในไดเร็คทอรี linux-2.6.25.i686 ภายในนี้จะมีไดเร็คทอรีย่อยที่ชื่อว่า configs/ ซึ่งจะมีไฟล์คอนฟิกสำหรับเครื่องต่างๆ ในที่นี้จะเลือกไฟล์สำหรับเครื่องที่เป็น i686 ชื่อไฟล์คือ kernel-2.6.25-i686.config</p>
<p>copy ไฟล์คอนฟิกนี้ไปเป็นชื่อไฟล์ .config</p>
<pre>[user01@server kernel-2.6.25]$ <strong>cd linux-2.6.25.i686/</strong></pre>
<pre>[user01@server linux-2.6.25.i686]$ <strong>ls configs/</strong>
kernel-2.6.25-i586.config  kernel-2.6.25-i686-debug.config  kernel-2.6.25-i686-PAEdebug.config
kernel-2.6.25-i686.config  kernel-2.6.25-i686-PAE.config    kernel-2.6.25-i686-xen.config</pre>
<pre>[user01@server linux-2.6.25.i686]$ <strong>cp configs/kernel-2.6.25-i686.config .config</strong></pre>
<p>รันคำสั่ง make oldconfig</p>
<pre>[user01@server linux-2.6.25.i686]$ <strong>make oldconfig
</strong>scripts/kconfig/conf -o arch/x86/Kconfig
*
* Linux Kernel Configuration
*
*
* General setup
*
Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?] y
Local version - append to kernel release (LOCALVERSION) []
Automatically append version information to the version string (LOCALVERSION_AUTO) [N/y/?] n
Support for paging of anonymous memory (swap) (SWAP) [Y/n/?] y
System V IPC (SYSVIPC) [Y/n/?] y</pre>
<pre>...
...
...</pre>
<pre>CRC32 functions (CRC32) [Y/?] y
CRC7 functions (CRC7) [N/m/y/?] n
CRC32c (Castagnoli, et al) Cyclic Redundancy-Check (LIBCRC32C) [M/y/?] m
#
# configuration written to .config
#</pre>
<p>รันคำสั่ง make menuconfig สำหรับการเลือกคอนฟิกของ kernel โดยจะมีรูปแบบการเลือกเป็นแบบเมนู</p>
<pre>[user01@server linux-2.6.25.i686]$ <strong>make menuconfig</strong></pre>
<pre><strong></strong></pre>
<p>ตัวอย่างหน้าจอของ make menuconfig<br />
<img src="http://spalinux.com/wp-content/uploads/2008/09/fedora_9_make_menuconfig.png" alt="Fedora 9 make menuconfig" /></p>
<p>เมื่อแก้ไขคอนฟิกของ kernel เรียบร้อย และออกจาก menuconfig แล้ว ให้แก้ไขไฟล์ .config โดยเพิ่ม hardware platform ไว้บนบรรทัดบนสุด โดยสามารถตรวจสอบ hardware platform ได้จากการรันคำสั่ง uname -i</p>
<p>ตัวอย่างการตรวจสอบและเพิ่ม hardware platform ในไฟล์ .config</p>
<pre>[user01@server linux-2.6.25.i686]$ <strong>uname -i
</strong>i386</pre>
<pre>[user01@server linux-2.6.25.i686]$ <strong>vi .confg
<span style="color: #0000ff;"># i386</span></strong>
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.25
# Tue Sep 16 14:03:32 2008
#</pre>
<p>หลังจากเพิ่ม hardware platform ในไฟล์ .config แล้ว copy ไฟล์นี้กลับเข้าไปใน SOURCES/ แต่เปลี่ยนชื่อเป็น config-&lt;arch&gt; โดย &lt;arch&gt; ได้มาจากการรันคำสั่ง uname -m</p>
<pre>[user01@server linux-2.6.25.i686]$ <strong>cp .config ../../../SOURCES/config-i686</strong></pre>
<p>ตามคำแนะนำในไฟล์ kernel.spec ว่า ถ้ามีการแก้ไขคอนฟิกของ kernel ให้เพิ่มการ define ตัวแปร buildid ด้วย ในที่นี้จะระบุเป็น .spalinux.test1.</p>
<p>ตัวอย่างการแก้ไขการ define ตัวแปร buildid</p>
<pre>...
%define buildid .spalinux.test1
...</pre>
<p>คอมไพล์ kernel และสร้างเป็นไฟล์ RPMS ใหม่ โดยจะเลือกคอมไพล์ให้เป็น package เฉพาะตัว base kernel สำหรับการบู๊ตเครื่อง และ kernel-devel ไว้สำหรับคอมไพล์โปรแกรมอื่นๆ เพิ่มเติม</p>
<p>หมายเหตุ option &#8216;-bb&#8217; เป็นการระบุให้มีการคอมไพล์โปรแกรมจริงๆ ซึ่งการคอมไพล์ kernel นั้นจะใช้เวลาค่อนข้างนานหลายชั่วโมง ขึ้นอยู่กับคอนฟิกที่เราเลือกด้วย แล้วก็ขึ้นกับ CPU, Memory</p>
<pre>[user01@server SPECS]$ <strong>rpmbuild -bb --with baseonly --without debuginfo --target=`uname -m` kernel.spec
</strong>Building target platforms: i686
Building for target i686
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.55363
+ umask 022
+ cd /home/user01/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ patch_command='patch -p1 -F1 -s'
+ '[' '!' -d kernel-2.6.25/vanilla-2.6.25 ']'
+ cd kernel-2.6.25
+ '[' -d linux-2.6.25.i686 ']'
+ rm -rf deleteme.i686
+ mv linux-2.6.25.i686 deleteme.i686
+ rm -rf deleteme.i686
+ cp -rl vanilla-2.6.25 linux-2.6.25.i686
...
...
...
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/kernel-2.6.25-14.spalinux.test1.fc9.i686-root
Wrote: /home/user01/rpmbuild/RPMS/i686/kernel-2.6.25-14.spalinux.test1.fc9.i686.rpm
Wrote: /home/user01/rpmbuild/RPMS/i686/kernel-devel-2.6.25-14.spalinux.test1.fc9.i686.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.98631
+ umask 022
+ cd /home/user01/rpmbuild/BUILD
+ cd kernel-2.6.25
+ rm -rf /var/tmp/kernel-2.6.25-14.spalinux.test1.fc9.i686-root
+ exit 0</pre>
<p>ผลลัพธ์ที่ได้จากการคอมไพล์จะอยู่ในไดเร็คทอรี RPMS/ แล้วแยกย่อยตามชนิด (arch) ของเครื่องที่ระบุตอนใช้คำสั่ง rpmbuild</p>
<pre>[user01@server RPMS]$ <strong>find i686/
</strong>i686/
i686/kernel-2.6.25-14.spalinux.test1.fc9.i686.rpm
i686/kernel-devel-2.6.25-14.spalinux.test1.fc9.i686.rpm</pre>
<h4>ข้อมูลอ้างอิง</h4>
<ul>
<li><a href="http://spalinux.com/2008/09/compile_src_rpm_by_normal_user">วิธีการคอมไพล์ไฟล์ src.rpm ด้วยผู้ใช้งานธรรมดา</a></li>
<li><a title="Docs/CustomKernel" href="http://fedoraproject.org/wiki/Docs/CustomKernel" target="_blank">Docs/CustomKernel<br />
</a></li>
<li><a title="Fedora 9 src.rpm" href="http://mirrors.kernel.org/fedora/releases/9/Fedora/source/SRPMS/" target="_blank">ไฟล์ src.rpm ใน Fedora 9</a>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spalinux.com/2008/09/compile_linux_kernel_on_fedora_9_in_rpms/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
