..

Orange Pi5 安装 Alpine

之前我们介绍过安装 armbian 到 btrfs 文件系统

armbian 挺好的。但是我用的更多的是 archlinux 或者 alpine。alpine 更适合运行在 container 中或者一些配置较低的系统上面。这个 NAS 基本只提供 samba 和存储池的功能。以后可能也会做一些边缘计算的任务。这里就选用 alpine 作为 rootfs。

我们使用 docker 来制作 rootfs,直接在 host 中执行下面的流程也是可以的。

mkdir ~/make-alpine-rootfs

将下面的内容复制到 ~/make-alpine-rootfs/Dockerfile 中。

From alpine:3.19

ADD https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.19/main/aarch64/apk-tools-static-2.14.4-r0.apk /root

WORKDIR /root
RUN tar -xzf apk-tools-static-*.apk

RUN ./sbin/apk.static -X https://mirrors.tuna.tsinghua.edu.cn/alpine/latest-stable/main -U --allow-untrusted -p /mnt --initdb add alpine-base openssh-server mkinitfs u-boot-tools btrfs-progs

RUN mkdir /mnt/boot
RUN mkdir /mnt/lib/modules

COPY <<EOF /mnt/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
EOF

COPY <<EOF /mnt/etc/apk/repositories
http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.19/main
http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.19/community
EOF

RUN echo "PermitRootLogin yes" >> /mnt/etc/ssh/sshd_config
RUN echo "PermitEmptyPasswords yes" >> /mnt/etc/ssh/sshd_config

RUN ln -sf /etc/init.d/devfs /mnt/etc/runlevels/sysinit/
RUN ln -sf /etc/init.d/mdev /mnt/etc/runlevels/sysinit/

RUN ln -sf /etc/init.d/hwclock /mnt/etc/runlevels/boot/
RUN ln -sf /etc/init.d/modules /mnt/etc/runlevels/boot/
RUN ln -sf /etc/init.d/sysctl /mnt/etc/runlevels/boot/
RUN ln -sf /etc/init.d/hostname /mnt/etc/runlevels/boot/
RUN ln -sf /etc/init.d/boootmisc /mnt/etc/runlevels/boot/
RUN ln -sf /etc/init.d/syslog /mnt/etc/runlevels/boot/
RUN ln -sf /etc/init.d/networking /mnt/etc/runlevels/boot/

RUN ln -sf /etc/init.d/sshd /mnt/etc/runlevels/default/

RUN ln -sf /etc/init.d/mount-ro /mnt/etc/runlevels/shutdown/
RUN ln -sf /etc/init.d/killprocs /mnt/etc/runlevels/shutdown/
RUN ln -sf /etc/init.d/savecache /mnt/etc/runlevels/shutdown/

RUN sed -i 's/ext4/btrfs ext4/g' /mnt/etc/mkinitfs/mkinitfs.conf

构建 rootfs

cd ~/make-alpine-rootfs
docker build -t mkrootfs .

制作 initramfs。如果是在其他机器上面构建 rootfs,需要将 Pi5 当前的内核 /lib/modules 的内容复制过来,并且在执行 mkinitfs 的时候需要指定内核版本。

docker run -it --name mkrootfs -v /lib/modules:/lib/modules:ro mkrootfs ash -c "cp -arp /lib/modules/* /mnt/lib/modules/ && chroot /mnt ash -c 'mkinitfs -o /boot/initramfs && mkimage -A arm64 -O linux -T ramdisk -C gzip -n uInitrd -d /boot/initramfs /boot/uInitrd'"

挂载当前系统的根目录

mount /dev/sda /mnt
ls -l /mnt

total 0
drwxr-xr-x    1 root     root           156 Feb 21 04:31 @rootfs

这个 @rootfs 就是当前 armbian 的系统。我们再创建一个用于 alpine。

btrfs subvol create /mnt/@rootfs-alpine

将刚才制作好的 rootfs 复制出来。

docker cp mkrootfs:/mnt/ /mnt/@rootfs-alpine/

复制当前系统的 fstab,并替换 subvol 的内容

cp /etc/fstab /mnt/@rootfs-alpine/etc/fstab
sed -i 's/subvol=@rootfs/subvol=@rootfs-alpine/g' /mnt/@rootfs-alpine/etc/fstab

替换 uInitrd (注意备份之前的 uInitrd)

cp /mnt/@rootfs-alpine/boot/uInitrd /boot/uInitrd

替换 /boot/armbianEnv.txtsubvol

sed -i 's/subvol=@rootfs/subvol=@rootfs-alpine/g' /boot/armbianEnv.txt

最后重启系统。我们就可以正常的进入 alpine 系统了。
通过修改 armbianEnv.txtsubvol,我们也可以在两个系统中来回切换。