The Btrfs inode-number epic (part 1: the problem)
lwn.net
lwn.net
e.g. we had a big issue with this back around 2008 where we accidentally had two AFS volumes with overlapping inode ranges (AFS was represented as a single device, even if there were multiple volumes mounted).
Linux's dynamic linker had an optimization that cached device/inode for DSOs that had already been loaded, and wouldn't attempt to load them again.
If you had a binary that depended on linking two DSOs from different volumes that had different names, but the same inode number, the first one would get linked OK but the linker would then ignore the second one and you'd get missing dynamic linker dependencies out of nowhere.
This was the first and hopefully last time reading the source to ld.so during a production outage.
The correct course of action would have been for Linus to not allow btrfs into mainline with such an interface. Each subvolume should have been seperately mounted, or the stat interface should have been extended to make subvolumes first class.
ZFS doesn't have this problem because each dataset (the equivalent of subvolume) is treated as a separate mountpoint. This can be annoying with NFS because you need to export and mount each dataset separately.
I use ZFS on multiple servers, and appreciate this approach. The problem is -- you're going to feel pain one way or the other. In that case, make sure that the pain is obvious and predictable.
If you're using subvolumes/datasets, you will have to deal with a problem at some point. Either you have to manually export multiple NFS volumes (ZFS), or potentially have inode uniqueness issues (Btrfs).
I'd much rather have the problems make excruciatingly obvious. I can script generating a config file for exporting many datasets (and I have done so). I can't really deal with non-unique inodes in the same manner.
In order to automate the export, I have a single script that can be executed with sudo on that system to manage both the creation of the dataset and the export.
So, there are still ways, if you’re able to use sudo.
My LDAP and NFS servers are separate too. I control both, so it’s a bit different, but I still have it setup so that account creation and home directory creation/export are handled in one script.
The account creation script (on the LDAP server) makes an SSH call to the NFS server to run the home directory creation/export update script. That specific SSH certificate is password-less and restricted to running only that single command. It could be root or another user that calls sudo.
So, some of what you’re looking for can be done with some SSH tricks… but only if both sides are comfortable with that setup. The benefit is that each side can manage their own scripts. The NIS admin can write the script on their side and NFS on their side. You just need to establish the workflow that works best for you.
Our cluster is completely self contained, so with sudo and SSH restrictions, I’m not concerned about security issues with this setup.
data/media/video/movies data/media/video/series
I set sharenfs with read write access for
data/media/video
Which gives me access via nfa to all the subvolumes.
To me it seems that ZFS snapshots represents a similar challenge[1] given that the snapshots can be accessed through the .zfs directory, and that ZFS also plays tricks[2] with the inodes.
[1]: https://docs.oracle.com/cd/E19253-01/819-5461/gbiqe/index.ht...
[2]: http://mikeboers.com/blog/2019/02/21/zfs-inode-generations
If you cd into a snapshot on FreeBSD it does not get listed in calls to `mount` but does on ZoL.
edit: i have not tested this since FreeBSD rebased on ZoL
I'm a big fan of btrfs snapshots, but with some other recent issues, I'm wondering if we should migrate away from btrfs.
We don't have hardlinks to directories because that is a terrible idea functionality wise.
I'll stick with xfs.
B/c it’s not built into the kernel, or some other reason?
Why not ZFS or ZoL (https://zfsonlinux.org/)?
B/c it’s not built into the kernel, or some other reason?
If two paths resolve to the same inode number, and thus to the same inode and data, that's called a hard link. The whole concept of inodes and inode numbers is deeply ingrained into the Unix userspace API and Unix filesystem semantics.
The whole purpose of inode numbers is to not deal with strings.
What you are suggesting is essentially a fundamental redesign of Unix filesystem semantics that requires each file to have at least two paths: a hierarchical, user generated one, and a non-hierarchical, auto generated one.