You are on page 1of 16

中国科学院软件研究所

工作周报
中国科学院软件研究所 工作周报

姓名: 陈卓特

时间:2024 年 3 月 29 日

2 / 16
中国科学院软件研究所 工作周报

目录
1. 工作任务.................................................................................................................3
1.1. 学术资料阅读..............................................................................................3
1.2. 实践环节......................................................................................................4
1.3. 本周出勤情况..............................................................................................4
2. 工作进展.................................................................................................................4
2.1. 学术资料阅读进展......................................................................................4
2.2. 实践环节进展..............................................................................................5
3. 学术资料阅读笔记...............................................................................................10
4. 下周计划...............................................................................................................13
4.1. 学术资料阅读............................................................................................13
4.2. 实践环节....................................................................................................13
5. 参考文献...............................................................................................................13

3 / 16
中国科学院软件研究所 工作周报

1. 工作任务

1.1. 学术资料阅读

[论文] A Linux in Unikernel Clothing

[博客] Firecracker: start a VM in less than a second


https://jvns.ca/blog/2021/01/23/firecracker--start-a-vm-in-less-than-a-second/

[文档] firecracker/docs/dev-machine-setup.md
https://github.com/firecracker-microvm/firecracker/blob/main/docs/dev-machine-

setup.md

[论文] Unikernel Linux (UKL)

[博客] What is KVM? - Red Hat


https://www.redhat.com/en/topics/virtualization/what-is-KVM

[文档] https://www.qemu.org/docs/master/about/build-platforms.html

[ 文 章 ] Modifying the configuration, 节 选 自 Linux Kernel in a Nutshell by Greg

Kroah-Hartman
https://www.oreilly.com/library/view/linux-kernel-in/0596100795/ch04s02.html

[博客] Exploring the Linux kernel: The secrets of Kconfig/kbuild

https://opensource.com/article/18/10/kbuild-and-kconfig

4 / 16
中国科学院软件研究所 工作周报

[教程] Linux kernel configuration

https://linuxconfig.org/in-depth-howto-on-linux-kernel-configuration

1.2. 实践环节

复现论文,在 QEMU 上运行 Lupine Linux。


阅读 Lupine Linux 源码。

1.3. 本周出勤情况

本周 3/25,3/26,3/27,3/28,3/29 出勤共五天

2. 工作进展

2.1. 学术资料阅读进展

[博客] Firecracker: start a VM in less than a second

Julia Evans 的博客文章讨论了 Firecracker 如何通过减少虚拟机所需的资源并确

保更好的利用率来提高无服务器应用程序的轻量级虚拟化能力。它涵盖了创建

更高效虚拟化解决方案的约束和考虑,包括使用 Linux 容器、特定语言的隔离

以及替代虚拟化技术。Firecracker 旨在解决虚拟机在开销、隔离、性能和快速

切换方面的问题,采用 microVM 架构,为无服务器计算环境提供增强的安全性

和效率。

5 / 16
中国科学院软件研究所 工作周报

[论文] Unikernel Linux (UKL)

Unikernel Linux (UKL) 项目通过最小化对 Linux 内核和应用程序的改动,探索

将 Linux 转变为 unikernel 的可能性。这种方法允许 UKL 支持广泛的 Linux 应用

程序和硬件,同时避免分叉内核,旨在创建一个既能满足通用操作系统需求又

能优化为特定应用和硬件的高效 unikernel。UKL 实现了将 unikernel 技术集成到

通用操作系统中,避免了分叉,同时提高了性能。大多数应用程序可以在不做

任何更改的情况下以相同或更快的速度运行。UKL 项目展示了通过对内核进行

有针对性的改动,可以实现显著的性能提升。通过启用基本模型配置,UKL 能

够支持大多数应用程序,尽管性能提升有限。开发者可以通过选择更广泛的配

置选项来提高性能,但这些配置选项可能不适用于所有应用程序。

[博客] What is KVM? - Red Hat

KVM (Kernel-based Virtual Machine) 是一种集成在 Linux 中的开源虚拟化技术,

可以将 Linux 变为允许主机运行多个隔离的虚拟环境(即虚拟机或客户机)的

6 / 16
中国科学院软件研究所 工作周报

hypervisor。作为 Linux 的一部分,KVM 从 Linux 的每项新特性、修复和进步中

直接受益,无需额外工程。它将 Linux 转换为类型 1(裸机)hypervisor,利用

