无盘模式

来自 Alpine Linux

在无盘模式下,整个操作系统及其所有应用程序首先加载到 RAM 中,然后仅从那里运行。这也是启动 Alpine Linux iso 安装介质的方法。可以安装和配置 Alpine Linux,以便系统继续以这种方式启动,如果在运行 setup-alpine 脚本时指定了“disk=none”。

此模式速度极快,可以节省不必要的磁盘启动、电源和磨损,非常适合服务器。它类似于其他 Linux 发行版可能称之为“节俭”安装或使用“toram”选项启动。

您可以继续使用您的 安装介质 作为 启动设备,而无需将 Alpine 安装到设备的内部磁盘,但也可以将 Alpine Linux 安装到设备的内部磁盘并将其配置为启动到“无盘模式”。

Apkovl

当您将 Alpine 安装启动到无盘模式时,它将初始化一个全新的根目录 (/),并且您所做的任何自定义设置(例如更改密码、添加用户等)将在您重新启动时丢失。但是,通过使用名为 本地备份实用程序(lbu) 的 Alpine Linux 工具,任何自定义配置都可以跨重启保留或“持久化”。通过将运行状态保存到 .apkovl 文件,初始的可能是只读的安装介质可以继续作为“无盘”系统的唯一启动设备,并在从启动设备启动时自动加载这些文件。

Apkovl(APK 覆盖文件)是一个用于在无盘模式下运行 Alpine Linux 时存储本地配置状态的文件。它存储所有已从默认文件更改的配置文件。文件名是 <hostname>.apkovl.tar.gz,并存储在路径在 /etc/lbu/lbu.conf 中定义的位置。Apkovl 文件中的内容覆盖在启动时加载的 apk 内容之上。

备份工具 lbu 允许通过使用 .apkovl 文件来提交和还原本地配置系统状态,这些文件被保存到备份位置并在启动时加载。在无盘模式下,为了使对运行系统所做的每一项更改在重启后仍然存在,必须在重启系统之前执行 lbu commit 命令以更新 .apkovl 文件。

本地软件包缓存

当 Alpine Linux 在无盘模式下启动时,远程仓库在网络启动后才能使用。这意味着在本地启动介质中没有的新软件包在重启后将不可用,除非它们被设置为持久性的 本地软件包缓存,该缓存位于本地可写存储设备上。本地软件包缓存可以与 .apkovl 文件存储在同一分区中。

安装

Alpine Linux 安装脚本 setup-alpine 使用 setup-lbu 脚本将配置和软件包缓存保存到任何可用的可写文件系统,该文件系统位于只读 安装介质 之外的任何介质上。

由于 Bug:#10473,将本地配置和软件包缓存存储在内部磁盘上需要手动步骤,即在 /etc/fstab 中添加条目,创建挂载点,并在运行 setup-alpine 脚本之前挂载分区。

  1. 在这种情况下,从 安装介质 启动目标无盘系统,并在 启动过程 阶段之后不要继续。
  2. 如果必要的分区不可用,请使用 fdisk 手动 创建 分区。在以下步骤中,我们将使用 /dev/sdXY 作为分区号。根据 blkid 的输出调整分区标识符
    • 由于 Bug:#11589。无盘设置的 APKOVL 加载在 btrfs 和 xfs 文件系统或基于 nvme 的设备上不起作用。因此,仅在传统驱动器上使用 ext4 文件系统分区来存储无盘模式状态。
    • mkfs.ext4 默认创建启用了 64 位功能的 ext4 文件系统,但由于问题 #14895,extlinux 可能无法使用该文件系统启动。您可能需要将“-O ^64bit”添加到 mkfs.ext4 以规避此问题。以下命令创建一个禁用了日志功能的 ext4 分区,以减少写入操作,并允许磁盘在启动期间从分区读取 .apkovl 和软件包后停止旋转。如果命令 mkfs.ext4 不可用,请使用命令 apk add e2fsprogs 安装软件包 e2fsprogs

    # mkfs.ext4 -O ^has_journal,^64bit /dev/sdXY

  3. 由于一个 bug,分区无法挂载到 /boot。配置 /etc/fstab 以将可写分区挂载到 /media/sdXY 而不是 /boot,即符合热插拔/冷插拔挂载点。

    # mkdir /media/sdXY

    # echo "/dev/sdXY /media/sdXY ext4 noatime,ro 0 0" >> /etc/fstab

  4. 挂载 /etc/fstab 中列出的分区。

    # mount -a

    查看 mount 的输出以验证更改是否已正确应用。
  5. 如果 setup-alpine 之前未运行过,请按照 安装步骤 完成 基本配置。上述更改现在应该使您能够选择用于保存本地配置和软件包缓存的分区。如果被询问,则无需首先卸载分区,这仅在允许安装到其父磁盘上时才需要。
  6. 如果 setup-alpine 已经用于配置无盘系统,则可以使用以下命令直接修改存储设置

    # setup-lbu sdXY

  7. 可以按如下方式启用本地软件包缓存

    # mkdir /media/sdXY/cache

    # setup-apkcache /media/sdXY/cache

  8. 如果分区足够大,则编辑 lbu.conf 以取消注释并设置 BACKUP_LIMIT=3 可能会很有用。例如,允许在需要时恢复到之前的可用状态。

    # apk add nano

    # nano /etc/lbu/lbu.conf

  9. 最后,通过执行 lbu commit 生成包含所有先前更改的第一个 .apkovl 文件,以便刚刚进行的自定义设置将在重启后仍然存在。

    # lbu commit

  10. 从现在开始,每当安装软件包或新配置时,并且应保留更改时,请执行 lbu commit

