未使用の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純粋な出力を解析する1行の内容ですlsblk

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

簡単な説明:小文字(デバイス)で始まる行を予約済みスペースに保存しますが/(マウント済み)または(スワップ)のある]行で上書きします。上書きしない場合は、行の後に何も表示せずに印刷します。

このようなスクリプトは読むよりも書くのが簡単ですが、興味があれば詳細に説明します。

答え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

印刷物の後ろに掛かっている「ディスク」はありません。

関連情報