创建可引导设备
本页面介绍如何为无盘或数据盘模式的 Alpine Linux 创建可自定义的启动设备,使用可写文件系统(即非 iso9660),以便存储本地自定义内容,如 apkovl 文件和缓存的软件包。 它还允许使用 update-kernel 脚本升级内核及其模块和用于启动系统的固件。
需求
- Alpine Linux 安装介质,可以是 CD/DVD/USB。
- 可自定义的启动设备,可以是 USB 驱动器/CompactFlash/SDCard 等,或用于无盘或数据模式 Alpine Linux 的硬盘分区。
使用 setup-bootable
setup-bootable 脚本是在 FAT32 文件系统上创建直接可自定义的启动设备的推荐方法。 对于其他文件系统,请参考 手动复制 Alpine 文件。
- 通过从 Alpine Linux 安装介质启动,完成 安装 直到 基本配置 步骤。 按照基本配置步骤中的描述,执行 setup-alpine 的初始执行,对所有与磁盘相关的问题回答 “none”。 确保可自定义的启动设备已插入或安装。 安装必要的工具来准备可自定义的启动设备,以避免出现影响后续操作的奇怪问题
# apk add dosfstools wipefs util-linux
- 运行
lsblk
以确定要转换为可引导设备的磁盘。 在此示例中,假设为 /dev/sda,根据需要更改- 警告: 以下步骤将清除 /dev/sda 磁盘上的所有内容。 如果您不确定或有重要数据,请勿继续。
# wipefs --all /dev/sda
- 创建一个分区 sda1,大小合适,将类型设置为 win95 fat,并设置可引导标志。 格式化 新创建的分区。 根据需要更改设备名称,例如/dev/sda1。
mkfs.vfat /dev/sda1
- 确定安装介质文件挂载的位置。 如果您运行
df
命令,您应该看到类似 /media/cdrom 或 /media/usb 或其他内容的只读挂载,具体取决于您的环境。 让我们使用 /media/cdrom 作为安装介质文件,/dev/sda1 作为可自定义的启动设备# setup-bootable -v /media/cdrom /dev/sda1
- 完成后,移除 安装介质 并 重启系统。
- 一旦系统从可自定义的启动设备 /dev/sda1 启动,以 root 用户身份登录并再次运行
setup-alpine
,以完成 安装 直到 基本配置 步骤。- # setup-alpine
- ...
- 您想使用哪个磁盘?(或 '?' 获取帮助或 'none') [none]
- 输入配置存储位置 ('floppy', 'sda1', 'usb' 或 'none') [sda1]
- 输入 apk 缓存目录(或 '?' 或 'none') [/media/sda1/cache]
- 对于关于要使用的磁盘的问题,选择 none。
- 脚本询问关于存储配置的问题。 选择可自定义的启动设备(在本例中为 'sda1')。
- 然后脚本会询问您 apk 缓存目录。 接受默认值或按如下方式键入,例如 /media/sda1/cache。 有关更多详细信息,请参考 APK 本地缓存。
- 始终记得运行
lbu ci
以将上述更改提交到磁盘。# lbu ci
- 通过重启并查看您的 Alpine 设置是否保存在可自定义的启动设备中来测试/验证。
手动复制 Alpine 文件
如果您不想使用 Setup-bootable
脚本或需要非 FAT32 分区,您可以手动创建可自定义的启动设备,方法是手动复制 Alpine Linux 文件并安装引导加载程序以使设备可引导。
复制 ISO/tarball 内容到 USB 驱动器
此方法是为从 Alpine ISO 文件复制文件而编写的,但也适用于 Alpine tarball (.tar.gz 文件),只需进行一行调整(见下文)。
- 安装一些先决条件。(如果您当前未使用 Alpine Linux,那么您可能已经安装了这些,否则您必须弄清楚如何安装它们。)
apk add dosfstools
apk add syslinux
- 将环境变量 'mydev' 设置为要安装 Alpine Linux 的 USB 驱动器的设备文件名
- 警告: 务必正确设置,否则您可能会覆盖错误的磁盘!
- 注意:如果 USB 驱动器的设备名称以数字结尾,您可能需要将下面所有
${mydev}1
替换为${mydev}p1
。 mydev=/dev/sdU
- 确保目标驱动器的现有分区(如果有)未挂载
umount -q $mydev?
- 复制并粘贴以下内容作为单个命令,以擦除目标驱动器,创建 MBR 分区表,并创建一个 FAT32 分区(您可以忽略任何 “Partition #1 contains a vfat signature.” 警告消息)
fdisk -w always $mydev <<EOF o n p 1 2048 -0 t 0c a w EOF
- 使用 FAT32 文件系统格式化新的 FAT32 分区
mkdosfs -F32 ${mydev}1
- 将 syslinux 可执行引导代码 复制到 MBR 引导扇区的引导代码区域(如果您当前未使用 Alpine Linux,您可能需要调整 syslinux 的 mbr.bin 文件的路径)
dd bs=440 count=1 conv=notrunc if=/usr/share/syslinux/mbr.bin of=$mydev
- 将 syslinux 引导加载程序文件安装到 FAT32 文件系统。(忽略 “Hidden (2048) does not match sectors (62)” 消息 - 现代系统使用分区表。 如果您收到 “no previous syslinux boot sector found” 错误,请尝试添加
--install
标志)syslinux ${mydev}1
- 将 Alpine 文件复制到 FAT32 文件系统(要改为复制 Alpine .tar.gz tarball 的内容,请参见下一项)
mydevname=$(basename $mydev)1 mkdir -p /media/$mydevname mount -t vfat ${mydev}1 /media/$mydevname cp -aT /media/cdrom /media/$mydevname # -T to copy hidden files umount /media/$mydevname
- 如果您改为想要复制 Alpine .tar.gz tarball 的内容,请执行以下操作
mydevname=$(basename $mydev)1 mytarball=/path/to/alpine-tarball.tar.gz mkdir -p /media/$mydevname mount -t vfat ${mydev}1 /media/$mydevname tar -p -s --atime-preserve --same-owner --one-top-level=/media/$mydevname -zxvf $mytarball umount /media/$mydevname
- (可选)删除作为复制过程一部分传输的任何 .apkovl 覆盖文件。 如果您想要未修改的原始安装,请执行此操作。
mount -t vfat ${mydev}1 /media/$mydevname rm /media/$mydevname/*.apkovl.tar.gz umount /media/$mydevname
完成安装
在启动之前创建的 Alpine Linux 可引导 USB 介质后,必须准备 USB 驱动器以保存本地自定义设置并运行 setup-alpine 以完成安装。
首先,让我们找出刚刚启动的 USB 介质的挂载位置,该位置可能会有所不同。
# mount | grep /media /dev/sdU1 on /media/sdU1 type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=utf8,shortname=mixed,errors=remount-ro)
在 USB 介质上创建本地目录以保存本地 APK 缓存(有关详细信息,请参阅 APK 本地缓存)。
# mount -o remount,rw /media/sdU1 # mkdir /media/sdU1/cache # setup-apkcache /media/sdU1/cache # ls -l /etc/apk/cache lrwxrwxrwx 1 root root 17 Oct 19 13:16 /etc/apk/cache -> /media/sdU1/cache
现在运行 setup-alpine 并继续,直到出现关于本地磁盘选择的问题 - 在无盘模式下,我们将不使用任何磁盘(即,我们的可引导介质文件基本上是未触及的),我们将使用 sdU1 来保存我们的系统自定义。
# setup-alpine ... Which disk(s) would you like to use? (or '?' for help or 'none') [none] Enter where to store configs ('floppy', 'sdU1', 'usb' or 'none') [sdU1]: Enter apk cache directory (or '?' or 'none') [/media/sdU1/cache]:
安装程序完成后,您可以看到检测到多少已创建/修改的文件,这些文件将被添加到备份中
# lbu status # lbu status | wc -l 59 # lbu commit # ls -l /media/sdU1/*apkovl.tar.gz -rwxr-xr-x 1 root root 9591 Oct 19 15:23 /media/sdU1/foo.apkovl.tar.gz
现在,所有自定义设置都保存在 USB 驱动器本身的 foo.apkovl.tar.gz 压缩 tarball 中。
故障排除
错误的设备名称
如果您无法从启动设备启动,并且看到类似
Mounting boot media failed. initramfs emergency recovery shell launched. Type 'exit' to continue boot
那么很可能是 syslinux.cfg 中的设备名称错误。 您应该替换此行中的设备名称
append initrd=/boot/grsec.gz alpine_dev=usbdisk:vfat modules=loop,cramfs,sd-mod,usb-storage quiet
使用正确的设备名称。
- 对于从 USB 启动,设备名称应为 'usbdisk'(如上所示)
- 对于其他选项,您可以运行
cat /proc/partitions
以查看可用的磁盘(即 'sda' 或 'sdb')
非 FAT32 文件系统
当启动设备使用默认不支持的文件系统格式化时,需要使用 update-kernel
将必要的 initfs 功能添加到 modloop。 请参阅:Alpine_Linux_package_management#Upgrading_.22diskless.22_and_.22data.22_disk_mode_installs
挂载启动设备并编辑 syslinux.cfg 文件。
然后找到 “append” 行,并将 alpine_dev=
设置更改为与使用的文件系统匹配,并将文件系统的内核模块添加到 modules=
列表中。
例如,更改
append [...] alpine_dev=usbdisk:vfat modules=loop,cramfs,sd-mod,usb-storage quiet
为
append [...] alpine_dev=usbdisk:ext4 modules=loop,cramfs,sd-mod,usb-storage,ext4 quiet
在 ext4 格式化分区的情况下。(或者对于其他文件系统,如果它们受 syslinux 和 Alpine Linux 内核支持)。
慢速 USB 设备
在 syslinux.cfg 行的末尾指定 'waitusb=X' 选项可能有助于某些注册时间较长的 USB 设备。 X 代表内核在查找安装介质之前等待的秒数。
append initrd=/boot/grsec.gz alpine_dev=usbdisk:vfat modules=loop,cramfs,sd-mod,usb-storage quiet waitusb=3
CF 卡读卡器
某些 CF 卡读卡器在市场上速度更快的 CF 卡上存在问题。 如果即使在检查 BIOS 设置后,您仍然遇到启动 CF 卡的问题,您可能需要使用较旧的卡。
此外,许多 CF 卡读卡器不支持 DMA,因此您可能需要在 syslinux.cfg 文件的 append 行中添加 nodma。