1#+Title: Alpine Linux + EFISTUB + BTRFS2#+Date: 2024-07-20T14:40:00+08:003#+Lastmod: 2025-01-214#+Author: Lindsay Zhou56* 制作启动镜像7这里使用 alpine-extended 镜像。89因为 standard 镜像中的磁盘分区工具只有 busybox 的 fdisk 和 sfdisk , 制作 gpt 分区表比较麻烦。10extended 镜像中有 util-linux-misc 中的 fdisk 和 cfdisk 可以用来制作 gpt 分区表。1112如果你只需要 mbr 分区表,有其他制作 gpt 分区的方式,standard 镜像也是可以的。1314* 安装系统15这里以下面的分区格式为例16| 挂载点 | 分区 | 文件系统类型 | 文件系统额外挂载参数 |17|---------+------------------+--------------+----------------------|18| =/boot= | =/dev/nvme0n1p1= | =vfat= | |19| =/= | =/dev/nvme0n1p3= | =btrfs= | =subvol=/root= |20| =/home= | =/dev/nvme0n1p3= | =btrfs= | =subvol=/home= |21| | =/dev/nvme0n1p2= | =swapfs= | |2223** 制作磁盘分区表24#+begin_src sh25 apk add cfdisk # 安装 cfdisk26 cfdisk /dev/nvme0n1 # 使用 cfdisk tui 配置分区2728 # 如果分区 /dev 中不存在分区设备节点,需要重启一下 mdev29 ls /dev/nvme0n1p* || /etc/init.d/mdev restart30#+end_src3132** 初始化文件系统33格式化各个磁盘分区:34#+begin_src35apk add btrfs-progs dosfstools # 安装分区工具3637# 格式化分区38mkfs.vfat /dev/nvme0n1p139mkswap /dev/nvme0n1p240mkfs.btrfs /dev/nvme0n1p341#+end_src4243制作相关 btrfs 子卷:44#+begin_src45mount /dev/nvme0n1p3 /mnt46btrfs subvol create /mnt/home47btrfs subvol create /mnt/root4849umount /mnt50#+end_src5152将各个分区按照结构,依次挂载到 =/mnt= 目录下:53#+begin_src54mount /dev/nvme0n1p3 /mnt -osubvol=/root55mkdir /mnt/boot /mnt/home56mount /dev/nvme0n1p3 /mnt/home -osubvol=/home57mount /dev/nvme0n1p1 /mnt/boot58swapon /dev/nvme0n1p259#+end_src6061** 安装系统62#+begin_src63env BOOTLOADER=none DISKOPTS=/mnt setup-alpine64#+end_src65相比默认的 =setup-alpine= sys 模式安装,最后会多两个步骤:66+ =Enter where to store configs:=67 设置 lbu 备份路径,如果需要与 sys 模式保持一致,填 =none=68+ =Enter apk cache directory:=69 apk 缓存路径,如果需要与 sys 模式保持一致,也填 =none=7071** 添加 swap 分区表72这种方式安装的 alpine 不会在 =/etc/fstab= 文件中添加交换分区记录,需要手动添加。73vi 直接编辑 /mnt/etc/fstab 文件添加类似下面的内容:74#+begin_src75# UUID=xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx swap swap defaults 0 076#+end_src7778或者执行7980#+begin_src81apk add blkid8283cat >> /mnt/etc/fstab << EOF84UUID=$(blkid --match-tag=UUID --output value /dev/nvme0n1p2) swap swap defaults 0 085EOF86#+end_src8788** 安装微码89#+begin_src90apk add --root /mnt amd-ucode # 以 amd cpu 为例91# 或者92# apk add --root /mnt intel-ucode # intel cpu93#+end_src9495** 启用 swap (如有)96#+begin_src97ln -s /etc/init.d/swap /mnt/etc/runlevels/boot/swap98#+end_src99100* 配置 EFI Boot101运行下面的脚本102#+begin_src103#!/usr/bin/env sh104# 可通过 wget https://p.koi.moe/efistub 获取105106set -e107apk add efibootmgr blkid108109UUID=$(blkid --match-tag=UUID --output value /dev/nvme0n1p3)110UCODEIMG=$(ls /mnt/boot/*-ucode.img|head -n1)111112# 如果为 intel cpu ,下面的 amd-ucode.img 改为 intel-ucode.img113params="root=UUID=$UUID rootfstype=btrfs rootflags=subvol=/root rw modules=sd-mod,usb-storage,btrfs,nvme\114 initrd=\amd-ucode.img \115 initrd=\initramfs-lts"116117efibootmgr --create --label "Alpine Linux" \118 --disk /dev/nvme0n1 --part 1 \119 --loader /vmlinuz-lts \120 --unicode "${params}" \121 --verbose122#+end_src123124* 重启进入系统125#+begin_src126umount /mnt && reboot127#+end_src