User-Kernel File System Library (ukfs)
User-Kernel File System Library (ukfs)
libukfs is a library which provides pathname-based access to a file system supported by rump. Historically it was necessary due to the fact that rump system calls did not exist and ukfs took care of some of the less pleasant issues with file system use, such as name resolution.
Although much of what ukfs does could be done using rump system calls, there are still two features which set it apart:
- All calls are self-contained. There is no need to
e.g. open a file prior to reading the contents.
A single call to
ukfs_read
is enough. - Mounting support. Most of the details having to do with
mounting a file system using a process-local server
are hidden within a single call to
ukfs_mount
.
An example of ukfs use is provided below:
fs = ukfs_mount(MOUNT_FFS, "/home/pooka/img/ffs.img", "/", 0, &args, sizeof(args)); ukfs_getdents(fs, "/", 0, buf, sizeof(buf)); ukfs_read(fs, "/etc/passwd", 0, buf, sizeof(buf)); ukfs_chdir(fs, "/etc", 0, buf, sizeof(buf)); ukfs_link(fs, "hardlink", "/linkfile"); ukfs_release(fs, 0);
The vision of the ukfs interface is to eventually turn into an
operating system independent method for accessing file systems.
However, further work is required to reach that point. For
example, struct stat
had a different binary
layout on every platform and calling the ukfs routine cannot
happen in a totally platform-agnostic manner - a reference to
the correct type of struct stat
must be passed.
Even in the current state of development, ukfs has already been successfully used to run NetBSD kernel file systems on Linux.
The ukfs interfaces are further documented in ukfs(3).
Source Code
You can browse
the source code history online or look into
src/lib/libukfs
in a NetBSD
source tree.