200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 树莓派3b+ CENTOS7 制作备份Raspberry Pi树莓派SD卡的img映像文件(不用dd命令)[转载]...

树莓派3b+ CENTOS7 制作备份Raspberry Pi树莓派SD卡的img映像文件(不用dd命令)[转载]...

时间:2023-06-29 18:10:04

相关推荐

树莓派3b+ CENTOS7 制作备份Raspberry Pi树莓派SD卡的img映像文件(不用dd命令)[转载]...

独角兽企业重金招聘Python工程师标准>>>

之前复制或者备份树莓派的SD卡,都是用dd命令全盘复制,可以用,但是这样有两大缺点:

1. 慢

2. 一个大的SD卡,比如64G,即使只用了2G,经过dd命令生成的img文件也会生成一个和整个SD卡容量一样大小的文件,即64G

于是,需要有一个可以解决上述问题的制作树莓派SD卡img映像文件的方法。

在网上搜索了一些,做了些研究,发现还是有办法的。 如下列网址所述:(感谢作者)

/haochuang/p/6066532.html

但是里面的脚本我用起来有问题,也懒得研究为什么有问题,于是参照脚本里的方法,手动一步一步命令来。

【准备】

准备一个树莓派Raspberry Pi和另外的Raspbian系统,并启动,用来作为备份操作的环境。要保证这个系统所在的SD卡的空间够大(我用了64G的卡,虽然没有必要这么大),足够用来保存img备份文件。

用PC上的其他Linux系统也可以,比如Debian 9.3。 而且用PC会快一些。

准备好要备份的SD卡,和USB读卡器。

将插好源SD卡的读卡器插入树莓派(或PC)。

1、首先安装必需的工具软件:

sudo yum install dosfstools dump parted kpartx

2、建立工作目录

mkdir ~/backupimgcd ~/backupimg

【生成空白img文件】

3、插入装有源SD卡的读卡器到USB口后,确定源SD卡对应的设备名(如果以本机作为原,则该步省略)

ls /dev/sd*

/dev/sda /dev/sda1 /dev/sda2

如上所示 /dev/sda 为源SD卡, /dev/sda1 为 /boot, /dev/sda2 为 / (根)。

不同的系统会有所不同,可能会是sdb… 或其他,例如:

挂载源SD卡

mkdir src_boot src_Rootsudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/sda1 ./src_boot/sudo mount -t ext4 /dev/sda2 ./src_Root/

4、查看源SD卡已用空间大小

df -k

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/root 61283036 2174112 56580524 4% /

devtmpfs458232 0 458232 0% /dev

tmpfs 463800 0 463800 0% /dev/shm

tmpfs 463800 12000 451800 3% /run

tmpfs 463800 0 463800 0% /sys/fs/cgroup

/dev/mmcblk0p1 64366 29902 34464 47% /boot

tmpfs 92760 0 92760 0% /run/user/1000

如上可以看出本机(如果是插入的sd card,则查看相应的空间)已用空间大约2.3G,留10%的余量后,空间为2.5G。

5、建立一个空白的img文件

建立一个空白的img文件,因为源SD卡(或本机)已用空间大约2.5G,那么建立一个2700M的空白img文件应该够了。

sudo dd if=/dev/zero of=raspi_centos7_aarch64_no_desktop.img bs=1M count=2700

特别注意这里 bs=1M,千万不要写成1MB

1M是1024*1024 Bytes, 而1MB是1000*1000 Bytes,会造成img文件的大小不是512 bytes的整数倍,后面会报错。

这个过程大约几分钟完成。 如果比较着急,可以另开一个终端,运行如下命令,可以观察到img文件大小的变化。

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

完成后,确认一下img文件已经生成,且文件大小正确

ls -l raspi_centos7_aarch64_no_desktop.img

6、然后给img文件分区

sudo parted raspi_centos7_aarch64_no_desktop.img --script -- mklabel msdossudo parted raspi_centos7_aarch64_no_desktop.img --script -- mkpart primary fat32 8192s 139263ssudo parted raspi_centos7_aarch64_no_desktop.img --script -- mkpart primary ext4 139264s 524287ssudo parted raspi_centos7_aarch64_no_desktop.img --script -- mkpart primary ext4 524288s -1

分区的起始扇区数都是 8192 的倍数【0716更新】,以保证4k对齐

检查分区是否成功

sudo parted raspi_centos7_aarch64_no_desktop.img --script -- print free

【挂载img文件到系统】

7、img文件对应的Loop device的设置

sudo losetup -f --show raspi_centos7_aarch64_no_desktop.img

/dev/loop0

下面的命令中相应输入/dev/loop0,如果不是 loop0 请做相应调整(以及以后的各个步骤里的loop0都要改变)

sudo kpartx -va /dev/loop0

add map loop0p1 (254:0): 0 114288 linear 7:0 8192

add map loop0p2 (254:1): 0 9295872 linear 7:0 122880

add map loop0p3 (254:1): 0 9295872 linear 7:0 122880

ls /dev/mapper/loop0p*

/dev/mapper/loop0p1 /dev/mapper/loop0p2/dev/mapper/loop0p3

此时loop device就设置好了,loop0p1对应的是img文件分区上的 /boot,loop0p3对应的是 /(根)

8、接着给img文件中的两个分区格式化

