Linuxでは、パーティションテーブルなしでパーティションを手動でマウントする

Linuxでは、パーティションテーブルなしでパーティションを手動でマウントする

パーティションテーブルを使用して、Linuxでパーティションテーブルをプログラムでマウントしようとしています。

Lostupを使用して破損したドライブのパーティション(パーティションテーブルが削除された状態)をバックアップにマウントできることを確認するために、これまでに行った作業は次のとおりです。ここで開始と終了のセクタを見つけることができると仮定します。

次のコマンドを使用して、2つのパーティションを持つ新しいファイルを作成しました。

sudo dd if=/dev/zero of=backup.img bs=1M count=100

sudo fdisk backup.imgbackup.img2つのパーティションに分けて、sudo fdisk -lu backup.img次のように表示されます。

Device   Boot  Start   End   Sectors   Size Id   Type
backup.img1       2048  104447  102400    50M 83   Linux
backup.img2     104448  204799  100352    49M 83   Linux

存在しないパーティションテーブルを使用してパーティションをマウントできるかどうかをテストしているので、ここにあるパーティションはパーティションext3です。ext4losetup

それからこれを試しました。

sudo losetup -r -o 1048576 /dev/loop0 backup.img効果があり、後で行うことができますsudo mount /dev/loop0 /mnt/test

ただし、パーティションテーブルを持たない生イメージがあると仮定するため、パーティションテーブルを手動で提供する必要があります。また、ディスクがさらに破損する可能性があるため、既存のバックアップを混乱させたくありません。

sudo losetup -o 1048576 --sizelimit 52428288 /dev/loop0 backup.img働く

ただし、次のようにループデバイスをインストールしようとすると

sudo mount /dev/loop0 /mnt/test、それは言わない

mount: /mnt/test: wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program or other error

サイズ制限を提供しましたが、losetupパーティションが認識されないのはなぜですか?

ここで何か抜けましたか?

答え1

理論的には、ループデバイスの設定に使用するコマンドには何の問題もありません。私のビルドスクリプトで同様のものを使用して画像を生成します。

私の意見では、誤ってテストイメージの形式を誤って指定して、extファイルシステムを元のサイズより大きくしたようです。

ループデバイスはファイルの一部を指すブロックデバイスであり、パーティションテーブルについては何も知りません。同様に、パーティションは、ディスク上の場所を説明するテーブルエントリを含むディスクのセクションにすぎません。

分割ブロックデバイスを取得する最も簡単な方法は、パーティションテーブルを使用することです。しなければならないすべてのディスクに存在します。

イメージにすでにパーティションテーブルがある場合は、実際にLinuxにラウンドロビンパーティションを追加するように依頼できます。

loop_device=$(losetup --show -f my image.img)
partx -a $loop_device

これにより、たとえばデバイスセットが作成されます/dev/loop2 /dev/loop2p1 /dev/loop2p2。これにより、オフセットを計算するのに苦労する必要がなくなります。

答え2

sudoコマンドには必要ありませんdd。以下が行われます。

dd if=/dev/zero of=backup.img bs=1M count=100

同様に、パーティション化されたテーブルを作成/編集するには、以下は必要ありませんsudo

$ gdisk backup.img 
GPT fdisk (gdisk) version 1.0.8

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory.

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1): 
First sector (34-204766, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-204766, default = 204766) or {+-}size{KMGTP}: 102400
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 8300
Changed type of partition to 'Linux filesystem'

Command (? for help): c
Using 1
Enter name: Test_1

Command (? for help): n
Partition number (2-128, default 2):  
First sector (34-204766, default = 104448) or {+-}size{KMGTP}: 
Last sector (104448-204766, default = 204766) or {+-}size{KMGTP}: 
Current type is 8300 (Linux filesystem)
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

Command (? for help): c
Partition number (1-2): 2
Enter name: Test_2

Command (? for help): p
Disk backup.img: 204800 sectors, 100.0 MiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 61A000F6-7F51-4615-B1B6-82D4C9E305B3
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 204766
Partitions will be aligned on 2048-sector boundaries
Total free space is 4061 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          102400   49.0 MiB    8300  Test_1
   2          104448          204766   49.0 MiB    8300  Test_2

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to backup.img.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.

パーティションテーブルを表示する場合も同様です。 no sudo:

$ fdisk -l backup.img 
Disk backup.img: 100 MiB, 104857600 bytes, 204800 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: gpt
Disk identifier: 61A000F6-7F51-4615-B1B6-82D4C9E305B3

Device       Start    End Sectors Size Type
backup.img1   2048 102400  100353  49M Linux filesystem
backup.img2 104448 204766  100319  49M Linux filesystem

これで、このパーティションにいくつかのファイルシステムを作成しようとしています。 2つのファイルシステムタイプを作成しますext4。今はそれが重要ではないと思います。

$ sudo kpartx -a backup.img

$ losetup --list | grep backup.img
/dev/loop19         0      0         0  0 /home/vlastimil/partition-experiments/backup.img       0     512

$ sudo mkfs.ext4 -L Test_ext4_1 -m 0 -E lazy_itable_init=0,lazy_journal_init=0 /dev/mapper/loop19p1 
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done                            
Creating filesystem with 12544 4k blocks and 12544 inodes

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

# The same command for /dev/mapper/loop19p2

その後、ディスクイメージを作成した後は常にセクタ乗算を使用してマウントしますが、kpartx上記で使用したように単純化されます。

$ mkdir mntpoint
$ sudo mount /dev/mapper/loop19p1 mntpoint1/
$ sudo mount /dev/mapper/loop19p2 mntpoint2/

これで、2つのパーティションがマウントされているはずです。

関連情報