LVM: Extending Physical Volume (under VMWare) - vmware

I have a virtual server under VMware, where I got 10 more GB harddisk from the sysadm.
Inside Linux (running Ubuntu 11.04 server), things are set up with LVM. In [c]fdisk, I do find these extra 10 gigs - they are present directly after the primary LVM partition.
I understand that I could make a new LVM partition out of this extra space, and then add this to the volume group, and then to the logical volume, and then resize the filesystem.
However, is it possible to assimilate these extra gigs into the existing LVM partition? So that the LVM's view of the physical volume increased instead of adding another physical volume into the volume group (preferably automatically percolating up to the volume group)?

I just built a test virtual machine with a 15GB disk and LVM on /dev/sda2. Then I grew the disk to 20GB and made LVM see the extra 5GB without adding another physical volume.
Here are the steps I followed:
apt-get install gnu-fdisk (or yum install gnu-fdisk)
I had to use gfdisk to make the whole thing work. No luck with the "standard" fdisk.
gfdisk /dev/sda
Switch to "sectors" as the unit (this is critical!!!) and print the partition table:
Command (m for help): u
Changing display/entry units to sectors
Command (m for help): p
Disk /dev/sda: 21 GB, 21089617920 bytes
255 heads, 63 sectors/track, 2564 cylinders, total 41190660 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 499711 257008 83 Linux
Warning: Partition 1 does not end on cylinder boundary.
/dev/sda2 501758 29798632 14643247 8e Linux LVM
Warning: Partition 2 does not end on cylinder boundary.
Command (m for help):
Write down the "start" sector of the "Linux LVM" partition (/dev/vda2).
Delete the partition and recreate it using the same "start" sector (501758) and the same partition type (8e):
Command (m for help): d
Partition number (1-2): 2
Command (m for help): n
Partition type
e extended
p primary partition (1-4)
p
First sector (default 63s): 501758
Last sector or +size or +sizeMB or +sizeKB (default 41190659s):
Command (m for help): p
Disk /dev/sda: 21 GB, 21089617920 bytes
255 heads, 63 sectors/track, 2564 cylinders, total 41190660 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 499711 257008 83 Linux
Warning: Partition 1 does not end on cylinder boundary.
/dev/sda2 501758 41190659 20338290 83 Linux
Command (m for help): t
Partition number (1-2): 2
Hex code (type L to list codes): 8e
Changed type of partition 2 to 8e (Linux LVM)
Command (m for help):
WARNING: please note that I didn't accept the default start sector for the partition, I entered it manually so that it matches the original value! I did accept the default value for the "last sector" though, because I want this partition to be as large as the disk.
Verify that you did everything correctly with "p" and write the new partition table to disk:
Command (m for help): w
Reboot the virtual machine.
Now log-in the virtual machine and run:
root#git:~# pvresize /dev/sda2
Physical volume "/dev/sda2" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
Done! Now run vgdisplay and you will see the extra 5GB available as free extents.
CAVEATS:
If LVM is not the last (or only) partition on the virtual machine disk, you might have an hard time extending the size of the partition. It might even be impossible.
If LVM is on a logical partition (which is where Debian puts it by default at install time) or in other words if LVM is on /dev/sda5 instead of /dev/sda2, you must write down the starting sector of both the extended partition (let's call it /dev/sda2) and the logical partition (let's call it /dev/sda5), then delete both partitions, then recreate them with the same starting sector. The last sector of both /dev/sda2 and /dev/sda5 should be the last sector of the disk.
Since this is a risky procedure I recommend doing a backup of the virtual machine before attempting it.

Here are the instructions I always use when I'm doing the same thing...
Do “fdisk –l /dev/sda” I’m assuming /dev/sda2 is your LVM partition
and you don’t have a /dev/sda3. Adjust the instructions to match your config.
1) Make sure you have expanded the VM disk.
2) do “fdisk /dev/sda”
p (to see existing partitions)
n (new partition)
p (primary partition) -- give it the next available partition number, probably 3
accept the defaults. It will use the rest of the disk
w (write changes)
3) REBOOT
4) run ‘pvcreate /dev/sda3’
5) run ‘vgdisplay’ to get the name of the volume group. In this example, it’s “VolGroup”, as in:
6) run vgextend VolGroup /dev/sda3
7) run “df” to see the name of the root volume group.
8) run lvextend /dev/mapper/VolGroup-lv_root -r -l+100%FREE
( the (-r) option causes it to format it, too)
9 run “df –h” to see your new disk space

