玩树莓派的小伙伴可能遇到这样的烦恼，手里只有一张卡或者一块ssd，但是又想体验不同的系统，无奈只能重复的刷系统，可以说相当麻烦了，今天就说一说树莓派如何安装双系统。数据无价，本教程的操作有一定的风险，开始前请备份重要数据！！！前言树莓派官方提供的NOOBS是可以实现多系统安装的，但是也存在一定的弊端，NOOBS本省会占用一定的空间造成空间浪费，系统都是从国外服务器在线下载，速度可想而知，而且需要显示器(从2015年开始玩pi的我到现在也没有显示器，穷啊)，最主要的还是不符合玩家折腾的精神，所以我们不使用NOOBS，我们自己实现一个不需要显示器的双系统。材料准备树莓派4bSD卡一张(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.img0x01.分区插卡，对介质进行分区和格式化查看设备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.安装OS1OS1安装官方系统#挂载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/loop00x03.安装OS2OS2安装基地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/loop00x04.处理bootcp 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 所有，转载请联系博主获得授权。