web-dev-qa-db-ja.com

ファイルシステムのUUIDを見つける方法

私はUbuntuを実行していて、特定のファイルシステム(パーティションではない)のUUIDを調べたいと思っています。 e2label /dev/sda1を使用してファイルシステムのラベルを検索しますが、UUIDを検索する同様の方法はないようです。

135
Brad Gilbert

使用可能で、このために非常にうまく機能する別のコマンドは「blkid」です。これは、e2fsprogsパッケージの一部です。それの使用例:

/ dev/sda1でデータを検索します。

topher@crucible:~$ Sudo blkid /dev/sda1
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"

すべてのパーティションのUUIDデータを表示します。

topher@crucible:~$ Sudo blkid
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"
/dev/sdb: UUID="467c4aa9-963d-4467-8cd0-d58caaacaff4" TYPE="ext3"

すべてのパーティションのUUIDデータを読みやすい形式で表示します(注:新しいリリースではblkid -Lは異なる意味を持ち、blkid -o listを代わりに使用してください)

topher@crucible:~$ Sudo blkid -L
device     fs_type label    mount point    UUID
-------------------------------------------------------------------------------
/dev/sda1 ext3             /              727cac18-044b-4504-87f1-a5aefa774bda
/dev/sdc  ext3             /home          467c4aa9-963d-4467-8cd0-d58caaacaff4

/ dev/sda1のUUIDのみを表示し、他には何も表示しません。

topher@crucible:~$ Sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda
169

GPTパーティションディスクのみ

GPTフォーマットのディスクでは、各パーティションにはGUIDが割り当てられています。GUIDはUUIDの形式ですが、おそらく元の投稿者が参照していたものとは異なります。したがって、この回答はおそらく元の質問者にとってあまり役に立ちません。それでも、注意すべき重要な違いがあると思います。

GPTでフォーマットされたディスク/ dev/sda上のパーティション1のGUID)と、そのパーティションラベルなどを取得するには:

Sudo sgdisk -i 1 /dev/sda

または以下のすべて:

ls -l /dev/disk/by-partuuid

ファイルシステムのルートが特定のパーティションにある状態で起動するには、次のLinuxカーネルパラメータ構文を使用します。

root=PARTUUID=87654321-4321-4321-abcd-123456789012

この場合、UUIDの先頭のみを指定できます。一意になるように指定します。このパラメータはより原始的であり、ブートプロセスの早い段階でカーネルによって理解できます。


これらの間には意味論の違いがあります:

ディスクはパーティションを保持し、パーティションはファイルシステムを保持し、ファイルシステムはディレクトリとファイルを保持します。一部のセットアップとオペレーティングシステムでは、より多くの層があります。

GUID UUIDおよび関連するラベルはパーティションを参照しますが、パーティションの内容は参照しません。同じディスク上の新しいパーティション、または新しいディスク上のパーティションには、新しいGUID UUID。同じパーティションは、あるファイルシステムと別の日に別のファイルシステムを保持できます。これは、GPTフォーマットのディスクにのみ存在し、レガシーパーティションディスクには存在しません。通常、ここでは、root=/dev/sda1またはroot=8:1を指定する以外にユーティリティはありません。 。

他の現在の回答は、いくつかの包含パーティション内のファイルシステムのUUIDを参照しています。ファイルシステムが全体として別のパーティションまたはハードディスクにコピーされた場合、その値は変わりません。このUUIDは、移動されたファイルシステムを見つけるのに役立ちます。したがって、これはおそらくほとんどの人にとってより適切です。 Linuxカーネルパラメータroot=UUID=87654321-4321-4321-a567-123456789012はこれを参照します。

root=LABEL=root=UUID=は初期のユーザースペースによって実装されていると思います。システムで先日見たinitコードは、これらのパラメーターを/ dev/disk/by-uuidと/ dev/disk/by-labelに変換しました(リンクは私のシステムのユーザースペースのudev)。

[1] http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/init/do_mounts.c#n18

11
John S Gruber

これを行うスクリプトクリーンな方法は、あらゆるタイプのファイルシステムで機能します。

