Linuxその他 - ディスクイメージ
概要
ディスクイメージは、ディスク全体またはパーティションの完全なコピーであり、後で復元や分析が可能である。
これは、システムのバックアップや移行、テスト等で非常に役立つ。
ディスクイメージファイルの拡張
Linux OSのディスクイメージファイルをマウントして使用する場合、ディスクイメージファイルの空き領域が不足する時がある。
ここでは、ディスクイメージファイルのサイズを変更する手順について記載する。
方法 1 (推奨)
まず、ディスクイメージファイルを確認する。
sudo fdisk -lu <ディスクイメージファイル>.img # 出力例 ディスク 2023-10-10-raspios-bookworm-arm64-lite.img: 2.54 GiB, 2722103296 バイト, 5316608 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスクラベルのタイプ: dos ディスク識別子: 0x7788c428 デバイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ 2023-10-10-raspios-bookworm-arm64-lite.img1 8192 1056767 1048576 512M c W95 FAT32 (LBA) 2023-10-10-raspios-bookworm-arm64-lite.img2 1056768 5316607 4259840 2G 83 Linux
dd
コマンドを使用して、空き領域を追加する。
上記の例では、最初のパーティションはブートパーティション(カーネルとバイナリブロブ)、2番目のパーティションはファイルシステムである。
ディスクイメージファイルに空の空き領域を追加して、2番目のパーティションを拡張する。
sudo dd if=/dev/zero bs=1M count=3072 >> <元のディスクイメージファイル>.img # この例では、3[GB]を追加している
空き領域を追加したディスクイメージファイルの情報を表示する。
この時、出力結果は空き領域が追加されたサイズ(以下の例では、5.54[GiB])と表示するが、ディスクイメージファイルの2番目のパーティションのサイズはまだ変更されていない。(以下の例では、2[G])
sudo fdisk -lu <元のディスクイメージファイル>.img # 出力例 ディスク 2023-10-10-raspios-bookworm-arm64-lite.img: 5.54 GiB, 5943328768 バイト, 11608064 セクタ 単位: セクタ (1 * 512 = 512 バイト) セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト ディスクラベルのタイプ: dos ディスク識別子: 0x7788c428 デバイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ 2023-10-10-raspios-bookworm-arm64-lite.img1 8192 1056767 1048576 512M c W95 FAT32 (LBA) 2023-10-10-raspios-bookworm-arm64-lite.img2 1056768 5316607 4259840 2G 83 Linux
これを解決するため、ディスクイメージファイルの空の追加領域の部分を埋めるようにパーティションのサイズを変更する必要がある。
まず、ループバックデバイスを作成する。
sudo losetup -f -P --show <元のディスクイメージファイル>.img # 出力例 /dev/loop0
これにより、/dev/loopXがディスクイメージファイル全体、/dev/loopXp2がサイズ拡張するパーティションとして設定される。
他のループバックデバイスを選択する場合は、未使用のループバックデバイスのドライブを割り当てる。
sudo fdisk -lu /dev/loopX # X : ループバックデバイス番号
# 実行例
sudo fdisk -lu /dev/loop0
# 出力例
ディスク /dev/loop0: 5.54 GiB, 5943328768 バイト, 11608064 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x7788c428
デバイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ
/dev/loop0p1 8192 1056767 1048576 512M c W95 FAT32 (LBA)
/dev/loop0p2 1056768 5316607 4259840 2G 83 Linux
上記の出力例では、/dev/loop0p1はブートパーティション、/dev/loop0p2はルートパーティションである。
次に、parted
を実行して、パーティションのサイズを変更する。
2番目のパーティションのサイズを、parted
コマンドのヘッダ出力のDiskまたはディスクで始まる行で指定された/dev/loopXのフルサイズに変更する。
以下の例では、ディスクは5943[MB]である。
sudo parted /dev/loopX
(parted) print # 出力例 モデル: Loopback デバイス (loopback) ディスク /dev/loop0: 5943MB セクタサイズ (論理/物理): 512B/512B パーティションテーブル: msdos ディスクフラグ: 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 4194kB 541MB 537MB primary fat32 lba, type=0c 2 541MB 2722MB 2181MB primary ext4 type=83
2番目のパーティションサイズを変更する。
以下の例では、2番目のパーティション(ルートパーティション)をフルサイズに変更している。
(parted) resizepart <パーティション番号> <拡張するサイズ> # 実行例 (parted) resizepart 2 5943MB
正常に拡張されているかどうかを確認する。
(parted) print # 出力例 モデル: Loopback デバイス (loopback) ディスク /dev/loop0: 5943MB セクタサイズ (論理/物理): 512B/512B パーティションテーブル: msdos ディスクフラグ: 番号 開始 終了 サイズ タイプ ファイルシステム フラグ 1 4194kB 541MB 537MB primary fat32 lba, type=0c 2 541MB 5943MB 5402MB primary ext4 type=83
e2fsck
コマンドを実行して、拡張したディスクイメージファイルのファイルシステムを確認する。
sudo e2fsck -f /dev/loopXpY # Xはデバイス番号, Yは拡張したパーティション番号
resize2fs
で拡張したディスクイメージファイルのファイルシステムを拡張する。
※パーティションのサイズは既に変更しているので、ここではファイルシステムをリサイズ(拡張)する。
sudo resize2fs /dev/loopXpY # Xはデバイス番号, Yは拡張したパーティション番号
ディスクイメージファイルが正常に拡張されているかどうかを確認する。
sudo parted /dev/loopX
(parted) print
# 出力例 (正常に拡張されている場合)
モデル: Loopback デバイス (loopback)
ディスク /dev/loop0: 5943MB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: msdos
ディスクフラグ:
番号 開始 終了 サイズ タイプ ファイルシステム フラグ
1 4194kB 541MB 537MB primary fat32 lba, type=0c
2 541MB 5943MB 5402MB primary ext4 type=83
最後に、ループバックデバイスを削除する。
sudo losetup -d /dev/loopX
方法 2
まず、空のイメージファイルを作成する。
以下の例では、拡張するサイズを5[GiB]としている。
truncate -s 5GiB <空のイメージファイル名>.img
元のディスクイメージファイルと空のイメージファイルを結合する。
cat <元のディスクイメージファイル>.img <空のイメージファイル名>.img > <結合したディスクイメージファイル名>.img
現在空いているループバックデバイスを確認する。
sudo losetup -f # 出力例 /dev/loop0
結合したディスクイメージファイルをループバックデバイスにマウントする。
sudo losetup /dev/loopX <結合したディスクイメージファイル名>.img # X : ループバックデバイス番号
正常にマウントできたかどうかを確認するため、ループバックデバイスの設定状況を確認する。
sudo losetup -a # 出力例 /dev/loop0: []: (<結合したディスクイメージファイル名>.img)
パーティションテーブルを確認する。
sudo fdisk -lu /dev/loopX
# 出力例
Disk /dev/loop0: 5.6 GiB, 3054501888 bytes, 5965824 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: 00CF01F2-3FB1-498B-BFE9-BA5B68507014
デバイス 起動 Start 最後から セクタ Size Id タイプ
/dev/loop0p1 2048 1048576 131072 511M c W95 FAT32 (LBA)
/dev/loop0p2 1048576 13913020 13313020 4.1G 83 Linux ファイルシステム
結合したディスクイメージファイルのパーティションを設定する。
sudo fdisk /dev/loopX
# 出力例
Welcome to fdisk (util-linux 2.37.4).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
まず、拡張するパーティションを削除する。
d
キーを入力した後、拡張するパーティション番号を入力する。
コマンド (m でヘルプ): d パーティション番号 (1,2, default 2): 2 Partition 2 has been deleted.
次に、拡張するパーティションの種類を選択する。
ここでは、プライマリとして使用するため、n
キーを入力した後、p
キーを入力する。
なお、extendedパーティション(拡張パーティション)は、主にスワップ向けに使用される。
コマンド (m でヘルプ): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p
拡張するパーティション番号および拡張するサイズ(セクタ番号の最初と最後)を入力する。
デフォルトの値は、最大セクタサイズである。
パーティション番号 (2-4, default 2): 2 # 出力例 First sector (1048576-15913020, default 1048576): Last sector, +sectors or +size{K,M,G,T,P} (1048576-15913020, default 15913020): Created a new partition 2 of type 'Linux' and of size 7.1 GiB.
拡張するパーティションタイプを指定する。
t
キーを入力した後、パーティション番号およびLinuxファイルシステムを示すパーティションタイプである83
を入力する。
コマンド (m でヘルプ): t パーティション番号 (1,2, default 2): 2 Partition type (type L to list all types): 83 # 出力例 Changed type of partition 'Linux' to 'Linux'.
設定したパーティションを確認する。
p
キーを入力する。
コマンド (m でヘルプ): p # 出力例 Disk /dev/loop0: 7.59 GiB, 8147483648 bytes, 14864445 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: 00CF01F2-3FB1-498B-BFE9-BA5B68507014 デバイス 起動 Start 最後から セクタ Size Id タイプ /dev/loop0p1 2048 1048576 1048576 511M c EFI システム /dev/loop0p2 1048576 15913020 14864445 7.1G 83 Linux ファイルシステム
上記で設定したパーティションを書き込む。
w
キーを入力する。
コマンド (m でヘルプ): w # 出力例 The partition table has been altered. Calling ioctl() to re-read partition table. Re-reading the partition table failed.: 無効な引数です The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).
ループバックデバイスを削除する。
sudo losetup -d /dev/loopX
ディスクイメージをマウントする。
sudo mount -o loop,offset=<オフセット番号 (1セクタサイズ ✕ セクタの開始番号)> <結合したディスクイメージファイル名>.img <マウントするディレクトリ>
拡張の設定をしたパーティションを拡大する。
# 設定されているループバックデバイス名を確認
sudo losetup -a
# パーティションの拡大
sudo resize2fs /dev/loopX
拡張したパーティションを確認する。
df # 出力例 /dev/loop0 1048576 15913020 14864445 35% /mnt