在覆盖整个磁盘之前,我需要确认磁盘的任何部分都未安装。这里的问题是,似乎您必须先知道磁盘上所有文件系统的名称,然后才能单独检查它们,而这通常可能很困难。
举个例子,我正在写这篇文章的系统有一个 SSD,并将parted -l
该磁盘显示为/dev/nvme0n1
,大小为 500G。/dev/block
显示:
lrwxrwxrwx 1 root root 10 Nov 18 12:37 259:0 -> ../nvme0n1
lrwxrwxrwx 1 root root 12 Nov 18 12:37 259:1 -> ../nvme0n1p1
lrwxrwxrwx 1 root root 12 Nov 18 12:37 259:2 -> ../nvme0n1p2
次要编号 0 表示“整个磁盘”,而 1 表示启动分区,2 表示交换分区。此 SSD 设置为 LVM,但 LVM 设备的/dev/mapper
名称完全不同。
当您检查已挂载的文件系统( 、、、 )时,该词nvme0n1
不会出现在任何地方。该词确实会出现,但只是因为它是一个已挂载的启动分区()。通常,我正在查看的磁盘可能没有启动分区,因此搜索前缀可能没有用(即使我找到了具有正确前缀的单词,我是否能保证它在同一个驱动器上?)mount
findmnt nvme0n1
/proc/mounts
/etc/mtab
nvme0n1p1
/boot/efi
nvme0n1
是否有通用方法可以查明磁盘是否“正在使用”?在这种特殊情况下,我可以解析输出lsblk
以查找/dev/mapper
下的名称nvme0n1
,但这似乎不是一个好的长期解决方案。
是的,前缀实际上表明了它是哪个驱动器 -
nvme0n1
是 NVMe 设备 0 命名空间 1,并且所有nvme0n1p##
分区设备都以这种方式命名,因为它们位于这个特定的驱动器上。这还不错,因为 lsblk 有代码来确定分区的直接挂载,以及设备映射器关系 - 甚至 mdraid 关系,这是与设备映射器不同的东西。我认为如果不借助 lsblk 这样的工具,甚至不可能有一个真正通用的解决方案,这些工具知道如何从几个不同的地方收集这些信息。
不要解析其常规输出,而是运行
lsblk --json
并解析它,找到您的磁盘并.children
递归地深入到其属性,直到找到一个非空的磁盘.mountpoints
。但是,即使 lsblk 也不了解 Btrfs 多设备文件系统(仅显示其中一个设备下的挂载点),它对 ZFS 的了解就更少了。
检查
/etc/mtab
,这是内核生成的所有内容的列表man mtab
。阅读
man lsof
,特别是以然后做一些类似的事情
对于每个已安装的文件系统。
此外,为了以防万一,请检查
swapon
或cat /etc/swaps
另一个内核生成的文件。