Logical Volume Manager (LVM) Examples

LVM Adding and Removing Disk Examples

Adding and Removing Disk with LVM - Example 03


In this example we are going to go through the basic procedure for adding a disk to LVM. We will then add a second larger disk and move the data from the smaller disk to the larger disk. Two disks have been added into our Virtual environment and can be seen from the "fdisk -l" command below.




[root@centos ~]# fdisk -l

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sdc: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Initially we are only going to use the smaller disk "/dev/sdb" (2147 MB).


Create a Partition using fdisk


First we need create a partition for use with LVM. To start the interactive dialogue we issue the command "fdisk /dev/sdb".

We then select "n for a new partition, then "p" for primary. Next we accept the default partition number and the default size values. We select "t to set our system partition. Option "8e" is selected as this is for LVM. Once complete, we write our changes by selecting "w".



[root@centos ~]# fdisk /dev/sdb

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x55112c08.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-261, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-261, default 261):
Using default value 261

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

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

Create a Physical Volume (PV)


Our next step is to create a Physical Volume. To accomplish this we use the "pvcreate" command.



[root@centos ~]# pvcreate /dev/sdb1
  Writing physical volume data to disk "/dev/sdb1"
  Physical volume "/dev/sdb1" successfully created

Create a Volume Group (VG)


To create a Volume Group we use the command "vgcreate".



[root@centos ~]# vgcreate vg01 /dev/sdb1
  Volume group "vg01" successfully created

Check our PV and VG


We can display our changes by issuing the "pvs" and "vgs" commands:



[root@centos ~]# pvs
  PV         VG          Fmt  Attr PSize PFree
  /dev/sda2  vg_centos lvm2 a--  7.51g    0
  /dev/sdb1  vg01        lvm2 a--  2.00g 2.00g
[root@centos ~]# vgs
  VG          #PV #LV #SN Attr   VSize VFree
  vg01          1   0   0 wz--n- 2.00g 2.00g
  vg_centos   1   2   0 wz--n- 7.51g    0

From the above we can see that "/dev/sdb1" is now associated with the Volume Group "vg01". We can also see that only "1" PV is associated with the Volume Group.


Create a Logical Volume with all available space


The command for creating a Logical Volume is "lvcreate". In our example we give our Logical volume the name "lvdata01" and specify that we will be using 100% of available space from the Volume Group "vg01".



[root@centos ~]# lvcreate -n lvdata01 -l 100%VG vg01
  Logical volume "lvdata01" created

Checking the PV and LV


If we now issue the commands "lvs" and "vgs" we can check the current stat of our configuration:



[root@centos ~]# lvs
  LV       VG          Attr     LSize Pool Origin Data%  Move Log Copy%  Convert
  lvdata01 vg01        -wi-a--- 2.00g
  lv_root  vg_centos -wi-ao-- 6.04g
  lv_swap  vg_centos -wi-ao-- 1.47g
[root@centos ~]# vgs
  VG          #PV #LV #SN Attr   VSize VFree
  vg01          1   1   0 wz--n- 2.00g    0
  vg_centos   1   2   0 wz--n- 7.51g    0

From the above we can see that our Logical Volume is 2GB in size and that it is associated with the Volume Group "vg01"


Create a Filesystem


To create a filesystem we will use the "mkfs.ext3". This will create a filesystem of type "ext3".



[root@centos ~]# mkfs.ext3 /dev/vg01/lvdata01
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
130816 inodes, 523264 blocks
26163 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 33 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override. 

Create a mount point for our filesystem


In this example we will create a directory called "/var/myspace". This will become our mount point. The command used for creating a directory is "mkdir". The command used for mounting our filesystem is "mount".



[root@centos ~]# mkdir /var/myspace

[root@centos ~]# mount /dev/vg01/lvdata01 /var/myspace

Once we have mounted our filesystem we can check this easily by issuing the command "df -h".



