kernel

容器安全入门

容器被认为是将这些微服务部署到云端的标准方式。除了安全性之外,容器在几乎所有方面都优于虚拟机,而安全性可能是它们被广泛采用的主要障碍。本文将更好地理解容器安全以及可用于保护它们的技术。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 二进制文件吗?它们是 Linux 内核的文件格式,直到 1995 年左右 ELF 取代了它。ELF 更好。它允许您将共享库加载到内存中的任何位置,而 a.out 二进制文件需要您注册共享库位置。这在小规模上很好,但随着您需要处理的共享库越来越多,它会变得越来越令人头疼。但是,在 ELF 成为标准默认格式 25 年后,Linux 源代码树中仍然支持 a.out。

Android 低内存杀手——进入还是退出?

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

保护内核栈

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

内核中的行长度限制

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

KUnit 和断言

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

疯狂的编译器优化

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

CGroup 交互

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

重写 printk()

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

内核问题

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

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

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

导出内核头文件

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