如何格式化img文件内的分区?

如何格式化img文件内的分区?

img通过以下命令创建了一个文件:

dd if=/dev/zero bs=2M count=200 > binary.img

它只是一个带有零的文件,但我可以使用它fdisk并创建分区表:

# fdisk binary.img

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x51707f21.

Command (m for help): p
Disk binary.img: 400 MiB, 419430400 bytes, 819200 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: 0x51707f21

假设有一个分区:

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 
First sector (2048-819199, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-819199, default 819199): 

Created a new partition 1 of type 'Linux' and of size 399 MiB.

Command (m for help): w
The partition table has been altered.
Syncing disks.

当我检查分区表时,得到以下结果:

Command (m for help): p
Disk binary.img: 400 MiB, 419430400 bytes, 819200 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: 0x7f3a8a6a

Device      Boot Start    End Sectors  Size Id Type
binary.img1       2048 819199  817152  399M 83 Linux

所以分区是存在的。当我尝试通过 gparted 格式化该分区时,出现以下错误:

在此输入图像描述

我不知道它为什么要查找binary.img1,而且我不知道如何从命令 live 格式化分区。

有谁知道如何使用 ext4 文件系统格式化它?

答案1

您可以通过环回功能访问磁盘映像及其各个分区。您已经发现某些磁盘实用程序可以在磁盘映像上(合理地)愉快地运行。然而,mkfs不是其中之一(但奇怪的mount是)。

这是输出fdisk -lu binary.img

Disk binary.img: 400 MiB, 419430400 bytes, 819200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
...

Device           Boot Start    End Sectors  Size Id Type
binary.img1            2048 819199  817152  399M 83 Linux

要访问您创建的分区,您有多种选择

  1. 明确的路线

    losetup --offset $((512*2048)) --sizelimit $((512*817152)) --show --find binary.img
    /dev/loop0
    

    输出/dev/loop0是已分配的循环设备的名称。该--offset参数只是分区的偏移量 ( Start) 乘以扇区大小 ( 512)。而--sizelimit是分区的大小,可以通过以下方式计算:End-Start+1,即 819199-2048+1=817152 ,并且该数字还必须乘以扇区大小。

    然后您可以用作/dev/loop0分区的参考:

    mkfs -t ext4 -L img1 /dev/loop0
    mkdir -p /mnt/img1
    mount /dev/loop0 /mnt/img1
    ...
    umount /mnt/img1
    losetup -d /dev/loop0
    
  2. 隐式路由

    losetup --partscan --show --find binary.img
    /dev/loop0
    

    输出/dev/loop0是已分配的主循环设备的名称。此外,该--partscan选项告诉内核扫描设备中的分区表并自动分配辅助循环设备。在您使用一个分区的情况下,您还会得到/dev/loop0p1,然后您可以将其用作对该分区的引用:

    mkfs -t ext4 -L img1 /dev/loop0p1
    mkdir -p /mnt/img1
    mount /dev/loop0p1 /mnt/img1
    ...
    umount /mnt/img1
    losetup -d /dev/loop0
    

答案2

一般来说,还有另一种方法可以做到这一点,使用kpartx(不是kde相关)

sudo kpartx -a binary.img

现在您应该将所有分区设备定义/dev/mapper循环0p1,循环0p2, ...

进而

sudo mkfs.ext4 /dev/mapper/loop0p1

或者,完成后,您也可以运行

sudo kpartx -d binary.img

摆脱loop0p?设备

答案3

我不知道为什么它会寻找binary.img1

(……后来埋binary.img2在评论中。)

这是因为这些工具期望文件名遵循特定的模式。该模式是系统上实际光盘和光盘卷的设备文件所使用的模式,即:

  • 包含整个光盘的设备文件被命名sda(或其他名称)。这就是fdisk期望利用的。
  • 磁盘各个片的设备文件(按其分区进行描述)被命名为sda1sda2sda3等。这就是诸如此类的工具在告诉您执行操作gparted时期望使用的工具mkfs单独的光盘卷

当然,普通文件不会像光盘设备文件那样重叠。您所看到的涉及环回文件系统的讨论都是关于获取单个整盘映像文件,并在写入所需的分区布局后使用环回创建反映其中各个切片的123等文件到分区表。

答案4

虽然这个主题没有直接相关,但它提到了很多相同和相关的信息。

Debian 维基 | Raspberry Pi 和 qemu-user-static

如果您无法使用apt安装本文中提到的某些命令,请尝试使用apt-cache search [package_name]。如果命令来自不同名称的包,则可能不会出现任何结果。

例如,以前可以使用 usinglosetup安装,但现在它是Ubuntu 存储库的一部分。要找出哪个包充当另一个包的容器,您必须使用搜索 Linux 发行版的在线存储库的方法。或者,如果您必须从其他来源安装它,请使用 Web 搜索引擎。losetupapt install losetuputil-linux

一些值得一看的包...

util-linux genisoimage dosfstools squashfs-tools fsarchiver xfsprogs reiserfsprogs reiser4progs jfsutils ntfsprogs btrfs-tools

每个 Linux 发行版也有自己的在线联机帮助页。有时使用手册页比教程更容易。手册页还将告诉您所有命令选项和参数。教程通常只关注所使用的内容。

相关内容