如何在不使用 fdisk 检查分区表文件有效性的情况下操作分区表文件?

如何在不使用 fdisk 检查分区表文件有效性的情况下操作分区表文件?

我正在内存中创建一个图像(/tmp 是一个 tmpfs):

$ dd if=/dev/zero of=/tmp/sdcard.img bs=512 count=3147775

它应该保存一个分区表和设备的前 3 个分区

$ losetup /dev/loop0 /tmp/sdcard.img
$ dd if=bootloader.img of=/dev/loop0 bs=512

前 2048 个扇区包含分区表。

$ fdisk -l /tmp/sdcard.img
Disk /dev/loop0: 1.5 GiB, 1611660800 bytes, 3147775 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: 0x0000de21

Device       Boot   Start     End Sectors  Size Id Type
/dev/loop0p1         2048 1050623 1048576  512M  c W95 FAT32 (LBA)
/dev/loop0p2      1050624 2099199 1048576  512M 83 Linux
/dev/loop0p3      2099200 3147775 1048576  512M 83 Linux

但我有一个问题。

我想添加第四个分区 /dev/loop0p4,它从 3147775 开始,到 37748724 结束。

我不想物理创建分区,但我想修改分区表,以便它认为该驱动器存在。

但是,当我用于fdisk此目的时,它会抱怨Value out of range.

我怎样才能fdisk强迫做吧。我不在乎分区表是否无效。我打算将其添加到更大的磁盘中,然后稍后对其进行格式化。我希望分区表成为我添加到更大磁盘的内容的一部分(这是有原因的,宁愿不深入研究这些细节)。我想知道的是如何在不退出十六进制编辑器的情况下使用这些任意值编写分区表。

答案1

您可以根据需要将文件设置为大或小 - 尤其是在 Linux tmpfs 上。

df -h /tmp

Filesystem      Size  Used Avail Use% Mounted on
tmpfs            12G  472K   12G   1% /tmp

我们可以制作一个稀疏文件。

for cmd in  \
       'dd bs=1024k seek=20k of=' \
       'ls -slh '
do      eval "$cmd/tmp/file"
        echo
done    </dev/null

0+0 records in
0+0 records out
0 bytes (0 B) copied, 0.000152051 s, 0.0 kB/s

0 -rw-r--r-- 1 mikeserv mikeserv 20G Dec 24 20:19 /tmp/file

看?它使用 0 块磁盘空间,但其表观大小为 20 GB。

然后你就可以了fdisk /tmp/file。我刚刚在其上创建了一个分区表。这是fdisk -l


Disk /tmp/file: 20 GiB, 21474836480 bytes, 41943040 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: 0x057d787a

Device     Boot    Start      End  Sectors Size Id Type
/tmp/file1          2048 20973567 20971520  10G 83 Linux
/tmp/file2      20973568 31459327 10485760   5G  5 Extended
/tmp/file3      31459328 41943039 10483712   5G 83 Linux

表格写完后,它确实使用了小的一点空间:

ls -lsh /tmp/file

8.0K -rw-r--r-- 1 mikeserv mikeserv 20G Dec 24 20:21 /tmp/file

但你不会知道。

df -h /tmp

Filesystem      Size  Used Avail Use% Mounted on
tmpfs            12G  480K   12G   1% /tmp

并且你可以稀疏地延长以同样的方式创建一个文件:

for cmd in  \
       'dd bs=1024k seek=30k of=' \
       'ls -slh '  'fdisk -l '
do      eval "$cmd/tmp/file"
        echo
done    </dev/null

0+0 records in
0+0 records out
0 bytes (0 B) copied, 9.8239e-05 s, 0.0 kB/s

8.0K -rw-r--r-- 1 mikeserv mikeserv 30G Dec 26 14:24 /tmp/file

Disk /tmp/file: 30 GiB, 32212254720 bytes, 62914560 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: 0x057d787a

Device     Boot    Start      End  Sectors Size Id Type
/tmp/file1          2048 20973567 20971520  10G 83 Linux
/tmp/file2      20973568 31459327 10485760   5G  5 Extended
/tmp/file3      31459328 41943039 10483712   5G 83 Linux

答案2

在我看来,你有 3 个选择:

1)使用其他不进行健全性检查的工具。您自己确实提到了十六进制编辑器......

2) 修改您正在使用的工具(fdisk)并删除健全性检查。 fdisk 的源代码就在那里,也许它已经包含在您的发行版中。

3) 修改您的图像以使健全性检查变得有效。您可以创建一个更大的映像,创建分区,然后使用 dd 仅将映像的开头复制到具有所需大小的新文件中。

相关内容