4 个稳定版本

2.1.2 2022年3月24日
2.1.0 2021年12月2日
2.0.0 2021年12月1日
1.0.0 2021年11月18日

#7#linux-distro

每月 41 次下载

自定义许可证

81KB
1.5K SLoC

Wyrcan Logo

Wyrcan ~ 容器引导加载程序

Wyrcan 是一个引导到容器的引导加载程序。这就是它所做的一切。

但当然,Wyrcan 并不仅仅意味着这些。使用 Wyrcan 引导容器还意味着您可以使用一个经过验证和可靠的软件打包生态系统来拥有一个裸机操作系统,该系统是

  • 无状态的:使用 Wyrcan 引导容器意味着磁盘上没有安装任何东西。除了您放入容器的状态之外,没有状态要管理。您永远不必担心软件包是否已更新:您可以安排重启以确保始终拥有最新的操作系统。而且如果您所有的本地存储挂载都是 noexec,那么一旦受到攻击,您只需重新启动即可。

  • 内存驻留的:完整的操作系统驻留在 RAM 中。这意味着它很快。但是,您也可以在容器中设置交换空间,以便将未使用的页面写入磁盘,为您的应用程序节省内存。

  • 声明式的:您的裸机操作系统是使用您在容器开发管道中已经熟悉的相同声明式工具开发的。但是您的操作系统配置在 git 中。将其托管在您最喜欢的 git 工具中(GitHub、GitLab、Bitbucket 等)。自动构建镜像。将其托管在您最喜欢的容器仓库中。

入门

使一切正常工作的三个基本步骤

  1. 构建和推送一个 可引导 容器。
  2. 配置 wyr.img=CONTAINER 以指向容器。
  3. 引导 Wyrcan。

从那里开始,Wyrcan 将完成其余的工作。

构建和推送可引导容器

什么是 可引导 容器?一个 可引导 容器是一个带有一些额外定制的普通容器

  1. 安装并创建符号链接到 /boot/wyrcan.kernel 的内核。

  2. 安装并创建符号链接到 /init 的 init 系统(通常是 systemd)。

  3. (可选) 所有必要的硬件支持包都已安装。这可能包括固件、用户空间驱动程序或启用软件。通常,此步骤不需要明确要求,因为安装内核将自动拉取所有必要的依赖项。

  4. (可选) 容器可以通过在 /boot/wyrcan.cmdline 中指定它们来定义所需的内核命令行选项。

在满足这些最小要求之后,您可以自定义容器以满足您的规格。您可能使用类似以下命令构建容器:podman build .docker build .。然后,您可以使用 podman push ...docker push ... 将其保存在您最喜欢的容器仓库中。

请注意,除了上述额外要求外,您将使用您现有的容器进程。

示例

Wyrcan项目为主流Linux发行版提供了一些可引导容器。所有这些都在GitLab容器注册库中可用。欢迎添加新功能、发行版以及错误修复!

  1. Debian
  1. Fedora
  1. Ubuntu
  1. Arch Linux
  1. CentOS

配置和启动Wyrcan

从这里开始,我们基本上希望使用内核 cmdline 中的 wyr.img=CONTAINER 启动Wyrcan。我们如何实现这一点取决于如何启动Wyrcan。有两种启动方法可用:直接启动和ISO启动。

直接启动

直接启动方案基本上指的是任何将Linux kernelinitrd 直接启动的过程。这包括

  • PXE / TFTP(即“网络启动”)
  • iPXE
  • QEMU

如何实现这些的具体细节取决于系统。然而,它们都有以下三个共同选项:kernelinitrd(也称为 initramfs)和 cmdline(也称为 optionsappend,出于历史原因)。

您基本上将 kernelinitrd 选项分别指向 wyrcan.kernelwyrcan.initrd,并填写适当的 cmdline 值。我们推荐以下 cmdline,但是可以根据您的需要进行自定义

quiet wyr.arg=loglevel=3 wyr.img=CONTAINER

示例

QEMU

$ curl -L 'https://gitlab.com/wyrcan/wyrcan/-/jobs/artifacts/latest/raw/wyrcan.kernel?job=images' \
  > wyrcan.kernel

