Linux - a free operating system
Resizing COW files
is a way to run Linux without root privileges in userspace. It is a convenient
tool when testing kernel code which is not strictly dependent on direct device
UML accesses its file systems by means of image files, similar to the
loop-mounting technique. It is however possible to configure a copy-on-write
(COW) behaviour; in such a case, every write operation acts on a shallow copy
of the image file, whereas read operations either act on the copy (if the
appropriate block has been written in there already), or the original image.
The following picture illustrates this behaviour.
So how does the kernel know which blocks are dirty? It keeps a sector table,
similar to how the memory manager keeps a pagetable with various flags.
Also, there's a header at the beginning with a magic number, size and sector
size settings, and the location and modification time of the backing file to
make sure the right one is used (it would result in data corruption otherwise).
Now on to the resizing procedure. It consists of 2 steps: One is executed by
UML directly, the other one must be done in userspace. This is a limitation of
the Kernel 2.4, and will likely improve in the future. Basically, we just
enlarge the virtual partition without changing the filesystem.
This will however have to be moved because a larger number of blocks means a
larger number of entries in the sector table. The whole filesystem, starting
with the last bytes and up to the superblock at the beginning, is moved towards
the end of the enlarged partition.
Now the filesystem can be enlarged as well with tools such as
Note that due to the lack of physical data in the backing file, the new sector
table entries must be marked dirty even though there is no valid data in the
COW file yet.
So, is there an implementation already?
Well, more or less, there is. Except for heavy testing, everything has been
implemented for Kernel 2.4.20. The patches are available here:
Diff for arch/um/driver/ubd_kern.c
Diff for arch/um/driver/ubd_user.c
Diff for arch/um/include/ubd_user.h
This setup has been tested using UML 2.4.20-4um-1 (Debian/unstable source
package) and the Slackware 8.1 root filesystem from the UML home page.
As the only difference, add the size to the process invocation, such as:
linux ubda=cowfile,backingfile,400M devfs=mount mem=128M
A demonstration of the patch
Back to the index page
Josef Spillner (mail)