Wednesday 6 October 2010

ว่าด้วยเรื่องการ Partition Linux ที่ดี ...

(ควรมีความรู้ การ partition เบื้องต้นและ LVM มาก่อนนะครับ ... ไว้ว่าง ๆ จะเขียนเรื่อง LVM ทีหลัง)


ในที่นี้จะเน้นการใช้ LVM2 (Device Mapper) เป็นหลักนะครับ เพราะว่าแบ่ง partition ได้ง่ายกว่า

จริง ๆ การแบ่ง Partition เนียเป็นสิ่งสำคัญอย่างหนึ่งในการ Install Linux เลยโดยเฉพาะพวก Server เพราะ
ถ้าเราวางแผนดีและแบ่ง Partition ได้ดีแล้ว จะสะดวกในการปรับแต่งหลาย ๆ อย่าง เช่น สามารถ partition
แก้ บาง partition โดยไม่ต้องไปทำหน้าเครื่อง เพราะบางทีมันอยู่ใน Datacenter ไม่สะดวกที่จะเข้าไป
อีกทั้งยังลดความเสี่ยง ในกรณี Logfile มันเกิดเต็ม ทำให้ /var เต็ม service ทำงานไม่ได้ อะไรพวกนี้ด้วย
สำหรับ partition บางตัวเราควรจะเลือกใช้เป็นแบบ LVM เช่น partition สำหรับ /home เพราะใช้ไปแล้ว
อาจจะต้องมีการขยายขนาดตามความต้องการ และ อาจจะขยายข้าม harddisk ไปอีกลูกได้ด้วย
รวมทั้ง /var/lib/mysql ด้วยถ้า ขนาดของ Database คุณมีการโตตลอดเวลาด้วยอัตราที่สูงมาก ๆ

บาง partition เราต้องเลือกตำแหน่งของ partition ให้ดีว่าจะอยู่ใน Primary หรือ Logical partition
ซึ่งมันจะช่วยในกรณีการกู้ระบบต่าง ๆ และการ Install OS ใหม่ได้มาก

ดูตัวอย่างดีกว่า

Scheme 1 : Multiple Logical Partition + LVM on /home
---------------------------------------------------------------------------

กรณีนี้เราจะใช้ LVM เฉพาะ /home เพื่อให้สามารถขยายได้เวลามันใกล้เต็มแล้วเราหา Harddisk มาเพิ่ม
และ performance จะค่อนข้างดีหน่อยใน partition อื่น ๆ เนึ่องจากไม่ต้องผ่าน Device Mapper (LVM)

ดูตัวอย่างเลย


โค๊ด:
uefa ~ # df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda5     ext3    7.8G  1.3G  6.1G  18% /
udev         tmpfs    998M  164K  998M   1% /dev
/dev/sda6     ext3    7.8G  260M  7.1G   4% /var
/dev/sda7     ext3     16G  129M   15G   1% /var/lib/mysql
/dev/sda8     ext3    3.9G  271M  3.5G   8% /var/log
/dev/sda9 reiserfs    2.0G  531M  1.5G  27% /usr/portage
/dev/sda10
          reiserfs    2.0G   33M  2.0G   2% /tmp
/dev/mapper/vg0-home
              ext3     33G  1.1G   30G   4% /home
shm          tmpfs    998M     0  998M   0% /dev/shm
/dev/sda1     ext2    130M  6.4M  117M   6% /boot

โค๊ด:
uefa ~ # mount
/dev/sda5 on / type ext3 (rw,noatime)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
udev on /dev type tmpfs (rw,nosuid)
devpts on /dev/pts type devpts (rw)
/dev/sda6 on /var type ext3 (rw)
/dev/sda7 on /var/lib/mysql type ext3 (rw)
/dev/sda8 on /var/log type ext3 (rw,noatime)
/dev/sda9 on /usr/portage type reiserfs (rw,noatime)
/dev/sda10 on /tmp type reiserfs (rw)
/dev/mapper/vg0-home on /home type ext3 (rw)
shm on /dev/shm type tmpfs (rw,noexec,nosuid,nodev)
usbfs on /proc/bus/usb type usbfs (rw,devmode=0664,devgid=85)
/dev/sda1 on /boot type ext2 (rw,noatime)

โค๊ด:
uefa ~ # fdisk -l /dev/sda

