最近又发现一个矿渣,我家云或者粒子云,配置是 RK3328 + 1G RAM + 8G EMMC。单看配置确实没啥看的价值,但是好就好在他可以内置一个 3.5 寸的硬盘,磁盘读写速度比起只有 USB 2.0 的 N1 盒子来说完全不可同日而语。矿难以后价格一度降到五六十块包邮,然而我总是后知后觉,发现的时候价格又都涨到 80 左右包邮了,无论如何,如果有接硬盘的需求,比现在入 N1 还是合算一些的。

这个东西其实硬件是有毛病会掉盘的,看了一下论坛上的说法,基本都是说供电有问题,USB -> SATA 的转换芯片本身也有问题(RK3328 不支持 SATA,他的内置 SATA 是用 USB3 加上转换芯片实现的)。不过我们要求不高,不会疯狂一次性给硬盘写入上 T 的数据,硬盘也用功耗比较低的西数绿盘之类的话就还好,至少我目前还没遇到掉盘的问题。

刷机过程和固件网上都有非常多了,这里不再啰嗦,网上固件基本都是弄好的 NAS 系统,要么就是基于 Debian 的 Armbian,但是对于我们 CentOS 爱好者来说,用着实在是不爽,所以就有了这篇文章,讲如何用 Armbian 的镜像和 CentOS 的 root 文件系统杂交出来一个 CentOS 的镜像给我家云用。

需要手边有一个可用的 Linux 系统

首先需要获得一个我家云可用的 Armbian 镜像,这里推荐 ride_wind 的 Armbian 固件,下载地址 https://cloud.189.cn/t/vA736bn2EfEb 密码 3997

里面 Armbian 开头的,看起来长得顺眼的下一个就可以,比如 Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.7z 。解开得到 Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img

此外我们还需要一个 CentOS 7 的镜像, 8 里面 aarch64 被合并进主流了,所以就没人做根文件系统镜像了,只有启动的 iso,当然也不是不能做,就是麻烦很多,我们先用现成的 7 来做。

下载链接

http://mirrors.aliyun.com/centos-altarch/7.8.2003/isos/aarch64/images/CentOS-Userland-7-aarch64-generic-Minimal-2003-sda.raw.xz

将两个文件都复制到 linux 系统下面,CentOS 的镜像需要用 xz -d 解压缩一下

xz -d CentOS-Userland-7-aarch64-generic-Minimal-2003-sda.raw.xz

先研究 Armbian 的镜像,用 fdisk 看一下这个镜像里面的样子

fdisk Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img

大概会出现如下结果,用 p 命令查看现在分区状态

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img: 1.3 GiB, 1413480448 bytes, 2760704 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xbfdae994

Device Boot Start End Sectors Size Id Type
Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img1 32768 2760703 2727936 1.3G 83 Linux

注意到没有这个分区开始位置比较靠后,在 32768 扇区位置, 32768 * 512 = 16M ,也就是说这个镜像前面 16M 不在分区里面,应该都是 bootloader 一类的。我们把它 mount 上看看啥样子

losetup -o 16777216 -f Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img
losetup -a
/dev/loop0: [2049]:29097987 (/data/share/tmp/Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img), offset 16777216
mount /dev/loop0 /mnt # 这里不要照抄,要看 losetup -a 出来结果里面对应的 loop 设备是哪个

然后进入 /mnt 就可以看到分区里面的内容了。

我们的基本思路是用 Armbian 的内核和 CentOS 的文件系统杂交,所以 Armbian 这个文件系统里面对我们有用处的就是内核和对应的模块,我们先把他 tar 出来备用,在 /mnt 下面执行

tar czf /tmp/armbian.tar.gz boot/ usr/lib/modules usr/lib/firmware

之后就可以开心的把 armbian 文件系统都给删光光了。

