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/ .*//'
간단한 설명: 소문자(디바이스)로 시작하는 라인을 예약된 공간에 저장하지만 /
(마운트됨) 또는 (스왑)이 있는 ]
라인으로 덮어씁니다 . 덮어쓰지 않으면 줄의 뒤에 오는 내용 없이 인쇄합니다.
이와 같은 스크립트는 읽는 것보다 작성하기가 더 쉽지만, 관심이 있으시면 자세히 설명해 드릴 수 있습니다.
답변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
인쇄물 뒤에 걸려 있는 "디스크"가 없습니다.