所以我想知道我是否可以将其挂载到 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 # 同步更改到磁盘
好了,大功告成。