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
打印后面没有悬挂安装的任何“磁盘”。