【2025年02月版】消せないように見えるブロックデバイスを触るの時メモ【lsblk, dmsetup, wipefs, blkdiscard】

# はじめに

cephのOSDで使っていたNVMeを再利用するために別のマシンかに装着したら、Resouce Busyで使えないんですけど。。。といった時のメモ

# 結論

`dmsetup remove` で削除する。

# 経緯

別のマシンで、cephのOSDとして使っていたNVMeを再利用するために、別のマシンに入れてみました。
ext4でフォーマットしようと、ブロクデバイスを確認するとこんな感じでした。

```terminal
# lsblk
 :
 :
nvme0n1                                                                                                                              
├─ceph--8b4f670a--c112--4dcd--88d6--aecd12ae4dd6-osd--block--69119991--567f--453f--b8ae--5283eb1ef0f5
 :
 :
```

いつもはパーティションの情報などを吹き飛ばしてフォーマットするので `dd` コマンドを実行しました。

```
# dd if=/dev/zero of=/dev/nvme0n1 bs=1M count=10 status=progress
```

さて、どうなったか確認。

```terminal
# lsblk
 :
 :
nvme0n1                                                                                                                              
├─ceph--8b4f670a--c112--4dcd--88d6--aecd12ae4dd6-osd--block--69119991--567f--453f--b8ae--5283eb1ef0f5
 :
 :
```

あるぅぇ？

:::note info

後ろから10M消してもよかったのかもしれないです。

```
dd if=/dev/zero of=/dev/nvme0n1 bs=512 seek=$(( $(blockdev --getsz /dev/nvme0n1) - 10240 )) count=10240
```
:::

```terminal
# umount /dev/nvme0n1
Device or resource busy
# wipefs --all /dev/nvme0n1
# dd if=/dev/zero of=/dev/nvme0n1 bs=1M count=10 status=progress
# blkdiscard /dev/nvme0n1
Device or resource busy
```

wipefs、blkdiscard、dd でも消せない。。。

```terminal
# lsblk
 :
 :
nvme0n1                                                                                                                              
├─ceph--8b4f670a--c112--4dcd--88d6--aecd12ae4dd6-osd--block--69119991--567f--453f--b8ae--5283eb1ef0f5
 :
 :
```

なにかつかんでいるのかな？

```terminal
# lsof | grep /dev/nvme0n1
# fuser -v /dev/nvme0n1
```

ないなぁ。。。

なので、デバイスマップをいじることに

```
# dmsetup ls
ceph--8b4f670a--c112--4dcd--88d6--aecd12ae4dd6-osd--block--69119991--567f--453f--b8ae--5283eb1ef0f5     (252:2)
pve-data        (252:5)
pve-data_tdata  (252:4)
pve-data_tmeta  (252:3)
pve-root        (252:1)
pve-swap        (252:0)
```

`dmsetup ls` の結果から、nvme0n1 に関連するデバイスマッパー（LVM）として存在しており、これが busy の原因と予想。

```terminal
# dmsetup remove ceph--8b4f670a--c112--4dcd--88d6--aecd12ae4dd6-osd--block--69119991--567f--453f--b8ae--5283eb1ef0f5
# dmsetup ls
pve-data        (252:5)
pve-data_tdata  (252:4)
pve-data_tmeta  (252:3)
pve-root        (252:1)
pve-swap        (252:0)
```

消えたので、いつもどおりに

```terminal
# dd if=/dev/zero of=/dev/nvme0n1 bs=1M count=10 status=progress
# makefs.ext4 /dev/nvmee0n1
```

# その他

## dmsetup コマンドとは
dmsetup は、Linux カーネルの機能である Device Mapper を操作・管理するためのコマンドラインツール。
Device Mapper は、物理ストレージデバイスを抽象化して柔軟なブロックデバイスを作成・管理するためのレイヤ。
LVM (Logical Volume Manager) や暗号化ディスク (dm-crypt) などの基盤として広く利用されている。

### Device Mapper の管理・操作
dmsetup は、Device Mapper が扱う “マッピングテーブル” の確認や編集、新規デバイスの作成・削除などを行うためのコマンド。
必要に応じてカーネルの Device Mapper に情報を登録・更新し、仮想デバイスを制御する。

### よく使うサブコマンド・オプション

#### dmsetup ls
登録されているデバイス (マッパーデバイス) の一覧を表示する。LVM で作成された論理ボリュームなどが表示される。

#### dmsetup info
指定したデバイス (例: /dev/mapper/...) の詳細情報を表示する。

#### dmsetup table
指定したデバイスのマッピングテーブルを表示する。どの物理デバイスとどのように紐づいているのか確認できる。
    
#### dmsetup create / remove
新規の Device Mapper デバイスの作成や、不要になったデバイスの削除を行う。create の場合はマッピングテーブルを引数などで与える必要がある。

#### dmsetup reload
既存のデバイスに対してマッピングテーブルを再読み込みさせ、再設定を反映させることができる。

## Device Mapper とは

### 抽象化レイヤ
Device Mapper は、物理デバイス (例: /dev/sda, /dev/nvme0n1) を論理的にまとめたり分割したりし、仮想的なブロックデバイスを作成するための抽象化レイヤ。

### 様々な機能への応用
LVM (Volume Group や Logical Volume の作成・管理)、RAID、スナップショット、暗号化 (dm-crypt、LUKS)、Thin Provisioning (薄合せ) など、多くのストレージ機能が Device Mapper の上に構築されている。

### テーブルによる管理
Device Mapper はテーブル (mapping table) という概念を用い、物理デバイスと論理デバイスとの対応関係を定義する。どのようにマッピングするかの情報をカーネルに設定することで、様々なバリエーションの仮想デバイスを作成できる。

# さいごに

かんたんでしたね