การใช้งาน Logical Volume Manager (LVM)

ใน Linux สามารถที่จะนำเอา physical volume หรือ hardisk มารวมกันใช้งานเป็นก้อน เรียกว่า volume groups (VG) มีลักษณะเป็น Logical Abstraction layer และนำเอา VG มาแบ่งเป็น Logical Volume (LV) ตามขนาดที่ต้องการ ก่อนนำไป mount กับ file system

LVM มีความยืดหยุดในการใช้งาน สามารถที่จะเพิ่มหรือลดขนาดได้โดยไม่จำเป็นต้องหยุด Application หรือไม่จำเป็นต้อง unmount file systems

Disk ที่นำมาใช้งานเป็น Physical volume ไม่จำเป็นต้องมีขนาดที่เท่ากัน โดยหน่วยขนาดของความจุ จะอ้างอิงเป็นหน่วยเรียกว่า extents แต่ละ extends มีขนาด 4 MB เช่นหาก PV1 มีขนาดตามรูปด้านล่าง 200 extents ก็มีขนาด 800MB

ขั้นตอนการใช้งาน

  1. initialize partition ด้วย คำสั่ง fdisk และมีชนิดเป็น 8e (Linux LVM)
  2. เปลี่ยน partition ที่ต้องการใช้งาน เป็น LVM ให้เป็น Physical Volume ด้วยคำสั่ง pvcreate
  3. สร้าง Volume Group จาก Physical Volume ที่สร้างจากข้อที่ 1
  4. สร้าง Logical Volume และ Mount กับ file system

vim Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
  config.vm.network "private_network", ip: "192.168.33.100"
  config.vm.provider "virtualbox" do |vb|
      unless File.exist?('./secondDisk.vdi')
        vb.customize ['createhd', '--filename', './secondDisk.vdi', '--variant', 'Fixed', '--size', 10 * 1024]
      end
      unless File.exist?('./thirdDisk.vdi')
        vb.customize ['createhd', '--filename', './thirdDisk.vdi', '--variant', 'Fixed', '--size', 20 * 1024]
      end
      unless File.exist?('./fourthDisk.vdi')
        vb.customize ['createhd', '--filename', './fourthDisk.vdi', '--variant', 'Fixed', '--size', 30 * 1024]
      end

     vb.memory = "4096"
     vb.cpus = "2"
     vb.customize ['storageattach', :id,  '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', './secondDisk.vdi']
     vb.customize ['storageattach', :id,  '--storagectl', 'SATA Controller', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', './thirdDisk.vdi']
     vb.customize ['storageattach', :id,  '--storagectl', 'SATA Controller', '--port', 3, '--device', 0, '--type', 'hdd', '--medium', './fourthDisk.vdi']

  end
end

สำหรับ Vagrantfile จะมีการเพิ่ม disk ไป 3 ลูก /dev/sdb, /dev/sdc, /dev/sdd ที่มีขนาดที่ไม่เท่ากัน

# lsblk
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda           8:0    0  40G  0 disk 
├─sda1        8:1    0   1G  0 part /boot
└─sda2        8:2    0  39G  0 part 
  ├─cl-root 253:0    0  37G  0 lvm  /
  └─cl-swap 253:1    0   2G  0 lvm  [SWAP]
sdb           8:16   0  10G  0 disk 
sdc           8:32   0  20G  0 disk 
sdd           8:48   0  30G  0 disk

จากนั้นใช้คำสั่ง fdisk เพื่อแบ่ง partition และ ชนิด 8e ทั้ง /dev/sdb, /dev/sdc/, /dev/sdd ดังตัวอย่าง

# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xa3b934b4.

Command (m for help): n                           #<----  new partition
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p                              #<---- เลือกเป็น primary
Partition number (1-4, default 1): 
First sector (2048-20971519, default 2048):         #<---- Enter ผ่าน 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519):   #<------ Enter ผ่าน 
Using default value 20971519
Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): t                               #<---- เปลี่ยนชนิด 
Selected partition 1
Hex code (type L to list all codes): 8e               #<---- เลือกเป็น  8e
Changed type of partition 'Linux' to 'Linux LVM'

Command (m for help): w                              #<---- บันทึกการเปลี่ยนแปลง
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

ให้ทำซ้ำอีกครั้งกับ /dev/sdc, /dev/sdd

# partprobe
# lvmdiskscan 
  /dev/cl/root [      36.99 GiB] 
  /dev/sda1    [       1.00 GiB] 
  /dev/cl/swap [       2.00 GiB] 
  /dev/sda2    [      39.00 GiB] LVM physical volume
  /dev/sdb1    [      10.00 GiB] 
  /dev/sdc1    [      20.00 GiB] 
  /dev/sdd1    [      30.00 GiB]

