hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

losetupコマンドの使い方



1 losetupコマンドとは?

ファイルをループバックデバイスとして使えるようにするためのコマンドです。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

losetupコマンドの版数は以下のとおりです。

[root@server ~]# losetup -V
losetup from util-linux 2.23.2

3 オプション一覧

オプションは以下のとおりです。

[root@server ~]# losetup -h

Usage:
 losetup [options] [<loopdev>]
 losetup [options] -f | <loopdev> <file>

オプション:
 -a, --all                     list all used devices
 -d, --detach <loopdev> [...]  detach one or more devices
 -D, --detach-all              detach all used devices
 -f, --find                    find first unused device
 -c, --set-capacity <loopdev>  resize device
 -j, --associated <file>       list all devices associated with <file>

 -l, --list                    list info about all or specified
 -o, --offset <num>            start at offset <num> into file
 -O, --output <cols>           specify columns to output for --list
     --sizelimit <num>         device limited to <num> bytes of the file
 -P, --partscan                create partitioned loop device
 -r, --read-only               setup read-only loop device
     --show                    print device name after setup (with -f)
 -v, --verbose                 verbose mode

 -h, --help     display this help and exit
 -V, --version  output version information and exit

Available --list columns:
         NAME  loop device name
    AUTOCLEAR  autoclear flag set
    BACK-FILE  device backing file
     BACK-INO  backing file inode number
 BACK-MAJ:MIN  backing file major:minor device number
      MAJ:MIN  loop device major:minor number
       OFFSET  offset from the beginning
     PARTSCAN  partscan flag set
           RO  read-only device
    SIZELIMIT  size limit of the file in bytes

For more details see losetup(8).

4 ループバックデバイスを作成する方法(-f)

ループバックデバイスを2つ作成します。

4.1 1つ目のループバックデバイス作成

まず、ループバックデバイスとして使用するファイルを作成します。ファイル名がdisk1.img、サイズが1Gのファイルを作成します。fallocateコマンドの使い方は、ファイルの作り方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# fallocate -l 1G disk1.img

作成したファイルを確認します。

[root@server ~]# ls -l disk1.img
-rw-r--r--. 1 root root 1073741824  2月 19 14:56 disk1.img

ファイル(disk1.img)をループバックデバイスに割り当てます。

[root@server ~]# losetup -f /root/disk1.img

ループバックデバイス一覧を確認します。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk1.img

4.2 2つ目のループバックデバイス作成

ループバックデバイスとして使用するファイルを作成します。ファイル名がdisk2.img、サイズが1Gのファイルを作成します。

[root@server ~]# fallocate -l 1G disk2.img

作成したファイルを確認します。

[root@server ~]# ls -l disk2.img
-rw-r--r--. 1 root root 1073741824  2月 19 15:01 disk2.img

ファイル(disk2.img)をループバックデバイスに割り当てます。

[root@server ~]# losetup -f /root/disk2.img

ループバックデバイス一覧を確認します。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk1.img
/dev/loop1         0      0         0  0 /root/disk2.img

5 ループバックデバイスを全て削除する方法(-D)

ループバックデバイス一覧を確認します。ループバックデバイスが2つ存在することがわかります。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk1.img
/dev/loop1         0      0         0  0 /root/disk2.img

ループバックデバイスを全て削除してみます。

[root@server ~]# losetup -D

ループバックデバイス一覧を確認します。ループバックデバイスが全て削除されたことがわかります。

[root@server ~]# losetup -l
[root@server ~]#

6 ループバックデバイスを削除する方法(-d)

ループバックデバイス一覧を確認します。ループバックデバイスが2つ存在することがわかります。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk1.img
/dev/loop1         0      0         0  0 /root/disk2.img

まず、/dev/loop0を削除してみます。

[root@server ~]# losetup -d /dev/loop0

ループバックデバイス一覧を確認します。/dev/loop0が削除され、/dev/loop1が残っていることがわかります。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop1         0      0         0  0 /root/disk2.img

次に、/dev/loop1を削除してみます。

[root@server ~]# losetup -d /dev/loop1

ループバックデバイス一覧を確認します。/dev/loop0、/dev/loop1ともに削除されたことがわかります。

[root@server ~]# losetup -l

9 特定のループバックデバイスの情報を表示する方法(-j)

ループバックデバイス一覧を確認します。ループバックデバイスが2つ存在することがわかります。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk1.img
/dev/loop1         0      0         0  0 /root/disk2.img

/dev/loop0の情報を表示してみます。

[root@server ~]# losetup -j /root/disk1.img
/dev/loop0: [2051]:42400594 (/root/disk1.img)

/dev/loop1の情報を表示してみます。

[root@server ~]# losetup -j /root/disk2.img
/dev/loop1: [2051]:42400596 (/root/disk2.img)

10 特定の情報を表示する方法(-O)

10.1 指定可能なオプション一覧

以下のオプションを指定することで、特定の情報だけを表示することができます。

Available --list columns:
         NAME  loop device name
    AUTOCLEAR  autoclear flag set
    BACK-FILE  device backing file
     BACK-INO  backing file inode number
 BACK-MAJ:MIN  backing file major:minor device number
      MAJ:MIN  loop device major:minor number
       OFFSET  offset from the beginning
     PARTSCAN  partscan flag set
           RO  read-only device
    SIZELIMIT  size limit of the file in bytes

