blog-site

git clone git://git.lin.moe/blog-site.git

  1#+Title: Alpine Linux + EFISTUB + BTRFS
  2#+Date: 2024-07-20T14:40:00+08:00
  3#+Lastmod: 2025-01-21
  4#+Author: Lindsay Zhou
  5
  6* 制作启动镜像
  7这里使用 alpine-extended 镜像。
  8
  9因为 standard 镜像中的磁盘分区工具只有 busybox 的 fdisk 和 sfdisk , 制作 gpt 分区表比较麻烦。
 10extended 镜像中有 util-linux-misc 中的 fdisk 和 cfdisk 可以用来制作 gpt 分区表。
 11
 12如果你只需要 mbr 分区表,有其他制作 gpt 分区的方式,standard 镜像也是可以的。
 13
 14* 安装系统
 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=     |                      |
 22
 23** 制作磁盘分区表
 24#+begin_src  sh
 25  apk add cfdisk # 安装 cfdisk
 26  cfdisk /dev/nvme0n1  # 使用 cfdisk tui 配置分区
 27
 28  # 如果分区 /dev 中不存在分区设备节点,需要重启一下 mdev
 29  ls /dev/nvme0n1p* || /etc/init.d/mdev restart
 30#+end_src
 31
 32** 初始化文件系统
 33格式化各个磁盘分区:
 34#+begin_src 
 35apk add btrfs-progs dosfstools # 安装分区工具
 36
 37# 格式化分区
 38mkfs.vfat /dev/nvme0n1p1
 39mkswap /dev/nvme0n1p2
 40mkfs.btrfs /dev/nvme0n1p3
 41#+end_src
 42
 43制作相关 btrfs 子卷:
 44#+begin_src 
 45mount /dev/nvme0n1p3 /mnt
 46btrfs subvol create /mnt/home
 47btrfs subvol create /mnt/root
 48
 49umount /mnt
 50#+end_src
 51
 52将各个分区按照结构,依次挂载到 =/mnt= 目录下:
 53#+begin_src 
 54mount /dev/nvme0n1p3 /mnt -osubvol=/root
 55mkdir /mnt/boot /mnt/home
 56mount /dev/nvme0n1p3 /mnt/home -osubvol=/home
 57mount /dev/nvme0n1p1 /mnt/boot
 58swapon /dev/nvme0n1p2
 59#+end_src
 60
 61** 安装系统
 62#+begin_src 
 63env BOOTLOADER=none DISKOPTS=/mnt setup-alpine
 64#+end_src
 65相比默认的 =setup-alpine= sys 模式安装,最后会多两个步骤:
 66+ =Enter where to store configs:=
 67  设置 lbu 备份路径,如果需要与 sys 模式保持一致,填 =none=
 68+ =Enter apk cache directory:=
 69  apk 缓存路径,如果需要与 sys 模式保持一致,也填 =none=
 70  
 71** 添加 swap 分区表
 72这种方式安装的 alpine 不会在 =/etc/fstab= 文件中添加交换分区记录,需要手动添加。
 73vi 直接编辑 /mnt/etc/fstab 文件添加类似下面的内容:
 74#+begin_src 
 75# UUID=xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx    swap   swap    defaults    0 0
 76#+end_src
 77
 78或者执行
 79
 80#+begin_src
 81apk add blkid
 82
 83cat >> /mnt/etc/fstab << EOF
 84UUID=$(blkid --match-tag=UUID --output value /dev/nvme0n1p2)    swap   swap    defaults    0 0
 85EOF
 86#+end_src
 87
 88** 安装微码
 89#+begin_src 
 90apk add --root /mnt amd-ucode # 以 amd cpu 为例
 91# 或者
 92# apk add --root /mnt intel-ucode # intel cpu
 93#+end_src
 94
 95** 启用 swap (如有)
 96#+begin_src
 97ln -s /etc/init.d/swap /mnt/etc/runlevels/boot/swap
 98#+end_src
 99
100* 配置 EFI Boot
101运行下面的脚本
102#+begin_src
103#!/usr/bin/env sh
104# 可通过 wget https://p.koi.moe/efistub 获取
105
106set -e
107apk add efibootmgr blkid
108
109UUID=$(blkid --match-tag=UUID --output value /dev/nvme0n1p3)
110UCODEIMG=$(ls /mnt/boot/*-ucode.img|head -n1)
111
112# 如果为 intel cpu ,下面的 amd-ucode.img 改为 intel-ucode.img
113params="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"
116
117efibootmgr --create --label "Alpine Linux" \
118  --disk /dev/nvme0n1 --part 1 \
119  --loader /vmlinuz-lts \
120  --unicode "${params}" \
121  --verbose
122#+end_src
123
124* 重启进入系统
125#+begin_src 
126umount /mnt && reboot
127#+end_src