[root@centos ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos-lv_root
                      6.0G  4.7G  1.1G  82% /
tmpfs                 250M     0  250M   0% /dev/shm
/dev/sda1             485M   38M  422M   9% /boot
/dev/mapper/vg01-lvdata01
                      2.0G   36M  1.9G   2% /var/myspace

We can now see from the above output that our filesystem has been mounted and has "1.9GB" of available space.


Add Entries into Mount Table


For a filesystem to be mounted automatically at boot time, it needs to have an entry defined in what is known as the "mount table". For our filesystem to be automatically mounted, we need to add the following line to the file "/etc/fstab":



/dev/vg01/lvdata01      /var/myspace            ext3    defaults        0 0

Once the line has been added you can test the syntax by issuing the command "mount -a". Any entries in the "/etc/fstab" will be mounted.



Create a large file


For this exercise we are going to create a single file of "1GB" in size. One of the easiest ways to create a large file is to use the "dd" command:



[root@centos myspace]# dd if=/dev/zero of=/var/myspace/big_file.img bs=1G count=1

[root@centos myspace]# ls -lh big*
-rw-r--r--. 1 root root 1.0G Apr 12 08:50 big_file.img

We now have a file called "big_file.img" of "1GB" in size. After creating this file, we can now see from the following "df -h" command that we have used "56%" of our available space!



[root@centos myspace]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos-lv_root
                      6.0G  4.7G  1.1G  82% /
tmpfs                 250M     0  250M   0% /dev/shm
/dev/sda1             485M   38M  422M   9% /boot
/dev/mapper/vg01-lvdata01
                      2.0G  1.1G  850M  56% /var/myspace

Adding another Disk


In our exercise we are now going to add an additional disk to increase the amount of space available. The process will be the same as the first disk. Before we add our next disk we will unmount our filesystem with the "umount" command:



[root@centos myspace]# umount /var/myspace

The disk we are going to add is "/dev/sdc". We can view this again from the command "fdisk -l"


Disk /dev/sdc: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Prepare our new disk for use with LVM



[root@centos /]# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xdd63f450.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-522, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-522, default 522):
Using default value 522

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

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

Create a new Physical Volume for new Disk


To create the PV, we will use the now familiar "pvcreate" command:



[root@centos /]# pvcreate /dev/sdc1
  Writing physical volume data to disk "/dev/sdc1"
  Physical volume "/dev/sdc1" successfully created

Add new Disk to Existing Volume Group


We now issue the "vgextend" command to add "/dev/sdc1" to our existing Volume Group "vg01"



[root@centos /]# vgextend vg01 /dev/sdc1
  Volume group "vg01" successfully extended

pvmove command - move data from one disk to another


Now we are going to move data from /dev/sdb1 to our larger area /dev/sdc1 using the "pvmove" command:



[root@centos /]# pvmove /dev/sdb1 /dev/sdc1
  /dev/sdb1: Moved: 0.4%
  /dev/sdb1: Moved: 16.8%
  /dev/sdb1: Moved: 34.6%
  /dev/sdb1: Moved: 51.1%
  /dev/sdb1: Moved: 75.0%
  /dev/sdb1: Moved: 100.0%

Remove /dev/sdb1 from Volume Group


Our next step in the exercise is to remove "/dev/sdb1" from the Volume Group "vg01" using the "vgreduce" command:



[root@centos /]# vgreduce vg01 /dev/sdb1
  Removed "/dev/sdb1" from volume group "vg01"

Remove a Physical Volume


Our next step is to remove /dev/sdb1 from LVM with the "pvremove command:



[root@centos /]# pvremove /dev/sdb1
  Labels on physical volume "/dev/sdb1" successfully wiped

Extend Logical Volume and Filesystem


To use our new added space we need to extend our Logical Volume "/dev/vg01/lvdata01" and filesystem. The command for this task is "lvextend. Notice, we will use the "-r option to automatically resize our filesystem:



[root@centos /]# lvextend /dev/vg01/lvdata01 /dev/sdc1 -r
fsck from util-linux-ng 2.17.2
/dev/mapper/vg01-lvdata01: 12/130816 files (0.0% non-contiguous), 279590/523264 blocks
  Extending logical volume lvdata01 to 4.00 GiB
  Logical volume lvdata01 successfully resized
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/vg01-lvdata01 to 1047552 (4k) blocks.
The filesystem on /dev/mapper/vg01-lvdata01 is now 1047552 blocks long.

And finally.... Mount our filesystem again



[root@centos /]# mount /dev/vg01/lvdata01 /var/myspace
[root@centos /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos-lv_root
                      6.0G  4.7G  1.1G  82% /
tmpfs                 250M     0  250M   0% /dev/shm
/dev/sda1             485M   38M  422M   9% /boot
/dev/mapper/vg01-lvdata01
                      4.0G  1.1G  2.7G  28% /var/myspace


Now this time when we issue the "df -h" command, we can see that we have now only utilised "28%" of our available space. Our Volume Group is now "4GB" in size. And we have our "big_file.img":



[root@centos myspace]# ls -l /var/myspace
total 1049620
-rw-r--r--. 1 root root 1073741824 Apr 12 08:50 big_file.img