kpartx -a xxx で追加したデバイスのソースイメージを探す

kpartx -a *.img でイメージファイルの各パーティションをアタッチした時に、デファイスファイルのどれがどれに対応しているか調べた。環境はUbuntu 20.04。

ためしに kpartx -a してみる。

### ディスクを作る
$ dd if=/dev/zero of=/tmp/test.img bs=1 count=0 seek=1G
### 適当にパーティションを作る
$ sgdisk -a1 -n1:34:2047 -t1:EF02 -n2:2048:+256M -t2:EF00 -n3:0:0:+100% -t3:8300 /tmp/test.img
$ sudo sgdisk -p /tmp/test.img
Disk /tmp/test.img: 2097152 sectors, 1024.0 MiB
Sector size (logical): 512 bytes
Disk identifier (GUID): BAC9F0D5-63A5-411B-9F48-E06CBB18E58B
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 2097118
Partitions will be aligned on 2-sector boundaries
Total free space is 0 sectors (0 bytes)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              34            2047   1007.0 KiB  EF02
   2            2048          526335   256.0 MiB   EF00
   3          526336         2097118   767.0 MiB   8300

$ sudo kpartx -av /tmp/test.img
add map loop0p1 (253:0): 0 2014 linear 7:0 34
add map loop0p2 (253:1): 0 524288 linear 7:0 2048
add map loop0p3 (253:2): 0 1570783 linear 7:0 526336

$ ll /dev/mapper/
total 0
drwxr-xr-x  2 root root     120 Jul 22 17:28 ./
drwxr-xr-x 16 root root    4200 Jul 22 17:28 ../
crw-------  1 root root 10, 236 Apr 23 14:53 control
lrwxrwxrwx  1 root root       7 Jul 22 17:28 loop0p1 -> ../dm-0
lrwxrwxrwx  1 root root       7 Jul 22 17:28 loop0p2 -> ../dm-1
lrwxrwxrwx  1 root root       7 Jul 22 17:28 loop0p3 -> ../dm-2

名前からし/dev/mapper/loop0p{1..3} の親は /dev/loop0 であると推測できるが、一応確認してみる。

kpartx で接続された各パーティションは、device mapper によってマップされている。マッピングの様子は、たとえば dmsetup ls --tree で表示できる。

$ sudo dmsetup ls --tree
loop0p3 (253:2)
 └─ (7:0)
loop0p2 (253:1)
 └─ (7:0)
loop0p1 (253:0)
 └─ (7:0)

253:x や 7:0 はデバイスナンバーといい、major:minor の組で表わされる。 dev 下にあるデバイスファイルを ls -l で表示すると、オーナー/グループと日付の間に major, minor の形で表示される。たとえば dmsetup ls --tree の結果の loop0p3 を見ると、loop0p3 (dm-2) 自体は 253:2 で、親は 7:0 であるという。これは下の ls -l の結果と照合できる。

$ ls -l /dev/loop* /dev/mapper/* /dev/dm-*
brw-rw---- 1 root disk 253,   0 Jul 22 17:28 /dev/dm-0
brw-rw---- 1 root disk 253,   1 Jul 22 17:28 /dev/dm-1
brw-rw---- 1 root disk 253,   2 Jul 22 17:28 /dev/dm-2
crw-rw---- 1 root disk  10, 237 Jul 22 06:10 /dev/loop-control
brw-rw---- 1 root disk   7,   0 Jul 22 17:28 /dev/loop0
brw-rw---- 1 root disk   7,   1 Jul 22 07:57 /dev/loop1
brw-rw---- 1 root disk   7,  10 Jul 20 15:34 /dev/loop10
brw-rw---- 1 root disk   7,  11 Jul 21 06:45 /dev/loop11
brw-rw---- 1 root disk   7,   2 Jul 22 07:57 /dev/loop2
brw-rw---- 1 root disk   7,   3 Jul 22 07:56 /dev/loop3
brw-rw---- 1 root disk   7,   4 May 17 16:33 /dev/loop4
brw-rw---- 1 root disk   7,   5 Jun 21 20:28 /dev/loop5
brw-rw---- 1 root disk   7,   6 May  6 09:28 /dev/loop6
brw-rw---- 1 root disk   7,   7 Jun 14 15:28 /dev/loop7
brw-rw---- 1 root disk   7,   8 Jun 29 23:38 /dev/loop8
brw-rw---- 1 root disk   7,   9 Jul 22 07:57 /dev/loop9
crw------- 1 root root  10, 236 Apr 23 14:53 /dev/mapper/control
lrwxrwxrwx 1 root root        7 Jul 22 17:28 /dev/mapper/loop0p1 -> ../dm-0
lrwxrwxrwx 1 root root        7 Jul 22 17:28 /dev/mapper/loop0p2 -> ../dm-1
lrwxrwxrwx 1 root root        7 Jul 22 17:28 /dev/mapper/loop0p3 -> ../dm-2

ループデバイスにアタッチされているものは、losetup --list コマンドで確認できる。

$ losetup --list /dev/loop0
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE     DIO LOG-SEC
/dev/loop0         0      0         0  0 /tmp/test.img   0     512

まとめると、今回の例では、 /tmp/test.img/dev/loop0 (7:0) にアタッチされており、その中のパーティション/dev/mapper/loop0p{1..3} にアタッチされている事がわかる。

kpartx -a でアタッチしたパーティションkpartx -d でデタッチできる

$ sudo kpartx -dv /tmp/test.img
del devmap : loop0p3
del devmap : loop0p2
del devmap : loop0p1
loop deleted : /dev/loop0

万が一、kpartx -a を何度もしたりアタッチしたファイルが何だったか忘れたなどの場合には、dmsetup, losetup を使って状況を確認、個別に削除できる。

補足

バイスのmajor番号は、/proc/device に一覧になっている。又、デバイス種ごとに番号は重複してもよいらしい。

$ egrep '^([A-C]| *[7] )' /proc/devices
Character devices:
  7 vcs
Block devices:
  7 loop

参考URL