Linux 内核中的组件(如内存管理、进程调度、I/O 堆栈、设备驱动程序等)运

行虚拟机,每个虚拟机都作为常规 Linux 进程实现,拥有专用的虚拟硬件。

KVM 支持安全增强型 Linux (SELinux) 和安全虚拟化 (sVirt) 来增强虚拟机的安

全性和隔离,支持使用 Linux 支持的任何存储,包括本地磁盘和网络附加存储,

以及实现虚拟机的实时迁移等特性。

[博客] Exploring the Linux kernel: The secrets of Kconfig/kbuild

这篇文章深入探讨了 Linux 内核的配置和构建系统 Kconfig/kbuild,介绍了如何

利用 Kconfig 进行内核配置,以及 kbuild 如何管理组件式构建。文章通过解释

Kconfig 的不同目标和如何生成配置文件(.config)及最终内核镜像文件

(vmlinux/bzImage),揭示了 Linux 内核构建过程中的依赖跟踪和优化技巧。

这一过程使 Linux 内核高度模块化和可定制,同时提高了构建效率和灵活性。

7 / 16
中国科学院软件研究所 工作周报

2.2. 实践环节进展

Lupine Linux 构建与配置


成功在本地环境中构建了 Lupine Linux 内核,并对其进行了必要的配置优化,

以适应后续的性能测试。这一步骤涉及了对 Linux 内核的深入了解,以及如何

通过精简内核来减少镜像大小和启动时间。
探索了内核配置专门化的不同策略,通过禁用不必要的内核模块和功能,进一

步优化了 Lupine Linux 的运行效率。

一、设置 Lupine Linux

第一步设置 lupine linux 的过程,有三个主要的步骤

Docker 环境构建
首先,我面临的挑战是 Ubuntu 16.04 的容器镜像在 README 文件中链接已失效。

为了解决这个问题,我替换了容器镜像,并成功构建了 Docker 环境。此外,我

还编写了 Dockerfile 来定义容器环境,并安装了构建 Linux 内核所需的所有依赖

和工具,从而成功构建了 Docker 镜像。

编译 Lupine Linux 内核
接 下 来 , 编 译 Lupine Linux 内 核 是 另 一 个 挑 战 。 我 分 别 编 译 了 lupine-djw-

kml.config 和 lupine.config 两个配置的内核。

制作根文件系统
制作根文件系统时,我遇到了几个问题,包括文件权限、文件拷贝失败,主要

是 路 径 问 题 ( 具 体 是 脚 本 内 的 copy 命 令 找 不 到 文 件 路 径 ) , 以 及

image2rootfs.sh 脚本中大量使用的 sudo 命令,这在 Docker 中一般不使用。为此,

我需要手动修改脚本。我还遇到了 Docker 守护进程连接失败、umount 尝试卸载

8 / 16
中国科学院软件研究所 工作周报

挂载点以及 rmdir 尝试删除非空目录的问题。我查了一些资料,通过使用特权

模式启动 Docker 容器,最终解决了这些问题。

二、运行 Lupine Linux


在 Firecracker 中运行
我一开始选择的是在 Firecracker 中运行 lupine linux,不过在运行时出现报错,

我查了资料了解到 Firecracker 使用 linux 的 KVM(基于内核的虚拟机),而

macOS 不支持 KVM,因此它只能在 Linux 上运行。这要求我使用虚拟机来进行

测试。由于 Firecracker 本身也是虚拟机,我担心虚拟机中再嵌套一个虚拟机跑

lupine linux 会出现其他问题,所以后来还是选择了

在 QEMU 中运行
当尝试在 QEMU 上运行 Lupine Linux 时,我发现 Lupine-Linux 内核编译时需要

开 启 CONFIG_PCI=y 和 CONFIG_VIRTIO_PCI=y 配 置 选 项 。 通 过 手 动 检 查

config 脚本,我发现我第一次编译内核使用的 lupine-djw-kml.config 不包含这两

个配置选项。因此,我选择了具备这些配置选项的 lupine.config 来编译内核,

从而成功在 QEMU 上运行了 Lupine Linux。

三、具体实现

主要是工作中使用到的一些命令

运行 Docker
在设置环境阶段,我使用了两个主要的 Docker 命令来启动容器:
普通模式启动 Docker 容器:

这 个 命 令 以 交 互 模 式 启 动 了 一 个 名 为 linuxbuild 的 容 器 , 并 挂 载 了 本 地 的

9 / 16
中国科学院软件研究所 工作周报

