ループデバイスは Linux でイメージファイルをハードディスクのようなブロックデバイスとして扱うための機能。
今回使う環境は CentOS7 にした。
$ cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) $ uname -r 3.10.0-229.14.1.el7.x86_64
dd/mkfs/mount を使う手順
まずはイメージファイルとして扱うファイルを dd コマンドで作っておく。
$ dd if=/dev/zero of=loopfile1 bs=1M count=1000 1000+0 レコード入力 1000+0 レコード出力 1048576000 バイト (1.0 GB) コピーされました、 2.10525 秒、 498 MB/秒
作成したファイルを XFS でフォーマットする。
$ mkfs.xfs loopfile1 meta-data=loopfile1 isize=256 agcount=4, agsize=64000 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=256000, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=853, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
完成したイメージファイルを mount コマンドで /mnt にマウントする。 -o オプションに loop を指定すると、ループデバイスを経由してイメージファイルをマウントすることになる。
$ sudo mount -o loop -t xfs loopfile1 /mnt/
これで先ほど作ったイメージファイルが /dev/loop0 デバイス経由で /mnt にマウントされた。
$ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/sda3 32357956 2328428 30029528 8% / devtmpfs 500224 0 500224 0% /dev tmpfs 508684 0 508684 0% /dev/shm tmpfs 508684 6604 502080 2% /run tmpfs 508684 0 508684 0% /sys/fs/cgroup /dev/sda1 127660 127640 20 100% /boot /dev/loop0 1020588 32928 987660 4% /mnt $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 32G 0 disk ├─sda1 8:1 0 128M 0 part /boot ├─sda2 8:2 0 1G 0 part [SWAP] └─sda3 8:3 0 30.9G 0 part / loop0 7:0 0 1000M 0 loop /mnt
使用中のループデバイスを一覧で取得する場合は losetup コマンドに -a オプションを指定する。
$ losetup -a /dev/loop0: []: (/home/vagrant/loopfile1)
未使用のループデバイスは losetup コマンドの -f オプションで確認できる。
$ losetup -f /dev/loop1
dd/losetup/mkfs/mount を使う手順
次は別の手順でループデバイスを使ってみる。 先程はファイルをフォーマットした上でループデバイスとしてマウントしたけど、今度はファイルをループデバイスに紐付けた上でフォーマットしてマウントしてみる。
$ dd if=/dev/zero of=loopfile2 bs=1M count=1000 1000+0 レコード入力 1000+0 レコード出力 1048576000 バイト (1.0 GB) コピーされました、 1.64299 秒、 638 MB/秒
まずは losetup コマンドで空いているデバイスに作成したファイルを紐付ける。
$ sudo losetup $(losetup -f) loopfile2
次に mkfs コマンドでループデバイスをフォーマットする。
$ sudo mkfs -t xfs /dev/loop1 meta-data=/dev/loop1 isize=256 agcount=4, agsize=64000 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=256000, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=853, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
フォーマットしたループデバイスを mount コマンドを使ってマウントする。
$ sudo mount -t xfs /dev/loop1 /tmp
これで、ふたつの手順でループデバイスを使ってイメージファイルをマウントできた。
$ losetup -a /dev/loop0: []: (/home/vagrant/loopfile1) /dev/loop1: []: (/home/vagrant/loopfile2) $ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 /dev/sda3 32357956 2331808 30026148 8% / devtmpfs 500224 0 500224 0% /dev tmpfs 508684 0 508684 0% /dev/shm tmpfs 508684 6640 502044 2% /run tmpfs 508684 0 508684 0% /sys/fs/cgroup /dev/sda1 127660 127640 20 100% /boot /dev/loop0 1020588 32928 987660 4% /mnt /dev/loop1 1020588 32928 987660 4% /tmp $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 32G 0 disk ├─sda1 8:1 0 128M 0 part /boot ├─sda2 8:2 0 1G 0 part [SWAP] └─sda3 8:3 0 30.9G 0 part / loop0 7:0 0 1000M 0 loop /mnt loop1 7:1 0 1000M 0 loop /tmp
ループデバイスのアンマウントと削除
次に使い終わったループデバイスを削除するやり方について。
まずは umount コマンドを使ってマウントを解除する。
$ sudo umount /tmp/
その上で losetup コマンドの -d オプションでループデバイスを削除する。
$ sudo losetup -d /dev/loop1
これでループデバイスを後片付けできた。
$ losetup -a /dev/loop0: []: (/home/vagrant/loopfile1)
めでたしめでたし。