mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-22 17:01:14 +00:00
![]() -----BEGIN PGP SIGNATURE-----
iHUEABYKAB0WIQRAhzRXHqcMeLMyaSiRxhvAZXjcogUCYCegywAKCRCRxhvAZXjc
ouJ6AQDlf+7jCQlQdeKKoN9QDFfMzG1ooemat36EpRRTONaGuAD8D9A4sUsG4+5f
4IU5Lj9oY4DEmF8HenbWK2ZHsesL2Qg=
=yPaw
-----END PGP SIGNATURE-----
Merge tag 'idmapped-mounts-v5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/brauner/linux
Pull idmapped mounts from Christian Brauner:
"This introduces idmapped mounts which has been in the making for some
time. Simply put, different mounts can expose the same file or
directory with different ownership. This initial implementation comes
with ports for fat, ext4 and with Christoph's port for xfs with more
filesystems being actively worked on by independent people and
maintainers.
Idmapping mounts handle a wide range of long standing use-cases. Here
are just a few:
- Idmapped mounts make it possible to easily share files between
multiple users or multiple machines especially in complex
scenarios. For example, idmapped mounts will be used in the
implementation of portable home directories in
systemd-homed.service(8) where they allow users to move their home
directory to an external storage device and use it on multiple
computers where they are assigned different uids and gids. This
effectively makes it possible to assign random uids and gids at
login time.
- It is possible to share files from the host with unprivileged
containers without having to change ownership permanently through
chown(2).
- It is possible to idmap a container's rootfs and without having to
mangle every file. For example, Chromebooks use it to share the
user's Download folder with their unprivileged containers in their
Linux subsystem.
- It is possible to share files between containers with
non-overlapping idmappings.
- Filesystem that lack a proper concept of ownership such as fat can
use idmapped mounts to implement discretionary access (DAC)
permission checking.
- They allow users to efficiently changing ownership on a per-mount
basis without having to (recursively) chown(2) all files. In
contrast to chown (2) changing ownership of large sets of files is
instantenous with idmapped mounts. This is especially useful when
ownership of a whole root filesystem of a virtual machine or
container is changed. With idmapped mounts a single syscall
mount_setattr syscall will be sufficient to change the ownership of
all files.
- Idmapped mounts always take the current ownership into account as
idmappings specify what a given uid or gid is supposed to be mapped
to. This contrasts with the chown(2) syscall which cannot by itself
take the current ownership of the files it changes into account. It
simply changes the ownership to the specified uid and gid. This is
especially problematic when recursively chown(2)ing a large set of
files which is commong with the aforementioned portable home
directory and container and vm scenario.
- Idmapped mounts allow to change ownership locally, restricting it
to specific mounts, and temporarily as the ownership changes only
apply as long as the mount exists.
Several userspace projects have either already put up patches and
pull-requests for this feature or will do so should you decide to pull
this:
- systemd: In a wide variety of scenarios but especially right away
in their implementation of portable home directories.
https://systemd.io/HOME_DIRECTORY/
- container runtimes: containerd, runC, LXD:To share data between
host and unprivileged containers, unprivileged and privileged
containers, etc. The pull request for idmapped mounts support in
containerd, the default Kubernetes runtime is already up for quite
a while now: https://github.com/containerd/containerd/pull/4734
- The virtio-fs developers and several users have expressed interest
in using this feature with virtual machines once virtio-fs is
ported.
- ChromeOS: Sharing host-directories with unprivileged containers.
I've tightly synced with all those projects and all of those listed
here have also expressed their need/desire for this feature on the
mailing list. For more info on how people use this there's a bunch of
talks about this too. Here's just two recent ones:
https://www.cncf.io/wp-content/uploads/2020/12/Rootless-Containers-in-Gitpod.pdf
https://fosdem.org/2021/schedule/event/containers_idmap/
This comes with an extensive xfstests suite covering both ext4 and
xfs:
https://git.kernel.org/brauner/xfstests-dev/h/idmapped_mounts
It covers truncation, creation, opening, xattrs, vfscaps, setid
execution, setgid inheritance and more both with idmapped and
non-idmapped mounts. It already helped to discover an unrelated xfs
setgid inheritance bug which has since been fixed in mainline. It will
be sent for inclusion with the xfstests project should you decide to
merge this.
In order to support per-mount idmappings vfsmounts are marked with
user namespaces. The idmapping of the user namespace will be used to
map the ids of vfs objects when they are accessed through that mount.
By default all vfsmounts are marked with the initial user namespace.
The initial user namespace is used to indicate that a mount is not
idmapped. All operations behave as before and this is verified in the
testsuite.
Based on prior discussions we want to attach the whole user namespace
and not just a dedicated idmapping struct. This allows us to reuse all
the helpers that already exist for dealing with idmappings instead of
introducing a whole new range of helpers. In addition, if we decide in
the future that we are confident enough to enable unprivileged users
to setup idmapped mounts the permission checking can take into account
whether the caller is privileged in the user namespace the mount is
currently marked with.
The user namespace the mount will be marked with can be specified by
passing a file descriptor refering to the user namespace as an
argument to the new mount_setattr() syscall together with the new
MOUNT_ATTR_IDMAP flag. The system call follows the openat2() pattern
of extensibility.
The following conditions must be met in order to create an idmapped
mount:
- The caller must currently have the CAP_SYS_ADMIN capability in the
user namespace the underlying filesystem has been mounted in.
- The underlying filesystem must support idmapped mounts.
- The mount must not already be idmapped. This also implies that the
idmapping of a mount cannot be altered once it has been idmapped.
- The mount must be a detached/anonymous mount, i.e. it must have
been created by calling open_tree() with the OPEN_TREE_CLONE flag
and it must not already have been visible in the filesystem.
The last two points guarantee easier semantics for userspace and the
kernel and make the implementation significantly simpler.
By default vfsmounts are marked with the initial user namespace and no
behavioral or performance changes are observed.
The manpage with a detailed description can be found here:
|
||
---|---|---|
.. | ||
acl.h | ||
bitmap.c | ||
dir.c | ||
do_balan.c | ||
file.c | ||
fix_node.c | ||
hashes.c | ||
ibalance.c | ||
inode.c | ||
ioctl.c | ||
item_ops.c | ||
journal.c | ||
Kconfig | ||
lbalance.c | ||
lock.c | ||
Makefile | ||
namei.c | ||
objectid.c | ||
prints.c | ||
procfs.c | ||
README | ||
reiserfs.h | ||
resize.c | ||
stree.c | ||
super.c | ||
tail_conversion.c | ||
xattr.c | ||
xattr.h | ||
xattr_acl.c | ||
xattr_security.c | ||
xattr_trusted.c | ||
xattr_user.c |
[LICENSING] ReiserFS is hereby licensed under the GNU General Public License version 2. Source code files that contain the phrase "licensing governed by reiserfs/README" are "governed files" throughout this file. Governed files are licensed under the GPL. The portions of them owned by Hans Reiser, or authorized to be licensed by him, have been in the past, and likely will be in the future, licensed to other parties under other licenses. If you add your code to governed files, and don't want it to be owned by Hans Reiser, put your copyright label on that code so the poor blight and his customers can keep things straight. All portions of governed files not labeled otherwise are owned by Hans Reiser, and by adding your code to it, widely distributing it to others or sending us a patch, and leaving the sentence in stating that licensing is governed by the statement in this file, you accept this. It will be a kindness if you identify whether Hans Reiser is allowed to license code labeled as owned by you on your behalf other than under the GPL, because he wants to know if it is okay to do so and put a check in the mail to you (for non-trivial improvements) when he makes his next sale. He makes no guarantees as to the amount if any, though he feels motivated to motivate contributors, and you can surely discuss this with him before or after contributing. You have the right to decline to allow him to license your code contribution other than under the GPL. Further licensing options are available for commercial and/or other interests directly from Hans Reiser: hans@reiser.to. If you interpret the GPL as not allowing those additional licensing options, you read it wrongly, and Richard Stallman agrees with me, when carefully read you can see that those restrictions on additional terms do not apply to the owner of the copyright, and my interpretation of this shall govern for this license. Finally, nothing in this license shall be interpreted to allow you to fail to fairly credit me, or to remove my credits, without my permission, unless you are an end user not redistributing to others. If you have doubts about how to properly do that, or about what is fair, ask. (Last I spoke with him Richard was contemplating how best to address the fair crediting issue in the next GPL version.) [END LICENSING] Reiserfs is a file system based on balanced tree algorithms, which is described at https://reiser4.wiki.kernel.org/index.php/Main_Page Stop reading here. Go there, then return. Send bug reports to yura@namesys.botik.ru. mkreiserfs and other utilities are in reiserfs/utils, or wherever your Linux provider put them. There is some disagreement about how useful it is for users to get their fsck and mkreiserfs out of sync with the version of reiserfs that is in their kernel, with many important distributors wanting them out of sync.:-) Please try to remember to recompile and reinstall fsck and mkreiserfs with every update of reiserfs, this is a common source of confusion. Note that some of the utilities cannot be compiled without accessing the balancing code which is in the kernel code, and relocating the utilities may require you to specify where that code can be found. Yes, if you update your reiserfs kernel module you do have to recompile your kernel, most of the time. The errors you get will be quite cryptic if your forget to do so. Real users, as opposed to folks who want to hack and then understand what went wrong, will want REISERFS_CHECK off. Hideous Commercial Pitch: Spread your development costs across other OS vendors. Select from the best in the world, not the best in your building, by buying from third party OS component suppliers. Leverage the software component development power of the internet. Be the most aggressive in taking advantage of the commercial possibilities of decentralized internet development, and add value through your branded integration that you sell as an operating system. Let your competitors be the ones to compete against the entire internet by themselves. Be hip, get with the new economic trend, before your competitors do. Send email to hans@reiser.to. To understand the code, after reading the website, start reading the code by reading reiserfs_fs.h first. Hans Reiser was the project initiator, primary architect, source of all funding for the first 5.5 years, and one of the programmers. He owns the copyright. Vladimir Saveljev was one of the programmers, and he worked long hours writing the cleanest code. He always made the effort to be the best he could be, and to make his code the best that it could be. What resulted was quite remarkable. I don't think that money can ever motivate someone to work the way he did, he is one of the most selfless men I know. Yura helps with benchmarking, coding hashes, and block pre-allocation code. Anatoly Pinchuk is a former member of our team who worked closely with Vladimir throughout the project's development. He wrote a quite substantial portion of the total code. He realized that there was a space problem with packing tails of files for files larger than a node that start on a node aligned boundary (there are reasons to want to node align files), and he invented and implemented indirect items and unformatted nodes as the solution. Konstantin Shvachko, with the help of the Russian version of a VC, tried to put me in a position where I was forced into giving control of the project to him. (Fortunately, as the person paying the money for all salaries from my dayjob I owned all copyrights, and you can't really force takeovers of sole proprietorships.) This was something curious, because he never really understood the value of our project, why we should do what we do, or why innovation was possible in general, but he was sure that he ought to be controlling it. Every innovation had to be forced past him while he was with us. He added two years to the time required to complete reiserfs, and was a net loss for me. Mikhail Gilula was a brilliant innovator who also left in a destructive way that erased the value of his contributions, and that he was shown much generosity just makes it more painful. Grigory Zaigralin was an extremely effective system administrator for our group. Igor Krasheninnikov was wonderful at hardware procurement, repair, and network installation. Jeremy Fitzhardinge wrote the teahash.c code, and he gives credit to a textbook he got the algorithm from in the code. Note that his analysis of how we could use the hashing code in making 32 bit NFS cookies work was probably more important than the actual algorithm. Colin Plumb also contributed to it. Chris Mason dived right into our code, and in just a few months produced the journaling code that dramatically increased the value of ReiserFS. He is just an amazing programmer. Igor Zagorovsky is writing much of the new item handler and extent code for our next major release. Alexander Zarochentcev (sometimes known as zam, or sasha), wrote the resizer, and is hard at work on implementing allocate on flush. SGI implemented allocate on flush before us for XFS, and generously took the time to convince me we should do it also. They are great people, and a great company. Yuri Shevchuk and Nikita Danilov are doing squid cache optimization. Vitaly Fertman is doing fsck. Jeff Mahoney, of SuSE, contributed a few cleanup fixes, most notably the endian safe patches which allow ReiserFS to run on any platform supported by the Linux kernel. SuSE, IntegratedLinux.com, Ecila, MP3.com, bigstorage.com, and the Alpha PC Company made it possible for me to not have a day job anymore, and to dramatically increase our staffing. Ecila funded hypertext feature development, MP3.com funded journaling, SuSE funded core development, IntegratedLinux.com funded squid web cache appliances, bigstorage.com funded HSM, and the alpha PC company funded the alpha port. Many of these tasks were helped by sponsors other than the ones just named. SuSE has helped in much more than just funding....