Disk /dev/sda: 81.9 GB, 81964302336 bytes
255 heads, 63 sectors/track, 9964 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          17      136521   83  Linux
/dev/sda2              18         273     2056320   82  Linux swap / Solaris
/dev/sda3             274         529     2056320   83  Linux
/dev/sda4             530        9964    75786637+   5  Extended
/dev/sda5             530        1554     8233281   83  Linux
/dev/sda6            1555        2579     8233281   83  Linux
/dev/sda7            2580        4628    16458561   83  Linux
/dev/sda8            4629        5141     4120641   83  Linux
/dev/sda9            5142        5398     2064321   83  Linux
/dev/sda10           5399        5655     2064321   83  Linux
/dev/sda11           5656        9964    34612011   8e  Linux LVM

ดูในตัวอย่างนี้จะเห็น partition ค่อนข้างเยอะ ... มาดูเหตุผลของการแบ่งแต่ละ partition และตำแหน่งที่มันอยู่ด

sda1 -- /boot
มันควรจะอยูตรงนี้ทุกเครื่องนะครับ อยู่ต้น harddisk เพราะมันเป็นจุดที่ไม่ควรจะเสียมากที่สุด จริง ๆ แล้วมันมีเหตุผลมาจาก เครื่องรุ่นเก่า ๆ ที่อาจจะบูตจาก cylinder มากกว่า 1024 ไม่ได้ (ไม่เกิน 8GB แรก) ให้ใช้ filesystem ที้เชื่อถือได้เช่น ext2 หรือ ext3 
จริง ๆ ควรจะใส่ option noauto ไปใน fstab ด้วย เพื่อไม่ให้มัน mount ตอนบูต (ช่วยไม่ให้มันเสียหายถ้าคุณเกิดไป rm -rf / โดยไม่ตั้งใจ)

sda2 -- SWAP
ตรงนี้เป็นตำแหน่งที่ดีของ Swap ครับ โดยทั่วไปควรจะอย่างน้อย 2 เท่าของแรม แต่ไม่เกิน 2GB นะครับ (ถ้าเครื่องคุณใช้ swap 2GB แสดงว่า ram คุณไม่พออย่างแรง คุณควรเพิ่มแรมหรือปรับแต่งให้มันกินแรมน้อยลง)

sda3 -- RESCUE ROOT
อันนี้ให้มีขนาดพอประมาณ ประมาณ 2-4GB แล้วแต่ Distribution ... ตรงนี้ หลังจากติดตั้ง Linux ตัวหลักที่ใช้งานเรียบร้อยแล้ว ... ให้ติดตั้ง Linux แบบพอบูตได้ลงไปครับ และสามารถใช้ Tools ต่าง ๆ ในการจัดการ partition ต่าง ๆ รวมทั้งจัดการเรื่อง LVM ด้วย
ถ้าทำได้ทำให้มันบูตได้จาก Superblock ของตัวเอง โดบไม่ใช้ boot partition (/boot) คงงงว่าจะบูตได้อย่างไร .. เดี๋ยวว่ากันทีหลังครับ

sda4 -- Extended Partition 
อันนี้ก็ Extended Partition สำหรับทำ Logical Partition ให้แบ่งโดยใช้ ที่เหลือทั้งหมดครับ

sda5 -- /  (root) 
Root partition ... คงไม่ต้องบอกว่าใช้ทำอะไร

sda6 -- /var
Partition นี้ส่วนใหญ่จะเก็บ data เกี่ยวกับ Service ต่าง ๆ และระบบครับ ที่สำคัญ "มันไม่ควรเต็ม" เพราะถ้าเต็ม "Service หลายตัวจะทำงานไม่ได้"

sda7 -- /var/lib/mysql 
Partition เก็บ data ของ MySQL จะแยกออกมาตามนี้หรือไม่ก็ได้นะครับ แต่ให้มีขนาดเพียงพอกับการใช้งาน MySQL โดยทั่วไป 16G ที่แบ่งไว้นี่
เหลือเฟือ แต่ผมแนะนำให้แยก เวลาเกิดเต็ม หรือ error มาจะได้ไม่ไปวุ่นวาย /var ทำให้ Service อื่นเน่าไปด้วย

sda8 -- /var/log
อันนี้คำคัญครับ เพื่อไม่ให้ logfile เกิดใหญ่ ๆขึ้นมาก ๆ เวลา logrotate ไม่ทำงาน หรือว่าโดน Bomb ... ซึ่งถ้าไมแบ่งไว้ logfile จะไป fill partition /var หรือ /
จนเต็ม ... แน่นอน service จะเดี้ยง

