在Linux中,如何确定哪些进程正在使用块设备?

我正在迁移到LVM卷组的服务器中有一个磁盘。 以前,它使用传统的DOS磁盘分区hdb[1-5]

我已经从hdb卸载了每个文件系统,使用hdbclosures交换,已经在设备上删除了一个较小的VG,然后用fdisk重新分区,删除了现有的分区,创build了2个分区,但是写出来后,linux拒绝重新读取分区表。 尝试使用hdparm -z报告: BLKRRPART failed: Device or resource busy.

我已经检查了以下的地方,以确保设备和它的分区arn't列在任何地方:

  • 的/ proc /掉期
  • 的/ proc / mdadm的
  • 从'pvs'命令输出
  • 从“挂载”命令输出
  • 在/ etc / mtab中
  • lsof | grep hdb

cat /proc/partitions仍然列出分区, hdparm -z /dev/hdb仍然给我设备繁忙。

有什么我失踪,或者我还不知道要find什么仍然保留在我的块设备的秘密地点? 更重要的是,我如何释放它的保留,所以我可以重新加载分区表?

FWIW,在这个特定的情况下,我可以简单地重新引导服务器而不用担心,但是这个困扰我之前,我很好奇,如果有更好的方法。

(编辑:添加更精确的措辞)(编辑:细节重新分区)

更新:我使用partprobe /dev/hdb ,它确实改变了一些事情:在/ dev / hdb1中,/ deb / hdb [3-5]现在不见了,partprobe报告Error: Error informing the kernel about modifications to partition /dev/hdb1 -- Device or resource busy. < – 具体关于hdb1。 hdb1以前是LVM Volume Group(VG)中的一个物理卷(Physical Volume,PV),在我重新分区之前,紧靠着vgremove + pvremoved em。

更新2:FWIW,我还没有纠正这个问题,幸运的是它不是紧急的。 我已经了解到partprobe正在使用一个更新的API调用,这就是为什么它似乎做了一些事情。 我还没有find一个简单而有效的方法,给定一个设备,它的主要/次要的数字,找出哪些资源(内核或用户空间)正在使用它。 有任何想法吗?

  • 在Linux中分区磁盘的最佳方法是什么? (RAID,分区或LVM)
  • LVM:重复的VG名称VolGroup00
  • DF报告文件系统不正确的可用空间(EXT4)
  • KVM上的CentOS Kickstart不能清除分区标签
  • 写入LVM2上的未分配空间
  • LVM精简configuration
  • 4 Solutions collect form web for “在Linux中,如何确定哪些进程正在使用块设备?”

    尝试使用热熔器

     fuser -vam /dev/hdb1 

    Eddy的fuser -vam /dev/hdb1例子基本上是正确的,但缺乏一些完整性。 在我的情况下,我遇到了类似的问题,同时从raid1arrays的最后一个驱动器恢复文件,其中保存数据的分区在LVM中。

    在这种情况下,我开始photorec检查驱动器,看到有一个卷组,然后closuresterminal运行photorec 。 我不知道, /dev/mapper/vg0-lv0仍然坚持/dev/mapper/vg0-lv0 。 所以,在未来,尝试使用fuser ,但在/dev/mapper/

    fuser -vam /dev/mapper/*

    这仍然可能不是最好的答案,但请记住尝试检查/ dev /下的任何文件,这些文件也可能以某种方式映射到您尝试使用的块设备。

    lsof是你正在寻找的命令。 你通常会想要将它用pipe道连接到grep。

    示例lsof | grep var lsof | grep var将列出所有打开文件的进程,其中path或文件名包含“var”

    什么是命令mount的输出。 不知道这是否适用于您的情况,但我知道我已经多次使用绑定安装 。 从绑定挂载卸载源文件系统不会卸载绑定挂载。 在这种情况下,mount的输出并不是非常有用,可以让你知道发生了什么。

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.