Man On a Mission

システム運用屋が、日々のあれこれを記録していくブログです。情報処理技術者試験の話題多し。高度試験の攻略なども。最近はやや歴史づいてます…。

【Linux】ディスクイメージをマウントする【ループバックデバイス】

今日は、Linuxのループバックデバイスについて少々。

PCであれこれ作業している際、たまにCD/DVDなどのISOイメージや、HDDイメージファイルの中を覗きたくなることがあります。

Linuxではループバックデバイス機能を使うことで、これらのイメージファイルをディスク*1としてマウントできます。
具体的なやり方は、「-o loop」オプション付きでmountコマンドを実行する、というものです。以下に例を挙げます。
(ちなみにUbuntuでの例です。CentOSとかでも同様だとは思いますが。)

 まず、マウントするイメージファイルが必要です。
ここではDDコマンドを使ってサンプルとなるイメージファイルを作成し、これをマウントすることにします。

イメージファイルの作成

100MB、ext4フォーマットのイメージファイルを作成します。

$ dd if=/dev/zero of=./100m.img bs=1M count=100
$ mkfs.ext4 100m.img

これで、約100MBのイメージファイルができました。

イメージファイルのマウント

上記のイメージファイルをマウントします。

# mount -t ext4 -o loop 100m.img /mnt/任意のディレクト

これで、「/mnt/任意のディレクトリ」にイメージファイルがマウントされます。
読み込みはもちろん、書き込みも可能です。

CD/DVDイメージのマウント(ISOイメージ)

もうひとつ例を挙げます。ISOイメージをマウントしてみましょう。
ここでは、Ubuntu16.04のインストールディスクイメージ(ubuntu-ja-16.04-desktop-amd64.iso)をマウントします。

# mount -t iso9660 -o loop ubuntu-ja-16.04-desktop-amd64.iso /mnt/任意のディレクト

書き込み禁止だという警告が出ますが、ともあれマウントはされます(読み込み専用)。

$ ls /mnt/任意のディレクト
EFI  README.diskdefines  boot  casper  dists  isolinux  md5sum.txt  pool  preseed

SDカードイメージのマウント

さて、ついでにSDカードのイメージファイルもマウントしてみましょう。
ここでは、シングルボード コンピュータRaspberry Pi(ラズベリー パイ)のSDカードイメージを使います。
以下、SDカードイメージ「Raspbian Jessie Lite」を用いた例。

# mount -t ext3 -o loop 2017-04-10-raspbian-jessie-lite.img /mnt/任意のディレクト

これは上手くいきません。以下のメッセージが表示されます。

mount: 何らかのエラーにより、マウントが失敗しました。
       ファイルシステムタイプ, オプション, /dev/loop0 上のスーパー
       ブロック, 必要なコードページ指定/ヘルパープログラム
       など、何らかの設定が間違っているものと思われます。
       syslog 内に記録された情報が手助けになるものと思います -
       dmesg | tail などを実行してお読みください

上手くいかない理由は、当該イメージファイルにパーティションが二つあるからです。
複数のパーティションが含まれるディスクイメージの場合、パーティションを指定してマウントしなければなりません。
具体的にはoffsetオプションを使ってマウントします。

まず、offsetに指定する値を調べるため、「fdisk -l -u」コマンドでディスクイメージの情報を得ます。

$ fdisk -l -u 2017-04-10-raspbian-jessie-lite.img

ディスク 2017-04-10-raspbian-jessie-lite.img: 1297 MB, 1297862656 バイト
ヘッド 255, セクタ 63, シリンダ 157, 合計 2534888 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x84fa8189

                        デバイス ブート      始点        終点     ブロック   Id  システム
2017-04-10-raspbian-jessie-lite.img1            8192       92159       41984    c  W95 FAT32 (LBA)
2017-04-10-raspbian-jessie-lite.img2           92160     2534887     1221364   83  Linux

offsetオプションに指定する値は、セクタサイズ×マウントしたいパーティションの始点です。
例えば、上記の二つ目のパーティションをマウントする場合、512*92160=47185920が指定値です。

# mount -t ext4 -o loop,offset=47185920 2017-04-10-raspbian-jessie-lite.img /mnt/任意のディレクト

今度はマウントできます。

$ ls /mnt/任意のディレクト
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

ちなみに、以下のようにoffset指定することも可能です。

# mount -t ext4 -o loop,offset=$((92160*512)) 2017-04-10-raspbian-jessie-lite.img /mnt/任意のディレクト

 

 

*1:正確にはブロック型デバイス