您的位置  > 互联网

TF卡使用dd命令导出成了.img文件作为备份

所以我想知道我是否可以将其挂载到 x86 Linux 主机上并执行此操作

如何删除系统映像文件?

立即使用大多数 Linux 发行版附带的 dd 命令。

想象一下你如何使用 dd 命令来制作 Linux

1

sudo dd if= of=/dev/sdx

/dev/sdx 是设备文件,通常存储在 /dev/ 目录下

那我们再想一想,可以反过来吗?

因此,推导了以下顺序:

1

sudo dd if=/dev/sdx of=rpimg.img

请注意,这必须是设备文件,而不是设备分区文件,除非要备份分区。

由于TF卡的大小是64GiB,换算成GB单位是60GB,数据量非常大,Linux系统调度也很正常。我的带有 USB3.0 读卡器的 TF 卡进行了测试,该过程将持续 10 分钟。

奇怪的想法

当我考虑是否可以在 x86 Linux 主机上运行它时,我有一些问题:

验证 QEMU 可以模拟运行 arm64() 的奇怪想法?

搜索资料后,我们可以发现树莓派使用的SoC是博通,大型架构属于ARM v8。

所以你需要知道QEMU现在是否可以模拟ARM v8

在包搜索中,我们发现 qemu-user- 描述如下

QEMU是一个快速的:ARM,CRIS,i386,M68k(),,MIPS,SH4,SPARC和x86-64。通过使用它,速度快,同时易于移植到新的主机 CPU 上。

这是用户模式。在此模式下,QEMU 可以在 CPU 上为一个 CPU 进行 Linux。

可能感觉它完全没问题。

选择 QEMU 作为用户模式而不是模式有两个原因

我们的目标是挂载 img 并使用 run,在这里使用 jail 不需要您启动整个系统,它实际上是一个软件,因此是用户模式。

此外,它不是虚拟机。 从本质上讲,它只是更改当前进程及其子进程的可见根路径。更改后,程序无法访问可见根目录之外的文件和命令。伟大的欺骗策略!

此外,实际上可以不使用它,但也可以使用它和 PRoot

有关PRoot及其使用方法的更多信息,请参阅以下链接

使用以下命令安装 qemu-user-

1

sudo apt install -y qemu-user-static

如果 qemu 支持执行二进制架构,但不支持本机模式,则会自动配置为使用 qemu 运行。

IMG 文件分析逻辑

还记得上面提到的设备文件吗?在 Linux 中,您与设备交互的位置被抽象为单个文件。

想想 Linux(甚至类 unix 系统)的一大特性,就像一切一样:一切都是一个文件。

我们正在将TF卡的完整内容复制到img文件中,那么img文件是否包含分区信息?

如果我们知道 img 文件中分区的起点和终点,那么它可以被抽象成类似设备文件的东西吗?

验证 DD 设备文件中的 IMG 文件是否具有完整分区格式

它提供我们常用的 fdisk 命令,是用于操作设备文件的瑞士军刀。

对 img 文件使用以下命令。我的 img 文件名是 rpios.img。

1

sudo fdisk -l rpimg.img

他输出以下内容

1
2
3
4
5
6
7
8
9
10
11

Disk rpimg.img: 59.69 GiB, 64088965120 bytes, 125173760 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf9f150b0

Device Boot Start End Sectors Size Id Type
rpimg.img1 8192 532479 524288 256M c W95 FAT32 (LBA)
rpimg.img2 532480 125173759 124641280 59.4G 83 Linux

fdisk 成功从 img 文件中读取分区信息,并将其视为合法设备。

挂载 img 文件,以便可以在内部操作它

在手册页上写入

循环是一个块,它不将其数据映射到硬盘或磁盘驱动器,而是映射到 or 中的文件以阻止 。这可以用于文件中图像的块,以便它可以与 mount(8) 一起使用。

上面的解释是,循环是映射到块设备的文件

以下段落中介绍了 mount 命令的手册页

如果没有循环(但只给出了一个“-o 循环”),那么挂载将尝试找到一些循环并使用它,用于

挂载 /tmp/disk.img /mnt -o 循环

但是他挂载的 img 文件是单分区的,而我们的 img 文件包含多个分区

这种类型的挂载知道 3 个 、 循环 和 ,即 (8)。(这些可以用于类型。

因此,如果我们镜像一个多分区,我们可以用放大器和参数来安装它。由于它是最后一个分区,我们懒得写。

因此,我们的命令如下

1
2

mkdir mp # 新建 img 文件挂载到的文件夹,把分区挂在这里
sudo mount ./rpimg.img ./mnt -o loop,offset=$((532480 * 512)) -t ext4

可能会遇到环路设备被占用的情况,我们需要使用 -f 命令来获取哪个环路设备可用。

由于第一个分区是引导分区,我们不操作它,因此不挂载它。

输入成功后没有回声,说明他已经成功了

那么让我们来看看LS MNT

1

bin  boot  data  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

它是完整的根目录结构,这意味着我们的目的就成功了!

安装img监狱后制作内容

的用法写在wiki上

那里

也是对 Arch wiki 用法的介绍

最关键的部分如下

由于树莓派系统自带DNS配置文件,我们不再需要复制机器的DNS配置文件。

因此,我们可以派生以下命令

1
2
3
4
5

cd mnt                                  # 切换到 img 文件的挂载文件夹
sudo mount --bind /proc proc # 挂载 proc
sudo mount --bind /dev dev # 挂载 dev
sudo mount --bind /sys sys # 挂载 sys
#cp -L /etc/resolv.conf etc/resolv.conf # 复制 DNS 配置文件,可选

最后,我们尝试使用靴子他。

1

sudo chroot . /bin/bash

如果您可以看到标识符已更改,则表示我们已经成功挂载了 img 文件并输入了它。

卸载 img 文件

当我们完成 img 文件的处理后,我们需要卸载 img 文件才能完成工作。

当然,最简单的方法是重新启动系统,该系统已完全卸载。我们通过使用手动卸载来节省时间

1
2
3
4
5
6

sudo losetup -d /dev/loop0  # 卸载回环设备
sudo umount ./mnt/dev # 卸载 dev 绑定
sudo umount ./mnt/proc # 卸载 proc 绑定
sudo umount ./mnt/sys # 卸载 sys 绑定
sudo umount ./mnt # 卸载 img 文件挂载
sudo sync # 同步更改到磁盘

好了,大功告成。