CUBE SUGAR CONTAINER

技術系のこと書きます。

Linux のループデバイスを使ってみる

ループデバイスは 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)

めでたしめでたし。