사용하지 않는 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/ .*//'

간단한 설명: 소문자(디바이스)로 시작하는 라인을 예약된 공간에 저장하지만 /(마운트됨) 또는 (스왑)이 있는 ]라인으로 덮어씁니다 . 덮어쓰지 않으면 줄의 뒤에 오는 내용 없이 인쇄합니다.

이와 같은 스크립트는 읽는 것보다 작성하기가 더 쉽지만, 관심이 있으시면 자세히 설명해 드릴 수 있습니다.

답변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

인쇄물 뒤에 걸려 있는 "디스크"가 없습니다.

관련 정보