玩树莓派的小伙伴可能遇到这样的烦恼,手里只有一张卡或者一块ssd,但是又想体验不同的系统,无奈只能重复的刷系统,可以说相当麻烦了,今天就说一说树莓派如何安装双系统。

数据无价,本教程的操作有一定的风险,开始前请备份重要数据!!!

前言

树莓派官方提供的NOOBS是可以实现多系统安装的,但是也存在一定的弊端,NOOBS本省会占用一定的空间造成空间浪费,系统都是从国外服务器在线下载,速度可想而知,而且需要显示器(从2015年开始玩pi的我到现在也没有显示器,穷啊),最主要的还是不符合玩家折腾的精神,所以我们不使用NOOBS,我们自己实现一个不需要显示器的双系统。

材料准备

  1. 树莓派4b
  2. SD卡一张(16G或以上),或硬盘一块
  3. 母-母杜邦线一条
  4. Linux操作系统(推荐Ubuntu),或者直接使用树莓派本身

SD卡或者USB都可以做双系统,我这里使用一张64G卡,操作系统我直接使用树莓派,如果你只有一张卡,那只能使用电脑或者虚拟机了。

安装

我选择的两个系统是官方系统和基地2.0,可以根据自己的需求更换。

0x00.准备工作

打开终端

#切换到root
sudo -i

#更新系统软件
apt update
apt upgrade

apt install dosfstools kpartx rsync

#创建工作目录
mkdir dualboot

cd dualboot

#创建挂载目录
mkdir boot root osimg

#上传两个要安装的系统镜像到这个目录
#2020-08-20-raspios-buster-armhf.img
#2020-06-22-OPENFANS-Debian-Buster-Desktop-Aarch64-ext4-v2020-2.0-U4-Release.img

20201029093230.png

0x01.分区

插卡,对介质进行分区和格式化
查看设备

lsblk

20201029093251.png
我这里设备名称是sda,根据自己情况替换

#分区
cfdisk /dev/sda

删除原有所有分区
20201029093648.png

创建三个分区,一个boot分区(fat32)512M,两个系统分区(ext4)

创建boot分区
20201029094035.png
20201029094103.png
20201029094122.png
20201029094152.png
20201029094216.png

创建第一个系统分区,我这里设置30G,大家根据自己需求设置
20201029094253.png
20201029094315.png
20201029094335.png

第二个系统分区创建同上

将改变写入磁盘
20201029094519.png
20201029094542.png

q退出cfdisk,检查磁盘分区

lsblk

20201029094616.png

格式化,注意替换自己的设备名称

#格式化boot分区
mkfs.fat -F 32 -n "boot" /dev/sda1

#格式化第一个系统分区,设置label
mkfs.ext4 -L rootfs1 /dev/sda2

#格式化第二个系统分区,设置label
mkfs.ext4 -L rootfs2 /dev/sda3

挂载boot分区

mount /dev/sda1 boot/

#创建两个系统的boot目录
mkdir boot/{os1,os2}

0x02.安装OS1

OS1安装官方系统

#挂载OS1的分区
mount /dev/sda2 root/

#挂载系统镜像
losetup -f --show 2020-08-20-raspios-buster-armhf.img

20201029112415.png

我这里是/dev/loop0,你的结果可能跟我不一样,在下面的命令中请将这个值替换为自己的结果。

#挂载镜像文件两个分区设备
kpartx -va /dev/loop0

mount /dev/mapper/loop0p2 osimg/
mount /dev/mapper/loop0p1 osimg/boot/

