Partition

如何在沒有 fdisk 檢查其有效性的情況下操作分區表文件?

  • December 28, 2015

我正在記憶體中創建一個圖像(/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它*去做。*我不在乎分區表是否無效。我將把它添加到更大的磁碟上,然後再格式化。我希望分區表成為我 dd 到那個更大磁碟的一部分(這是有原因的,寧願不深入研究這些細節)。我只想知道如何在不拉出十六進制編輯器的情況下使用這些任意值編寫分區表。

您可以根據需要製作任意大小的文件 - 特別是在 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

引用自:https://unix.stackexchange.com/questions/251207