
clone3(), fchmodat4(), and fsinfo()
By Jonathan Corbet
July 5, 2019
内核开发者社区里仍然在不断提出一些新的系统调用API。最近mailing list里面在讨论有clone3(), fchmodat4(), fsinfo()。有些情况下开发者会尽量保留用于今后扩展的flag bit,不过有时候也会有一些全新的功能需要讨论实现。
clone3()
clone()系统调用会创建一个新的进程、线程。这是fork()函数的底层代码里真正干活的部分。它和fork()有一个区别,就是能够接受flags作为参数。随着时间的推移,已经有不少新的flag加进来了。大多数都是用来控制系统resource和namespace如何跟新建进程来share的。事实上,因为加的flag太多,当Linux 5.2合入CLONE_PIDFD的时候,就用掉了最后一个flag bit。所以clone()函数彻底没有可扩展的空间了。
最自然的解决方案就是把clone()系统调用复制一份,实现一个新的API,能接收其他一些flag。Christian Brauner可能是出于对自己的CLONE_PIDFD占用了最后一个flag感到很内疚,开始着手实现这个功能。他首先是实现了一个clone6(),不过在跟人讨论之后,改成了clone3()(其实有一个clone2()是只在IA64架构上用的)。函数原型如下:
这里的clone_args结构包含了很多之前的clone()能接受的参数。并且新加的flags也通过移动exit_signal的未知,可以变成64位了。这样今后一段时间的flag bit应该足足够用了。
参数size是clone_args结构的长度。万一将来需要扩展这个结构的话,kernel就能够利用这个参数来区分是用的哪个版本的clone_args结构。希望不会再需要创建一个clone4()了。
这个接口对各位开发者看起来都是挺不错的。不过Jann Horn指出一个明显问题:seccomp机制需要检查系统调用的参数,不过它没法检查放在一个单独structure里面传进来的参数,这样seccomp就不能检查clone3()的flags bit了。他认为这样会导致之前利用seccomp来实现沙盒的代码,完全没法使用clone3()。Kees Cook建议用另外一种机制来从user space获取数据,并且跟seccomp兼容,不过暂时还没人来实现这个机制。
clone3()已经在linux-next上了,很有可能会包含在Linux 5.3里面。
fchmodat4()
看一下fchmodat()函数的man page就可以看到如下的原型定义:
这里flags参数可以包含一个AT_SYMLINK_NOFOLLOW,会让fchmodat()能够直接操作符号链接,而不是对符号链接指向的目标来做操作。这里就有一个小问题:fchmodat()在kernel里实现的时候其实完全不接受flags参数。所以man page里面也说“这个flag还没有实现”。
Palmer Dabbelt出于一些不愉快的经历,决定来实现这个功能:“我昨晚花了晚餐的一半时间,忍受我这边一位硬件工程师关于Linux不支持fchmodat()的flags参数的抱怨”。结果他提出了一组patch set实现了fchmodat4(),他跟fchmodat()的函数原型一直,不过确实实现了flags参数的支持。
大家对这组patch set的意见比较一致,应该没有什么阻碍它被接受的。不过暂时还没有并入linux-next。
fsinfo()
系统调用statfs()可以用来获取某个文件系统的各种信息,包括它的format, block size, 空闲的blocks数量,最大的文件名长度,等等。不过现在看来,文件系统还有更多信息可以提供出去,不过statfs()没有办法支持了。本应该等人实现statfs2()的,不过David Howells提供了fsinfo()实现。
fsinfo()的函数原型如下:
这里dtd和filename参数就是指明需要查询哪个文件系统的信息。params是一个可选的参数数组,描述需要哪些信息。而buffer和buf_size指明了output buffer。
如果params是null,返回信息就基本跟statfs()提供的一样。此外,有需要的话还可以获取更多内容,例如文件系统的capability是否有什么限制,时间戳的精度,mount参数,远端服务器的信息等等。他还提供了另一组patch set,这样fsinfo()就能进一步的提供系统的mount topology信息。
这个系统调用还是挺复杂的,这里没法详细介绍它是怎么工作的。幸好作者有比较好的描述文档。patch里面提供了很多信息介绍fsinfo()能做什么,也包含了很多供filesystem开发者使用的API描述信息。还有一个patch里面描述了mount-topology查询的使用方法。另外一个patch里面添加了文档描述怎么把参数整理好传递给user space。
大家都明白,提供这个从kernel获取详细的文件系统相关信息的API是很有价值的。不过fsinfo() patch set还是太复杂了,震惊了patch reviewers,reviewers之前提出要把这个patch set分成一些小patch,现在拿到了改过之后的版本。文件系统开发者最近更坚持要求新加的feature都要加到xfstests测试集里,不过这个目前Howells还没有提供。Howells的第一版patch已经是将近一年之前提出的了,反复讨论了挺长时间,不过看起来还是需要一段时间的完善才能加入mainline。
全文完
LWN文章遵循CC BY-SA 4.0许可协议。
极度欢迎将文章分享到朋友圈热烈欢迎转载以及基于现有协议上的修改再创作~
长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~