制作树莓派img镜像文件

2023-11-17

想做个树莓派的img镜像,然而对SD卡进行全盘复制很浪费空间,且不能恢复到比现有SD卡容量小的卡上,因此探索制作小img的方法,网上看了大神制作的脚本,比如https://github.com/conanwhf/RaspberryPi-script/blob/master/rpi-backup.shhttps://github.com/elespec/rpi-backup/blob/master/rpi-backup.sh,然而做好之后在我的树莓派上无法启动。最终参考了这篇文章的方法:手动一步一步来制作备份Raspberry Pi树莓派SD卡的img映像文件(不用dd命令),感谢原作者分享。结合这些修改成了一个脚本。我的树莓派是Raspbain Stretch系统
使用时将树莓派的SD卡插到PC上,用PC制作img镜像,最后img文件会放在~/bakcup_img/文件夹下,测试所用PC的操作系统是Ubuntu16.04。

查看SD卡挂载信息

PC端SD卡已经自动挂载好了,使用df -h查看SD卡对应的设备名和使用的空间大小

df -h

SD卡对应的设备名
设备名/dev/mmcblk0p1/dev/mmcblk0p2,根据空间大小判断/dev/mmcblk0p1/boot/dev/mmcblk0p2/(根)
根据原文步骤,简化了一些写成脚本,可以先按照脚本自动备份这一节提供的脚本运行,也可以按照手动备份的方法一步步执行。

脚本自动备份

将脚本复制到一个文本文件中,假设名字为rpi-backup.sh,需要赋可执行权限,脚本执行有两个参数,第一个参数是树莓派SD卡/boot分区的设备名,第二个参数是/分区的设备名。最终img文件会生成在~/backupimg/文件夹下。

sudo chmod +x rpi-backup.sh
./rpi-backup.sh /dev/mmcblk0p1 /dev/mmcblk0p2

脚本内容如下:

#!/bin/sh

if [  $# != 2 ]; then
  echo "argument error: Usage: $0 boot_device_name root_device_name"
  echo "example: $0 /dev/mmcblk0p1 /dev/mmcblk0p2"
  exit 0
fi
dev_boot=$1
dev_root=$2
mounted_boot=`df -h | grep $dev_boot | awk '{print $6}'`
mounted_root=`df -h | grep $dev_root | awk '{print $6}'`
img=rpi-`date +%Y%m%d-%H%M`.img

#install tools
sudo apt-get install dosfstools dump parted kpartx

echo =====================   part 1, prepare workspace    ===============================
mkdir ~/backupimg
cd ~/backupimg

echo ===================== part 2, create a new blank img ===============================
# New img file
#sudo rm $img

bootsz=`df -P | grep $dev_boot | awk '{print $2}'`
rootsz=`df -P | grep $dev_root | awk '{print $3}'`
totalsz=`echo $bootsz $rootsz | awk '{print int(($1+$2)*1.3/1024)}'`
sudo dd if=/dev/zero of=$img bs=1M count=$totalsz
#sync
echo "...created a blank img, size ${totalsz}M "

# format virtual disk
bootstart=`sudo fdisk -l | grep $dev_boot | awk '{print $2}'`
bootend=`sudo fdisk -l | grep $dev_boot | awk '{print $3}'`
rootstart=`sudo fdisk -l | grep $dev_root | awk '{print $2}'`
echo "boot: $bootstart >>> $bootend, root: $rootstart >>> end"
#有些系统 sudo fdisk -l 时boot分区的boot标记会标记为*,此时bootstart和bootend最后应改为 $3 和 $4
#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

echo =====================  part 3, mount img to system  ===============================
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}p2 -L rootfs
#在backupimg文件夹下新建两个文件夹,将两个分区挂载在下面
mkdir tgt_boot tgt_Root
#这里没有使用id命令来查看uid和gid,而是假设uid和gid都和当前用户名相同
uid=`whoami`
gid=$uid
sudo mount -t vfat -o uid=${uid},gid=${gid},umask=0000 ${device}p1 ./tgt_boot/
sudo mount -t ext4 ${device}p2 ./tgt_Root/