lsblk -no UUID <device-containing-FS>

または、マウントポイント(またはその中の任意のファイル)を指定します。

lsblk -no UUID $(df -P <file> | awk 'END{print $1}')

出力はUUID、UUID全体、およびUUIDのみです。

8
Tom Hale

Ext2/ext3/ext4でこれを行う最も簡単な方法は、次のとおりです。

/sbin/tune2fs -l /dev/sda1
5
Eddie

これを行うための推奨方法は、

Sudo vol_id -u /dev/sda2

UUIDの使用の詳細については、 この記事 を参照してください(ubuntuヘルプから、UUIDを使用するすべてのLinuxディストリビューションで機能するはずです)。

この質問のコメントに記載されているように、vol_idがパスに含まれていない可能性があります。 ubuntuでは/ sbinにあるため、上記は機能します。 Fedoraの場合、

Sudo /lib/udev/vol_id -u /dev/sda2

他のディストリビューションのvol_idが他の場所にある場合は、コメントを投稿して、この回答に追加します。

3
Hamish Downer

これは私にとってはうまくいくようです:

Sudo dumpe2fs /dev/sda1 | grep UUID

Sda1のUUIDが必要だとすると、次のようなことを試すことができます。

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sda1 | cut -d\: -f2 | cut -d/ -f5 ; done

それに応じてsda1を調整します。すべてのパーティションのUUIDを取得するには、グラプとカットをドロップします。

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" ; done

デスクトップ上のsda1のサンプル出力:

[mihailim@home ~]$ for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sdb3 | cut -d\: -f2 | cut -d/ -f5 ; done
dc8c49f1-e2dc-46bc-ba02-013f26c85f70

編集:この解決策は、udev-> vol_idの解決策よりも工夫されていますが、ルート権限が必要ですnotは、2005年以降のカーネルで機能し、すべてのツールに依存していることに注意してくださいデフォルトで任意のユーザーのパスにあるLinuxディストリビューション。

2

これを使用して、すべてのUUIDを出力することもできます。

for disk in /dev/disk/by-uuid/*; do 
    basename "$(readlink "$disk")"
    basename "$disk"
    echo
done

またはこの間違いなくシンプルなコマンド、sda1検索対象のデバイス:

disk=sda1
find /dev/disk/by-uuid -type l -exec sh -c "readlink {} | grep -o $disk && basename {}" \;

すべてのUUIDを出力するための2番目の方法の適応:

find /dev/disk/by-uuid -type l -exec sh -c 'basename $(readlink {}); basename {}; echo' \;
1
kiri
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

上記は、長年にわたってほとんどの(私が見つけたすべての)Linuxシステムで機能するようです。それは欠陥があるかもしれません、私は知りません。シリアル番号を取得したいのですが、これはルートファイルシステムのUUIDです。

(私のように)rootである必要なくシリアル番号を取得する方法があり、UNIXの異なるバージョンで異なる「異常な」パッケージをインストールしない場合、私はそれを感謝します-常に何かを学ぶことができます。そして私は私が物事を混合していることを認識しています-これはルートファイルシステムのUUIDであり、ディスクではありません。

BTWの目的は、変更できないマシンごとに一意の番号を生成することです(ディスクのシリアル番号や、かつてのMACアドレスなど)。

ソフトウェアを単一のマシンにエンコードするために使用されます。 MACアドレスは、仮想アドレスが許可されるまでは問題ありませんでした。一部の不快な顧客は、MACアドレスを一定に(もちろん、異なるネットワーク上で)設定し、私への支払いを回避しています。

AIXでは、マシンを識別する1つの番号を取得する単一の呼び出しがあります。ハードウェアの変更やソフトウェアの更新が発生するかどうかは問題ではないので、どのように行われるのかわかりません...マザーボードが変更されると、数が変わるため、非表示になっていると思います。そしてそれはまれです。

1
Eric Eberhard

以下を使用して、特定のドライブのUUIDを取得できます。

Sudo vol_id -u /dev/sda1

または、これを使用して、接続されたメディアのすべてのUUIDをリストできます。

ls /dev/disk/by-uuid
0
Rich Adams