关于制作树莓派最小系统镜像文件.img
- 前言
- 需要的材料
- 开始盘它
前言
我是直接在树莓派上进行镜像的制作(树莓派3B),速度比较慢,如果有Ubuntu系统的PC那就更好了,废话不多说,开始盘它
需要的材料
1.我要做的系统镜像是5.2G,所以尽量选择大一点的内存卡,我选的32G,够用,并在这张内存卡里烧录一个树莓派的官方的镜像,以便启动树莓派.
2.读卡器一个
3.需要备份的SD卡
开始盘它
1.把需要备份的SD卡装到读卡器,把读卡器插到树莓派的USB口,32G的烧录有树莓派系统镜像的插到树莓派(我烧录的是官方7月份最新发布的带有桌面的镜像),上电启动树莓派
2.最好给树莓派连个屏幕,鼠标,键盘,操作方便
3.启动后进入终端,使用命令 df -h 查看已经挂载上去的源SD卡的两个分区
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
找到源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
最后两行的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
大小么得问题,完成.
文件已经在SD卡中了,怎么处理这个文件就是自己的事情了,我本地用的win10的系统,我从网上找的工具,把img文件传到本地,很费时间,如果各位有好的方法可以评论告诉我,这篇博客是参照别人写的,其中也有一些和原文不一样的,自己跳的坑.经过本人多次亲自实践,做好的新镜像烧录到16Gtf卡中,可以正常启动和使用,如果大家在实践过程中出现问题,欢迎留言!
最后附上原文地址,也感谢作者