Use Overlay Filesystem on Ubuntu
How to use
We have a device running Ubuntu and will be powered off directly without shutdown gracefully.
In order to keep the file system from damage, we use the OverlayFS provided in Linux kernel since 3.18.
The usage of OverlayFS is very simple, as following:
# first install overlayroot package
$ sudo apt-get install overlayroot
# second, change the config file /etc/overlayroot.conf
# the simple config is as following
# we enable swap, and disable recurse overlay
$ cat /etc/overlayroot.conf
overlayroot="tmpfs:swap=1,recurse=0"
After rebooting, we should see something like this:
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 16G 8.0K 16G 1% /dev
tmpfs 3.1G 74M 3.1G 3% /run
/dev/sda3 96G 16G 76G 17% /media/root-ro
tmpfs-root 16G 60M 16G 1% /media/root-rw
overlayroot 16G 60M 16G 1% /
tmpfs 16G 24K 16G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 16G 0 16G 0% /sys/fs/cgroup
$ mount
[...]
configfs on /sys/kernel/config type configfs (rw,relatime)
overlayroot on /var/cache/apt/archives type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_)
overlayroot on /opt/var/cache/apt/archives type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_)
overlayroot on /var/lib/apt/lists type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_)
overlayroot on /opt/var/lib/apt/lists type overlay (rw,relatime,lowerdir=/media/root-ro,upperdir=/media/root-rw/overlay,workdir=/media/root-rw/overlay-workdir/_)
How to disable
When you change some file under OverlayFS, and after the reboot, the file will keep the same.
But sometimes you do want to change the original file, how to disable this feature?
We have these methods:
- Remount the disk with rw, and change the file under lowerdir
- Use overlayroot-chroot tool provided by the package
- Disable OverlayFS when booting
- Disable by overlayroot.conf
Remount
If you just want to change some files, this is very direct, remount the block device and change the file under lowerdir.
# remount with read-write
$ sudo mount -o remount,rw /dev/sda3
# say we want to change overlayroot.conf
# note: we must change under the file under the lowerdir: /media/root-ro
$ sudo vim /media/root-ro/etc/overlayroot.conf
# remount with read-only
$ sudo mount -o remount,ro /dev/sda3
Use overlayroot-chroot
If we want to install some package and keep the package after reboot, we can't use the first method, since the package may change many files under different directories.
We still have a simple way, you run overlayroot-chroot with root, make changes, and the changes will be saved after reboot.
$ sudo overlayroot-chroot
The change may not take effect immediately after exit the command, you can mount again like this:
$ sudo mount -o remount /
Disable OverlayFS when booting
The overlayroot-chroot method may solve 90% of the problem, but it do has some limitation.
The overlayroot-chroot just like chroot into the lower filesystem, and remount with writable.
If you have some scripts-say postinstall in some package, checks the chroot mode, it may refuse to execute under this case.
To fix this problem, we can disable OverlayFS during the booting phase.
We can edit the boot command line, append overlayroot=disabled and boot again.
linux /vmlinuz-4.15.0-123-lowlatency root=UUID=bfb40993-3xxxx ro systemd.unit=multi-user.target overlayroot=disabled
Under this case, the OverlayFS will be disabled completely.
Disable by overlayroot.conf
We can disable OverlayFS during the boot time, but if we want to keep it disabled after several reboots, we have a simple way.
You can change the overlayroot.conf config file using the remount method, and comment all the lines, and then reboot again.
If we want to enable, we can remount and un-comment the config lines, and after reboot, the OverlayFS will be enabled agian.
$ cat /media/root-ro/etc/overlayroot.conf
# overlayroot="tmpfs:swap=1,recurse=0"