パーティションテーブルを使用して、Linuxでパーティションテーブルをプログラムでマウントしようとしています。
Lostupを使用して破損したドライブのパーティション(パーティションテーブルが削除された状態)をバックアップにマウントできることを確認するために、これまでに行った作業は次のとおりです。ここで開始と終了のセクタを見つけることができると仮定します。
次のコマンドを使用して、2つのパーティションを持つ新しいファイルを作成しました。
sudo dd if=/dev/zero of=backup.img bs=1M count=100
sudo fdisk backup.img
backup.img
2つのパーティションに分けて、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
です。ext4
losetup
それからこれを試しました。
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つのパーティションがマウントされているはずです。