echo ===================== part 4, backup /boot =========================
sudo cp -rfp ${mounted_boot}/* ./tgt_boot/
sync
echo "...Boot partition done"

echo ===================== part 5, backup / =========================
sudo chmod 777 ./tgt_Root
sudo chown ${uid}.${gid} tgt_Root
sudo rm -rf ./tgt_Root/*
cd tgt_Root/
# start backup
sudo dump -0uaf - ${mounted_root}/ | sudo restore -rf -
sync 
echo "...Root partition done"
cd ..

echo ===================== part 6, replace PARTUUID =========================

# replace PARTUUID
opartuuidb=`sudo blkid -o export $dev_boot | grep PARTUUID`
opartuuidr=`sudo blkid -o export $dev_root | grep PARTUUID`
npartuuidb=`sudo blkid -o export ${device}p1 | grep PARTUUID`
npartuuidr=`sudo blkid -o export ${device}p2 | grep PARTUUID`
sudo sed -i "s/$opartuuidr/$npartuuidr/g" ./tgt_boot/cmdline.txt
sudo sed -i "s/$opartuuidb/$npartuuidb/g" ./tgt_Root/etc/fstab
sudo sed -i "s/$opartuuidr/$npartuuidr/g" ./tgt_Root/etc/fstab
echo "...replace PARTUUID done"

echo "remove auto generated files"
#下面内容是删除树莓派中系统自动产生的文件、临时文件等
cd ~/backupimg/tgt_Root
sudo rm -rf ./.gvfs ./dev/* ./media/* ./mnt/* ./proc/* ./run/* ./sys/* ./tmp/* ./lost+found/ ./restoresymtable
cd ..

echo ===================== part 7, unmount =========================
sudo umount tgt_boot tgt_Root
sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice
rmdir tgt_boot tgt_Root


echo "==== All done. img file is under ~/backupimg/ "

手动备份

准备工作

安装工具软件

sudo apt-get install dosfstools dump parted kpartx

建立工作目录

mkdir ~/backupimg
cd ~/backupimg

创建空白img文件

源SD卡已使用空间大概3.5G,就创建了4600M大小的img文件

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

原博客中有提示:

特别注意这里 bs=1M,千万不要写成1MB
1M是1024*1024 Bytes, 而1MB是1000*1000 Bytes,会造成img文件的大小不是512 bytes的整数倍,后面会报错。

创建空白img文件
查看分区表

sudo fdisk -l

分区表
给img文件分区
按照原来的起始位置设置分区

注:分区的起始扇区数都是 8192 的倍数,保证4K对齐

sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 96042s
#第二个分区的终止点为img文件的末尾
sudo parted raspberrypi.img --script -- mkpart primary ext4 98304s -1

检查分区是否成功

sudo parted raspberrypi.img

检查分区是否成功
在(parted)后面输入print free,最后输入quit退出。

格式化img文件分区并挂载

查看img文件对应的Loop device的设置

sudo losetup -f --show raspberrypi.img

查看img文件对应的Loop device的设置

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

sudo kpartx -va /dev/loop0

终端输入ls /dev/mapper/loop0p*应该是有/dev/mapper/loop0p1 /dev/mapper/loop0p2两个设备。
其中loop0p1是/boot,loop0p2是根。
格式化、挂载:

sudo mkfs.vfat -n boot /dev/mapper/loop0p1
sudo mkfs.ext4 -L rootfs /dev/mapper/loop0p2
#在backupimg文件夹下新建两个文件夹,将两个分区挂载在下面
mkdir tgt_boot tgt_Root
sudo mount -t vfat -o uid=zk,gid=zk,umask=0000 /dev/mapper/loop0p1 ./tgt_boot/
sudo mount -t ext4 /dev/mapper/loop0p2 ./tgt_Root/

上面的uid和gid根据自己系统的用户名有所变化。

备份/boot

直接拷贝
下面命令中的/media/zk/boot/*要根据自己系统中树莓派SD卡的挂载位置进行修改。

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

备份"/"

原文中提供了两种方法,本人尝试时只用了第一种:dump/restore方法
对目标挂载点设置合适的权限,并清空

sudo chmod 777 ./tgt_Root
#下面的zk.zk与上文提到的uid,gid设置一致,需要根据系统的用户名去修改
sudo chown zk.zk tgt_Root
sudo rm -rf ./tgt_Root/*
cd tgt_Root/

开始备份
#下面命令中的/media/zk/rootfs/要根据自己系统中树莓派SD卡的挂载位置进行修改

sudo dump -0uaf - /media/zk/rootfs/ | sudo restore -rf -
#返回上层目录
cd ..

备份"/"
耗时几分钟,运行完后可以查看下tgt_Root下是否已把文件备份过来

相应修改PARTUUID设定

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

./tgt_boot/cmdline.txt 
./tgt_Root/etc/fstab 

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

sudo blkid

在输出的信息里查看到:
/dev/mapper/loop0p1PARTUUID是“961e1351-01”,
/dev/mapper/loop0p2PARTUUID是“961e1351-02”。

修改 cmdline.txt 文件

将其中root=PARTUUID=af2f8761-02部分改为/dev/mapper/loop0p2(即根分区)的PARTUUID,修改后如下:

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=961e1351-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

修改fstab文件

proc            /proc           proc    defaults          0       0
PARTUUID=961e1351-01  /boot           vfat    defaults          0       2
PARTUUID=961e1351-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

收尾

卸载各个挂载的分区,删除loop device,删除挂载点目录

sudo umount tgt_boot tgt_Root
sudo kpartx -d /dev/loop0
sudo losetup -d /dev/loop0
rmdir tgt_boot tgt_Root

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

制作树莓派img镜像文件 的相关文章

  • 如何使用树莓派连接电脑无线网络热点并查看树莓派ip地址

    1 确保电脑已经联网 在电脑右下角点开 网络连接 打开 无线热点 右键转到 设置 2 查看 热点名称和密码 并确保网络频率为2 4GHz 树莓派现时只支持802 11 n的WIFI标准所以只能连接2 4G网络 所以你需要确保你所连接的是2
  • 树莓派体验12 - 树莓派I2C接口获取温湿度

    i2c tools工具安装 apt get install i2c tools i2c tools包含如下命令 i2cdetect i2cdump i2cget i2cset 通过raspi config打开树莓派I2C 执行i2cdete
  • 关于树莓派的VNC连接

    在使用树莓派时 会经常由于条件限制 无法配置全套外设 如显示器 键盘 鼠标 而需要用到手机或者电脑进行远程连接 树莓派除了支持putty进行SSH连接外 还可以通过tightvnc进行VNC连接 下面介绍一下两种远程连接方式的使用方法 1
  • Windows下Win32 Disk Imager和Linux中dd命令两种方式烧录树莓派镜像

    下了好久的决心 终于买了一块树莓派 本着已是装机老手的心态 没有买装好系统的sd卡 自己买了一张准备自己装 结果很艰辛 最常见的装树莓派操作系统的方式就是 Win32 Disk Imager 再去领快递的前几个小时 我已经把前戏做的很足 镜
  • Raspberry系统管理 —— 安装和配置OpenVINO

    文章目录 什么是OpenVINO 下载测试用例 加速自己的模型 什么是OpenVINO OpenVINO Open Visual Inference and Neural Network Optimization 是一个用于视觉推理和神经网
  • ros多机联调ROS md5sums do not match问题记录

    树莓派3b 上运行roscore 与pc端虚拟机上的ros联通 树莓派上运行一个AddTwoInts的服务节点 在pc端虚拟机上调用该服务 出现md5sums do not match的错误导致调用失败 后来发现是因为两边的 srv的数据类
  • 【树莓派】利用tesseract进行汉字识别

    树莓派 利用tesseract进行汉字识别 安装tesseract库 识别图像中的汉字 安装tesseract库 安装tesseract库和它的python封装 sudo apt install tesseract ocr fix miss
  • 清理systemd日志

    systemd journal之于systemd犹如syslog之于init 其日志文件保存在 var log journal目录下 随着时间的流逝 该目录下会积累大量日志文件 占用不少的磁盘空间 如果硬盘容量较小或可用空间紧张 可以考虑清
  • 手动配置树莓派wifi联网连接热点手机热点

    手动配置树莓派wifi联网连接热点 修改wifi配置文件 运行命令 sudo nano etc wpa supplicant wpa supplicant conf 在文件中添加无线网配置信息 ctrl interface DIR var
  • 单片机串口控制树莓派3B播放HDMI视频,omxplayer,

    使用树莓派3B通过HDMI播放视频 并且使用串口去控制播放哪个视频 1 问题解耦 单片机串口控制树莓派3B播放视频 树莓派播放视频 单片机串口传参控制树莓派 树莓派播放视频 树莓派播放视频 并且能用串口这种简单的通信方式去控制 应该是需要安
  • 【自我提高】树莓派GPIO的几种语言控制方法 python 篇

    使用 python 语言控制 GPIO 18 首先知道树莓派外置IO的关系对照表 我这里的树莓派是 PI 3B V1 2 关系对照表如下 首先安装 python 和 GPIO 库 具体安装过程参考 https blog csdn net w
  • Linux系统下对树莓派镜像进行烧写操作。可搭建自己的迷你服务器

    烧写后可以当做搭建自己的迷你服务器或者可携带的计算机哦 我以linux系统下对内存卡进行烧写镜像 烧写的先以snappy ubuntu care为例 网上的资料大多都是win下操作的 步 1 购买嵌入式开发板 可选够集成度大的 可烧写系统的
  • 2.树莓派上程序自启动方式总结(带桌面)

    在树莓派上设置程序上电自动启动的几种方法 1 在pi config中新建autostart文件夹 在下面新建 desktop后缀的文件 具体方式问度娘 忘了 2 在pi文件夹下 修改 bashrc和 profile文件 比如直接运行py文件
  • 制作树莓派img镜像文件

    想做个树莓派的img镜像 然而对SD卡进行全盘复制很浪费空间 且不能恢复到比现有SD卡容量小的卡上 因此探索制作小img的方法 网上看了大神制作的脚本 比如https github com conanwhf RaspberryPi scri
  • 树莓派 mqtt

    Mosquitto是一款实现了消息推送协议 MQTT v3 1 的开源消息代理软件 sudo yum y install epel release sudo yum y install mosquitto 运行 sudo systemctl
  • linux创建链接命令

    1 软链接 符号链接 1 软链接文件有类似于Windows的快捷方式 2 在符号连接中 文件实际上是一个文本文件 其中包含的有另一文件的位置信息 3 它只会在你选定的位置上生成一个文件的镜像 不会占用磁盘空间 linux创建链接软命令 具体
  • 树莓派安装TensorFlow并使用[一步到位]

    树莓派安装TensorFlow并使用 一步到位 安装TensorFlow并使用 树莓派3B 树莓派安装TensorFlow并使用 一步到位 换源并更新 安装TensorFlow依赖包 安装TensorFlow并使用 各种问题 换源并更新 安
  • electron-vue 树莓派armv7l打包踩坑记录

    1 unsupported arch arm 报错 Unsupported arch arm failedTask build stackTrace Error Unsupported arch arm 解决办法 在package json
  • 树莓派4B安装详细教程,从零开始!

    树莓派4B安装详细教程 从零开始 前言 一 准备材料 1 硬件材料 2 软件材料 二 安装步骤 1 格式化SD卡 2 安装系统 三 安装完成 前言 提示 本文详细介绍树莓派4B的安装流程 适合刚入手树莓派的同学 认为我写的好的同学希望点赞关
  • 【树莓派4B】darknet-nnpack的安装及使用

    文章目录 前言 步骤 1 下载依赖项 2 安装NNPACK darknet 3 下载darknet nnpack 4 使用YOLO进行预测 检测图像 检测视频 检测视频流 错误处理 make 时报错 undefined reference

随机推荐

  • 某**集团夺旗赛的一道隐写题

    解压压缩包 解压出来一个文件file 使用file命令进行查看 发现是data 010查看也无果 看到标题是logistic联想到是否与xor文件有关 遂使用工具xortool 工具在此 xortool file 选概率最大的那个 13 x
  • HDFS API操作的访问方式及JUnit测试类的使用

    HDFS API操作的访问方式 主要分为使用文件系统访问方式和URL访问方式 package com wyg hdfs import java io File import java io FileOutputStream import j
  • hive 高级分组聚合(grouping sets cube和rollup)

    1 grouping sets 1 1 select a b sum c from tbl group by a b grouping sets a b 相当于 select a b sum c from tbl group by a b
  • Python求1-100所有奇数和的方法!

    在之前的文章中 老男孩IT教育小编为大家介绍过Python的特点 优势 用途以及薪资待遇等知识 而为了帮助大家更好的掌握Python 小编将为大家讲解一些实战案例 比如 Python中如何求1 100的奇数和 接下来我们来看看吧 Pytho
  • Stable Diffusion安装教程、model导入教程以及精品promt指令

    文章目录 引言 原理 图片感知压缩 潜在扩散模型 安装 插件 插件与模型下载 常用promt关键字 交流讨论 引言 最近大火的AI作画吸引了很多人的目光 AI作画近期取得如此巨大进展的原因个人认为有很大的功劳归属于Stable Diffus
  • 读取sftp服务器上的文件内容到指定的数据库表内

    引入sftp jar依赖
  • 一些常用的公共js方法

    读者可能会觉得节流与防抖有点像 其实仔细斟酌就能发现他们的不同 节流是指对于连续触发的事件 每隔一段固定时间执行一次 只要事件持续出发就可以执行很多次 在节流里涉及的时间主要是指事件执行的间隔时间 防抖则是对连续触发的事件 只会执行一次 不
  • 从操作系统层面理解同步、异步、阻塞、非阻塞

    同步和异步描述调用者会不会主动等待函数的返回值 举个例子 public void method int result otherMethod 像上面这种形式就叫同步 result 会一直等待 otherMethod 方法执行完毕并拿到返回值
  • BMVC2022

    原文标题 Hierarchical Residual Learning Based Vector Quantized Variational Autoencoder for Image Reconstruction and Generati
  • 运行 Triton 示例

    安装 Triton Docker 镜像 在拉取镜像前 需要安装 Docker 和 NVIDIA Container Toolkit 用以下命令拉取镜像 docker pull nvcr io nvidia tritonserver
  • VTK编译方法

    VTK编译方法 VTK Group Imaging ON VTK Group MPI ON VTK Group QT ON VTK Group TK ON VTK Group Views ON VTK RENDERING BACKEND O
  • 使用layui/layuiAdmin的总结

    layui是一个前端UI框架 主要是配合JQuery使用 开始使用 首先是下载文件 然后引入css和js文件 引入之后就需要在
  • 以太坊开发入门,完整入门

    翻译自 https medium com mattcondon getting up to speed on ethereum 63ed28821bbe 从入门到精通 干货篇 必读 如果你 是一个专业的程序员 如果你想了解以太坊当前可以做到
  • QT QTabWidget 、布局控件 动态添加窗口(控件)、删除窗口(控件)方案

    new 一个窗口或者控件 QTabWidget addTab 将新建的控件放到一个容器中 比如 QMap
  • mybatis查询

    以后返回统一用对象 resultMap 查询 基本查询 select from person where person id id 条件查询 分页 select from cobra apply store yjs user id yjsU
  • 递归的一种应用

    有些问题 涉及两个对象 比如两个数 像个长度不同的数组 链表之类的 必须考虑是前者大还是后者大的情况 分别处理 其实可以只处理一种情况 比如前者小 后者大的情况 另一种情况 前者大后者小 可以通过交换参数 递归调用本函数来处理
  • ArrayList与顺序表

    文章目录 一 顺序表是什么 二 ArrayList是什么 三 ArrayList的构造方法 四 ArrayList的常见方法 4 1 add 4 2 size 4 3 remove 4 4 get 4 5 set 4 6 contains
  • kali linux中如何安装中文输入法

    前言 在使用kali linux中 我们可能用到中文输入法 那么我们该如何安装中文输入法呢 正文 一 首先 我们需要检查更新源是否可用 如果可用我们就进行第二步 如果不可用 我们则需要手动添加更新源 手动添加更新源 我们需要到网上找到最新的
  • 云原生安全性:构建可信任的云应用的最佳实践

    文章目录 云原生安全性的重要性 1 数据隐私 2 恶意攻击 3 合规性要求 4 业务连续性 构建可信任的云应用的最佳实践 1 安全开发 2 身份验证与授权 3 容器安全性 4 监控与审计 5 持续集成与持续交付 CI CD 6 安全培训和教
  • 制作树莓派img镜像文件

    想做个树莓派的img镜像 然而对SD卡进行全盘复制很浪费空间 且不能恢复到比现有SD卡容量小的卡上 因此探索制作小img的方法 网上看了大神制作的脚本 比如https github com conanwhf RaspberryPi scri