それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

複数パーティションのHDDのRAWイメージをマウントする方法まとめ

複数のパーティションが含まれたイメージをマウントする

パーティションのイメージをマウントするには、そのままマウントすれば出来ますけど。

sudo mount partionA.img /mnt ##通常のマウント

複数のパーティションを含むディスクイメージだと、そうも行かない

方法

losetup の場合、背うつ属しただけだと認識されないことがあるので kpartx -a で反映させます。

パーティションが含まれるRAW disk imageの場合

takuya@atom:~$ fdisk -l  my_disk.img

Disk 2014-09-09-wheezy-raspbian.img: 3276 MB, 3276800000 bytes
255 heads, 63 sectors/track, 398 cylinders, total 6400000 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
Disk identifier: 0x00090806

                         Device Boot      Start         End      Blocks   Id  System
my_disk.img1            8192      122879       57344    c  W95 FAT32 (LBA)
my_disk.img2          122880     6399999     3138560   83  Linux

パーティションをファイル名として指定できない

 #=>パーティション2をマウントしたいけど ・・・・
sudo mount my_disk.img2 /mnt

引数my_disk.img2がファイル名として解釈されて my_disk.img<N> のようなパーティション番号として解釈されない。

そこでパーティションを含むハードディスクのイメージをマウントするには、losetup をつかうか、offsetを使う方法をとります。個人的にはlosetup を使うほうが好きですね。

方法1 offsetを使う方法

offsetを指定すれば、mountコマンドでlosetup⇛mount が出来ます。

offsetをfdisk コマンドで確認

ディスクのoffsetをfdisk コマンドを使って確認

takuya@atom:~$ fdisk -l -u 2014-09-09-wheezy-raspbian.img

Disk 2014-09-09-wheezy-raspbian.img: 3276 MB, 3276800000 bytes
255 heads, 63 sectors/track, 398 cylinders, total 6400000 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
Disk identifier: 0x00090806

                         Device Boot      Start         End      Blocks   Id  System
2014-09-09-wheezy-raspbian.img1            8192      122879       57344    c  W95 FAT32 (LBA)
2014-09-09-wheezy-raspbian.img2          122880     6399999     3138560   83  Linux

offsetから、マウントコマンドを作成

sudo mount -o loop,offset=$((122880*512)) 2014-09-09-wheezy-raspbian.img  /mnt

mount を確認

takuya@atom:~$ ls  /media/img
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var

ちなみに loop デバイスを確認

takuya@atom:~$ sudo losetup -a
/dev/loop0: [fe00]:58464759 (/home/takuya/2014-09-09-wheezy-raspbian.img), offset 62914560

チャント、loop が設定されていますね。

mount がloop を管理しています。

この方法の場合、パーティションの(スタートxセクタサイズ)を計算するのですが、セクタってなに、スタートセクタってなに??ってなりませんか?

いまどき、セクタ・シリンダ・ユニット単位とか気にしないじゃん・・・

方法2 loop デバイスを手動で設定する(オススメ)

先ほどのmountが管理していたloopを手作業で管理する場合です。

複数パーティションが含まれたディスクイメージを /dev/sda1 /dev/sda2 の用に数値で指定できるようにする。そのためのloopデバイスを手動管理するスタイル。

個人的にはこの方が楽だと思ってたりする。覚えやすいし、イメージしやすい。

通常の物理デバイスと使い方がほぼ同じ

  1. RAWファイルをデバイスに接続(USBドライブをぶっ刺す相当)
  2. バイスの中にパーティションを見つける
  3. マウントする

これらをコマンドを使って1つずつ確認するから迷わないし、通常の物理ディスク接続の手順に近いので覚えやすい。

準備

いくつかの準備をします。

/etc/modprobe.d/loop.conf に以下を記述

options loop max_part=63 max_loop=8

#

modprobeで設定を反映する。

sudo rmmod loop
sudo modprobe loop

これで準備完了

loop デバイスに登録

img ファイルを loopデバイスに割り当てる。

takuya@atom:~$ sudo losetup  /dev/loop1  2014-09-09-wheezy-raspbian.img

loopデバイスに割り当てられたか確認

losetup -a で割り当て済みのデバイスを見ることが出来る

takuya@atom:~$ sudo losetup -a
/dev/loop1: [fe00]:58464759 (/home/takuya/2014-09-09-wheezy-raspbian.img)

今回は /dev/loop1 に割り当てました。

バイス指定を省略

バイスの指定を明示したのは初めてやる人が、覚えるためで、

通常は次のコマンドで、パパっと接続します。

sudo losetup  -f  2014-09-09-wheezy-raspbian.img

これで、USBフラッシュメモリを、差し込んだのとほぼ同じようになります。

パーティションの確認

loopデバイスをfdisk するとパーティションを見ることが出来ます。

takuya@atom:~$ ls /dev/loop0*
/dev/loop0  /dev/loop0p1  /dev/loop0p2

これを使うことでハードディスクのイメージのパーティションを格段に触りやすくなると思う。

パーティションを番号で指定する。

takuya@atom:~$ sudo mount /dev/loop0p2 /media/img/

パーティションの番号で指定できるようになって、覚えること減った。

takuya@atom:~$ ls /media/img/
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var

計算もいらないし、fdisk コマンドも使ってない。

方法3 kpartx

loop デバイスを作るの面倒なので、kpartx を使う方法でmapper を使って、デバイスを作る

準備

aptitude install kpartx

ループデバイスマッピング

takuya@atom:~$ sudo kpartx -a 

kpartx を使うと/dev/mapper に以下のような物ができる

takuya@atom:~$ ls /dev/mapper/
atom-root  atom-swap_1  control  loop0p1  loop0p2
takuya@atom:~$ ls /dev/mapper/loop0p1
/dev/mapper/loop0p1
takuya@atom:~$ ls /dev/mapper/loop0p2
/dev/mapper/loop0p2
takuya@atom:~$

後はコレをマウントする

sudo mount /dev/mapper/loop0p2 /media/img

作業が終わったらおかたづけ

takuya@atom:~$ sudo umount /dev/mapper/loop0p1
takuya@atom:~$ sudo kpartx -d /dev/loop0
takuya@atom:~$ sudo losetup -d /dev/loop0

やってることは同じなんですけどね。

ループデバイスを自動生成するか、手作業でループ指定するか、マッピングするか、この違いなんだけど、

いっぱいやり方あって困りますね。

今回は、紹介しませんでしたが、libvirt kvm での qemu-img やら、openstack が使ってる管理ツールnova cinder swift だとか、似たようなものや、ラッパーが作らていて。。。もう頭痛い

ぐぐってもこれらの方法を中途半端が混ざってたりしてて、スゴく迷った。

私も過去に、ごっちゃになっていました。

参考資料

http://takuya-1st.hatenablog.jp/entries/2012/10/10

http://cyberang3l.wikispaces.com/HOWTO+-+Mount+Raw+Images

http://d.hatena.ne.jp/mir/20100108/p1