10.2 inode番号を表示する方法(BACK-INO)

ループバックとして使用しているファイルのinode番号を表示してみます。それぞれ、42400594と42400596であることがわかります。

[root@server ~]# losetup -l -O NAME,BACK-INO
NAME       BACK-INO
/dev/loop0 42400594
/dev/loop1 42400596

次にlsコマンドでファイルのinode番号を確認してみます。disk1.imgのinode番号は42400594であることがわかります。

[root@server ~]# ls -li disk1.img
42400594 -rw-r--r--. 1 root root 1073741824  2月 19 14:56 disk1.img

disk2.imgのinode番号は42400596あることがわかります。

[root@server ~]# ls -li disk2.img
42400596 -rw-r--r--. 1 root root 1073741824  2月 19 15:01 disk2.img

10.3 メジャー番号、マイナー番号を表示する方法(MAJ:MIN)

ループバックデバイスのMAJOR、MINOR番号を表示してみます。

[root@server ~]# losetup -l -O NAME,MAJ:MIN
NAME       MAJ:MIN
/dev/loop0   7:0
/dev/loop1   7:1

lsコマンドでMAJOR、MINOR番号を確認してみます。/dev/loop0のMAJOR、MINOR番号は、それぞれ7, 0であることがわかります。

[root@server ~]# ls -l /dev/loop0
brw-rw----. 1 root disk 7, 0  2月 19 15:28 /dev/loop0

lsコマンドでMAJOR、MINOR番号を確認してみます。/dev/loop1のMAJOR、MINOR番号は、それぞれ7, 1であることがわかります。

[root@server ~]# ls -l /dev/loop1
brw-rw----. 1 root disk 7, 1  2月 19 15:28 /dev/loop1

11 ループバックデバイスのサイズを変更する方法(--set-capacity)

ループバックデバイス一覧を確認します。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk1.img

ループバックデバイスのサイズを確認します。1Gであることがわかります。

[root@server ~]# blockdev --getsize64 /dev/loop0
1073741824

ファイルサイズを2Gに変更します。

[root@server ~]# truncate -s 2147483648 disk1.img

ファイルのサイズを確認します。2Gに変更されたことがわかります。

[root@server ~]# ls -l disk1.img
-rw-r--r--. 1 root root 2147483648  2月 19 16:22 disk1.img

ループバックデバイスのサイズを確認します。1Gであることがわかります。

[root@server ~]# blockdev --getsize64 /dev/loop0
1073741824

ループバックデバイスのサイズを変更します。

[root@server ~]# losetup --set-capacity /dev/loop0

ループバックデバイスのサイズを確認します。2Gに変更されたことがわかります。

[root@server ~]# blockdev --getsize64 /dev/loop0
2147483648

ループバックデバイスファイルシステムを作成します。

[root@server ~]# mkfs.xfs /dev/loop0

ループバックデバイスをマウントします。

[root@server ~]# mount -t xfs /dev/loop0 /mnt0/

ファイルシステムのサイズを確認します。2Gに変更されたことがわかります。

[root@server ~]# df -hT /mnt0/
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/loop0     xfs      2.0G   33M  2.0G    2% /mnt0

12 オフセットを指定する方法(-o)

"-o"オプションを使うと、ファイルの指定したオフセットからループバックデバイスに割り当てることができます。

ファイルを確認します。1Gサイズのファイルであることがわかります。

[root@server ~]# ls -l disk1.img
-rw-r--r--. 1 root root 1073741824  2月 19 14:56 disk1.img

オフセットは以下のように指定します。

[root@server ~]# echo $((512*1024))
524288

ファイルのオフセット524288からをループバックデバイスに割り当てます。

[root@server ~]# losetup -o $((512*1024)) -f /root/disk1.img

オフセット524288からループバックデバイスに割り当てられていることがわかります。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0 524288         0  0 /root/disk1.img

13 ループバックデバイスをマウントする手順

ループバックデバイス一覧を確認します。ループバックデバイスが2つ存在することがわかります。

[root@server ~]# losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         0  0 /root/disk1.img
/dev/loop1         0      0         0  0 /root/disk2.img

各ループバックデバイスファイルシステムを作成します。

[root@server ~]# mkfs.xfs /dev/loop0
[root@server ~]# mkfs.btrfs /dev/loop1

マウントするディレクトリを作成します。

[root@server ~]# mkdir /mnt0
[root@server ~]# mkdir /mnt1

ループバックデバイスをマウントします。

[root@server ~]# mount -t xfs /dev/loop0 /mnt0/
[root@server ~]# mount -t btrfs /dev/loop1 /mnt1/

/mnt0にマウントしたデバイスの情報を確認します。xfsファイルシステムであることがわかります。

[root@server ~]# df -hT /mnt0/
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/loop0     xfs     1014M   33M  982M    4% /mnt0

/mnt1にマウントしたデバイスの情報を確認します。btrfsファイルシステムであることがわかります。

[root@server ~]# df -hT /mnt1/
ファイルシス   タイプ サイズ  使用  残り 使用% マウント位置
/dev/loop1     btrfs    1.0G   17M  905M    2% /mnt1

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