vorfee's Tech Blog

Just another tech blog

Linuxでrawディスクのimageファイルを扱うあれこれ(空ファイル作成、パーティション作成、マウントなど)

RaspberryPiのためにLinuxでディスクのイメージファイルを編集するのに使うけどすぐに忘れるのでメモ。

この記事でできること

  • ディスクimageを一から作成できる
  • 既存のディスクimgaeをマウントできる

1: 空のimageを作成

方法1 - truncate

truncateコマンドでハードディスク上に指定したサイズ(単位はbyte)の空ファイルを作成する。

# サイズが2GiBのimageを作成
$ truncate -s 2GiB image.img

上で示した通り、サイズには接頭辞をつけることができる。よく使う単位は以下の通り。

WindowsOSXで表示される単位は2進接頭辞(KiB、MiB、GiB)を基準にしているため、ここでは2進接頭辞を使う。なお、もう一方の単位系はSI接頭辞(KB、MB、GB)という。 *1

これを踏まえて実例を列挙する。

# 500byteのファイルを作成
$ truncate -s 500 image.img

# 32MiBのファイルを作成
$ truncate -s 32MiB image.img

# 1GiBのファイルを作成
$ truncate -s 1GiB image.img

# 100MiBのファイルを3つ作成
$ truncate -s 100MiB image-1.img image-2.img image-3.img

方法2 - dd

ddコマンドでも同様の空ファイルを作成することができる。

# サイズが2Gのimageを作成
$ dd of=image.img count=0 seek=1 bs=2G

2: ファイルをブロックデバイスとして認識させる

losetupコマンドでループデバイスにファイルを関連付ける。ループデバイスに関連付けるにはroot権限が必要である。

# 使用されていないループデバイスを表示
$ sudo losetup -f
/dev/loop0

# /dev/loop0にimage.imgを関連付ける
$ sudo losetup /dev/loop0 image.img

逆に関連付けを解除するには-dオプションを使う。

# /dev/loop0とimage.imgの関連付けを解除
$ sudo losetup -d /dev/loop0

3: パーティショニングする

設定したループデバイスに対してpartedでパーティショニングする。パーティショニングにはroot権限が必要である。

# 対話的にパーティショニングを開始する
$ sudo parted /dev/loop0

以下に2GiBのファイルを300MiBのfat32と1.7GiB(=残りの容量全部)のext4にパーティショニングする例を示す。

# 一行のコマンドでパーティショニングする
$ sudo parted /dev/loop0 -s mklabel msdos \
  -s mkpart primary fat32 0 300MiB \
  -s mkpart primary ext4 300MiB 100%

# パーティショニング内容を確認する
$ sudo parted /dev/loop0 -s print

パーティショニングすると、パーティションに合わせてループデバイスに名前が割り振られる。上記の例では新たに/dev/loop0p1(300MiB)と/dev/loop0p2(1.7GiB)が作成される。 *2

4: フォーマットする

パーティショニングしたら指定のファイルシステムにフォーマットする。root権限が必要である。

# fat32でフォーマット
$ sudo mkfs.vfat /dev/loop0p1

# ext4でフォーマット
$ sudo mkfs.ext4 /dev/loop0p2

余計なことが大好きなOS(Ubuntuとか)ならばこの時点で勝手にマウントする。

5: マウントする

適当なディレクトリを作ってマウントする。root権限が必要である。

# ディレクトリ(マウントポイント)の作成
$ sudo mkdir /mnt/imgp1 /mnt/imgp2

# マウントする
$ sudo mount /dev/loop0p1 /mnt/imgp1
$ sudo mount /dev/loop0p2 /mnt/imgp2

その他

この記事の通りにコマンドを打ちこんでいたらファイルだらけになったという人へ。以下のコマンドで掃除できる。

sudo umount /mnt/imgp1
sudo umount /mnt/imgp2
sudo rm -rf /mnt/imgp1 /mnt/imgp2
sudo losetup -d /dev/loop0
rm image.img

参考

*1:どちらの場合も正確にはキロは小文字のkであるが、個人的に大文字のほうが統一感があるため大文字にしている。

*2:万が一自動で割り振られなかった場合はkpartxコマンドで割り当てる。なお、UbuntuDebianとArchLinuxでは自動で割り振られた。