web-dev-qa-db-ja.com

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

しかし、私には問題があります。

3147775で始まり37747824で終わる4番目のパーティション/ dev/loop0p4を追加したいと思います。

パーティションを物理的に作成したくありませんが、このドライブが存在すると見なされるようにパーティションテーブルを変更したいと思います。

ただし、この目的でfdiskを使用すると、Value out of range.

fdiskを強制的に実行パーティションテーブルが無効であってもかまいません。これをより大きなディスクに追加し、後でフォーマットします。パーティションテーブルを、その大きなディスクに追加するものの一部にしたいと思います(これには理由があり、詳細を詳しく調べたくありません)。私が知りたいのは、16進エディターを取り出さずにこれらの任意の値でパーティションテーブルを作成する方法です。

2
peskal

特にLinuxtmpfsでは、ファイルを好きなだけ大きくしたり小さくしたりできます。

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ギガバイトです。

その後、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

テーブルが書き込まれた後、それはlittleビットのスペースを使用します:

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

そして、あなたはまばらにextend同じ方法でファイルを作ることができます:

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
3
mikeserv

私が見るように、あなたには3つの選択肢があります:

1)サニティチェックを行わない別のツールを使用します。あなたは自分で16進エディタについて言及しました...

2)使用しているツール(fdisk)を変更し、サニティチェックを削除します。 fdiskのソースはそこにあります、多分それはあなたのディストリビューションにすでに含まれています。

3)サニティチェックが有効になるように画像を変更します。より大きなイメージを作成し、パーティションを作成してから、ddを使用して、イメージの先頭のみを必要なサイズの新しいファイルにコピーすることができます。

0