This is one of the reasons I prefer to have one big physical volume on the VMs that is separate from the /boot and other initial parts. This allows you to create a whole disk as an LVM physical disk (pvcreate /dev/sdb). Then if you need to do a resize, none of the file system changes need to happen because it is directly on disk.
In that scenario, you simply run pvresize /dev/sdb and move on with your vgextend, lvextend and resize2fs. Much simpler to maintain.

Personally I followed the instruction in this blog.
To summarize the steps:
Increase the virtual disk size using the vm-ware tools vmware-vdiskmanager
Boot on another system (GParted live CD or mount an Iso CD-ROM to boot on)
Use the Gparted tools (easy and graphic interface) to increase the recently expended drive
remove the CD-ROM (or the ISO) and boot on the original partition.
For expanding my Linux VM (RedHat EL 6) I did boot on the GParted ISO image (from here) and I was able to extend the partition I wanted. Note I had to move the partition I wanted unchanged at the end.
It was safe with one of my colleague as well, but I would recommand to backup the VM before running Gparted Linux.

extend disk without reboot
echo 1 > /sys/block/sda/device/rescan
echo 1 > /sys/block/sdb/device/rescan
partprobe
gdisk fix warnging
parted change partion size
## parted can executed as command line. but this is very dangerous
parted -s /dev/sdb "resizepart 2 -1" quit
parted -s /dev/sdb "resizepart 3 100%" quit
resizepart 3 100%
pvresize /dev/sda3
lvextend -l +100%FREE cs/root
xfs_growfs /dev/cs/root

Related

While trying to create file system on my partition getting an error

Iam operating centos 7 on a virtual machine
I have /dev/sdb of size 1G
I used the following command to create a extended partition
fdisk /dev/sdb
n -- for adding new partition
e -- extended
Partition number --1
First sector -- default
Last sector -- +512M
entered W
partprobe /dev/sdb
mkfs.ext4 /dev/sdb1 /mnt
Got this error
Mke2fs 1.42.9 (28-dec-2013)
Mkfs.ext4 : invalid blocks '/mnt' on device '/dev/sdb1'
Not able to figure it out
I created a directory /data and tried it in place of /mnt still not worked
according to man mkfs.ext4 you need to either ignore last parameter given (/mnt) becasue the last argument AFTER the device is fs-size, not some path
OR provide actual fs-size, like 512m

Extend GlusterFS on top of LVM

I need to add more space to one of our gluster volumes. The volumes are replica 2 and sit on top of an LVM. The file system is XFS. The current size is 4TB and I want to resize to 6TB. The LVM has enough Free PEs on both replica servers.
--- Physical volume ---
PV Name /dev/sdb
VG Name gluster
PV Size 10,91 TiB / not usable 4,00 MiB
Allocatable yes
PE Size 4,00 MiB
Total PE 2861183
Free PE 1633407
Allocated PE 1227776
PV UUID F3CwNm-dceK-ezPY-7w12-OYT5-FLAH-U0a239
-
--- Physical volume ---
PV Name /dev/sdb
VG Name gluster
PV Size 10,91 TiB / not usable 4,00 MiB
Allocatable yes
PE Size 4,00 MiB
Total PE 2861183
Free PE 1618047
Allocated PE 1243136
PV UUID dWDEgF-0brq-9e6r-eqpO-jTeK-GJfb-c3MGbE
I've read somewhere, that it's enough to extend the LVM and to resize the FS on both hosts.
# lvextend -L +2T <lvm>
# xfs_growfs <lvm mountpoint>
I know that XFS has to be reseize while it's mounted. The LVM can also be resized during operations (although not recommended). And I've read somewhere that GlusterFS will automatically adapt to the new volume size as soon as both/all volumes have the new size.
Since the storage is used in an productive environment it's important to do this on the fly.
Has anyone any experience with this combination or can confirm that my approach is correct?
Thanks in advance.
To answer my own question:
Eventually we had to increase Gluster storage without downtime.
After extending the logical volume of all Gluster bricks to the same size and growing the xfs filesystem to the maximum size of the volume, the Gluster volume automatically adjusted the new size.
I'm not sure if it's the recommended way, but it worked for us like a charm (both replica 2 and replica 3 volumes).
According to the https://access.redhat.com/solutions/1517993 if you want, you can grow a glusterfs volume by growing its bricks rather than adding new ones.
You can do it following a usual file system resizing method (the method will depend on the underlying block device).
Example : the brick is set on an XFS file system on the LV VGgluster/brick1. We want to add another 500MB to this brick.
Check that you have free space on the VG containing the brick :
~~~
# vgs VGgluster
~~~
Grow the file system :
~~~
# lvextend --resizefs -L+500M VGgluster/brick1
~~~
The size has been updated on the client :
~~~
# df /glusterfs/mountpoint
From my experience: if it's a replica volume, you have to resize all volume's bricks. Until all bricks have the same size, the actual size of particular gluster volume will be equal the size of the smallest brick at the moment.

