..
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.txt
的 subvol
sed -i 's/subvol=@rootfs/subvol=@rootfs-alpine/g' /boot/armbianEnv.txt
最后重启系统。我们就可以正常的进入 alpine 系统了。
通过修改 armbianEnv.txt
的 subvol
,我们也可以在两个系统中来回切换。