启动设备

最初的基于 ISO9660 文件系统的只读 安装介质 可以继续作为新配置的 Alpine Linux 无盘系统的唯一启动设备。

运行无盘模式的 Alpine Linux 也可以从 USB 闪存盘/CompactFlash/SD 卡或 SSD/NVMe 硬盘上的可写文件系统分区启动。此启动设备被称为可自定义的启动设备,以区别于 安装介质。诸如 apkovl 文件和缓存软件包之类的本地自定义项可以存储在此可自定义的启动设备中,这也允许使用 update-kernel 脚本升级内核及其模块和固件。

从 Web 服务器加载 apkovl

Alpine 的“无盘模式”ISO 启动镜像支持启动参数以加载自定义文件,例如从 Web 服务器加载 apkovl

可以通过使用 APKOVL 内核启动参数提供自定义 URL,从 Web 服务器加载 APKOVL 文件。如果您没有 Web 服务器,可以临时运行 busybox 的 httpd 来提供 .apkovl - busybox httpd -p 127.0.0.1:80

升级无盘系统

当 Alpine Linux 在“无盘”或“数据”磁盘模式下运行时,除了常规的 升级步骤 之外,升级还需要一些额外的步骤。

如果从只读设备或作为可写介质上的 iso 镜像启动“无盘”系统,则无法更新驻留在该设备上的启动文件(内核、模块、固件等)。

对于可自定义的启动设备,可以更新启动文件。然而,即便如此,内核及其模块和固件文件仍然不能通过常规软件包更新直接更新。相反,有一个 update-kernel 脚本可以生成 initfs 镜像,并将它们与升级后的内核一起安装。

  • 在升级之前,请安装 mkinitfs 软件包,因为这是生成启动期间使用的初始文件系统所必需的,如下所示

    # apk add mkinitfs

  • 默认配置中缺少的其他 initfs 功能,例如 btrfs 文件系统支持(在编写本文时,允许在启动期间加载 .apkovl 配置和软件包缓存),可以在 /etc/mkinitfs/mkinitfs.conf 文件中启用。
  • 可用的 initfs 功能可以使用 ls /etc/mkinitfs/features.d 列出

# ls /etc/mkinitfs/features.d # apk add nano # nano /etc/mkinitfs/mkinitfs.conf # lbu commit

  • 最后,更新内核及其启动环境。

# update-kernel /media/sdXY/boot/

注意:运行 update-kernel 至少需要 8 GB 的可用内存,以避免 modloop 镜像损坏。因此,在内存受限的设备(如 Raspberry Pi)中,使用环境变量 TMPDIR 指向 *nix 文件系统格式化的物理设备上的目录,如 SD 卡或 USB 闪存盘,如下所示:

# TMPDIR=/media/sdc1/tmp update-kernel /media/mmcblk0p1/boot/

有关手动添加其他模块或固件软件包的选项,请参阅 update-kernel --help

内核选项

有关无盘模式的内核命令行选项的文档将在安装文档子软件包 mkinitfs-doc 后可用

man mkinitfs-bootparam

       If no root= parameter is given, the initramfs will build a live system
       in memory from scratch. This is also called diskless mode.

       When booting in diskless mode, the following options are also
       available:

       alpine_repo=(URL | PATH)
              If set, /etc/apk/repositories will be filled with this. May be a
              comma-separated list of URLs.

       apkovl=(URL | [DEVICE[:FS_TYPE]:]PATH)
              A HTTP, HTTPS or FTP URL to an apkovl.tar.gz file which will be
              retrieved and applied. Can also be a filesystem path, optionally
              prepended with the device name without the /dev/ prefix.

       autodetect_serial=no
              Disable automatic detection and setup of serial console.

       ds=OPTIONS
              Data source for tiny-cloud. If OPTIONS starts with nocloud,
              tiny-cloud will be enabled.

       nokeep_apk_new
              Setup a fresh system, ignore any apkovl.

       pkgs=PACKAGE{,PACKAGE}
              Comma-separated list of packages to be installed.
       ssh_key=(URL | SSH_KEY)
              This setting installs openssh and places the public key given as
              value in /root/.ssh/authorized_keys.  If the value is an HTTP or
              FTP url, its fetches the key(s) from there.

       splash Enable splash screen.

       usbdelay=NUMBER
              Wait NUMBER seconds for USB devices to show up before searching
              for boot media.

       wireguard=INTERFACE;IP_ADDRESS{,IP_ADDRESS,...}[;WG_CONFIG_FILE]
              Set up a wireguard interface named INTERFACE with the addresses
              IP_ADDRESS and use /etc/wireguard/initrd.conf or WG_CONFIG_FILE
              as a classic wg (not wg-quick) config.

       zfs_force=NUMBER
              Enable force importing the root zpool on boot, even if it was
              previously mounted from a different system/OS.

参见