Add unallocated free space to LVM

I added 5 GB to primary disk under VMware. I can see 5GB free :
Number Start End Size Type File system Flags
32.3kB 1049kB 1016kB Free Space
1 1049kB 256MB 255MB primary ext2 boot
256MB 257MB 1048kB Free Space
2 257MB 215GB 214GB extended
5 257MB 215GB 214GB logical lvm
215GB 220GB 5370MB Free Space
How can I add this free space to my group volume ? I need create a new partition first?
Yes, you need to create a partition first and change partition's system id for LVM (code 8e).
Example:
fdisk /dev/sdb #Assuming this is the disk you added
press "n" #to create a new partition and following along.
press "t" #change the partition's system id to "8e"
press "w" #to write the changes
#Create PV.
pvcreate /dev/sdb1
#Add PV to the Volume Group
vgextend <VolumeGroup> /dev/sdb1
#Extend the logical volume
lvextend -l +100%FREE /dev/VolumeGroup/yourLV
Make sure the LV is not mounted when you extend it. Run "lvdisplay" to ensure the Logical Volume extended.
NOTE: If the filesystem doesn't expand you may try rebooting the machine or do fsck and then resize.

Correcting VirtualBox raw disk VMDK file after resizing a partition

I have a Windows 8.1 installation on second partition of my second HDD (/dev/sdb2 in Ubuntu) created using the command
VBoxManage internalcommands createrawvmdk -filename sdb2.vmdk -rawdisk /dev/sdb -partitions 2
Everything worked just fine - Windows installation was runable from VirtualBox and even bootable normally from GRUB. Last time when installing some software in Windows (PC booted up directly into Windows), I discovered there's not enough space on the system partition (/dev/sdb2) and enlarged it by 15 GB that were left spare on the HDD.
These changes made the Windows installation unusable in VirtualBox of course - it fails to boot offering some repair options. The first thing which I realized that is needed to do was enlarging the partition in the VMDK file, so I backed up the old sdb2.vmdk and sdb2-pt.vmdk files and recreated them with the same command as before.
This, however, made no change, because sdb2-pt.vmdk seems to be storing the boot record (MBR in my case, currently with GRUB) and some more stuff needed for Windows to work properly. My next attempt was replacing the new sdb2-pt.vmdk with the old one (with Windows bootloader and perhaps the old partition table) - this didn't work either.
How to update the VMDK files with the new partition size to make the enlarged Windows 8.1 installation bootable from VirtualBox again?
I have finally found the solution myself. Since the VBoxManage internalcommands createrawvmdk -filename sdb2.vmdk -rawdisk /dev/sdb -partitions 2 command produces two valid files based on the current disk structure, the only change needed was to recover the Windows boot loader from the old sdb2-pt.vmdk file which is a rather straightforward process. If you only wish to learn the recovery steps, you can skip the following theoretical part.
Some background information on the VMDK file format
VMWare Disk Format (VMDK) consists of two files - a descriptor file (sdb2.vmdk in the original question) and an extent file (sdb2-pt.vmdk). Their internal structure is well defined in the specification from VMWare. I'll sum up the most important parts:
The descriptor file (sdb2.vmdk) contains a section annotated # Extent description which can look something like this:
# Extent description
RW 63 FLAT "sdb2-pt.vmdk" 0
RW 41943040 ZERO
RW 83886080 FLAT "/dev/sdb" 58722304
RW 2 FLAT "sdb2-pt.vmdk" 63
RW 1191843568 ZERO
One extent description (a row from those above) has the following structure:
Access Size in sectors Type of extent Filename (Offset)
The offset parameter (specified only for FLAT type extents) specifies the offset (in sectors) of the given extent within the file Filename. Notice that file sdb2-pt.vmdk consists of two extents, the first 63 sectors long and the second only 2 sectors long.
The FLAT extent file sdb2-pt.vmdk is a raw data binary file identical to one you would obtain e.g. using the dd command on Unix-like systems. Since the sector size was 512 bytes in my case (I don't know if this is a general rule), the sdb2-pt.vmdk file (based on the new disk partitioning described in the extent description above) was (63+2)*512 bytes long.
Now to the second extent (the one with only 2 sectors in size). This is a padding extent which arose in my new partition table after enlarging the Windows partition (third extent in the description table). Since my previous partition table did not contain any such padding, the old sdb2-pt.vmdk file only contained the first 63 sectors long extent and thus was 1 024 bytes smaller than the new one generated by the VBoxManage internalcommands createrawvmdk -filename sdb2.vmdk -rawdisk /dev/sdb -partitions 2 command. This obviously rendered the old extent file and the new one incompatible.
The recovery process
Please be aware that the following steps apply to the old MBR disk structure only!
You surely want to keep the new partition structure and to propagate any changes made in the partition table to the VMDK file. Proceed with these steps:
Backup your old description file (sdb2.vmdk) and extent file (sdb2-pt.vmdk). In the following steps, you will only need the second one but you never know what else could happen.
Generate new descriptor and extent files issuing the command:
VBoxManage internalcommands createrawvmdk -filename sdb2.vmdk -rawdisk /dev/sdb -partitions 2
Now, the first extent entry in your new description file (sdb2.vmdk) should look like this:
RW ## FLAT "sdb2-pt.vmdk" 0
With the knowledge that you want to keep the new partition table (with everything what follows) and only restore the Windows boot loader stored in the backed up extent file (old sdb2-pt.vmdk), you have to copy the first 440 bytes (boot loader) from the old extent file to the new one. This can either be done with a hex editor (copy all values starting from address 0x0 up to 0x1B8 exclusive) or on a Unix-like system using the command:
dd if=old-sdb2-pt.vmdk of=sdb2-pt.vmdk bs=1 count=440
Violà.
On github there is a tool that will do that automatically (and re-running with same options will update its vmdk and auxiliary files, so you can change partitions too later) https://github.com/vasi/vmdk-raw-parts

Resizing disk space on vagrant box

I'd like to give my box some more disk space. I'm trying to do this through the vagrantfile as follows:
Vagrant::Config.run do |config|
# ..
config.vm.customize ["modifyvm", :id, "--memory", 1024]
config.vm.customize ["modifyhd", :id, "--resize", 4096]
end
This gives me the error:
A customization command failed:
["modifyhd", "e87d8786-88be-4805-9c2a-45e88b8e0e56", "--resize", "4096"]
The following error was experienced:
VBoxManage: error: The given path 'e87d8786-88be-4805-9c2a-45e88b8e0e56' is not fully qualified
VBoxManage: error: Details: code VBOX_E_FILE_ERROR (0x80bb0004), component Medium, interface IMedium, callee nsISupports
VBoxManage: error: Context: "OpenMedium(Bstr(pszFilenameOrUuid).raw(), enmDevType, enmAccessMode, fForceNewUuidOnOpen, pMedium.asOutParam())" at line 178 of file VBoxManageDisk.cpp
Please fix this customization and try again.
I'm trying to piece the information together from http://docs.vagrantup.com/v1/docs/config/vm/customize.html
http://www.virtualbox.org/manual/ch08.html#vboxmanage-modifyvdi
You are sending modifyhd the UUID of the VM (provided by vagrant) while it expects the UUID of the VDI.
You will need to use the absolute path to the actual VDI file or its UUID. You can use the following command to get the UUID of the VDI: VBoxManage showhdinfo <filename> (see virtualbox - how to check what is the uuid of a vdi?)
I created a new disk, added and extended the older.
My Vagrantfile:
Vagrant.configure(2) do |config|
config.vm.box = "bseller/oracle-standard"
config.vm.define :oracle do |oracle|
oracle.vm.hostname = 'oraclebox'
oracle.vm.synced_folder ".", "/vagrant", owner: "oracle", group: "oinstall"
oracle.vm.network :private_network, ip: '192.168.33.13'
oracle.vm.network :forwarded_port, guest: 1521, host: 1521
oracle.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "4096"]
vb.customize ["modifyvm", :id, "--name", "oraclebox"]
if !File.exist?("disk/oracle.vdi")
vb.customize [
'createhd',
'--filename', 'disk/oracle',
'--format', 'VDI',
'--size', 60200
]
vb.customize [
'storageattach', :id,
'--storagectl', "SATA",
'--port', 1, '--device', 0,
'--type', 'hdd', '--medium', 'disk/oracle.vdi'
]
end
end
oracle.vm.provision "shell", path: "shell/add-oracle-disk.sh"
oracle.vm.provision "shell", path: "shell/provision.sh"
end
end
This will create new disk in
disk
|-- oracle.vdi
shell
|-- provision.sh
Vagrantfile
and add in your box. The new disk is of 60GB
My shell provision.sh
set -e
set -x
if [ -f /etc/disk_added_date ] ; then
echo "disk already added so exiting."
exit 0
fi
sudo fdisk -u /dev/sdb <<EOF
n
p
1
t
8e
w
EOF
sudo pvcreate /dev/sdb1
sudo vgextend VolGroup /dev/sdb1
sudo lvextend -L50GB /dev/VolGroup/lv_root
sudo resize2fs /dev/VolGroup/lv_root
date > /etc/disk_added_date
This script was adapted from SHC to box bseller/oracle-standard. For full code, see my project oraclebox in GitHub
I've been looking at this, and I haven't found any way to actually do this directly. However, you can achieve the effect using Ansible as a provisioner. First of all, it is definitely possible with Vagrant to create and add a second disk, which you can then add and mount any way you like using Ansible.
However, Ansible also has the ability to run local commands (on the host). This is with Ansible's local_action feature. I used it here to reboot a Vagrant VM after a kernel upgrade and tell the host to wait until it has restarted, but you could use this with the command or shell actions to find the HD identifier, shutdown the VM, and configure the hard disk, then reboot. At least in theory.
Although the question is old but I saw no answer accepted.
The given path 'e87d8786-88be-4805-9c2a-45e88b8e0e56' is not fully qualified shows up because the UUID e87d8... is VirtualBox vm UUID, not your SATA storage disk device UUID. You an find the storage device UUID by VBoxManage showvminfo e87d8786-88be-4805-9c2a-45e88b8e0e56|grep vdi. The replace :id with the SATA storage UUID in Vagrantfile modifyhd line.
It solved my problem.
OK... Solved...
VBoxManage.exe wan't in my path so what I did was go to (you have to go to that path):
C:\Program Files\Oracle\VirtualBox
then used the command:
VBoxManage.exe modifyhd "C:\Users\MyUser\VirtualBox VMs\MachineName\HDName.vdi " --resize 20480
For 20 GB size a HD
This DON'T work:
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd "C:\Users\MyUser\VirtualBox VMs\MachineName\HDName.vdi " --resize 20480
You have to be in the path: C:\Program Files\Oracle\VirtualBox
You can add new disk instead.
First use virtual box GUI to add another
virtual disk
then use fdisk to create a primary disk partion
root#linux-dev:/# fdisk -l
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk /dev/sda: 9.9 GiB, 10632560640 bytes, 20766720 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x83312a2b
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 19816447 19814400 9.5G 83 Linux
/dev/sda2 19818494 20764671 946178 462M 5 Extended
/dev/sda5 19818496 20764671 946176 462M 82 Linux swap / Solaris
root#linux-dev:/# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.25.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.
Created a new DOS disklabel with disk identifier 0x5eb328b9.
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5eb328b9
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039):
Created a new partition 1 of type 'Linux' and of size 20 GiB.
Command (m for help): p
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5eb328b9
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 41943039 41940992 20G 83 Linux
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
Make newly created disk partition a ext4 filesystem
root#linux-dev:/# mkfs.ext4 /dev/sdb1
mke2fs 1.42.12 (29-Aug-2014)
Creating filesystem with 5242624 4k blocks and 1310720 inodes
Filesystem UUID: 0301b56a-1d80-42de-9334-cc49e4eaf7b2
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
Mount the disk partition to a directory
root#linux-dev:/# mount -t ext4 /dev/sdb1 /home/chenchun
root#linux-dev:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 9.2G 3.3G 5.5G 38% /
udev 10M 0 10M 0% /dev
tmpfs 74M 4.4M 70M 6% /run
tmpfs 185M 0 185M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 185M 0 185M 0% /sys/fs/cgroup
none 372G 240G 133G 65% /vagrant
/dev/sdb1 20G 44M 19G 1% /home/chenchun