linux_4.0_build 目录到容器的/usr/src/linux_4.0_build 目录,以便在容器内部访问

这些文件。

使用 Privileged 模式启动 Docker 容器:

Privileged 模式允许 Docker 容器访问宿主机的所有设备,这在构建 Lupine Linux

内核和根文件系统时非常有用,尤其是在处理文件系统和权限问题时。

构建 Lupine Linux 内核
为了构建 Lupine Linux 内核,我使用了如下命令:

sh scripts/build-with-configs.sh configs/lupine.config configs/apps/nginx.config


./scripts/build-with-configs.sh configs/lupine.config configs/apps/nginx.config
这两个命令分别执行了构建脚本 build-with-configs.sh,用于结合 Lupine Linux

的通用配置 lupine.config 和特定应用(在这个例子中是 nginx)的配置来构建内

核。这一步骤对于确保 Lupine Linux 能够为特定应用提供最优的支持非常重要。

构建根文件系统
构建根文件系统的命令:
sh scripts/image2rootfs.sh nginx alpine ext2
这条命令调用 image2rootfs.sh 脚本,以创建一个基于 alpine Linux 的 nginx 应用

的 ext2 格式的根文件系统。这一步骤是为了确保运行环境具备了运行应用所需

的所有文件和配置。
另外,我也使用了以下 Docker 命令来辅助这个过程:

docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v

/Users/apple/desktop/linux_4.0_build:/usr/src/linux_4.0_build linuxbuild /bin/bash

10 / 16
中国科学院软件研究所 工作周报

该命令启动了一个临时容器,其中/var/run/docker.sock 的挂载允许容器内部的命

令管理宿主机上的 Docker 实例,这可以自动化构建过程。

在 QEMU 中运行
最后,我在 QEMU 中成功运行了 Lupine-Linux。

制作 rootfs

11 / 16
中国科学院软件研究所 工作周报

在 qemu 上运行 lupine linux

3. 学术资料阅读笔记

Lupine Linux
Linux 内核通过其 Kconfig 配置机制包含了大量的专业化设施。总共有 15,953

个配置选项适用于 Linux 4.0 版本。配置选项决定了是否应该通过编译特性的

源代码并将其链接到内核映像中或链接到可以动态加载到运行中内核的模块中,

来包括这些特性。内核配置选项赋予用户选择或启用(例如)对各种硬件(例

如,设备驱动程序)、各种服务(例如,文件系统、网络协议)以及管理最基

本计算资源的算法(例如,内存管理、调度)的支持的权力。

3.1 专门化

3.1.1 应用程序特定选项

12 / 16
中国科学院软件研究所 工作周报

单内核被一种极简主义哲学所驱动,即它们仅包含应用程序需要的功能。虽然

与 Linux 的兼容性通常意味着一些妥协,但可以采用以应用为中心的方法来配

置 Linux 内核。为此,我们将某些配置选项归类为应用特定选项,这些选项可

能会也可能不会出现在任何 Lupine 单内核的内核配置中。我们还讨论了应用程

序清单可以如何以不同的粒度通知内核配置,但将生成此类清单(可以利用静

态或动态分析[30, 31, 37])的工作留给未来。

单内核体现了 DevOps 行业趋势,在这一趋势中,系统配置和运行时操作任务

与应用程序开发紧密集成。我们识别出大约 100 个网络相关选项,包括多种不

太流行的协议,以及 35 个文件系统相关的配置选项,这些选项代表了依赖于

(单个)应用程序的系统配置权衡。在更细的粒度上,如果我们假设应用程序

或容器清单详细说明了应用程序将使用哪些系统调用,那么我们可以配置

Linux 包含一些必要的系统调用。例如,表 1 列出了决定一个或多个系统调用

(及其实现)是否编译进内核二进制文件的配置选项。作为应用特定配置的一

个示例,redis 键值存储默认需要 EPOLL 和 FUTEX,而 nginx Web 服务器额

外 需 要 AIO 和 EVENTFD 。 为 redis 编 译 的 Lupine 内 核 不 包 含 AIO 或

EVENTFD 相关的系统调用。

除上述内容外,一些应用程序还期望内核提供其他服务,例如 /proc 文件系统

或 sysctl 功能。此外,由于其传统上作为更高权限安全域的地位,Linux 内核

维护着一个庞大的库。单内核不维护传统的权限分离,但可能直接或间接地使

用这些功能,通过使用需要它的协议或服务(例如,IPsec 的加密例程)。我们

