开发板刷入Arch Linux

之前有提到过手里有块开发板用来当自己的微型服务器,跑跑脚本,组建局域网之类的,之前一直刷的是 Armbian 的系统,但遗憾的是手中的这块 orangepiwin 型号已经不被 Armbian 支持维护了,爱折腾的我怎么可以忍受陈旧的软件和内核呢, 于是在找了下网上的资料,发现 Arch Linux 同样支持 Arm 架构,下面就来一起看看吧。

初窥 Arch Arm

Arch Arm的官网里是这么介绍它的

  • 简单轻量
  • 为 Arm 优化
  • 软件保持最新

这几点完全解决了用户的痛点,由于 Arm 旗下平台众多,芯片种类也各不相同,所以安装方式也不同,我手中这块板子是 Allwinner 全志的芯片,需要参照官网的 pine64安装教程 来进行安装操作

动手安装

pine64安装教程 里描述是 pine64 的安装过程,虽然不是自用的 orangepiwin 但仍可参考借鉴,安装步骤总体可分为三部分

  • SD 分区
  • 镜像写入
  • 引导写入

经常折腾电脑的同学会发现,这些步骤类似操作系统的安装步骤。OK,让我们开始

SD 分区

这一步骤区别不大按官网操作即可,SD 存储卡接入电脑里,查看所使用的 驱动器是多少,此处假设为 sdX,以下命令按实际替换 sdX

1
2
3
4
5
6
7
8
9
10
# 填充 0 数值(可选)
dd if=/dev/zero of=/dev/sdX bs=1M count=8
# 开始对硬盘分区
fdisk /dev/sdX
# 输入 o 清除已有分区
# 输入 p 列出当前分区,此时应该没有内容
# 输入 n 新建分区,输入 p , 输入 1 , 输入 4096, 按 回车
# 输入 w 保存信息
# 格式化为 ext4
mkfs.ext4 /dev/sdX1

镜像写入

1
2
3
4
5
6
7
8
# 创建挂载目录
mkdir root
# 挂载磁盘
mount /dev/sdX1 root
# 下载镜像文件,地址固定
wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
# 以 root 身份 写入到挂载目录中,注意不要用 sudo
bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C root

到此步骤与 pine64 安装教程一致,但此后就开始不同,由于每块版子都有自己的设备树,所以后面和自己的开发板型号做处理。

下载 pine64 wget http://os.archlinuxarm.org/os/allwinner/boot/pine64/boot.scr 启动文件, cat boot.scr 可以看到如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
'Vy�Z����-U-Boot boot script�# After modifying, run ./mkscr

# Set root partition to the second partition of boot device
part uuid ${devtype} ${devnum}:${bootpart} uuid

setenv bootargs console=${console} root=PARTUUID=${uuid} rw rootwait

if load ${devtype} ${devnum}:${bootpart} ${kernel_addr_r} /boot/Image; then
setenv fdtfile allwinner/sun50i-a64-${board_name}.dtb
if load ${devtype} ${devnum}:${bootpart} ${fdt_addr_r} /boot/dtbs/${fdtfile}; then
if load ${devtype} ${devnum}:${bootpart} ${ramdisk_addr_r} /boot/initramfs-linux.img; then
booti ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r};
else
booti ${kernel_addr_r} - ${fdt_addr_r};
fi;
fi;
fi

乱码部分不用关心,由于本人的开发板是 orangepiwin 与 pin 同属于 allwinner/sun50i-a64- 类别下的开发板,所以我的修改内容较为简单增加一行 setenv board_name orangepi-win,明确指定使用 orangepi-win 即可

其他开发板需要结合自己开发板规格 和 芯片型号来设置 fdtfile 文件,可能要修改 setenv fdtfile allwinner/sun50i-a64-${board_name}.dtb 这一整行内容

新建 boot.cmd 结合微调之后内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
part uuid ${devtype} ${devnum}:${bootpart} uuid

setenv bootargs console=${console} root=PARTUUID=${uuid} rw rootwait

if load ${devtype} ${devnum}:${bootpart} ${kernel_addr_r} /boot/Image; then
setenv board_name orangepi-win
setenv fdtfile allwinner/sun50i-a64-${board_name}.dtb
if load ${devtype} ${devnum}:${bootpart} ${fdt_addr_r} /boot/dtbs/${fdtfile}; then
if load ${devtype} ${devnum}:${bootpart} ${ramdisk_addr_r} /boot/initramfs-linux.img; then
booti ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r};
else
booti ${kernel_addr_r} - ${fdt_addr_r};
fi;
fi;
fi
1
2
3
4
5
6
# 根据 boot.cmd 重新生成 boot.scr
mkimage -C none -A arm64 -T script -d boot.cmd boot.scr
# 拷贝 boot.scr 至指定目录下
cp boot.scr root/boot/boot.scr
# 结束挂载
umount root

引导写入

U-Boot 用于嵌入式系统的引导加载程序,此处可以直接用本人编译好的引导程序,点此下载,当然如果有兴趣研究 U-Boot 编译可以参考 github 上的一篇说明自行实践

1
2
# 写入引导
dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=8k seek=1

开机体验

引导程序写完后将 SD 安回开发板中,插上网线电源开机,观察路由器设备列表新出现的设备,使用 SSH 连接, 默认的帐号信息如下

  • 普通账户 alarm, 密码 alarm
  • 特权账户 root ,密码 root
1
2
3
4
5
6
7
8
9
pacman-key --init
pacman-key --populate archlinuxarm
# 编辑镜像文件
vi /etc/pacman.d/mirrorlist
# 在第一行添加国内源
Server = https://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo
保存退出
# 设置时区
timedatectl set-timezone Asia/Shanghai

自此完成相关安装操作

写在最后

其实折腾这个也有一段时间了,之前尝试了 alpine 系统,无法启动一直也没找到原因,后面索性就直接换系统,Arch Linux 优点就是滚动更新,还是比较好用的,希望本次的内容可以帮助到你。