pvcreate错误 Can't open exclusively. Mounted filesystem

背景

曾经使用过/dev/vdb设备创建过lvm pv,但是因为一些异常操作,导致pv丢失,pvs无法查看到对应的pv。

使用pvcreate命令重新创建pv报错:

# pvcreate /dev/vdb
  Can't open /dev/vdb exclusively.  Mounted filesystem?
  Can't open /dev/vdb exclusively.  Mounted filesystem?

定位

pvs命令,没有/dev/vdb对应的pv。

# pvs
  PV         VG   Fmt  Attr PSize   PFree
  /dev/vda2  klas lvm2 a--  <49.00g    0

但pvcreate提示有已mount的文件系统,但我们使用lvs命令,也并没有对应的回显。

# lvs
  LV   VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root klas -wi-ao---- <46.00g                                                    
  swap klas -wi-a-----   3.00g

然而,lsblk命令却能找到一些端倪。

# lsblk 
NAME                                                    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda                                                     252:0    0  50G  0 disk 
├─vda1                                                  252:1    0   1G  0 part /boot
└─vda2                                                  252:2    0  49G  0 part 
  ├─klas-root                                           253:0    0  46G  0 lvm  /
  └─klas-swap                                           253:1    0   3G  0 lvm  
vdb                                                     252:16   0  50G  0 disk 
├─lvmvg-pvc--1d3164d2--0a6d--468c--b037--a3ff03c88679-real
│                                                       253:3    0   1G  0 lvm  
│ ├─lvmvg-pvc--1d3164d2--0a6d--468c--b037--a3ff03c88679 253:2    0   1G  0 lvm  
│ └─lvmvg-0de5f0c6--9010--4ed6--b87f--40bf91d9928f      253:5    0   1G  1 lvm  
├─lvmvg-0de5f0c6--9010--4ed6--b87f--40bf91d9928f-cow    253:4    0   1G  0 lvm  
│ └─lvmvg-0de5f0c6--9010--4ed6--b87f--40bf91d9928f      253:5    0   1G  1 lvm  

如上所示,在异常之前,曾经通过/dev/vdb的pv创建了名为lvmvg的vg,并在此vg上创建了一些lv卷。

再次使用mount命令查看对应的lv卷,却没有查看到挂载信息。

# mount | grep lvmvg

ps:如果这里有mount的,需要先尝试umount掉。

解决方法

因为/dev/vdb曾经是lvm pv,这次异常之后,曾经的lv信息可能还存在于device mapper表中,那么需要先删除device mapper表中对应的项。

查看是否有对应的项。

如下所示,使用dmsetup table命令可显示,lvmvg开始的就是残存的数据,和前面lsblk命令的输出可以对应起来。

# dmsetup table 
lvmvg-pvc--1d3164d2--0a6d--468c--b037--a3ff03c88679-real: 0 2097152 linear 252:16 2048
lvmvg-pvc--1d3164d2--0a6d--468c--b037--a3ff03c88679: 0 2097152 snapshot-origin 253:3
klas-swap: 0 6291456 linear 252:2 2048
klas-root: 0 96460800 linear 252:2 6293504
lvmvg-pvc--4c858851--1463--4426--a452--5c85b8a8ccef: 0 6291456 linear 252:16 6293504
lvmvg-0de5f0c6--9010--4ed6--b87f--40bf91d9928f: 0 2097152 snapshot 253:3 253:4 P 8
lvmvg-0de5f0c6--9010--4ed6--b87f--40bf91d9928f-cow: 0 2097152 linear 252:16 2099200

删除残存项

使用dmsetup remove命令删除残存项。如下所示,有些残存项可能有先后顺序,如果不能删除,就先删除其他的,最后再来删除之前删除失败的即可。

# dmsetup remove lvmvg-pvc--1d3164d2--0a6d--468c--b037--a3ff03c88679-real
device-mapper: remove ioctl on lvmvg-pvc--1d3164d2--0a6d--468c--b037--a3ff03c88679-real  failed: Device or resource busy
Complete cookie 0xd4dc12f success.
Command failed.
# dmsetup remove lvmvg-pvc--1d3164d2--0a6d--468c--b037--a3ff03c88679
# dmsetup remove lvmvg-pvc--4c858851--1463--4426--a452--5c85b8a8ccef
# dmsetup remove lvmvg-0de5f0c6--9010--4ed6--b87f--40bf91d9928f
# dmsetup remove lvmvg-0de5f0c6--9010--4ed6--b87f--40bf91d9928f-cow
# dmsetup remove lvmvg-pvc--1d3164d2--0a6d--468c--b037--a3ff03c88679-real

检查结果并验证

删除残存项之后,可使用lsblk命令来查看,一切都干净了。

# lsblk 
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda           252:0    0  50G  0 disk 
├─vda1        252:1    0   1G  0 part /boot
└─vda2        252:2    0  49G  0 part 
  ├─klas-root 253:0    0  46G  0 lvm  /
  └─klas-swap 253:1    0   3G  0 lvm  
vdb           252:16   0  50G  0 disk 

再次使用pvcreate命令,创建成功。

# pvcreate /dev/vdb
  Physical volume "/dev/vdb" successfully created.