内核

容器安全入门

容器被认为是将这些微服务部署到云端的标准方式。除了安全性之外,容器在几乎所有方面都优于虚拟机,而安全性可能是它们被广泛采用的主要障碍。本文将提供对容器安全性和可用于保护它们的技术的更好理解。Linux 容器可以定义为在用户空间中运行的一个或一组进程,这些进程通过不同的内核工具与系统的其余部分隔离。

糟糕!调试内核崩溃

深入了解导致内核崩溃的原因以及一些有助于获取更多信息的实用程序。在 Linux 环境中工作,您多久遇到一次内核崩溃?发生这种情况时,您的系统将处于瘫痪状态,直到您完全重启它。而且,即使在您的系统恢复到功能状态后,您仍然会留下疑问:为什么?您可能不知道发生了什么或为什么会发生。这些问题是可以回答的,以下指南将帮助您找出导致原始崩溃的某些条件的原因。

记录正确的 Git 用法

Jonathan Corbet 编写了一份文档,旨在将其纳入内核树中,描述了基于 git 的内核仓库的合并和变基的最佳实践。正如他所说,它代表了当前实际使用的工作流程,并且是一份活文档,有望随着时间的推移得到添加和更正。该文档的灵感来自于注意到 Linus Torvalds 对其他人(通常是子系统维护者)处理他们的 git 树的方式感到不满的频率。

简化现代 GCC 的函数跟踪

Steven Rostedt 想要做一些内务处理,特别是用于调试内核的函数跟踪代码。在此之前,内核可以使用 GCC 的 -pg 标志或 -pg 和 -mfentry 的组合来启用函数跟踪。在每种情况下,GCC 都会创建一个特殊的例程,该例程将在每个函数开始时执行,以便内核可以跟踪对所有函数的调用。

制作一个内核需要什么?

这个内核。那个内核。人们经常提到一个操作系统的内核或另一个内核,但并不真正了解它的作用或工作方式,或者制作一个内核需要什么。编写自定义(和非 Linux)内核需要什么?

缩小 Linux 攻击面

通常,内核开发人员会尝试减小针对 Linux 的攻击面的大小,即使它不能完全关闭。这样的补丁是否能进入内核通常是不确定的。Linus Torvalds 始终更喜欢真正能堵住漏洞的安全补丁,而不是仅仅让攻击者稍微难以入侵。

地址空间隔离和 Linux 内核

来自 IBM 的 Mike Rapoport 发起了一项在 Linux 内核中实现地址空间隔离的提议。地址空间隔离源于虚拟内存的概念——系统将其所有硬件设备的内存地址映射到一个干净的虚拟空间中,以便它们都看起来像一个平滑的可用 RAM 范围。实现虚拟内存的系统还可以创建仅对系统的一部分或某些进程可用的隔离地址空间。

弃用 a.out 二进制文件

还记得 a.out 二进制文件吗?在 ELF 接管之前,它们是 1995 年左右 Linux 内核的文件格式。ELF 更好。它允许您将共享库加载到内存中的任何位置,而 a.out 二进制文件需要您注册共享库位置。这在小规模下还可以,但是当您需要处理越来越多的共享库时,它会变得越来越令人头疼。但是,在 ELF 成为标准默认格式 25 年后,a.out 仍然在 Linux 源代码树中得到支持。

Android 低内存杀手——在内还是在外?

Linux 内核以及所有操作系统内核的工作之一是管理系统可用的资源。当这些资源用完时,应该怎么办?如果资源是 RAM,则没有太多选择。接管任何用户软件的行为,了解该软件的功能并使其更节省内存是不可行的。相反,内核几乎别无选择,只能尝试识别最负责消耗系统 RAM 的软件并终止该进程。

保护内核堆栈

Linux 内核堆栈是一个诱人的攻击目标。这是因为内核需要跟踪它所处的位置。如果调用了一个函数,然后又调用了另一个函数,然后再调用另一个函数,则内核需要记住它们被调用的顺序,以便每个函数都可以返回到调用它的函数。为此,内核保留一个表示其当前上下文历史记录的“堆栈”值。

内核中的行长度限制

内核开发人员会定期讨论一些每个人通常都认为理所当然的事情,例如文本行的长度。就我个人而言,我喜欢文本行到达屏幕的两侧——这只是一个不浪费空间的问题。Alastair D'Silva 最近同意了我的观点。他认为,近年来显示器尺寸和屏幕分辨率变得如此之大,以至于内核应该开始允许在单行文本上显示更多数据。这很简单——更可见的文本意味着更多机会在数据转储中发现错误。

KUnit 和断言

KUnit 最近得到了广泛的使用和开发。它是内核的新单元测试系统,由 Brendan Higgins 在去年年底推出。其目标是使维护人员和其他开发人员能够以可靠且可重现的方式测试内核代码的离散部分。这与依赖于系统整体行为的各种形式的测试不同,因此不一定总是产生相同的结果。

疯狂的编译器优化

内核开发总是很奇怪。Andrea Parri 最近发布了一个补丁,以更改多线程操作期间的内存读取顺序,以便如果一个读取依赖于下一个读取,则第二个读取实际上不能在第一个读取之前发生。问题在于,该错误实际上永远不会发生,而该修复程序使内核的行为对开发人员来说不太直观。Peter Zijlstra 特别反对该补丁,称不可能构建一个能够触发所讨论错误的物理系统。

CGroup 交互

CGroup 正在不断开发中,部分原因是它们构成了当今许多商业服务的核心。令人惊讶的是,它们仍然是一个未完成的项目。隔离和分配系统元素是一项持续的努力,还有许多工作要做。并且由于安全问题,可能永远无法将虚拟系统呈现为完全独立的系统。可能总是需要做出妥协。

重写 printk()

printk() 函数是内核开发人员持续关注的主题。表面上,它只是一个用于将文本发送到控制台的输出例程。但是,与常规打印例程不同,printk() 必须能够在极端条件下工作,例如当发生可怕的事情并且系统需要在它咽下最后一口气时发出一些最后的线索。

内核问题

您对您的内核了解多少? 像真正了解那样了解吗? 考虑到 Linux 内核对世界的重要性——也许同样重要的是,对我们自己的个人计算机和小工具的重要性——令人惊讶的是,大多数人实际上对它知之甚少。

与来自 Intel、Red Hat 和 SUSE 的内核开发人员的对话

三位内核开发人员描述了在内核上工作的真实感受、他们如何与其他公司的开发人员互动、一些令人讨厌的事情以及如何入门。像大多数 Linux 用户一样,我很少接触 Linux 内核的实际代码。当然,我看过它。我甚至在少数情况下自己编译过内核——有时是为了尝试一些新东西,或者仅仅是为了说我可以做到(“Linux From Scratch”有点像成年礼)。

导出内核头文件

Joel Fernandes 提交了一个模块,用于通过 /proc 目录导出内核头文件,以便用户更容易扩展内核,而无需一定拥有可用的源代码树。他说