玩树莓派的小伙伴可能遇到这样的烦恼,手里只有一张卡或者一块ssd,但是又想体验不同的系统,无奈只能重复的刷系统,可以说相当麻烦了,今天就说一说树莓派如何安装双系统。
数据无价,本教程的操作有一定的风险,开始前请备份重要数据!!!
前言
树莓派官方提供的NOOBS
是可以实现多系统安装的,但是也存在一定的弊端,NOOBS本省会占用一定的空间造成空间浪费,系统都是从国外服务器在线下载,速度可想而知,而且需要显示器(从2015年开始玩pi的我到现在也没有显示器,穷啊),最主要的还是不符合玩家折腾
的精神,所以我们不使用NOOBS,我们自己实现一个不需要显示器的双系统。
材料准备
- 树莓派4b
- SD卡一张(16G或以上),或硬盘一块
- 母-母杜邦线一条
- 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
0x01.分区
插卡,对介质进行分区和格式化
查看设备
lsblk
我这里设备名称是sda
,根据自己情况替换
#分区
cfdisk /dev/sda
删除原有所有分区
创建三个分区,一个boot分区(fat32
)512M,两个系统分区(ext4
)
创建boot分区
创建第一个系统分区,我这里设置30G,大家根据自己需求设置
第二个系统分区创建同上
将改变写入磁盘
按q
退出cfdisk,检查磁盘分区
lsblk
格式化,注意替换自己的设备名称
:
#格式化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
我这里是/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
我这里是/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/
现在树莓派的双系统安装完成。
- 不短接任何引脚默认启动os1。
- 用母-母杜邦线短接3.3v和gpio2后再上电启动os1。
- 用母-母杜邦线短接GND和gpio2后再上电启动os2。
动手能力强的小伙伴可以做个开关控制不同系统启动 ^_^
如果觉得短接引脚麻烦,也可以用替换文件的方法切换系统:
- 用boot/os1/config.txt覆盖boot/config.txt,启动os1
- 用boot/os2/config.txt覆盖boot/config.txt,启动os2
替换文件的方法可以在win下操作,也可以在linux下操作。
测试
os1:
插上制作好的SD卡,用杜邦线短接3.3V和gpio2:
os2:
用杜邦线短接GND和gpio2:
双系统安装到不同设备也是可以实现的,原理都是一样的。
以上就是树莓派双系统的教程,很多地方都是很灵活的,方法不止一种,遇到问题要善于思考,实在思考不明白可以找我一起讨论。
本文为原创文章,版权归 Kevin's Blog 所有,转载请联系博主获得授权。
大佬,牛掰
师傅好厉害!
师傅万岁万岁万万岁!
膜拜了