
こんにちは、キクです。
サーバを運用していると以下のような場面に遭遇することがあります。
- OSのインストールイメージ(ISO)の中身をちょっと確認したい
- ddコマンドで作ったディスクイメージをマウントしてファイルを救出したい
本記事では、そんな場面で登場する「ループバックマウント」について備忘録として残しておきます。
本記事の内容
それでは、よろしくお願いします。
1. ループバックマウントとは?

通常、Linuxでファイルシステムを認識させるには、物理的なドライブが/dev/sda1といったデバイスファイルとして存在している必要がある
しかし、ループバックマウントを使うと、OSが「特定のファイルを仮想的なブロックデバイス(/dev/loopX)として扱う」ことができるようになる
これにより、ファイルがあたかも外付けHDDであるかのように振る舞い、マウントが可能になるという仕組み
2. 仕組みの裏側(ループデバイス)
ループバックマウントを実行した際には、OS内部では以下のようなことが起きている
1. 空いているループデバイス(/dev/loop0など)を探す
これまで意識したことがなかったのですが、/dev配下には複数のループデバイスが存在していることを確認できました
kiku@ubuntu:~$ ll /dev/ |grep loop
crw-rw---- 1 root disk 10, 237 Apr 22 06:10 loop-control
brw-rw---- 1 root disk 7, 0 Mar 31 00:03 loop0
brw-rw---- 1 root disk 7, 1 Mar 31 00:03 loop1
brw-rw---- 1 root disk 7, 2 Mar 31 00:03 loop2
brw-rw---- 1 root disk 7, 3 Mar 31 00:03 loop3
brw-rw---- 1 root disk 7, 4 Mar 31 00:03 loop4
brw-rw---- 1 root disk 7, 5 Mar 31 00:03 loop5
brw-rw---- 1 root disk 7, 6 Mar 31 00:03 loop6
brw-rw---- 1 root disk 7, 7 Mar 31 00:03 loop7
2. そのループデバイスを指定したファイルに紐付ける
3. ループデバイスをターゲットのディレクトリにマウントする
なぜ「ループデバイス」が必要なのか?
Linuxの世界には「すべてはファイルである」という大原則があるが、ファイルには大きく2つの階層がある
- 通常のファイル:テキストや画像など、中身を直接読み書きするもの
- ブロックデバイス:HDDやSSDのように、OSが「ディスク」として認識するもの
OS(カーネル)のmountコマンドは、原則として「ブロックデバイス」しかマウントできないが、ループデバイスがあることで「ただのファイルを、ブロックデバイスのフリをして振る舞わせる」ための仲介役(アダプター)として働いてくれる
ループデバイスは仮想的なSDカードリーダーのようなもの

「ループデバイスは仲介役」と表現したが、例えるなら仮想的なSDカードリーダーのようなイメージに近い
- ファイル(.imgなど):SDカードそのもの
- ループデバイス:パソコンに挿すカードリーダー
- マウント:カードリーダーをOSが認識してファイルの中身を見れるようにすること
カードリーダー(ループデバイス)を通して、SDカード(ファイル)の中身を読み取るという動作を、すべてOS内部のソフトウェアだけで完結させているのが、ループバックマウントの正体である
3. どんなときに使うのか(ユースケース)
主に以下のような場面で利用される
1. ISOイメージの内容確認
インストールメディアを焼く前に、中身のスクリプトやパッケージを確認する
2. バックアップイメージの操作
ddコマンドで取得したディスクイメージから、特定のファイルだけを取り出したいとき
3. 仮想的なファイルシステムの作成
空のファイルを作成し、それをフォーマットしてマウントすることで、クォータ制限(容量制限)付きの作業領域を擬似的に作る
4. 操作練習
1. 100MBの空ファイルを作成
kiku@ubuntu:~$ dd if=/dev/zero of=test_disk.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.106737 s, 982 MB/s
2. 作成したファイルをファイルシステム(ext4)で初期化
ファイルを作成した時点ではただのデータの塊なので、OSが読み書きできるようにフォーマットする
kiku@ubuntu:~$ mkfs.ext4 test_disk.img
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 25600 4k blocks and 25600 inodes
Allocating group tables: done
Writing inode tables: done
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done
ファイルに対してフォーマットをかけるというループバックならではの不思議な操作
3. マウントポイント(ディレクトリ)を作成
kiku@ubuntu:~$ mkdir ./mnt_test
4. ループバックマウントを実行
kiku@ubuntu:~$ sudo mount -o loop test_disk.img ./mnt_test/
ext4としてマウントされている
kiku@ubuntu:~$ mount |grep test_disk
/home/kiku/test_disk.img on /home/kiku/mnt_test type ext4 (rw,relatime)
作成したファイルが/dev/loop0としてマウントポイント(/home/kiku/mnt_test)にマウントされていることが分かる
kiku@ubuntu:~$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 165M 1016K 164M 1% /run
/dev/sda1 48G 3.0G 45G 7% /
~省略~
/dev/loop0 90M 24K 83M 1% /home/kiku/mnt_test
kiku@ubuntu:~$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 100M 0 loop /home/kiku/mnt_test
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 49G 0 part /
├─sda14 8:14 0 4M 0 part
├─sda15 8:15 0 106M 0 part /boot/efi
└─sda16 259:0 0 913M 0 part /boot
sdb 8:16 0 10G 0 disk
├─sdb1 8:17 0 5G 0 part /test
│ /mnt/my_btrfs
└─sdb2 8:18 0 5G 0 part
sr0 11:0 1 4M 0 rom
読み書きもできた
root@ubuntu:/home/kiku# echo test > mnt_test/test.txt
root@ubuntu:/home/kiku# ll mnt_test/
total 28
drwxr-xr-x 3 root root 4096 Apr 28 23:23 ./
drwxr-x--- 7 kiku kiku 4096 Apr 28 23:14 ../
drwx------ 2 root root 16384 Apr 28 23:13 lost+found/
-rw-r--r-- 1 root root 5 Apr 28 23:23 test.txt
root@ubuntu-linuc:/home/kiku# cat mnt_test/test.txt
test
専門用語辞典
マウント (Mount)
- コンピュータに接続した機器やファイルを、OSのディレクトリ構造の一部として組み込み、利用可能にすること
ISOイメージ
- CDやDVD、Blu-rayの内容を1つのファイルにまとめたもの
- 国際標準規格(ISO 9660)に準拠している
ブロックデバイス
- データを一定サイズの「ブロック」単位で読み書きするデバイスのこと
- HDDやSSD、ループデバイスなどが該当する。
ループバック (Loopback)
- 送信したデータや信号が、外部へ出ずにそのまま自分自身に戻ってくる仕組み
ループデバイス (/dev/loop)
- 通常のファイルをブロックデバイスとして利用するための仮想デバイス
ディスクイメージ (.img)
- ストレージの内容をセクタ単位でそのままコピーしたバイナリファイル
ddコマンド
- データのコピーや変換を行うコマンド
- ディスク全体の完全な複製(イメージ作成)によく使われる