เมื่อแบ่ง partition เรียบร้อยให้ เปลี่ยน /dev/sdb, /dev/sdc, /dev/sdd เป็น physical volume ด้วยคำสั่ง pvcreate

# pvcreate /dev/sdb1  /dev/sdc1  /dev/sdd1
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdc1" successfully created.
  Physical volume "/dev/sdd1" successfully created.

ตรวจสอบกับ lvmdiskscan, pvdisplay, pvscan

# lvmdiskscan 
  /dev/cl/root [      36.99 GiB] 
  /dev/sda1    [       1.00 GiB] 
  /dev/cl/swap [       2.00 GiB] 
  /dev/sda2    [      39.00 GiB] LVM physical volume
  /dev/sdb1    [      10.00 GiB] LVM physical volume
  /dev/sdc1    [      20.00 GiB] LVM physical volume
  /dev/sdd1    [      30.00 GiB] LVM physical volume
  2 disks
  1 partition
  0 LVM physical volume whole disks
  4 LVM physical volumes
# pvdisplay /dev/sdb1
  "/dev/sdb1" is a new physical volume of "10.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               10.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               6xbIOv-t4Ho-XZ2p-DBxD-Epqm-fSkM-MYIGnq
# pvscan 
  PV /dev/sda2   VG cl              lvm2 [39.00 GiB / 4.00 MiB free]
  PV /dev/sdd1                      lvm2 [30.00 GiB]
  PV /dev/sdb1                      lvm2 [10.00 GiB]
  PV /dev/sdc1                      lvm2 [20.00 GiB]
  Total: 4 [98.99 GiB] / in use: 1 [39.00 GiB] / in no VG: 3 [60.00 GiB]

สร้าง volume group ชื่อ vg00 จาก /dev/sdb1, /de/sdc1 (เก็บ /dev/sdd1 ไว้ทดสอบการ ขยาย) ด้วยคำสั่ง volume group

# vgcreate vg00  /dev/sdb1  /dev/sdc1
  Volume group "vg00" successfully created

ทดสอบด้วยคำสั่ง pvdisplay

[root@localhost ~]# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vg00                 #<---  ชื่อ ของ volume groups
  PV Size               10.00 GiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              2559                 #<---- ขนาดในหน่วย ของ  Extents
  Free PE               2559
  Allocated PE          0
  PV UUID               6xbIOv-t4Ho-XZ2p-DBxD-Epqm-fSkM-MYIGnq

  --- Physical volume ---
  PV Name               /dev/sdc1
  VG Name               vg00
  PV Size               20.00 GiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               5119
  Allocated PE          0
  PV UUID               LhpsHn-Wlh0-8fcT-4KU3-TWkS-C2XK-js66gy

  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               39.00 GiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              9983
  Free PE               1
  Allocated PE          9982
  PV UUID               0e82iE-fRXw-jQyw-M0R3-jQ3P-g0af-HLjZlU

  "/dev/sdd1" is a new physical volume of "30.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd1
  VG Name               
  PV Size               30.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               jG82dh-6X3e-3S8R-cXpi-KM2g-MJru-p35nfx

ทดสอบด้วยคำสั่ง vgdisplay

[root@localhost ~]# vgdisplay 
  --- Volume group ---
  VG Name               vg00
  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               29.99 GiB
  PE Size               4.00 MiB
  Total PE              7678                #<----  /dev/sdb1=2559  +  /dev/sdc1=5119           
  Alloc PE / Size       0 / 0   
  Free  PE / Size       7678 / 29.99 GiB
  VG UUID               0cLfsz-eNQJ-ZG8n-A06q-txXq-kULK-igHZtJ

  --- Volume group ---
  VG Name               cl
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               39.00 GiB
  PE Size               4.00 MiB
  Total PE              9983
  Alloc PE / Size       9982 / 38.99 GiB
  Free  PE / Size       1 / 4.00 MiB
  VG UUID               D47t6F-tUkH-QAA3-z5hE-npc3-uwZd-0kZQ77

สร้าง logical volume ขนาด 2G ชื่อ lv01

[root@localhost ~]# lvcreate -L 2G -n lv01  vg00
  Logical volume "lv01" created.
