Bash 스크립트에는 운영 체제 관련 디스크(Linux/RHEL 시스템 실행)만 캡처해야 하는 코드 위치가 많이 있습니다.
우리는 Linux 버전을 사용하며 7.2/7.5/7.6/7.9
대부분의 경우 머신에는 테라바이트 크기 디스크 등을 포함하는 데이터 또는 데이터베이스 서버를 저장하기 위한 추가 디스크가 있습니다.
일반적으로 우리는 다음 cli를 사용하여 운영 체제 디스크를 캡처합니다.
os_disk=` lsblk -l | grep part | awk '{print $1}' | sed s'/[0-9]/ /g' | sort -u | head -1 `
추가 파티션 디스크가 없을 때 작동하지만 다음 예와 같이 추가 파티션 디스크가 있을 때 작동합니다.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 1.8T 0 disk /data/sdb
sdb 8:16 0 1.8T 0 disk /data/sdc
sdc 8:32 0 1.8T 0 disk /data/sdd
sdd 8:48 0 1.8T 0 disk /data/sde
sde 8:64 0 1.8T 0 disk
├─sde1 8:65 0 931.3G 0 part
└─sde2 8:66 0 931.7G 0 part
sdf 8:80 0 1.8T 0 disk /data/sdg
sdg 8:96 0 1.8T 0 disk /data/sdh
sdh 8:112 0 1.8T 0 disk /data/sdi
sdi 8:128 0 1.8T 0 disk /data/sdj
sdj 8:144 0 1.8T 0 disk /data/sdk
sdk 8:160 0 1.8T 0 disk /data/sdl
sdl 8:176 0 1.8T 0 disk /data/sdm
sdm 8:192 0 1.8T 0 disk /data/sdn
sdn 8:208 0 1.8T 0 disk /data/sdo
sdo 8:224 0 557.9G 0 disk
├─sdo1 8:225 0 500M 0 part /boot
└─sdo2 8:226 0 557.4G 0 part
├─VGPO-lvm_root 253:0 0 100G 0 lvm /
├─VGPO-lvm_swap 253:1 0 16G 0 lvm [SWAP]
└─VGPO-lvm_var 253:2 0 100G 0 lvm /var
그러면 우리는 잘못된 결과를 얻게 될 것입니다. OS 디스크는 다음과 같은 결과를 sde
얻어야 합니다.sdo
os_disk=` lsblk -l | grep part | awk '{print $1}' | sed s'/[0-9]/ /g' | sort -u | head -1 `
echo $os_disk
sde
따라서 이 경우 머신이 가상 머신일 수도 있고 물리적 머신일 수도 있는 경우 운영 체제 디스크를 제공하는 다른 방법을 찾아야 합니다.
답변1
시스템 마운트 지점에 마운트된 파티션이 포함된 디스크를 찾을 수 있습니다.예를 들어 /boot
:
lsblk -ls | awk '$NF == "/boot" { m = 1; next } m && $NF == "disk" { print $1 ; exit}'
이는 다음에도 적용됩니다 /
.
lsblk -ls | awk '$NF == "/" { m = 1; next } m && $NF == "disk" { print $1 ; exit}'
이는 lsblk
목록 모드( -l
)를 사용하여 구문 분석을 단순화하고 트리( -s
)를 반전시켜 우리가 찾고 있는 파티션 뒤에 상위 디스크가 나타나도록 합니다.
답변2
findmnt
주문이 있으신가요 ? 나는 findmnt
스크립트에서 루트 파일 시스템의 장치를 가져오곤 했습니다 .
findmnt -ensP -M /
/etc/fstab
테스트 머신에서 검색 및 생성:
TARGET="/" SOURCE="/dev/nvme0n1p1" FSTYPE="ext4" OPTIONS="rw,discard,errors=remount-ro,x-systemd.growfs"
이는 "목록" 형식의 기본 출력 필드입니다. 내 스크립트는 사용자 정의 출력 필드 세트를 정의하고 인쇄 순서도 설정합니다.
findmnt -ensP -o SOURCE,TARGET,FSTYPE,SIZE,UUID,LABEL -M /
생산:
SOURCE="/dev/nvme0n1p1" TARGET="/" FSTYPE="ext4" SIZE="39.2G" UUID="1ca031f6-4004-4f8d-a861-532a0158c91f" LABEL=""
findmnt
많은 옵션이 있으며 그 중 하나는 문제 출력과 같은 트리를 --tree
생성하는 것 입니다.lsblk
위에서 사용한 옵션은 다음과 같습니다.
-e
- 특정 필드의 값을 "평가"하여 장치로 변환합니다. ( -e
SOURCE 필드 제외 SOURCE="UUID=1ca031f6-4004-4f8d-a861-532a0158c91f"
)
-n
- 출력에 헤더 라인 없음
-s
- /etc/fstab 읽기(또는 -m
/etc/mtab 읽기)
-P
- "Pair" 형식으로 출력 FIELD="VALUE"
(셸 스크립트에서 구문 분석하기가 더 쉽다고 생각함)
-M
- 출력을 다음으로 제한 이 마운트 지점에 마운트된 파일 시스템
많은 유연성을 제공하는 다른 옵션도 많이 있습니다. 예를 들어 -t ext4
검색을 ext4
파일 시스템으로 제한합니다.
마지막 참고 사항: findmnt
마운트된 파일 시스템에 대한 정보( 를 통해 /etc/mtab
) 또는 /etc/fstab
목록에 나열된 파일 시스템에 대한 정보(마운트 또는 마운트되지 않음)를 찾으십시오. 설치되지 않았거나 존재하지 않는 것을 찾을 수 없습니다 . 이를 위해서는 이전 버전이 /etc/fstab
필요 하거나 필요할 수 있습니다 .lsblk
blkid