关于制作树莓派最小系统镜像文件.img

  • 前言
  • 需要的材料
  • 开始盘它


前言

我是直接在树莓派上进行镜像的制作(树莓派3B),速度比较慢,如果有Ubuntu系统的PC那就更好了,废话不多说,开始盘它

需要的材料

1.我要做的系统镜像是5.2G,所以尽量选择大一点的内存卡,我选的32G,够用,并在这张内存卡里烧录一个树莓派的官方的镜像,以便启动树莓派.

2.读卡器一个

3.需要备份的SD卡

开始盘它

1.把需要备份的SD卡装到读卡器,把读卡器插到树莓派的USB口,32G的烧录有树莓派系统镜像的插到树莓派(我烧录的是官方7月份最新发布的带有桌面的镜像),上电启动树莓派

2.最好给树莓派连个屏幕,鼠标,键盘,操作方便

3.启动后进入终端,使用命令 df -h 查看已经挂载上去的源SD卡的两个分区

ubuntu 镜像解压 ubuntu镜像文件img_ubuntu 镜像解压


4.安装做镜像需要的工具

sudo apt-get install dosfstools dump parted kpartx

如果安装报错,更新一下源

sudo apt-get update

5.建立工作目录

mkdir ~/backupimg

cd backuping

6.挂载源SD卡

mkdir src_boot src_Root

sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/sdb1 ./src_boot/

sudo mount -t ext4 /dev/sdb2 ./src_Root/

7.源SD卡的空间占用,上边的图片也有看到4.8G左右,所以制作的明白镜像最好是4.8x1.15,为了保险起见,还是做一个6G的空白img镜像

sudo dd if=/dev/zero of=raspberrypi.img bs=1M count=6000

因为是再树莓派上直接制作,这个过程比较漫长,可以再开一个终端查看img文件大小的变化来确定进度

watch -d -n 5 ls -lh ~/backupimg

8.制作完成确认一下是否生成了大小正确的空白镜像文件

ls -l raspberrypi.img

9.给空白镜像分区,分区的大小根据源SD卡分区的大小,查看源SD卡是如何分区的

sudo fdisk -l

ubuntu 镜像解压 ubuntu镜像文件img_ubuntu 镜像解压_02


找到源SD卡的两个分区,记住boot分区的End和rootfs分区的Start这两个数字,是接下来分区要用到的(源SD卡中的系统不一样,分区的大小就有区别,这两个数字也不一样,一定要用自己的)

10.开始分区

sudo parted raspberrypi.img --script – mklabel msdos

sudo parted raspberrypi.img --script – mkpart primary fat32 8192s 96663s

sudo parted raspberrypi.img --script – mkpart primary ext4 98304s -1

11.检查分区是否成功

sudo parted raspberrypi.img

进去之后在(parted)后输入print free来查看分区

然后输入qiut退出来

12.挂载img文件到系统

sudo losetup -f --show raspberrypi.img

这个命令敲完显示的是

/dev/loop0

下面的命令中相应输入/dev/loop0,如果不是 loop0 请做相应调整

分区:

sudo kpartx -va /dev/loop0

显示两个区,大小是刚才创建的分区的大小,此时loop device就设置好了,loop0p1对应的是img文件分区上的 /boot,loop0p2对应的是 /(根)

13.接着给img文件中的两个分区格式化

sudo mkfs.vfat -n boot /dev/mapper/loop0p1

sudo mkfs.ext4 /dev/mapper/loop0p2

14.挂载目标img文件loop device

mkdir tgt_boot tgt_Root

sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/mapper/loop0p1 ./tgt_boot/

sudo mount -t ext4 /dev/mapper/loop0p2 ./tgt_Root/

我这里直接用的树莓派的系统,所以gid和uid都是pi,若是其他linux系统,这个要做相应的调整

15.挂载完成,开始备份两个分区

boot分区的东西较少,直接cp命令备份

sudo cp -rfp ./src_boot/* ./tgt_boot/

16.根文件东西较多,可以用dump/restore方法,但是我这里一直报错,不知道为什么,所以用笨一点的方法
这个方法会使用tar把源SD卡的根文件系统打包,所以在本机系统空间里需要额外的和源SD卡的根文件系统已用空间大小一样的可用空间
先对目标挂载点设置合适的权限,并清空
sudo chmod 777 tgt_Root

sudo chown pi.pi tgt_Root

sudo rm -rf ./tgt_Root/*
第二条命令中的gid和uid不再说了
然后用tar把源SD卡的根文件系统打包,先cd到src_Root/
cd src_Root/
sudo tar pcf …/backup.tar .
要把全部文件打包,所以后边有个 . 别忘了
tar的过程中可能会出现一些 socket ignored 错误,可以忽略
这个过程时间较长,耐心等待
打包结束,接着将tar包解开到目标img文件的根文件系统
先到相应的目录
cd …/tgt_Root/
解包
sudo tar pxf …/backup.tar
解包过程也比较漫长耐心等待

解包完成后返回上层目录,删除刚才生成的打包文件
cd …
sudo rm backup.tar

17.这个时候SD卡的备份就已经完成了,不过此时的img文件即使写入到空白SD卡里面也是无法启动的,因为Raspbian启动要对应分区的PARTUUID,所以我们还要修改目标img文件里的如下两个文件
./tgt_boot/cmdline.txt
./tgt_Root/etc/fstab

18.首先查看img文件对应的loop device的两个分区的PARTUUID

sudo blkid

ubuntu 镜像解压 ubuntu镜像文件img_根文件系统_03


最后两行的PARTUUID是对应两个分区的值,记下来,要用到

19.修改上边的两个文件
sudo vim ./tgt_boot/cmdline.txt
修改其中的PARTUUID为刚才对应的分区的值

sudo vim ./tgt_Root/etc/fstab
修改文件中的两个对应分区的值

20.这样就可以了,然后是善后工作

卸载各个挂载的分区
sudo umount src_boot src_Root tgt_boot tgt_Root

删除loop device
sudo kpartx -d /dev/loop0
sudo losetup -d /dev/loop0

删除挂载点目录
rmdir src_boot src_Root tgt_boot tgt_Root

大功告成,现在backuping文件夹中只剩下img文件了,看一下大小

ls -l

ubuntu 镜像解压 ubuntu镜像文件img_树莓派_04


大小么得问题,完成.

文件已经在SD卡中了,怎么处理这个文件就是自己的事情了,我本地用的win10的系统,我从网上找的工具,把img文件传到本地,很费时间,如果各位有好的方法可以评论告诉我,这篇博客是参照别人写的,其中也有一些和原文不一样的,自己跳的坑.经过本人多次亲自实践,做好的新镜像烧录到16Gtf卡中,可以正常启动和使用,如果大家在实践过程中出现问题,欢迎留言!
最后附上原文地址,也感谢作者