sda9 -- /usr/portage
อันนี้ Gentoo Specific ครับ ไม่ต้องมีก็ได้ ...

sda10 -- /tmp
นี่ก็สำคัญอีกตัวครับ /tmp ไม่ควรจะเต็ม เหมือนกัน เพราะหลายโปรแกรมจะทำงานไม่ได้ ถ้า /tmp เขียนลงไปไม่ได้ หรือมันเต็ม

sda11 -- LVM Physical Partition
อันนี้ก็ส่วนที่เหลือทั้งหมด ให้ทำเป็น LVM PV (type 8e) ทั้งหมดเลยครับ (หรือจะแบ่งหลาย ๆ อันแล้วแต่สะดวก)
จริง ๆ คือ 1 ก็พอ .... จากนั้นทำเป็น Volume Group และ Logical Volume ของ /home และ mount point อื่น ๆ ที่ต้องการ

ทำให้กรณีนี้ จะมี Logical Volume เพิ่มมาคือ
/dev/vg0/home -- LVM Logical Volume (/home) 
อันนี้ทำ Volume Group ชื่อ vg0 และ Logical Volume ชื่อ home -- อันนี้จริง ๆ แล้วถ้าคุณมีหลาย server ที่ใช้งานด้วยกัน ควรจะใช้
ชื่อของ volume group คนชะชื่อกัน เช่น เครื่องแรกใช้ sv1vg1 อีกตัว sv2vg1 อีกตัว sv3vg1 เพราะเวลาเอา harddisk
ไปเสียบอีกเครื่อง แล้ว volume group ชื่อเดียวกัน Linux มันจะ งง ก่งก๊งไปเลยครับ

กรณีที่ คุณไม่แน่ใจในขนาดของ MySQL และ HOME ของคุณว่าควรจะขนาดไหน หรือมันขึ้นลงบ่อย ๆ แนะนำให้ทำ
/var/lib/mysql ไว้เป็น Logical Volume แทนที่จะแบ่ง partition ธรรมดาให้มัน นะครับเผื่อจะเอาไว้ ลด, ขยายได้สะดวก (แต่อาจจะทำให้มันช้าลงนิดนึง)

จริง ๆ จะแบ่ง /usr หรือ /opt ด้วยก็ได้นะครับ แต่มันอาจจะไม่จำเป็นเท่าไหร่ 
/opt : ถ้าเราไม่ได้ใช้โปรแกรมอะไรพิเศษใน /opt  ก็คงไม่จำเป็น (ใน /opt ส่วนหใหญ่ ผมมีเฉพาะ JDK)
/usr : โดยทั่วไปก่อนนี้ /usr ที่แบ่งแยกออกมาเพราะเหตุผลด้าน security ครับ และส่วนใหญ่ขนาดมันไม่เพิ่มกันบ่อย ๆ อยู่แล้ว ถ้าต้องการเรื่อง
security สำหรับ Filesysetm จริง ๆ ปัจจุบันมี Security API ใน Linux หลายตัวที่เลือกใช้ได้ และทำงานกับ Security Label ใน Filesystem เช่น SELinux

หรือใครอยากทำก็ไม่ว่ากัน ระวังบูตไมได้ล่ะ

----

อูย บ่นยาวไป ต่อ ๆ 

การแบ่ง partition นี้จะแบ่งตอน Install Linux ก็ได้นะครับ 
เมื่อ Install เรียบร้อย ให้ Install ตัวที่ใช้เป็น Rescue ตามใน Rescue Partition โดยใช้ เพียง Partition นั้น partition เดียว (ในตัวอย่างเป็น sda3) จัดการ set ค่าต่าง ๆ รวมทั้ง network ด้วย
อย่างที่บอกตอนแรกว่าให้ติดตั้ง Boot Loader ของ Rescue Partition ไว้ใน Superblock ดังนั้นปกติมันจะบูตไม่ได้ครับ
หรือคุณจะตั้งให้มันเรียก kernel บน rescue partition ตรง ๆ ก็ได้นะ (ถ้าทำเป็น)

กรณีใช้ grub ให้เข้า Linux ตัวหลักไปแก้ /boot/grub/menu.lst (หรือ /boot/grug/grub.conf) เพิ่ม
entry สำหรับ boot โดย chain load ตัว Partition ที่เป็น Rescue เข้าไป (ในที่นี่เป็น sda3 หรือ (hd0,2) ใน grub)

ดูตัวอย่างละกัน

โค๊ด:
uefa ~ # cat  /boot/grub/menu.lst
timeout 3

