Tuesday, January 5, 2010

Resizing a RHEL 4 & 5 LVM in a VMWare Guest

Nothing like starting the new year with an "out of space" problem.

So, I have a RHEL 5.3 image running under VMWare Fusion. I needed more space in order to install some more software... easy I thought until I tired it and with the help of several blogs and other posting, I thought I would put my recipe into words. So the challenge is to add and extra 2GB into the root filesystem

Step 1 - Cleanly shutdown your VMWare guest
Suggest that you shutdown cleanly as you can to ensure that all other steps go smoothly.

Step 2 - Remove your Snapshots of the Guest
VMWare Fusion on a Mac forces you to remove any snapshots before you can re-size the disk

Step 3 - Resize the disk
There are some command line tools for doing this, but in the 'Hardware Settings' for the guest you can resize a disk (in VMWare Fusion and above).

Step 4 - Restart your Guest
Restart you guest

Step 5 - Look at your disk space
If you look at the disk psace from your guest, you will see that it show no extra disk space! This is simply because the O/S has not seen the added space yet. Use "df" to take a look at the mounted volumes on your system.
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
3.8G 3.2G
427M 89% /
/dev/sda1 99M 12M 82M 13% /boot
tmpfs 506M 0 506M 0% /dev/shm
.host:/ 233G 173G 61G 74% /mnt/hgfs

As you can see, we have 427M if space left on the root file-system "/".

Step 6 - Make sure that there is free space
You can next check if the O/S can see the free space. Use the utility "parted" to view the partitions.
[root@localhost ~]# parted
GNU Parted 1.8.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)
print free

Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number Start End Size Type File system Flags
1 32.3kB 107MB 107MB primary ext3 boot
2 107MB 6440MB 6333MB primary lvm
6440MB 8587MB 2147MB Free Space

(parted) quit
Step 7 - Make a new partition out of the free space
In the step above you can see the free space, which starts at 6440MB and ends at 8587MB. You now need to make a new partition, using "parted" again
[root@localhost ~]# parted
GNU Parted 1.8.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)
mkpart
Partition type? primary/extended?
primary
File system type? [ext2]?
ext3
Start?
6440
End?
8587

(parted)
print

Model: VMware, VMware Virtual S (scsi)
Disk
/dev/sda: 8590MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number Start End Size Type File system Flags
1 32.3kB 107MB 107MB primary ext3 boot
2 107MB 6440MB 6333MB primary lvm
3 6440MB 8587MB 2147MB primary

(parted)
quit
We have a new partition out of the free space... but we have not finished yet!

Step 8 - Create the Physical Volume from the Partition
Now that we have a partition on the disk we now create a physical volume using the "pvcreate" command.
[root@localhost ~]# pvcreate /dev/sda3
Physical volume "/dev/sda3" successfully created
The device name (/dev/sda3) came from Step 7, concatenating the device name (/dev/sda) with the partitions number (3) to get /dev/sda3.

Step 9 - Determine the Volume Group
Now that we have a partition, we need to add it into the Volume Group. First find the name of the volume group using the "vgscan" command.
[root@localhost ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "
VolGroup00" using metadata type lvm2
Step 10 - Add the partition into the Volume Group
Now add the partition into the volume group using the "vgextend" command.
[root@localhost ~]# vgextend VolGroup00 /dev/sda3
Volume group "VolGroup00" successfully extended
Here's where we got the information from
  • VolGroup00 came from Step 8
  • /dev/sda3 came from Step 7, concatenating the device name (/dev/sda) with the partitions number (3) to get /dev/sda3
Step 11 - Extend the Logical Volume
Next we have to tell the Logival Volumn Manager (LVM) that we have an additional partition to add. We do this using the "lvextend" command.

[root@localhost ~]# lvextend -l +63 /dev/VolGroup00/LogVol00 /dev/sda3
Extending logical volume LogVol00 to 5.84 GB
Logical volume LogVol00 successfully resized
What the command says above is the following
  • Use partition /dev/sda3
  • On Volume /dev/VolGroup00/LogVol00 (the name comes from Step 5)
  • By 63 extents, this is roughly 2GB. There are other options that let you specific this in terms of GB, percentage free etc.
Step 12 - Now extend the filesystem
The the Logical Volume is just a collection of space. Typically you then take this space and create a file-system. Given that we have a file-system we want to extend it with the space we just added to the Logical Volume. We do this with the "resize2fs" command.

Step 12.1 - Redhat 4.x

localhost ~]# ext2online /dev/VolGroup00/LogVol00

Step 12.2 - Redhat 5.x
[root@localhost ~]# resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 1531904 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 1531904 blocks long.
This command takes all the space we added to the Logical Volume... now the acid test, do we see the free space in the file-system?

Step 13 - Check for free space
Check for the free space, using the "df" command.
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
5.7G 3.2G 2.3G 59% /
/dev/sda1 99M 12M 82M 13% /boot
tmpfs 506M 0 506M 0% /dev/shm
.host:/ 233G 173G 61G 75% /mnt/hgfs

Success! You can see we now have an extra 2GB of free space! Go make yourself a cup of tea.

14 comments:

bitfinfo said...

Awesome post, save me a ton of time. Note that this works on CentOS 5.4 as well, likely many other *nix as well.

powernethk said...

using "vgdisplay VolGroup00" to find out the "Free PE / Size"
For example:

Free PE / Size 30 / 960.00 MB

lvextend -l+30 /dev/VolGroup00/LogVol00

Diosan said...

Thank you very very much... I was struggling with this until I saw your post... it practically saved my life... thank you so much

iangardner said...

Proper job!
Used your instructions on Centos 5.5 server.
parted print free gives space in GB which can be used in parted mkpart start and end values. Also lvextend can just be given logical volume name and partition name, e.g. lvextend /dev/mapper/VolGroup00-LogVol00 /dev/sda3 assuming you want to use up all the free space.

Bawhead III said...

Absolute genius. You just saved what remaining hair I have and a ton of time and hassle. Great detail, following the exact process.
Thanks again!!

dingetje said...

Most excellent! Thanks for posting this how-to. Worked like a charm on CentOS 4.6 after searching on the official sites to no avail.

Olli said...
This comment has been removed by the author.
Olli said...

Thanks a lot, just what I needed!

And I found out that it's even easier to use system-config-lvm in CentOS 5.5 at least. After using parted to created the new partition as instructed, use system-config-lvm to mount the new partition:

-> Select VolGroup00 _Physical View_
- "Extend Volume Group", select newly created partition e.g. /dev/sda3
-> Select VolGroup00 _Logical View_
- select Logical Volume which is mounted to "/" (or which ever mount you which to extend)
- click "Edit Properties" and click "Use Remaining" to allocate all remaining space to this mount

John said...

Thank you very much for this post! Much appreciated.

Kaj said...

This post right here: Awesome. Thanks a lot. Saved me a ton of time.

Alvin said...

Thanks for all the feedback, much appreciated! I just wrote down what proved to be a complex solution to a simple task. Glad its been of help!

Unknown said...

Thanks again, 2013 and still save people lots of time!

nyet said...

2014 and you saved my hairy bacon. Thanks!

Allison Cassatta said...

You are a LIFESAVER to this Linux newbie!!!! Thank you!!!