thoughtexpo

Move /var to a new partition in VM

Published: Jan 19, 2021 • Lastmod: Mar 26, 2021 • Author: Leela Venkaiah G • 6 min read

Tags: #fedora

Well if there’s not enough planning in building a resource it’ll eat away our productive time when it fails or doesn’t work as anticipated. In the current context the effort in migrating /var partition might be less but if not done properly may result in data loss!

Current setup before migrating /var to new partition:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
-> cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME="Fedora 32 (Server Edition)"

-> lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   80G  0 disk 
├─sda1               8:1    0    1G  0 part /boot
└─sda2               8:2    0   79G  0 part 
  ├─fedora-root    253:0    0   45G  0 lvm  /
  └─fedora-swap    253:1    0  7.9G  0 lvm  [SWAP]

-> df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G  1.6M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/fedora-root   45G   16G   30G  36% /
tmpfs                    3.9G  4.0K  3.9G   1% /tmp
/dev/sda1               1014M  285M  730M  29% /boot
tmpfs                    786M     0  786M   0% /run/user/0

As you can infer from above there’s no separate mount for /var and currently is part of /, however I intend to move /var to a different partition for future use. Being a VM running on KVM host below are the steps that’ll be followed in brief:

  • Create a qcow2 image and attach to the VM
  • Create and mount xfs filesystem on newly added disk, rsync existing /var to newly mounted disc
  • Add details in /etc/fstab to mount /var on reboot

1. Attach disk to VM §

On a sidenote, if performing partioning on an existing disk please follow this guide . Back to our scenario, create and attach a new disk to the guest machine and perform below on KVM machine

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# Change below vars to your needs
-> disk_name=var-disk
-> disk_size=100G
-> vm_name=fedora-32
-> target_disk=sdb

# Get KVM default pool, if using some fancy directoy name please assign to 'pool_path' directly
-> pool_path=$(virsh pool-dumpxml default | grep -Po '(?<=path>)[[:alnum:]/.-]+(?=<)')

# Create 'qcow2' image with required size
-> qemu-img create -o preallocation=metadata -f qcow2 $pool_path/$disk_name $disk_size

# Attach newly created disk to VM
-> virsh attach-disk $vm_name --source $pool_path/$disk_name --target $target_disk --driver qemu --subdriver qcow2 --persistent

Verify the disk is created and attached to the guest (Fedora) machine

1
2
3
4
5
6
7
8
9
# On GUEST Machine verify disk is recognized
-> lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   80G  0 disk 
├─sda1               8:1    0    1G  0 part /boot
└─sda2               8:2    0   79G  0 part 
  ├─fedora-root    253:0    0   45G  0 lvm  /
  └─fedora-swap    253:1    0  7.9G  0 lvm  [SWAP]
sdb                  8:16   0  100G  0 disk

2. Create a file system on the disk §

After adding disk to VM, you can follow this guide until creation of filesystem, cause in our scenrio we are creating an xfs filesystem. Perform mkfs.xfs /dev/vg1/lv1 on host VM and a new filesystem will be created on the disk.

If incase you want to use already existing disk and create xfs on it, wipe (WARNING: potential data loss) existing file system headers by running wipefs -a <disk> and create new filesystem on that.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# On Guest (VM) verify volume group is created
-> lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   80G  0 disk 
├─sda1               8:1    0    1G  0 part /boot
└─sda2               8:2    0   79G  0 part 
  ├─fedora-root    253:0    0   45G  0 lvm  /
  └─fedora-swap    253:1    0  7.9G  0 lvm  [SWAP]
sdb                  8:16   0  100G  0 disk
└─vg1-lv1          253:2    0  100G  0 lvm

*If you wish not to go through all the hassle of creating LVM, you can simply run mkfs.xfs on new disk.

3. Sync /var to new disk §

We will mount new disk and to avoid any data writes we’ll be dropping to runlevel 1 and perform rsync data of /var to mounted disk

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-> mkdir /mnt/new-dir
-> mount /dev/mapper/vg1-lv1 /mnt/new-dir

# Drop to single user mode
-> telinit 1

# Check the runlevel and take note of last runlevel
-> who -r
         run-level 1  2021-01-20 07:49                   last=3

# rsync (or 'cp' also would work the same) 'var' contents to '/mnt/new-dir'
-> rsync -aqxp /var/* /mnt/new-dir/

# Rename '/var'
-> mv /var /var.old && mkdir /var

# Take note of UUID of LVM
-> UUID=$(blkid /dev/mapper/vg1-lv1 | grep -oP '(?<=UUID=").*?(?=")')

# Add entry in '/etc/fstab'
-> echo UUID=$UUID /var xfs defaults 0 0 >> /etc/fstab

# Unmount /mnt/new-dir and mount '/var' as mentioned in '/etc/fstab'
-> umount /mnt/new-dir
-> mount -a

# IMP: Restore SELinux labels on newly mounted partition
-> restorecon -R /var

# It's best to reboot the server to ascertain no errors
# Go to multi user mode (revert to last runlevel from line #9) and reboot the server
-> telinit 3 # ('last=3' in line #9, in GUI environment it's typically '5')
-> reboot

If everything checks out well, server should reboot without any issues with /var mounted as per /etc/fstab entries.

Verification and minimal troubleshoot §

After server restarts mount | grep var should be successfull, df -h should list /var being mounted on different filesystem and lsblk stating /var on lvm

Below is the info after migration:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-> mount | grep var
/dev/mapper/vg1-lv1 on /var type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

-> df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G  1.6M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/mapper/fedora-root   45G   16G   30G  36% /
tmpfs                    3.9G  4.0K  3.9G   1% /tmp
/dev/sda1               1014M  285M  730M  29% /boot
tmpfs                    786M     0  786M   0% /run/user/0
/dev/mapper/vg1-lv1      100G  3.8G   97G   4% /var

-> lsblk
NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   80G  0 disk 
├─sda1               8:1    0    1G  0 part /boot
└─sda2               8:2    0   79G  0 part 
  ├─fedora-root    253:0    0   45G  0 lvm  /
  └─fedora-swap    253:1    0  7.9G  0 lvm  [SWAP]
sdb                  8:16   0  100G  0 disk 
└─vg1-lv1          253:2    0  100G  0 lvm  /var

If for some reason the server didn’t come up as expected, login to VM via console connection (virt-manager) from KVM and perform below:

1
2
3
4
5
6
7
8
9
# Backup and remove newly added entry in /etc/fstab
-> cp /etc/fstab /etc/fstab.old
-> head -n -1 /etc/fstab.old > /etc/fstab

# Unmount '/var' and rename old directory (from previous step) to '/var'
-> umount /var && mv -f /var.old /var

# Reboot server and compare info against before migration, it should match
-> reboot

Many services use /var for log messages and storing data apart from configs, it’s always a good idea particulary in server environments to have a healthy amount of free space available in /var directory.

All above steps are performed and verified on Fedora 32 Server Edition as part of making space for container images and related volume mounts.


Thanks for your time and I hope it is well spent, I'll be very happy to hear your thoughts in comments section or you can contact me by any means mentioned in the footer 😄.

Share on ...

So long 👋 ...