default 0
falllback 1

title Gentoo Linux 2005.1 - uefa - 2.6.15-gentoo-r7
root (hd0,0)
kernel /boot/vmlinuz-2.6.15-gentoo-r7 root=/dev/sda5

title Gentoo Linux -- RESCUE PARTITON
root (hd0,2)
chainloader +1

---

ปล. Redhat/Fedora/Debian อย่าลืม initrd นะครับ ไม่งั้นบูตไม่ได้นะ

Scheme 2 : Root Logical Partition + Multiple LVM LVs
---------------------------------------------------------------------------
กรณีนี้เหมือนข้างบนครับ ตั้งแต่ sda1 - sda5

จากนั้นที่เหลือ ทำเป็น LVM ทั้งหมด (sda6) อาจจะมีหลาย Partition ก็ได้ คือมีหลาย 
PV ใน หลาย partition เช่น sda6, sda7 ,sda8, sda9 partition ละ 10G อะไรแบบนี้

จากนั้นสร้าง Volume Group และ Logical Volume สำหรับ Mount Point ต่างๆ แบบข้างบนได้เลย

--------------------------------------

มาดูสถานะการณ์ที่การแบ่งแบบนี้มีประโยชน์กันบ้าง

- Linux ตัวหลักบูตไม่ได้ ::: ไม่ยากเลยครับ ต่อให้คุณไม่สามารถไปที่หน้าเครื่องได้ ให้ใครเอาจอ + keyboard ไปต่อ บอก กด reset เลือก อันที่เขียนว่า RESCUE จบ มันจะบูตได้พร้อมระบบ network
และพร้อมให้คุณ ssh เข้าไปจัดการกับ Linux ตัวที่เจ้งไปแล้ว ถ้าแน่ใจว่าน่าจะบูตได้แล้ว ก็ reboot และมันก็น่าจะกลับมาในสภาพปกติ ... กรณีนี้เหมือนกับการใช้ แผ่น Install Linux ในการบูตเข้าไปแก้ไขระบบ โดย chroot เข้าไป

จะลังเกตุได้ว่า ทำได้แม้แต่ partition ใน ที่เหลือใหม่ทั้งหมด (อาจจะ backup ไป harddisk อีกตัว, ข้ามเครื่อง, ลง tape ฯลฯ)
สำหรับแบบแรก ... แต่คุณต้องเข้าไปแก้ config ของ boot loader ให้มันบูตเข้ามาที่ RESCUE อัตโนมัตินะครับ เพราะหลัง fdisk ใหม่มันต้อง reboot
และแบบที่สอง ... อันนี้จะ Flexible กว่าแบบแรกมาก ๆ เพราะเมื่อเข้า RESCUE mode แล้วสามารถ ลด เพิ่ม ย้าย Logical Volume ได้ตามสะดวกเลย โดยไม่ต้องบูต เหมือนการ partition ใหม่

- มี Harddisk อีกตัว ตัวจะเพิ่มเข้าไป ::: อันนี้แบ่งแบบเดียวกันเลยครับ ตั้งแต่ sda1 - sda4 จากนั้นให้ sda5 เป็น LVM PV ทั้งหมด และเพิ่มเข้าไปใน Volume Group แล้วจัดการขยายขนาด ตามสะดวก ... อ่อ แถมยังใช้ Swap แบบ Stripping ได้ด้วย (คล้าย ๆ raid 0) โดยการตั้ง Priority ให้เท่ากัน (เช่นมี sda2, sdb2)

สำหรับตัวอย่างสอง อันนี้เป็นการทำบน Harddisk ตัวเดียวนะครับ ถ้ามีสองตัว จะทำ Software RAID 0 หรือ RAID 1 ก่อนก็ได้ แต่แนะนำให้ทำเป็น RAID ตั้งแต่ /dev/sda5 ไปนะครับ (เป็น /dev/md1, /dev/md2 ....) สำหรับ /boot และ rescue partition ไม่ต้อง raid  เพราะ /boot และ rescue คุณควรจะ raw copy ตรง ๆ 

แบบว่า  dd if=/dev/sda1 of=/dev/sdb1 ไปเลย เพราะมันเล็กนิดเดียว

ถ้า kernel เกิดเพี้ยนขึ้นมา อย่างน้อย rescue partition หรือ boot partition 1 ตัวเหลือให้ใช้งานแน่นอน


ที่มา http://www.thaiadmin.org/board/index.php?topic=20409.0