树莓派系统剪裁、克隆

最近需要对10多个树莓派进行烧写系统,没办法逐个去配置,所以想配置好一个之后再去克隆,并且把系统剪裁到最小,方便储存、传输,并且缩短烧写时间。

环境

  • 树莓派3B
  • 系统版本:stretch,2018年4月28日
  • 16G tf卡

失败尝试

  1. 克隆后在主机上剪裁
    按照这个地方给的方法尝试了一下,教程中关于分区开始和结束没有写准确,修正后依然无法启动
  2. 直接在树莓派上剪裁
    按照上面链接中给出的第二个脚本,依然无法启动,可能跟硬件版本有关
    经过上面尝试后觉得还是直接在树莓派上克隆并剪裁靠谱,所以集中精力搞这个。

成功

经过反复查找,终于在github上找到了两个有用的链接,分别对应不同的系统版本,主要操作是:
1. 将系统烧写、配置好,此为tf卡A;
2. 另外准备一个16G或8G速度快一点的tf卡B,在电脑上格式化为exFAT格式,以方便树莓派读写并存储大于4G的文件,利用usb读卡器插上树莓派;
3. 首先安装exFAT读写库:exfat-fuse,然后挂载到/mnt目录;
4. 使用下面的脚本:

#!/bin/sh