$ curl -L 'https://gitlab.com/wyrcan/wyrcan/-/jobs/artifacts/latest/raw/wyrcan.initrd?job=images' \
  > wyrcan.initrd

$ qemu-system-x86_64 \
  -append "console=ttyS0 quiet wyr.arg=loglevel=3 wyr.img=CONTAINER" \
  -kernel wyrcan.kernel \
  -initrd wyrcan.initrd \
  -enable-kvm \
  -nographic \
  -m 4G

asciicast

iPXE

iPXE仅支持有限数量的TLS加密套件。截至本文撰写时,iPXE无法从GitHub下载。但它可以从GitLab下载。在Equinix Metal等云平台上,您可以为要启动的iPXE文件指定URL,并配置裸机始终从该URL启动。将以下文件放入GitLab仓库,并在云服务提供商中放入它的原始URL。现在您的启动过程将完全自动化。

#!ipxe

set kernel https://gitlab.com/wyrcan/wyrcan/-/jobs/artifacts/latest/raw/wyrcan.kernel?job=images
set initrd https://gitlab.com/wyrcan/wyrcan/-/jobs/artifacts/latest/raw/wyrcan.initrd?job=images

kernel ${kernel} console=ttyS0 quiet wyr.arg=loglevel=3 wyr.img=CONTAINER
initrd ${initrd}
boot

ISO启动

ISO启动方案与直接启动方案的不同之处在于,由于我们是使用ISO启动Wyrcan(无论是作为镜像还是刻录到CD、DVD或USB存储设备),我们无法直接指定cmdline。因此,我们只能手动指定或将其持久化到EFI变量中。

手动

这种方法最直接,但它缺乏自动化。然而,它对于探索和测试非常有用。

  1. 下载Wyrcan ISO
  2. 将其刻录到CD、DVD或USB存储设备上(可选)。
  3. 启动它。
  4. 当您到达引导加载程序菜单时,按e。这将打开cmdline的编辑器。
  5. 编辑cmdline以满足您的需求。请确保指定wyr.img=CONTAINER
  6. ENTERRETURN启动。

从这里开始,您应该会看到Wyrcan下载指定的容器并启动它。

虽然这很好用,但我们需要一个方法来自动化启动过程。

自动化

为了自动化ISO启动过程,我们需要一种方法来持久化wyr.imgwyr.arg。为了做到这一点,只需将wyr.efi=write添加到cmdline中。Wyrcan将验证您的配置并将其存储到EFI NVRAM中。一旦完成,Wyrcan将重新启动以显示完全自动化的过程。

一旦参数被存储,您就不再需要手动编辑cmdline。只需让Wyrcan从默认选项启动。Wyrcan将找到之前保存的cmdline并启动它。只需将ISO连接到设备,每次重新启动时Wyrcan都会做正确的事情。

⚠⚠⚠警告⚠⚠⚠

一些较旧的系统存在EFI固件缺陷,如果在EFI变量中写入自定义EFI变量,可能会导致硬件损坏。这是对EFI规范的明显违反,但却是相当不幸的。您不太可能拥有这样的硬件,尤其是如果您在服务器平台上使用Wyrcan。然而,您应该知道,使用EFI变量自动化流程可能会导致系统损坏的微小风险。

示例

QEMU(仅EFI)

这稍微复杂一些,只是因为您必须确保qemu使用EFI。Wyrcan不支持仅BIOS的系统。

  1. 下载Wyrcan ISO镜像。

  2. 复制OVMF_VARS.fd。这为您提供了保存EFI变量的能力。如果您已安装qemu,则该文件应包含在您的发行版中。有关详细信息,请参阅您发行版的文档。

  3. 使用EFI启动ISO(请确保分配足够的RAM)。像上面一样,OVMF_CODE.fd文件也应包含在您的发行版中。

$ curl -L 'https://gitlab.com/wyrcan/wyrcan/-/jobs/artifacts/latest/raw/wyrcan.iso?job=images' \
  > wyrcan.iso

