无盘模式
在无盘模式下,整个操作系统及其所有应用程序首先加载到 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
脚本之前挂载分区。
- 在这种情况下,从 安装介质 启动目标无盘系统,并在 启动过程 阶段之后不要继续。
- 如果必要的分区不可用,请使用
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
- 由于一个 bug,分区无法挂载到 /boot。配置 /etc/fstab 以将可写分区挂载到 /media/sdXY 而不是 /boot,即符合热插拔/冷插拔挂载点。
# mkdir /media/sdXY
# echo "/dev/sdXY /media/sdXY ext4 noatime,ro 0 0" >> /etc/fstab
- 挂载 /etc/fstab 中列出的分区。
#
查看mount -a
mount
的输出以验证更改是否已正确应用。
- 如果
setup-alpine
之前未运行过,请按照 安装步骤 完成 基本配置。上述更改现在应该使您能够选择用于保存本地配置和软件包缓存的分区。如果被询问,则无需首先卸载分区,这仅在允许安装到其父磁盘上时才需要。 - 如果
setup-alpine
已经用于配置无盘系统,则可以使用以下命令直接修改存储设置# setup-lbu sdXY
- 可以按如下方式启用本地软件包缓存
# mkdir /media/sdXY/cache
# setup-apkcache /media/sdXY/cache
- 如果分区足够大,则编辑 lbu.conf 以取消注释并设置 BACKUP_LIMIT=3 可能会很有用。例如,允许在需要时恢复到之前的可用状态。
# apk add nano
# nano /etc/lbu/lbu.conf
- 最后,通过执行
lbu commit
生成包含所有先前更改的第一个 .apkovl 文件,以便刚刚进行的自定义设置将在重启后仍然存在。# lbu commit
- 从现在开始,每当安装软件包或新配置时,并且应保留更改时,请执行
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.
参见
- Alpine 本地备份实用程序 - lbu'
- 本地软件包缓存
- 手动编辑现有的 apkovl
- 备份闪存安装
- 将无盘系统升级到新的 Alpine Linux 版本
- 无盘 PXE 启动
- 如何使用 mkimage 制作自定义 ISO 镜像
- QEMU 无盘示例
- 包含特殊文件部分 - 将
/etc
之外的自定义文件包含在 .apkovl 文件中。