[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/vg00/lv01
  LV Name                lv01
  VG Name                vg00
  LV UUID                4dUn2b-GAYi-HGch-QKFM-fNAD-Xpdn-hRlH2T
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-11-16 14:17:40 +0000
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

สร้าง logical volume แต่มีหน่วยเป็น 1000 extent

[root@localhost ~]# lvcreate -l 1000  -n lv02  vg00
  Logical volume "lv02" created.
[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/vg00/lv01
  LV Name                lv01
  VG Name                vg00
  LV UUID                4dUn2b-GAYi-HGch-QKFM-fNAD-Xpdn-hRlH2T
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-11-16 14:17:40 +0000
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

  --- Logical volume ---
  LV Path                /dev/vg00/lv02
  LV Name                lv02
  VG Name                vg00
  LV UUID                ZT4unL-yRPD-Rk8e-EPRP-Bd2c-0yzj-2MVqBA
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-11-16 14:21:38 +0000
  LV Status              available
  # open                 0
  LV Size                3.91 GiB
  Current LE             1000                  #<---  ขนาด 1000 extent
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:3

ขยาย /dev/vg00/lv01 อีก 2 Gigabyte

# lvextend -L +2G /dev/vg00/lv01  
  Size of logical volume vg00/lv01 changed from 2.00 GiB (512 extents) to 4.00 GiB (1024 extents).
  Logical volume vg00/lv01 successfully resized.

สร้าง File system

# mkfs.ext4  /dev/vg00/lv01
# mkdir /data01
# mount /dev/vg00/lv01  /data01

# mount | grep lv01
/dev/mapper/vg00-lv01 on /data01 type ext4 (rw,relatime,seclabel,data=ordered)

# df -h /data01/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/vg00-lv01  3.9G   16M  3.6G   1% /data01

เราสามารถ ใช้ lvcreate -l ร่วมกับการกำหนด เป็น % เพื่อความสะดวก

# vgdisplay vg00  | grep Free
  Free  PE / Size       5654 / 22.09 GiB

# lvcreate -l 100%Free -n lv03 vg00
  Logical volume "lv03" created.

# lvdisplay /dev/vg00/lv03
  --- Logical volume ---
  LV Path                /dev/vg00/lv03
  LV Name                lv03
  VG Name                vg00
  LV UUID                bhtXoe-hXFb-sllD-C7OD-63ZG-FtEV-d4gLCq
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-11-16 14:42:55 +0000
  LV Status              available
  # open                 0
  LV Size                22.09 GiB
  Current LE             5654
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:4

  [root@localhost ~]# vgdisplay vg00  | grep Free
  Free  PE / Size       0 / 0                      #<---  ใช้ vg00 หมดแล้ว

เรายังมี disk /dev/sdd1 เหลืออยู่ ให้นำมาเพิ่ม ใน volume group vg00 เติมเข้าไป

# vgextend vg00 /dev/sdd1
  Volume group "vg00" successfully extended

# vgdisplay vg00  | grep Free
  Free  PE / Size       7679 / 30.00 GiB

การขยาย file system หลังขยาย logical volume

เพิ่ม +5G ให้แก่ /dev/vg00/lv01

# lvextend -L +5G /dev/vg00/lv01
  Size of logical volume vg00/lv01 changed from 4.00 GiB (1024 extents) to 9.00 GiB (2304 extents).
  Logical volume vg00/lv01 successfully resized.

# df -h /data01/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/vg00-lv01  3.9G   16M  3.6G   1% /data01

แต่ file system ยังมีขนาด เท่าเดิม ดังนั้นจึงต้องขยาย file system ด้วยคำสั่ง resize2fs

[root@localhost ~]# resize2fs /dev/vg00/lv01
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg00/lv01 is mounted on /data01; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/vg00/lv01 is now 2359296 blocks long.

[root@localhost ~]# df -h /data01/
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/vg00-lv01  8.8G   18M  8.4G   1% /data01

การลบ logical volume

# lvremove /dev/vg00/lv03
Do you really want to remove active logical volume vg00/lv03? [y/n]: y
  Logical volume "lv03" successfully removed

ลบ physical volume จาก volume group

# vgreduce vg00  /dev/sdd1
  Physical volume "/dev/sdd1" still in use

ลบไม่ได้ เนื่อง จาก ยังคงใช้งานอยู่ ทดสอบด้วยการลบทั้งหมด

# umount /data01
# lvremove /dev/vg00/lv01
# lvremove /dev/vg00/lv02
# lvremove /dev/vg00/lv03


# vgreduce vg00  /dev/sdd1
  Removed "/dev/sdd1" from volume group "vg00"

นำ Disk ไปใช้กับ volume group cl เพื่อต้องการ ขยาย root

# lvextend -L +10G  /dev/cl/root 
  Size of logical volume cl/root changed from 36.99 GiB (9470 extents) to 46.99 GiB (12030 extents).
  Logical volume cl/root successfully resized.

results matching ""

    No results matching ""