制作思路
在emmc上烧录ubuntu系统,需要内核至少开启
CONFIG_MD
CONFIG_BLK_DEV_DM
CONFIG_BLK_DEV_LOOP
CONFIG_DM_VERITY
,内核编译教程可以参考上一篇,或者查看官方文档即可。然后在sd卡上制作双系统,切记sd卡的格式是fat32
材料准备
- 香橙派开发板,我的是香橙派5b
- sd卡或者外接硬盘
- ubuntu镜像
操作过程
- 切换到root用户
sudo -i
- 更新软件包列表
apt update
- 安装所需软件
apt install dosfstools kpartx rsync
- 创建工作目录
mkdir devboot
- 转到工作目录
cd devboot
- 创建挂载目录
mkdir boot root osimg
- 同时把ubuntu镜像上传到这个目录并改名字为
img01.img
- 查看目录下的文件
ls -al
目录文件 - 插入sd卡,查看是否有
lsblk -d
,如下图,我的sd卡是mmcblk1
sd卡设备 - 对sd卡进行分区
cfdisk /dev/mmcblk1
,一个boot分区(fat32
)512M,两个系统分区(ext4
),步骤如下
分区 -
删除原有所有分区,效果如下
删除后的分区 -
创建boot分区
boot分区
boot分区
boot分区
boot分区
boot分区 -
创建系统分区,把剩余空间平均分配即可
第一个系统分区 -
效果如下
分区效果 - 选
Write
写入磁盘,选Quit
退出,输入partprobe
使分区生效 - 查看分区情况
lsblk
分区情况 - 格式化,
注意替换自己的设备名称
mkfs.fat -F 32 -n "boot" /dev/mmcblk1p1
mkfs.ext4 -L rootfs1 /dev/mmcblk1p2
mkfs.ext4 -L rootfs2 /dev/mmcblk1p3
,没有报错即可,有报错就解决报错,有报错大概率是sd卡有问题,重新格式化sd卡或者换一个 - 挂载
boot
分区mount /dev/mmcblk1p1 boot/
- 创建俩个系统的boot目录
mkdir boot/{os1,os2}
- 挂载第一个系统分区
mount /dev/mmcblk1p2 root/
- 挂载系统镜像
losetup -f --show img01.img
挂载系统镜像 - 添加分区映射
kpartx -va /dev/loop0
- 挂载分区映射
mount /dev/mapper/loop0p2 osimg/
mount /dev/mapper/loop0p1 osimg/boot/
- 拷贝boot目录到os1中
cp -a osimg/boot/* boot/os1/
- 卸载boot目录
umount osimg/boot/
- 同步rootfs
rsync -axv osimg/ root/
- 创建引导程序目录
mkdir root/bootpar
- 把分区信息写入分区系统表,改成自己的分区即可
sed -i "s/\(UUID=\)[[:xdigit:]-]\+\([[:blank:]]*\)\/boot/\1$(blkid -o value -s UUID /dev/mmcblk1p1)\2\/bootpar/" root/etc/fstab
sed -i "s/\(UUID=\)[[:xdigit:]-]\+\([[:blank:]]*\/[[:blank:]]\+\)/\1$(blkid -o value -s UUID /dev/mmcblk1p2)\2/" root/etc/fstab
echo -e "/bootpar/os1 /boot none bind 0 0\n" >> root/etc/fstab
sed -i "s/\(UUID=\)[[:xdigit:]-]\+/\1$(blkid -o value -s UUID /dev/mmcblk1p2)/" boot/os1/orangepiEnv.txt
- 同步到存储设备中
sync && sync
- 卸载目录,删除分区映射,解除镜像挂载
umount root/
umount osimg/
kpartx -d /dev/loop0
losetup -d /dev/loop0
- 安装第二个系统,步骤同上面第一个系统一样,命令顺序如下
mount /dev/mmcblk1p3 root/
losetup -f --show img01.img
kpartx -va /dev/loop0
mount /dev/mapper/loop0p2 osimg/
mount /dev/mapper/loop0p1 osimg/boot/
cp -a osimg/boot/* boot/os2/
umount osimg/boot/
umount osimg/boot/
rsync -axv osimg/ root/
mkdir root/bootpar
sed -i "s/\(UUID=\)[[:xdigit:]-]\+\([[:blank:]]*\)\/boot/\1$(blkid -o value -s UUID /dev/mmcblk1p1)\2\/bootpar/" root/etc/fstab
sed -i "s/\(UUID=\)[[:xdigit:]-]\+\([[:blank:]]*\/[[:blank:]]\+\)/\1$(blkid -o value -s UUID /dev/mmcblk1p3)\2/" root/etc/fstab
echo -e "/bootpar/os2 /boot none bind 0 0\n" >> root/etc/fstab
sed -i "s/\(UUID=\)[[:xdigit:]-]\+/\1$(blkid -o value -s UUID /dev/mmcblk1p3)/" boot/os2/orangepiEnv.txt
sync && sync
umount root/
umount osimg/
kpartx -d /dev/loop0
losetup -d /dev/loop0
- 处理boot
cp -a boot/os1/* boot/
- 重启
reboot
,重启后启动的是第一个镜像
切换镜像
- 把
/bootpar/os1/orangepiEnv.txt
复制到/bootpar/
中,就是启动第一个镜像 - 把
/bootpar/os2/orangepiEnv.txt
复制到/bootpar/
中,就是启动第二个镜像
一键脚本
也可以使用脚本键建制作香橙派双系统