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
多くのオプションがあり、その1つは問題の出力などのツリーを--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