$ cp /usr/share/edk2/ovmf/OVMF_VARS.fd myvars.fd

$ qemu-system-x86_64 \
  -drive if=pflash,format=raw,readonly,file=/usr/share/edk2/ovmf/OVMF_CODE.fd \
  -drive if=pflash,format=raw,file=myvars.fd \
  -cdrom wyrcan.iso \
  -enable-kvm \
  -nographic \
  -m 4G

asciicast

常见问题解答(FAQ)

Wyrcan是如何工作的?

Wyrcan启动了一个小巧的Linux构建。一旦网络启动,Wyrcan就会下载指定的容器镜像。接下来,Wyrcan将容器镜像转换为内核initrd。这里的initrd除了内核外,还包括整个容器镜像。最后,Wyrcan使用kexec功能启动生成的内核/initrd

是的,确实是从容器镜像中启动了实际的内核。容器启动后,Wyrcan没有任何内容保留在内存中。

Wyrcan能自己启动吗?

是的!Wyrcan本身就是一个可启动的容器。这意味着你可以链接加载Wyrcan来确保使用最新版本。例如,以下cmdline会在启动最终镜像之前先启动Wyrcan的最新版本:

wyr.img=registry.gitlab.com/wyrcan/wyrcan wyr.arg=wyr.img=registry.gitlab.com/wyrcan/debian

您在这里可以看到一个正在工作的链接启动

asciicast

Wyrcan内核的完整命令行参数列表是什么?

您可以使用以下内核命令行参数来控制Wyrcan

  • wyr.img=IMG - 指定要启动哪个容器。IMG应该是通常格式的容器名称。例如

    wyr.img=registry.gitlab.com/wyrcan/debian:latest
    
  • wyr.arg=ARG - 将指定的命令行参数传递给容器的内核。此参数可以多次指定,并且可以引用以包含空格。传递的参数将由Wyrcan内核忽略。例如,以下是一个有效的示例

    wyr.arg="quiet log-buf-len=1M" wyr.arg=print-fatal-signals=1
    

    容器的内核将接收以下命令行

    quiet log-buf-len=1M print-fatal-signals=1
    
  • wyr.net.[KIND.]FILE.SECTION.KEY=VAL - 允许您指定自定义的网络参数。此类型的所有参数都分组到文件中。然后创建一个包含指定内容的systemd.KIND文件。如果未指定KIND,则默认为network。例如,前面概述的配置将生成以下内容的/etc/systemd/network/FILE.KIND

    [SECTION]
    KEY=VAL
    

    请参阅systemd-networkd文档以获取完整的配置可能性。

  • wyr.efi=write - 将wyr.img和wyr.arg参数保存到EFI NVRAM中。这可以实现持久、自动启动。

  • wyr.efi=clear - 从EFI NVRAM中删除所有先前存储的值。这将禁用持久、自动启动。

等等...常驻内存...你是在使用我所有的RAM吗!?

是的。但并非真正如此。现代操作系统总是试图使用您所有的RAM。这仅仅更高效。

在传统的启动过程中,操作系统从磁盘开始。随着操作系统及其应用程序的加载,数据从磁盘传输到内存页面。当这些应用程序退出时,页面通常会保留在内存中作为缓存。这些页面通常被写回交换文件或分区。

在Wycan中,操作系统从内存开始启动。确实,这需要比传统系统更多的内存来启动。然而,如果您启动一个启用磁盘上交换文件或分区的容器,OS未使用的部分将被像普通操作系统一样页出到磁盘。因此,最终结果有些相似。但是,在Wycan中,您不需要管理磁盘上操作系统的状态。这是一大优势。

另外...您最近见过服务器吗?裸金属云服务器上可以配备2TiB的内存。您会没事的。

为什么Wyrcan托管在GitLab上?

不幸的是,iPXE对TLS加密套件的兼容性有限。结果是,iPXE可以直接从GitLab下载Wyrcan的kernelinitrd文件。我尝试的其他git存储库都不起作用。

此外,GitLab是开源的,并且内置了容器注册库。有很多值得喜欢的地方!

下载链接

依赖项

~14–27MB
~522K SLoC