rm -rf /mnt/* # 千万不要敲错。。。

在往镜像里面拷贝之前还需要做个事情,就是把这个镜像扩一下容,要不然放不下 CentOS。。

cd /data/share/tmp # 你放 armbian 镜像的路径
umount /mnt
losetup -d /dev/loop0 # 同样不要照抄,和前面的保持一致
dd if=/dev/zero bs=1M count=2048 » Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img

用 fdisk 将其扩容

fdisk Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img

然后用 d 直接删掉分区,再用 n 重建,重建的时候,Start 记得写 32768,之前我们有提到过,镜像前面 16M 是保留的。其余都用默认就可以
最后 w 写入。
大概类似下面这个吧,供参考

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img: 3.3 GiB, 3560964096 bytes, 6955008 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xbfdae994

Device Boot Start End Sectors Size Id Type
Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img1 32768 2760703 2727936 1.3G 83 Linux

Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-2760703, default 2048): 32768
Last sector, +sectors or +size{K,M,G,T,P} (32768-6955007, default 6955007):

Created a new partition 1 of type ‘Linux’ and of size 3.3 GiB.
Partition #1 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: n

Command (m for help): w

The partition table has been altered.
Syncing disks.

losetup -o 16777216 -f Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img
losetup -a
/dev/loop0: [2049]:29097987 (/data/share/tmp/Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img), offset 16777216

先别着急 mount,文件系统还没有扩容

e2fsck -f -y /dev/loop0
resize2fs /dev/loop0

然后就可以 mount 了

mkdir /mnt/dst
mount /dev/loop0 /mnt/dst

下面需要把 CentOS 的镜像也给挂载上,这个镜像里面有分区,所以稍微麻烦点

losetup -f CentOS-Userland-7-aarch64-generic-Minimal-2003-sda.raw

用 losetup -a 查看对应的 loop 设备,假设为 /dev/loop1

partprobe /dev/loop1
mkdir /mnt/src
mount /dev/loop1p4 /mnt/src # 这个镜像的第四个分区才是 linux root

下面我们需要复制 CentOS 里面所有文件到 Armbian 的文件系统,为了保持原来的链接之类有效,直接用 tar 来全部同步

cd /mnt/src
tar c | tar x -C ../dst

接下来删掉 CentOS 里面的内核和模块之类,用刚才备份的文件覆盖回去

cd /mnt/dst
rm -rf boot usr/lib/modules usr/lib/firmware
tar zxf /tmp/armbian.tar.gz

现在 CentOS 文件复制基本完成了,但是不要着急,还差最后一步,CentOS 根分区在 fstab 里面是靠 UUID 加载的, Armbian 分区的 UUID 肯定不一样,如果不调整会导致无法进系统。需要编辑一下 fstab

首先不要卸载文件系统,用 blkid 查看一下 UUID

blkid
/dev/loop0: UUID="575c6079-5569-4591-bb50-3a561c1b32e1" TYPE=“ext4”
/dev/loop1: PTUUID=“00012ee3” PTTYPE=“dos”
/dev/loop1p1: SECTYPE=“msdos” UUID=“6085-5C8F” TYPE=“vfat” PARTUUID=“00012ee3-01”
/dev/loop1p2: LABEL="_/boot" UUID=“0f70c468-4087-4ddb-88a6-f19d910a12ac” SEC_TYPE=“ext2” TYPE=“ext3” PARTUUID=“00012ee3-02”
/dev/loop1p3: LABEL="_swap" UUID=“72adc5ad-d2a7-404f-b107-ab30c646bd51” TYPE=“swap” PARTUUID=“00012ee3-03”
/dev/loop1p4: LABEL="
/" UUID=“284014ff-cdc5-4a45-9454-bcefd1e9304f” TYPE=“ext4” PARTUUID=“00012ee3-04”

然后编辑 fstab

cd /mnt/dst
vi etc/fstab

只保留第一行,其他都删掉,然后第一行的 UUID 改为刚才我们看到 armbian 镜像的那个。

好了,到此就全部结束了。卸载文件系统

umount /mnt/src
umount /mnt/dst
losetup -D

之后 Armbian_19.11.3_Chainedbox_stretch_current_5.4.2.img 就变成了一个含有 CentOS 7 的镜像。

在 Windows 下面刷入我家云即可。