การใช้งาน LVM เพื่อจัดการพื้นที่ฮาร์ดดิสก์

Songyote Mungmai
4 min readSep 16, 2018

--

บทความนี้ขอแนะนำ LVM (Logical Volume Management) มาใช้ในการแก้ปัญหาเนื้อที่ในการเก็บข้อมูลไม่เพียงพอ ซึ่งลินุกซ์ส่วนใหญ่ตอนนี้จะมี LVM มาให้ด้วยอยู่แล้ว และถ้าตอนติดตั้ง OS เลือกแบบ Create default layout นั้น โปรแกรมติดตั้งก็จะเลือกใช้ LVM บน disk partition แต่ละอันที่แบ่งให้เลย ทำให้สะดวกต่อการใช้งาน แล้วเราก็สามารถมาปรับ ลด แก้ไข ขนาดในการเก็บข้อมูลของแต่ละส่วนได้

เนื่องจากความต้องการในการเก็บไฟล์ข้อมูลเพิ่มขึ้นตลอดเวลา จนบางครั้งทำให้ผู้ดูแลระบบยากต่อการวางแผนว่าจะแบ่งส่วนการเก็บไฟล์ (disk partition) อย่างไร ในบางครั้งดูเหมือนจะเผื่อพื้นที่ฮาร์ดดิสก์สำหรับเก็บข้อมูลส่วนต่างๆ เพียงพอแล้ว แต่ใช้ไปไม่นานพื้นที่บางส่วนถูกใช้ไป 100% แล้ว เก็บข้อมูลเพิ่มต่อไปอีกไม่ได้

https://cdn.thegeekdiary.com/wp-content/uploads/2014/10/LVM-basic-structure.png

https://cdn.thegeekdiary.com/wp-content/uploads/2014/10/LVM-basics.png

นอกจากองค์ประกอบพื้นฐานที่สำคัญแล้ว ยังมีหน่วยย่อยเล็กๆที่ควรรู้จักเพิ่มเติม ได้แก่

  • physical devices คือองค์ประกอบพื้นฐานของ physical volume โดยในแต่ละ physical volume จะประกอบด้วย physical disks เช่น /dev/sda1, dev/sda2 ซึ่งเรียกว่า physical devices นั่นเอง
  • physical extent (PE) ในแต่ละ physical volume จะถูกแบ่งออกเป็นส่วนๆอีกที เรียกว่า physical extents โดยจะมีขนาดเท่ากันกับ logical extents ภายใน volume group นั้นๆ
  • logical extent (LE) ในแต่ละ logical volume ก็จะถูกแบ่งออกเป็นส่วนๆ เช่นเดียวกับ physical volume เรียกว่า logical extents โดยจะมีขนาดเดียวกันในทุกๆ logical volumes ภายใน volume group นั้นๆ

ที่มา : https://medium.com/@nareerat.prr/what-is-lvm-24ae24322eff

ส่วนประกอบของ LVM ส่วนประกอบหลักๆ ของ LVM จะมีอยู่สามส่วนคือ

Physical Volume (PV) ในส่วนนี้ก็คือส่วนของฮาร์ดดิสก์จริงๆ ที่เราจะใช้ในการเก็บข้อมูล เราสามารถใช้ฮาร์ดดิสก์เพื่อทำเป็น Physical Volume ได้สองแบบ แบบแรกใช้ทีเดียวทั้งก้อนเลยเช่นทั้งก้อน /dev/sda หรือจะเป็นแบบที่สองคือทำทีละ disk partitionเช่น /dev/sda1, /dev/sda2 ตามคำเอกสาร LVM HOWTO แล้วเขาแนะนำเป็นแบบที่สองคือแบ่งเป็น partition ก่อนแล้วค่อยทำเป็น Physical Volume

Volume Group (VG) จะทำหน้าที่รวบรวม Physical Volume ต่างๆ เข้าด้วยกันเพื่อมองเป็นก้อนๆ เดียว เช่นรวม /dev/sda1, /dev/sdb1, /dev/sdc1 ซึ่งทำถูกทำเป็น Physical Volume แล้ว นำมาเข้าด้วยกันเป็น Volume Group ที่ชื่อ VG0

Logical Volume (LV) เป็นก้อนย่อยๆ ที่แบ่งมาจาก Volume Group นั่นเอง เช่นเมื่อเราสร้าง Volume Group ที่ชื่อ VG0 ขึ้นมาแล้วเราก็นำมาแบ่งย่อยอีกทีนึงเช่นเป็น LV0_home สำหรับใช้เป็น /home ของระบบ LV0_var สำหรับใช้เป็น /var เป็นตัน

หลังจากแบ่งเป็น Logical Volume แล้ว เราก็สามารถนำมา Volume นั้นมา format เป็น filesystem ตามที่เราต้องการได้เช่น ext2, ext3 เพื่อนำมา mount เป็น /home, /var อีกที

เตรียม Disk Partition เพื่อใช้ทำเป็น LVM

เริ่มต้นเราต้องเลือก parition ที่จะใช้ทำเป็น LVM โดยใช้คำสั่ง fdisk ในการสร้าง ตัวอย่างเช่นสมมติว่าเรามีฮาร์ดดิสก์อยู่สองตัว ซึ่งเป็นตัวใหม่ที่ยังไม่เคยถูกใช้งานเลยต่ออยู่เป็น /dev/sdb และ /dev/sdc เราต้องสร้าง partition ขึ้นมาใหม่แล้วเปลี่ยนชนิดของ partition ให้เป็นแบบ “Linux LVM” ได้ตามตัวอย่างต่อไปนี้

