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


11

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

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

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


私のシステムでは、人間が読めるユニークなラベルをすべてのパーティションに割り当てています。その後、ラベルを使用してそれらについてのほとんどすべてを見つけることができます/dev/disk/by-label...これは、マウントされていないパーティションでも機能します。これには、rootからroot-bakへのrsyncのようなことを行うスクリプトを作成できるという利点があります。
ジョー

回答:


25

使用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インストールで使用できます。


これは16.04でうまく機能します。14.04で機能しませんでした。信頼性に関して望ましい結果を得るには、このアプローチを使用する必要がありました。
オタク長老

11

別の解決策:

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

5

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

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

2
これは、sudo16.04でなくても動作します。
エリアケイガン

あなた(またはスクリプト)が以前にこのコマンドをrootとして実行したことがある場合のみ。また、ouputを、この場合には(キャッシュから)古くなってもよい
Dmitriusan

@Dmitriusanこれを14.04システムで実行しましたが、これはrootによって実行lsblkまたはblkid実行されたことはなく、完全に機能しました。Rovoが投稿したバージョンではなく、このコマンドでキャッシュの問題が発生する理由を知っていますか?生の出力は何らかの方法でキャッシュを回避しますか?
アーロニカル

デバイスのUUIDにアクセスするコマンドには、ルートアクセス(Rovoが投稿したバージョンを含む)が必要だと思います。lsblkに関しては、ここに関連する質問unix.stackexchange.com/questions/210889/…(最初の回答を参照)
ドミトリウス

sudoが必要であることに同意しますが、lsblkがキャッシングに依存していることを示唆するものは見つかりません。blkidrootで実行しても、でキャッシュファイルを作成しても/dev/.blkid.tab、の非sudo使用でlsblkはUUID列から何も表示されません。古い出力のリスクはないと思います。
アロニカル

4

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

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

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

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


これは私のために動作しますが、sudo
pa4080

4

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

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

1

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

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

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

sudo apt install e2fsprogs

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


私が手awk: not an option: -eに私はそれを機能させるためにあなたの答えを編集しました。踏み越えた場合は、気軽にロールバックしてください。乾杯!:-)
オタク長老

奇妙なことに、それは-eの有無にかかわらず動作するようです。-eは、awkのマニュアルページに記載されています。私はいつもスクリプトでそれを使ってきましたが、それがなくてもうまく機能したことに驚きました:) -eは古いUNIXの習慣だと思います。しかし、私は使用法に一貫性を持たせ、人々を混乱させないように両方の場所またはどちらの場所でも-eを使用する必要がありました。
ジョン

ああ、を使用する14.04の下であなたと同じ結果が得られますgawk。16.04で指定されているエラーが表示されますが、mawk代わりに使用するようです。
オタク長老

これは、/ etc / alternativesの1つです。/ etc / alternatives / awk-> 16.04での/ usr / bin / gawk Mawkはインストールされていますが、/ etc / alternativesでアクティブではありません。17.04のgnomeでは、awkを指します。フレッシュインストール17.10では、mawkです。gawkをインストールした後、リンクはgawkを指し、gawkをアンインストールすると、mawkに戻ります。
ジョン

:-)それはおそらく「より少ない」のような声明につながったと思われる同様のプログラム間のこれらの小さな違いです
長老ギーク

1

14.04および16.04で動作するようにテスト済み

ルートのUUIDを常に生成する必要がある単純なワンライナーは次のとおり/です。

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

ここで行っているのは、mountの出力をgrepしてルートシンボルを両側のスペースと/一致/させ、パス拡張シンボルとして使用する場合に一致を回避するawkことです。デバイス名を指定し、THATを環境変数$ DRIVEに割り当ててから、フィールドセパレータとしてblkid $DRIVEを使用してパイプスルーカットの出力を使用し"、UUIDのみを残して他のすべてを削除する2番目のフィールドのみを選択します。

上記のコマンドでgrepの後に属するのは、実際には ' space/ space'であり、表示される' / 'ではないことに注意してください

これには、sudoドライブがどのようにマウントされているかに関係なく、適切な結果が必要ないという利点があります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.