将 microVM 配置中的 20 个压缩相关和 55 个加密相关选项标记为应用特定。

最后,Linux 包含大量的调试设施;Lupine 单内核可以从 microVM 的配置中选

择多达 65 个调试和信息相关的内核配置选项。

3.1.2 不必要的选项

13 / 16
中国科学院软件研究所 工作周报

microVM 的配置中的某些选项,根据定义,任何 Lupine 单内核都永远不会需

要,因此可以安全地消除。我们将这些选项分为两组:(1)源于单内核的单进

程性质的选项;(2)源于云中预期的虚拟硬件环境的选项。

单内核不旨在运行多个进程。Linux 内核旨在运行多个进程,因此需要可配置

的同步、调度和资源计账功能。例如,cgroups 和命名空间是限制、记账和隔离

进程或进程组之间资源利用的特定机制。我们在 Firecracker 的 microVM 配置

中归类了大约 20 个与 cgroups 和命名空间相关的配置选项。

此外,内核通常在比应用程序更独立、更高权限的安全域中运行。因此,内核

包含增强的访问控制系统,例如 SELinux,以及保护从应用程序域到内核域的

转换的功能,如 seccomp 过滤器,所有这些对单内核都是不必要的。更重要的

是,对性能有严重影响的安全选项也因此变得不必要。例如, KPTI(内核页表

隔离 [9] )禁 止将 内核 页 面映射 到进程的 页表 中,以减 轻熔断 ( Meltdown

[40])漏洞。这显著影响系统调用性能;在 Linux 5.0 上测试 KPTI 时,我们测

量到系统调用延迟增加了 10 倍。总共,我们由于单一安全域而消除了 12 个配

置选项。

Linux 很适合在多处理器系统上运行。因此,内核包含各种选项,以包括和调

整 SMP 和 NUMA 功能。另一方面,由于大多数单内核不支持 fork,利用多

个处理器的标准方法是运行多个单内核。

最后,Linux 包含通过模块动态加载功能的设施。单个应用程序促进了在构建

时包含其所需所有功能的内核的创建。总的来说,我们将消除 89 个配置选项

归因于单内核的单进程—“单”—特性,如图 4 中的“多进程”所示。在第 5

节中,我们将检查这一属性的放宽。

14 / 16
中国科学院软件研究所 工作周报

单内核不旨在用于通用硬件。Linux 的默认配置旨在产生一个通用系统。这样

的系统密切参与管理硬件,具有可配置的功能来执行任务,包括电源管理、热

插拔以及驱动和接口设备。通常旨在云中作为虚拟机运行的单内核,可以将许

多物理硬件管理任务留给底层主机或虚拟机监控程序。Firecracker 的 microVM

内核配置通过消除许多不必要的驱动程序和特定于架构的配置选项(如图 3 所

示)演示了第一步。Lupine 的配置通过将 150 个配置选项—包括 24 个可以留

给底层主机处理的电源管理选项—分类为对 Lupine 单内核不必要的,进一步展

示了这一点,如图 4 所示。

4. 下周计划

4.1. 学术资料阅读

[论文] A Linux in Unikernel Clothing


[论文] Unikernel Linux (UKL)

4.2. 实践环节

继续阅读源码,尝试复现构建 Lupine Linux 的过程。

5. 参考文献

[1] A Linux in Unikernel Clothing

15 / 16
中国科学院软件研究所 工作周报

[2] Firecracker: start a VM in less than a second


https://jvns.ca/blog/2021/01/23/firecracker--start-a-vm-in-less-than-a-second/
[3] firecracker/docs/dev-machine-setup.md
https://github.com/firecracker-microvm/firecracker/blob/main/docs/dev-machine-

setup.md
[4] Unikernel Linux (UKL)
[5] What is KVM? - Red Hat
https://www.redhat.com/en/topics/virtualization/what-is-KVM
[6] https://www.qemu.org/docs/master/about/build-platforms.html

[7] Modifying the configuration, 节选自 Linux Kernel in a Nutshell by Greg Kroah-

Hartman
https://www.oreilly.com/library/view/linux-kernel-in/0596100795/ch04s02.html

[8] Exploring the Linux kernel: The secrets of Kconfig/kbuild


https://opensource.com/article/18/10/kbuild-and-kconfig
[9] Linux kernel configuration
https://linuxconfig.org/in-depth-howto-on-linux-kernel-configuration

16 / 16

You might also like