สร้าง Physical Volume บน Disk Partition
ขั้นตอนนี้เราจะทำการสร้าง Physical Volume ขึ้นมาบน Disk Partition ที่เราเพิ่งสร้างไปคือ /dev/sdb1 และ /dev/sdc1 โดยเราสามารถทำได้โดยใช้คำสั่ง pvcreate ในการสร้างและใช้คำสัง pvdisplay ในการตรวจสอบได้ ตามตัวอย่างต่อไปนี้

ตัวอย่างการสร้าง Physical Volume บน Disk Partition

[root@server]# pvcreate /dev/sdb1 /dev/sdc1
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdc1" successfully created
[root@server ~]# pvdisplay
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 80.00 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID DE2WGx-ENyz-oxlv-jZ20-Le5l-pnvV-GzMeJ2
--- NEW Physical volume ---
PV Name /dev/sdc1
VG Name
PV Size 80.00 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID s0Wuj0-AYVd-jIZa-gmQp-n05o-MinM-xDQKVh

รวม Physical Volume ทำเป็น Volume Group
ขั้นตอนนี้เราจะนำ Physical Volume ที่เราสร้างมารวมกันเป็นก้อนๆ เดียวเป็น Volume Group โดยเราสามารถตั้งชื่อได้เพื่อสะดวกในการดูแลระบบต่อไป ในขั้นตอนนี้เราจะใช้คำสั่ง vgcreate ในการสร้างและ vgdisplay ในการตรวจสอบ ตามตัวอย่างต่อไปนี้

ตัวอย่างการสร้าง Volume Group

root@server ~]# vgcreate VG_HOME /dev/sdb1 /dev/sdc1
Volume group "VG_HOME" successfully created
[root@server ~]# vgdisplay
--- Volume group ---
VG Name VG_HOME
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 159.99 GB
PE Size 4.00 MB
Total PE 40958
Alloc PE / Size 0 / 0
Free PE / Size 40958 / 159.99 GB
VG UUID ivjNHc-GdhD-58jD-0b9H-LK8J-pY59-9Lj140

ตัวอย่างด้านบนนี้จะเป็นการรวม Physical Volume /dev/sdb1 และ /dev/sdc1 รวมเป็น Volume Group เดียวที่ชื่อ VG_HOME

แบ่ง Volume Group ออกเป็น Logical Volume
เมื่อเราได้ Volume Group แล้ว เราจะนำมาแบ่งออกเป็นส่วนต่างๆ คือ Logical Volume เพื่อนำไปใช้งานอีกที สมมติว่าเราต้องการสร้าง Logical Volume สำหรับทำเป็น /home ขนาด 50GB สามารถทำได้โดยคำสั่งต่อไปนี้

ตัวอย่างการสร้าง Logical Volume ขนาด 50GB
[root@fc8-a ~]# lvcreate -L 50G -n LV_HOME VG_HOME
Logical volume "LV_HOME" created
[root@fc8-a ~]# lvdisplay
--- Logical volume ---
LV Name /dev/VG_HOME/LV_HOME
VG Name VG_HOME
LV UUID VldIjI-LyUr-raDW-Of5Z-Hwes-Sl1P-Hu2juQ
LV Write Access read/write
LV Status available
# open 0
LV Size 50.00 GB
Current LE 12800
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:0

ตัวอย่างด้านบนจะเป็นการสร้าง Logical Volume ที่ชื่อ LV_HOME ขนาด 50GB ซึ่งเป็นส่วนหนึ่งของ VG_HOME เวลานำไปใช้งานสร้าง filesystem เราสามารถอ้างอิงโดยใช้ชื่อเป็น /dev/VG_HOME/LV_HOME
สร้าง filesystem บน Logical Volume
หลังจากที่ได้ Logical Volume แล้ว เราต้องทำการสร้าง filesystem ขึ้นมาก่อนที่จะนำไป mount ใช้งานได้ คำสั่งที่ใช้ในการสร้างก็เหมือนกับเราสร้างบน partition ทั่วไปนั่นเอง คือคำสั่ง mke2fs ในที่นี้เราจะสร้าง ext3 filesystem

ตัวอย่างการสร้าง ext3 filesystem บน Logical Volume

[root@server ~]# mke2fs -j /dev/VG_HOME/LV_HOME
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
6553600 inodes, 13107200 blocks
655360 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
400 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

ทำการ mount filesystem
สุดท้ายเราต้อง mount filesystem บน path ที่เราต้องการเช่น /home แต่สำหรับการทดสอบการก่อนใช้งานจริง แนะนำให้ mount เป็น path อื่นก่อนเช่น /mnt/home

ตัวอย่างการ mount filesystem
[root@server ~]# mkdir /mnt/home
[root@server ~]# mount /dev/VG_HOME/LV_HOME /mnt/home
[root@server ~]# df -k
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 9196792 3850748 4871324 45% /
tmpfs 225064 0 225064 0% /dev/shm
/dev/mapper/VG_HOME-LV_HOME
51606140 184272 48800428 1% /mnt/home

========================================

First, make a file system on it. Your system already has ext4 (there are other choices):

mkfs.ext4 /dev/ubuntu-vg/iew-vm-lv

Then find its unique UUID identifier, the line has the name you gave the LV:

blkid

Edit /etc/fstab and add a line similar to this. Your UUID and mount point will be different.

UUID=fcde9bb7-4311-41e2-986a-647a672ebf83 /mnt/example ext4 defaults        0 2

Make this mount point directory and mount it:

mkdir /mnt/example
mount /mnt/example

 by the author.

--

--