如何轻松找出是否以某种方式安装了块设备(或其一部分)


10

我想知道最简单的方法是确定(没有root特权)是否安装了块设备(例如sdb)或它的任何部分(以及它的哪一部分)。

检查/proc/mountssdb是不够的,因为sdbLVM可能会使用它的一个分区或其中一个分区。您可以检查,/sys/block/sdb/sdb*/holders/但是会得到dm-x必须解析为/dev/mapper名称的条目才能进行检查/proc/mounts。可能,但是如果有一个更简单的解决方案...(它不需要root特权)


2
我很好奇,您是否只是在尝试确定设备是否已安装?* / holders和* / * / holders足以告诉您/ proc / mounts表中不存在该设备的安装状态。为什么需要进一步解决?即cryptsetup将其添加到所有者中,表明您不应该弄乱驱动器。.即使未安装/ dev / mapper,也可能导致加密损坏。它只是通过驱动程序在内部安装。同样也不要忘记检查/ sys / block / sdb / holders,因为驱动器可以“保持”在没有分区的情况下。
拉赫利

Answers:


12

从本质上讲,这是检查整个角箱的问题。

  • 驱动器可以出现在/ proc / mounts中
  • 一个驱动器可以用作交换(使用/ proc / swaps)
  • 驱动器可以是活动LVM PV的一部分(使用pvdisplay)
  • 驱动器可以是dm-mapper RAID组的一部分(使用/ proc / mdstat)
  • 应用程序可以直接访问驱动器(例如,Oracle支持直接写入驱动器或分区而不是文件系统)(使用保险丝)
  • 虚拟机可以直接访问驱动器(使用热熔器)
  • 可以由回送设备引用驱动器(例如:mount /dev/sda -o offset=1M /foo(使用lostup -a)

这些只是我花了一个半分钟思考的例子。我敢肯定还有十几个人。

我认为最后一个示例是最有趣的,很少有人知道。它允许您在不使用分区的情况下挂载文件系统。只要指定起始偏移量,Linux就会透明地创建一个回送设备。上面的示例产生以下内容:

# cat /proc/mounts
...
/dev/loop0 /foo ext4 relatime,data=ordered 0 0

# losetup -a
/dev/loop0 [0005]:2048 (/dev/sda), offset 1048576

为什么要这么做?通常,它涉及到以前曾经发生过严重错误的情况。

还请记住,借助mainline中的namepacing功能(请参阅unshare),不同的进程可以对已安装的内容和未安装的内容有不同的看法。在这里,事情开始变得有点红药了。


1

挂载设备的方式更多,所有这些都可以组合在一起,因此通常需要您自己找出来。

即lvm使用了什么: pvdisplay

因此,您还需要包括nfs,cif,raid,loop,crypt等。/proc/mounts正如您已经提到的,始终是一个好的起点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.