我想捕获所有没有文件系统的磁盘(所有mkfs
不在其上运行的磁盘)
我尝试了以下操作,但仍然给出了操作系统( sda )。
lsblk
使用或其他命令捕获所有没有文件系统的磁盘的最佳方法是什么?
lsblk -f | egrep -v "xfs|ext3|ext4"
NAME FSTYPE LABEL UUID
MOUNTPOINT
fd0
sda
└─sda2 LVM2_member v0593a-KiKU-9emb-STbx-ByMz-S95k-jChr0m
├─vg00-lv_swap swap 1beb675f-0b4c-4225-8455-e876cafc5756
[SWAP]
sdg
sdh
sdi
sdj
sdk
sr0
答案1
lsblk -o NAME,FSTYPE -dsn
这将打印一个块设备列表,这些块设备本身不是分区的持有者(它们没有分区表)。检测到的文件系统类型位于第二列中。如果其为空,则表示没有可识别的文件系统。
因此,要通过一个命令获得您想要的输出
lsblk -o NAME,FSTYPE -dsn | awk '$2 == "" {print $1}'
答案2
在我看来,最好的选择是FDISK。句法:
fdisk -l | grep -i ^disk
答案3
答案4
下面的一句话似乎有效。它打印除具有 TYPE、PTTYPE、LABEL 或 PARTLABEL 的块设备名称之外的所有块设备名称。最后两个是因为带有标签的东西可能已经在使用中。
在我看来,这似乎是一种比使用grep -v
排除目前已知的文件系统类型列表更好的方法。
blkid | awk -F': ' '!/ ((PT)?TYPE|(PART)?LABEL)="[^"]+"/ {print $1}'
注:由此产生的块设备列表为不是以任何方式保证不被使用,只是它们没有正在使用的块设备所具有的任何常用标记。他们是大概没有使用,但如果不花更多时间研究这个问题,我什至不愿意建议它是任何类型的有保证的列表。
在我的一台 ZFS On Linux 机器上,它会生成以下输出:
# blkid | awk -F': ' '!/ ((PT)?TYPE|(PART)?LABEL)="[^"]*"/ {print $1}'
/dev/sdb9
这对于该系统来说是正确的。 /dev/sdb9是未格式化、未使用的分区。它是磁盘末尾的一个 8MB 分区,用于单磁盘 ZFS 池(这是一台用于测试东西的家用机器,我需要它的镜像驱动器来做其他事情,但还没有时间更换它)
顺便说一句,blkid
运行时间比lsblk
.它做了一个很多需要做更多的工作来尝试识别它正在查看的块设备类型。
这可能仅在具有数百个驱动器/lvm 成员/zvol 和其他块设备的服务器上才会明显。
例如,在我的一台中型服务器上(有362个各种块设备),blkid
运行时间大约为2分钟,而lsblk
大约需要0.09秒。在另一个更小的系统上,只有 39 个块设备(上面提到的家庭测试盒),blkid
需要 0.16 秒,而lsblk
需要 0.01 秒。
如果您需要重复运行此命令并且运行时间太长,您始终可以将blkdid
输出暂时缓存在 tmpfile 中。例如,如果缓存不存在或早于 30 分钟,则生成缓存文件 ( blkid > /path/to/blkid.cache
) 并将其用作输入awk
或其他内容。