#install tools
sudo apt-get -y install rsync dosfstools parted kpartx#mount USB device
usbmount=/mntimg=$usbmount/rpi-`date +%Y%m%d-%H%M`.imgecho ===================== part 1, create a new blank img ===============================
# New img file
#sudo rm $img
bootsz=`df -P | grep /boot | awk '{print $2}'`
rootsz=`df -P | grep /dev/root | awk '{print $3}'`
totalsz=`echo $bootsz $rootsz | awk '{print int(($1+$2)*1.5)}'`
sudo dd if=/dev/zero of=$img bs=1K count=$totalsz# format virtual disk
bootstart=`sudo fdisk -l /dev/mmcblk0 | grep mmcblk0p1 | awk '{print $2}'`
bootend=`sudo fdisk -l /dev/mmcblk0 | grep mmcblk0p1 | awk '{print $3}'`
rootstart=`sudo fdisk -l /dev/mmcblk0 | grep mmcblk0p2 | awk '{print $2}'`
echo "boot: $bootstart >>> $bootend, root: $rootstart >>> end"
#rootend=`sudo fdisk -l /dev/mmcblk0 | grep mmcblk0p2 | awk '{print $3}'`
sudo parted $img --script -- mklabel msdos
sudo parted $img --script -- mkpart primary fat32 ${bootstart}s ${bootend}s
sudo parted $img --script -- mkpart primary ext4 ${rootstart}s -1
loopdevice=`sudo losetup -f --show $img`
device=/dev/mapper/`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
sleep 5
sudo mkfs.vfat ${device}p1 -n boot
sudo mkfs.ext4 ${device}p2echo ===================== part 2, fill the data to img =========================
# mount partitions
mountb=$usbmount/backup_boot/
mountr=$usbmount/backup_root/
mkdir -p $mountb $mountr
# backup /boot
sudo mount -t vfat ${device}p1 $mountb
sudo cp -rfp /boot/* $mountb
sync
echo "...Boot partition done"
# backup /root
sudo mount -t ext4 ${device}p2 $mountr
if [ -f /etc/dphys-swapfile ]; thenSWAPFILE=`cat /etc/dphys-swapfile | grep ^CONF_SWAPFILE | cut -f 2 -d=`if [ "$SWAPFILE" = "" ]; thenSWAPFILE=/var/swapfiEXCLUDE_SWAPFILE="--exclude $SWAPFILE"
fi
sudo  rsync --force -rltWDEgop --delete --stats --progress \$EXCLUDE_SWAPFILE \--exclude '.gvfs' \--exclude '/dev/*' \--exclude '/media/*' \--exclude '/mnt/*' \--exclude '/proc/*' \--exclude '/run/*' \--exclude '/sys/*' \--exclude '/tmp/*' \--exclude 'lost\+found/*' \--exclude '$usbmount/*' \// $mountr
# special dirs
for i in dev media mnt proc run sys boot; doif [ ! -d $mountr/$i ]; thensudo mkdir $mountr/$ifi
done
if [ ! -d $mountr/tmp ]; thensudo mkdir $mountr/tmpsudo chmod a+w $mountr/tmp
fi
sudo rm -f $mountr/etc/udev/rules.d/70-persistent-net.rulessync
ls -lia $mountr/home/pi/
echo "...Root partition done"
# if using the dump/restore
# tmp=$usbmount/root.ext4
# sudo chattr +d $img $mountb $mountr $tmp
# sudo mount -t ext4 ${device}p2 $mountr
# cd $mountr
# sudo dump -0uaf - / | sudo restore -rf -
# cd# replace PARTUUID
opartuuidb=`blkid -o export /dev/mmcblk0p1 | grep PARTUUID`
opartuuidr=`blkid -o export /dev/mmcblk0p2 | grep PARTUUID`
npartuuidb=`blkid -o export ${device}p1 | grep PARTUUID`
npartuuidr=`blkid -o export ${device}p2 | grep PARTUUID`
sudo sed -i "s/$opartuuidr/$npartuuidr/g" $mountb/cmdline.txt
sudo sed -i "s/$opartuuidb/$npartuuidb/g" $mountr/etc/fstab
sudo sed -i "s/$opartuuidr/$npartuuidr/g" $mountr/etc/fstabsudo umount $mountb
sudo umount $mountr# umount loop device
sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice
rm -rf $mountb $mountr
echo "==== All done. You can un-plug the backup device"

上面有一个参数($1+$2)*1.5),其中1.5可以适当调小至1.2,按照1.5
系统大约是6G,烧写速度大约8 min。
以上脚本成功适用于树莓派3b和stretch系统,对于2B,则有另外一个脚本,但没有测试过,具体问题可参考[4]


[1] https://github.com/cwt0490/rpi-bk/blob/master/rpi-bk.sh
[2] http://conanwhf.github.io/2016/08/25/rpi-cloneimg/
[3] https://blog.csdn.net/talkxin/article/details/50456282
[4] https://github.com/conanwhf/RaspberryPi-script/issues/4

树莓派系统剪裁、克隆相关推荐

  1. 树莓派教程之树莓派系统镜像刷入和远程登陆(1)

    我的树莓派是3代B,中国版,操作环境:win10. 系统刷入前的准备: 1,需要有一根micro usb线给树莓派供电,一个microSD卡用来装系统 2,一根网线用来登入系统,我是命令行登陆的没有用 ...

  2. 基于机器学习的捡球机器人设计与实现(探索)第1篇——树莓派系统的安装与配置(20190106)

    这是第一句话.begin 2019-01-06 by 崔斐然 此仅用于文章仅用于记录自己在摸索的过程和遇到的问题等.内容杂乱无章.可能会引用大佬的文章.如有侵权请联系cuifeiran@outlook ...

  3. 树莓派AI视觉云台——7、树莓派系统备份

    树莓派使用SD卡来装载系统,如果SD卡丢失或者损坏,那么树莓派上的数据都会丢失,所以一定要备份好SD卡.这篇文章可以帮你备份你的树莓派系统.主要内容为备份SD卡,制作树莓派系统镜像以及在需要的时候还原 ...

  4. 树莓派AI视觉云台——3、树莓派系统的启动

    一.树莓派供电 树莓派开发板有两种供电方式: 1)使用micro usb供电:所有android手机的充电线都可以给他供电 2)直接连接小车主板供电. 二.启动树莓派 烧写完后把SD卡直接插入树莓派即 ...

  5. 树莓派AI视觉云台——2、树莓派系统镜像的下载和烧写

    一.树莓派启动方式及支持的系统 树莓派开发板没有配置板载FLASH,因为它支持SD卡启动,所有我们需要下载相应镜像,并将其烧写在SD上,启动系统即可.(这个镜像里包含了我们通常所说的bootloade ...

  6. linux下安装树梅派系统,优麒麟树莓派系统(优麒麟 for Raspberry Pi)的安装方法...

    要安装优麒麟树莓派系统(优麒麟 for Raspberry Pi),得先下载 ubuntukylin-focal-beta-raspi+arm64.img.xz,然后通过以下步骤引导您烧录优麒麟到您的 ...

  7. 在香蕉派的树莓派系统上配置 Syncthing 自启动(暨 Linux 软件自启服务配置)

    在香蕉派的树莓派系统上配置 Syncthing 自启动 独立观察员 2020 年 1 月 19 日(2020年8月30日 更新) 首先做个名词解释," 香蕉派" 是国内一款山寨树莓 ...

  8. [Linux系统] VMware克隆CentOS7,解决网络配置问题

    [Linux系统] VMware克隆CentOS7,解决网络配置问题 参考文章: (1)[Linux系统] VMware克隆CentOS7,解决网络配置问题 (2)https://www.cnblog ...

  9. u盘自动挂载 树莓派_再推荐一个备份树莓派系统的脚本

    来自 九年吃菜粥 的投稿. 在我们使用树莓派进行学习或者搭建实验环境时经常会把系统玩坏,辛苦配置的开发环境又得重新配置:或者更新某一软件后发现新版本和某些组件不兼容,又无法降级.这个时候我们会想将系统 ...

最新文章

  1. dataset for person re-id
  2. MySQL自定义函数(CREATE FUNCTION)
  3. codeblocks无法打开文件kernel32.lib
  4. 判断当前用户是否为root
  5. 带你探索CPU调度的奥秘
  6. 【STM32】【STM32CubeMX】STM32CubeMX的使用之一:工程建立之点亮你的LED
  7. 2星|《麦肯锡图表工作法》:用图表做商业分析的入门演示
  8. linux中利用shell脚本条件执行linux命令
  9. 想要下载,却没有积分,CSDN你做个人吧
  10. html页面pc端显示正常,手机端页面整体偏左(兼容性处理)
  11. 电脑主机需要清洁么,多久清理一次比较好?
  12. 2012意大利之行1:从深圳到罗马_我是亲民_新浪博客
  13. 30行代码实现微信朋友圈自动点赞
  14. java获取当前年月日(java获取当前年月日时分秒毫秒)
  15. STM32输出PWM波形
  16. 今天说一件细心的事情
  17. 能一次性管理10--20个群的微信群机器人助手到底有多好用!
  18. 无意中看到一个很强的贴,简直一群机关枪阿
  19. 12.4 C++常引用
  20. 微型计算机的硬件结构采用,微型计算机硬件结构内部结构

热门文章

  1. js实现纯前端截屏(可以对iframe的内容进行截取)
  2. 地理商业智能发展浅析
  3. 数据源——中青数据百融
  4. 电磁兼容——电子系统的EMC要求
  5. 也谈“为什么中国的程序员总被称为码农?”
  6. SetDlgItemText函数(详解)
  7. 【目标跟踪】|单目标跟踪指标
  8. HashMap是线程安全的吗?有什么线程安全的方法
  9. 如何给学生选择好的台灯?分享国AA级照度的护眼台灯
  10. 简述什么是FBV和CBV