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
印刷物の後ろに掛かっている「ディスク」はありません。