在过去的几年里,我一直在做很多关于容器的工作。早期,我听了 Julien Friedman 的一个精彩演讲,他用几行 Go 代码编写了一个最简单的容器。这给了我“啊哈”时刻,我领悟到容器不过是 Linux 进程,它们对运行它们的机器的视图受到了限制。
构建这种受限视图涉及 Golang 的 syscall 包 中的很多调用。最初,我只是表面上接受了这一点,但过了一段时间后,我想剥开下一层洋葱,看看这些系统调用到底是什么以及它们是如何工作的。我将在我在 OSCON 上的演讲中分享我学到的东西。
顾名思义,系统调用是系统调用,它们是您可以从用户空间向 Linux 内核发出请求的方式。内核为您完成一些工作,例如创建进程,然后将控制权交还给用户空间。
有一种通用的机制用于进行所有系统调用到内核的转换,这由 libc 库处理。用户空间代码设置一些寄存器,包括它想要进行的系统调用的 ID 以及它需要传递给系统调用的任何参数。它触发一个“陷阱”以将控制权转移到内核。
这就是用户空间代码向内核发出请求的方式,但 Linux 也具有伪文件系统,允许内核将信息传递给用户空间。内容看起来像普通的目录和文件。
/proc 目录就是一个很好的例子。查看内部,您会发现关于机器上运行的进程的各种有趣信息。在某些情况下,例如 cgroups (控制组),用户空间可以通过写入这些伪文件系统下的文件来配置参数。
当您使用容器时,这尤其有趣,因为主机的 /proc 包含关于所有容器化进程的信息。这包括环境变量,环境变量也存储在 /proc 伪文件系统中,这意味着您的主机可以访问所有正在运行的容器的环境。如果您通过环境变量将证书或数据库密码等机密传递到容器中,这可能会产生安全后果。
许多从事普通应用程序的程序员可能不会觉得他们经常使用系统调用。实际上,他们是使用的,因为即使是像创建文件或更改目录这样的日常活动也涉及 Linux 上的系统调用。
您不必是系统程序员也可以享受系统调用的乐趣!
如果您想了解更多信息,Liz 将在德克萨斯州奥斯汀举行的 OSCON 2017 上演讲 系统调用初学者指南。如果您有兴趣参加会议,请使用此折扣码 在您注册时: PCOS。
评论已关闭。