web-dev-qa-db-ja.com

スクリプトから/ファイルシステムのUUIDを取得します

/ファイルシステムを含むボリュームのUUIDを取得するにはどうすればよいですか?私が今までに見つけた最高のものはblkid -o listです。しかし、この出力は人間が読めるものであり、解析が困難です。おそらくもっと良い方法がありますか?

システム固有のテンプレートを使用して構成管理をパラメーター化するために必要です。

将来の私の質問の結果を再利用する可能性のある人のためのblkid gotchaに関する注意:blkidは、/etc/blkid.tabでの以前の実行結果をキャッシュします。つまり、blkidまた、root実行後にblkidを非rootユーザーとして実行すると、古い(誤った可能性のある)データが返されます。

11
Dmitriusan

findmnt を使用します。

$ findmnt /        
TARGET SOURCE       FSTYPE OPTIONS
/      /dev/md127p1 ext4   rw,relatime,stripe=256,data=ordered
$ findmnt / -o UUID
UUID
046a554b-d9f5-4b23-82e6-ffaeb98284aa
$ findmnt / -o UUID -n
046a554b-d9f5-4b23-82e6-ffaeb98284aa

また、情報の検索方法と表示方法(JSON出力を含む!)を制御するいくつかのオプションもあります。これはmountパッケージの一部であるため、すべてのUbuntuインストールで使用できます。

24
muru

別の解決策:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -nはヘッダーを抑制します(実際には必要ありませんが、解析の方が安全です)
  • -rは生の出力を作成します(解析をより安全にします)
  • -o UUID,MOUNTPOINT必要な情報のみを含める
11
pLumo

lsblkコマンドを使用してUUIDを出力できますが、パーティションのデバイス名(/ dev/sda2など)が必要です。これを取得するには、dfコマンドを使用し、出力をトリミングします。コマンド置換を使用して、lsblkにデバイス名を付けます。 UUIDにアクセスするにはSudoが必要ですが、通常のlsblkの出力では必要ありません。

Sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
5
Arronical

mountpointの値を、問題のファイルシステムの現在のマウントポイントに調整します。

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
Sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
4
David Foerster

私が思いついた最高のソリューションは

blkid -o list | awk '/\/[[:space:]]+/{ print $0 }' | tr -s ' ' | cut -d ' ' -f 4

最適ではないように感じますが、動作します。

注: [[:space:]]は、 Space

4
Dmitriusan

14.04および16.04で動作することがテスト済み

ルート/のUUIDを常に生成する必要がある単純な1ライナーは

export DRIVE = $(mount | grep '/' | "'{print $ 1}'のawk -F"); blkid $ DRIVE | cut -d '"' -f2`

ここで行っているのは、マウントの出力をgrepして、ルートシンボルと両側のスペースを一致させる/で、/がパス拡張シンボルとして使用され、awkを介してフィールドとしてデバイス名のみを出力し、環境変数$ DRIVEにTHATを割り当てるための区切り記号。その後、フィールド区切り記号としてblkid $DRIVEを使用してパイプスルーカット"の出力を使用し、他のすべてを削除する2番目のフィールドのみを選択し、 UUID。

上記のコマンドでgrepの後に属するものは実際には 'space/space表示される「/」ではなく「」。

これにはSudoを必要としないという利点があり、ドライブのマウント方法に関係なく適切な結果を返します。

このアプローチを試みる前に、$ DRIVE環境変数を他のものに使用していないことを確認するのが賢明でしょう。変数を使用していない場合、echo $DRIVEは空白行を返します。

1
Elder Geek

私が使用するものは次のとおりです。

Sudo tune2fs -l $(df  / | tail -1 |awk '{print $1}') |grep UUID|awk '{ print $3 }'

tune2fsはe2fsprogsパッケージに含まれていますが、デフォルトでインストールされているかどうかは思い出せません。

Sudo apt install e2fsprogs

インストールされていない場合。

1
John