#拷贝OS1的boot目录
cp -a osimg/boot/* boot/os1/

umount osimg/boot/

#同步rootfs
rsync -axv osimg/ root/

mkdir root/bootpar

sed -i "s/\(PARTUUID=\)[[:xdigit:]-]\+\([[:blank:]]*\)\/boot/\1$(blkid -o value -s PARTUUID /dev/sda1)\2\/bootpar/" root/etc/fstab

sed -i "s/\(PARTUUID=\)[[:xdigit:]-]\+\([[:blank:]]*\/[[:blank:]]\+\)/\1$(blkid -o value -s PARTUUID /dev/sda2)\2/" root/etc/fstab

echo -e "/bootpar/os1 /boot  none bind 0 0\n" >> root/etc/fstab

sed -i "s/\(PARTUUID=\)[[:xdigit:]-]\+/\1$(blkid -o value -s PARTUUID /dev/sda2)/" boot/os1/cmdline.txt

#禁止自动扩容
sed -i 's/init=\/usr\/lib\/raspi-config\/init_resize.sh//' boot/os1/cmdline.txt

sync && sync

umount root/

umount osimg/

kpartx -d /dev/loop0

losetup -d /dev/loop0

0x03.安装OS2

OS2安装基地2.0

#挂载OS2的分区
mount /dev/sda3 root/

#挂载系统镜像
losetup -f --show 2020-06-22-OPENFANS-Debian-Buster-Desktop-Aarch64-ext4-v2020-2.0-U4-Release.img

20201029130743.png

我这里是/dev/loop0,你的结果可能跟我不一样,在下面的命令中请将这个值替换为自己的结果。

#挂载镜像文件两个分区设备
kpartx -va /dev/loop0

mount /dev/mapper/loop0p2 osimg/
mount /dev/mapper/loop0p1 osimg/boot/

#拷贝OS2的boot目录
cp -a osimg/boot/* boot/os2/

umount osimg/boot/

#同步rootfs
rsync -axv osimg/ root/

mkdir root/bootpar

sed -i "s/\(PARTUUID=\)[[:xdigit:]-]\+\([[:blank:]]*\)\/boot/\1$(blkid -o value -s PARTUUID /dev/sda1)\2\/bootpar/" root/etc/fstab

sed -i "s/\(PARTUUID=\)[[:xdigit:]-]\+\([[:blank:]]*\/[[:blank:]]\+\)/\1$(blkid -o value -s PARTUUID /dev/sda3)\2/" root/etc/fstab

echo -e "/bootpar/os2 /boot  none bind 0 0\n" >> root/etc/fstab

sed -i "s/\(PARTUUID=\)[[:xdigit:]-]\+/\1$(blkid -o value -s PARTUUID /dev/sda3)/" boot/os2/cmdline.txt

sync && sync

umount root/

umount osimg/

kpartx -d /dev/loop0

losetup -d /dev/loop0

0x04.处理boot

cp boot/os1/fixup* boot/
cp boot/os1/start* boot/
cp boot/os1/config.txt boot/

编辑boot/config.txt,在文件最前面加入以下内容:

[gpio2=1]
os_prefix=os1/
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=85

[gpio2=0]
os_prefix=os2/
#配置基地2.0需要的参数
arm_64bit=1
arm_control=0x200
kernel=kernel8.img
disable_splash=1
dtparam=random=on
hdmi_force_hotplug=1
initramfs initrd.img
disable_overscan=1
dtparam=audio=on

对于不同系统上面的配置会有些许不同,大家灵活处理。

0x05.收尾

sync && sync

umount boot/

现在树莓派的双系统安装完成。

  1. 不短接任何引脚默认启动os1。
  2. 用母-母杜邦线短接3.3v和gpio2后再上电启动os1。
  3. 用母-母杜邦线短接GND和gpio2后再上电启动os2。

20201029154112.png

动手能力强的小伙伴可以做个开关控制不同系统启动 ^_^

如果觉得短接引脚麻烦,也可以用替换文件的方法切换系统:

  1. 用boot/os1/config.txt覆盖boot/config.txt,启动os1
  2. 用boot/os2/config.txt覆盖boot/config.txt,启动os2

替换文件的方法可以在win下操作,也可以在linux下操作。

测试

os1:
插上制作好的SD卡,用杜邦线短接3.3V和gpio2:
20201029155157.png
20201029155522.png

os2:
用杜邦线短接GND和gpio2:
20201029155218.png
20201029155942.png

双系统安装到不同设备也是可以实现的,原理都是一样的。

以上就是树莓派双系统的教程,很多地方都是很灵活的,方法不止一种,遇到问题要善于思考,实在思考不明白可以找我一起讨论。

本文为原创文章,版权归 Kevin's Blog 所有,转载请联系博主获得授权。

已有 4 条评论

  1. 师傅好厉害!

  2. 师傅万岁万岁万万岁!

发表评论