How can I store /var on a separate partition?
First prepare a new partition (e.g. with parted
and mkfs
).
Say the partition is /dev/sda5
Mount the new partition:
mkdir /var2
mount /dev/sda5 /var2
Sync your current var:
rsync -a /var/ /var2
Add the entry to /etc/fstab
/dev/sda5 /var ext4 defaults 2 2
Reboot.
If you happen to need to go back you your old /var just comment out the entry in fstab.
Configuring a new /var partition on a virtual server
When I took over a new virtual server that had been provisioned by my employer’s hosting company, there wasn’t enough free space in the root filesystem. Luckily, they had used Logical Volume Manager (LVM) to sub-divide the virtual disk and there was sufficient free space available to create new volumes. I created extra logical volumes for var
and home
which had been regular directories in the root filesystem. Since the virtual server provider didn’t provide a KVM-like interface by which I could access the server in single-user mode, I used a very similar method to the one outlined by Aleksander (this answer includes extra details for recovering disk space in addition to LVM-specific commands).
Create a new /var filesystem with LVM
Create a logical volume for the new var
filesystem, mount it (using a temporary directory) and copy files from the current /var
to the new filesystem:
# Create a new 60GB logical volume in the `VolGroup00` group called `var`.
sudo lvcreate -L 60GB -n var VolGroup00
# Create an ext4 filesystem on this new `var` volume.
sudo mkfs.ext4 /dev/VolGroup00/var
# Mount this filesystem at a temporary mount-point.
sudo mkdir /var.new
sudo mount /dev/VolGroup00/var /var.new
Since running processes will have files in /var
kept open and in use, the directory tree can’t simply be moved to the new filesystem. Recursively (-r
) copy files from the current /var
partition to the new filesystem while preserving file attributes and extended attributes (-a, --archive
option). A cautious user might first create an LVM snapshot of the current volume before copying but that’s too much off-topic detail for this question.
sudo cp -ra /var/ /var.new/
Alternatively, the files can be copied with rsync
, with its -a, --archive
option to preserve time-stamps, ownership, modes, etc. and its -X, --xattrs
option to preserve the extended attributes such as the security labels used by AppArmor and SELinux:
sudo rsync -raX /var/ /var.new/
Update the filesystem table
Configure the new filesystem to be used as a new mount-point for /var
by adding the following line to /etc/fstab
. Note that 0
is used as the pass number (last field) so that the filesystem won’t be automatically checked (fsck
) after a certain number of reboots.
/dev/mapper/VolGroup00-var /var ext4 defaults 0 0
Since changing into single-user mode is not possible, reboot the computer to use this new volume as /var
.
Remove temporary mount-point
After the machine has restarted, the new filesystem will be mounted on /var
so the temporary mount-point can be safely removed:
sudo rmdir /var.new
Recover disk space from the root filesystem
The old /var
files will still be taking up space on the root partition but they are not easily accessible while another filesystem is mounted at /var
(they are “masked” by the new filesystem using the /var
directory as its mount-point). Use a temporary mount-point to mount the root filesystem so that contents of the original /var
directory are available by an alternative path.
sudo mkdir /old-root
sudo mount /dev/mapper/VolGroup00-root /old-root/
sudo rm -rf /old-root/var/*
sudo umount /old-root/
sudo rmdir /old-root/