如何获取未使用的 lsblk 设备

如何获取未使用的 lsblk 设备
root@pve-virt-01:~# lsblk
NAME               MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                  8:0    0   250G  0 disk
├─sda1               8:1    0  1007K  0 part
├─sda2               8:2    0   512M  0 part /boot/efi
└─sda3               8:3    0 249.5G  0 part
  ├─pve-swap       253:0    0     8G  0 lvm  [SWAP]
  ├─pve-root       253:1    0  62.3G  0 lvm  /
  ├─pve-data_tmeta 253:2    0   1.6G  0 lvm
  │ └─pve-data     253:4    0   160G  0 lvm
  └─pve-data_tdata 253:3    0   160G  0 lvm
    └─pve-data     253:4    0   160G  0 lvm
sdb                  8:16   0    32G  0 disk
sdc                  8:32   0    32G  0 disk
sdd                  8:48   0    32G  0 disk
sde                  8:64   0    32G  0 disk


我只想查看所有未用于 lvm/zfs/ext4 的设备。您是否知道如何实现这一目标?我想将它用于脚本,这样我就可以使用sgdisk所有未使用的磁盘,但这意味着我需要确保我不选择使用过的磁盘。

我想列出所有未使用的 blk 设备。

编辑:

输出应该是:

/dev/sdb
/dev/sdc
/dev/sdd
/dev/sde

答案1

看来您想打印本身及其子设备没有安装点的设备。

lsblk使用和的 JSON 输出jq

lsblk --tree -o PATH,MOUNTPOINT -J | jq -r '.blockdevices[]
    | del(select(.mountpoint!=null or .children[]?.mountpoint!=null))
    | .path // empty'

答案2

不知道你对自己的剧本还满意吗?这是一个sed解析纯输出的单行代码lsblk

lsblk | sed -E '/^[a-z]/{x;//s/ .*//p;x;};/^[a-z]|\/|]/h;$!d;x;/^[a-z]/!d;s/ .*//'

简短说明:它将以小写字母(设备)开头的行存储在保留空间中,但用带有/(mounted) 或](swap) 的行覆盖它们。如果它们没有被覆盖,则打印它们而不包含该行的尾随内容。

像这样的脚本编写起来比阅读起来容易,但是如果您有兴趣,我可以详细解释它。

答案3

我考虑过这一点,但我不确定在使用磁盘时是否始终设置磁盘标识符:

for i in $(lsblk -dnp|  awk '{print $1}')
do
    fdisk -l $i| grep 'Disk identifier:'
    if [ $? = '1' ]
    then
        sgdisk -Z $i
        sgdisk -o $i
    fi
done

答案4

在我的系统上:

$ lsblk | awk '$6 == "disk" {if (d) print "/dev/"d; d=$1} {if ($7) d=""} END {if (d) print "/dev/"d}'
/dev/sdv
/dev/sdai
/dev/sdbc

打印后面没有悬挂安装的任何“磁盘”。

相关内容