sudo mkfs.vfat -n boot /dev/mapper/loop0p1sudo mkfs.ext4 /dev/mapper/loop0p2sudo mkfs.ext4 /dev/mapper/loop0p3

9、挂载目标img文件loop device

mkdir tgt_boot tgt_Rootsudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/mapper/loop0p1 ./tgt_boot/sudo mount -t ext4 /dev/mapper/loop0p3 ./tgt_Root/

【备份/boot】

10、首先备份/boot,直接拷贝即可

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

【备份“/”】

11、备份根文件系统稍微复杂些,可以用两种方法

(方法一),dump/restore方法

首先对目标挂载点设置合适的权限,并清空

sudo chmod 777 tgt_Rootsudo chown pi.pi tgt_Rootsudo rm -rf ./tgt_Root/*cd tgt_Root/

然后开始备份

sudo dump -0uaf - ../src_Root/ | sudo restore -rf -

整个dump/restore过程需要几分钟时间,看到 DUMP IS DONE 就说明备份成功了

然后返回上层目录

(方法二),tar方法

如果上述方法一的 sudo dump … 那一步出现 Broken pipe、 Illegal instruction等错误而失败的话,可以使用方法二。

这个方法会使用tar把源SD卡的根文件系统打包,所以在本机系统空间里需要额外的和源SD卡的根文件系统已用空间大小一样的可用空间。

首先,和方法一里面一样,对目标挂载点设置合适的权限,并清空

sudo chmod 777 tgt_Rootsudo chown pi.pi tgt_Rootsudo rm -rf ./tgt_Root/*

然后用tar把源SD卡(或本机)的根文件系统打包

cd src_Root/sudo tar pcf ../backup.tar .

tar的过程中可能会出现一些 socket ignored 错误,可以忽略。

此过程可能需要比较长的时间,可另外开一个终端,运行如下命令,用来观察backup.tar文件大小的变化。

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

上述打包过程结束后,接着将tar包解开到目标img文件的根文件系统

cd ../tgt_Root/sudo tar pxf ../backup.tar

此过程可能需要比较长的时间,可另外开一个终端,运行如下命令,用来观察目标img文件的根文件系统的已用空间大小变化

watch -d -n 5 df -h

解包过程结束后,回到上层目录,并删除backup.tar文件

cd ..sudo rm backup.tar

【相应修改PARTUUID设定】

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

./tgt_boot/cmdline.txt

./tgt_Root/etc/fstab

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

sudo blkid

/dev/mmcblk0p1: LABEL="boot" UUID="E5B7-FEA1" TYPE="vfat" PARTUUID="ddffe93a-01"

/dev/mmcblk0p2: UUID="b4ea8e46-fe87-4ddd-9e94-506c37005ac5" TYPE="ext4" PARTUUID="ddffe93a-02"

/dev/sda2: UUID="9a7608bd-5bff-4dfc-ac1d-63a956744162" TYPE="ext4" PARTUUID="ec04fe79-02"

/dev/loop0: PTUUID="af2f8761" PTTYPE="dos"

/dev/mmcblk0: PTUUID="ddffe93a" PTTYPE="dos"

/dev/sda1: LABEL="boot" UUID="B60A-B262" TYPE="vfat" PARTUUID="ec04fe79-01"

/dev/mapper/loop0p1: SEC_TYPE="msdos" LABEL="boot" UUID="755C-C29C" TYPE="vfat" PARTUUID="af2f8761-01"

/dev/mapper/loop0p2: UUID="a174c97e-049f-4fbd-abb7-0b9098dae24a" TYPE="ext4" PARTUUID="af2f8761-02"

这里可以看到/boot对应的是af2f8761-01 , / 对应的是af2f8761-02

13、修改 cmdline.txt 文件

sudo vi ./tgt_boot/cmdline.txtcat ./tgt_boot/cmdline.txtdwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=af2f8761-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

14、修改 fstab 文件

sudo vi ./tgt_Root/etc/fstabcat ./tgt_Root/etc/fstabproc/procproc defaults0 0PARTUUID=af2f8761-01 /bootvfat defaults0 2PARTUUID=af2f8761-02 / ext4 defaults,noatime 0 1# a swapfile is not a swap partition, no line here# use dphys-swapfile swap[on|off] for that

15、卸载各个挂载的分区

sudo umount src_boot src_Root tgt_boot tgt_Root

16、删除loop device

sudo kpartx -d /dev/loop0sudo losetup -d /dev/loop0

17、删除挂载点目录

rmdir src_boot src_Root tgt_boot tgt_Root

18、最后剩下img文件

ls -l

【大功告成】

完成之后可以用dd或者Etcher烧写img文件到其他SD卡中,注意烧写到新卡中在树莓派中运行后,要先用raspi-config先把分区空间expand一下,否则可用空间会很小。

虽然步骤比较多,但是赤手空拳的一步一步命令来的更清晰明了,也能了解其中的技术细节。

19、使用sftp将img传到windows上

sftp pi@192.168.3.6:/home/pi/my/other_root/home/pi/bakup_img

报错:Received message too long 458961482

解决:将vi ~/.bashrc文件中的linux_logo -f注释掉

---------------------

作者:zhufu86

来源:CSDN

原文:/zhufu86/article/details/78821056

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。