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


133

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


すべての答えをありがとう、私はそれらをすべて異なる状況で使用すると確信しています。
ブラッドギルバート

2
以前は「パーティションのUUIDを見つけるにはどうすればよいですか」というタイトルでした。この質問は、GPTパーティションテーブルを使用する場合にのみ意味があります。ここにその質問への答えがあります
アラステアアーバイン

回答:


164

使用できる可能性があり、これにも非常に有効な別のコマンドは「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

1
Ubuntuコンピューターでは、sudoを使用する必要はありません。
ブラッドギルバート

を入力するだけでblkid、私が望んでいたものが正確に得られましたが、私が求めていたものではありませんでした。(とにかくそれを受け入れます、私は頻繁にそれを使用すると確信しているので)
ブラッドギルバート

3
Ubuntuの新しいバージョンでは、同等のコマンドblkid -Lが現在使用されていblkid -o listます。-Lオプションは、に変更されました-L label指定されたラベルを使用するデバイスをルックアップします。
-aculich

@aculich答えを更新して、の最近の構文を含めましたblkid。言及してくれてありがとう。
クリストファーキャシェル

2
素晴らしい、私は知らなかったblkid。私はいつもやっls -l /dev/disk/by-uuidたばかりだ。Gentooではblkidsys-apps/util-linux
AdmiralNemo

10

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

GPT形式のディスクでは、各パーティションに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があります。同じパーティションには、ある日と別の日に1つのファイルシステムを保持できます。GPT形式のディスクにのみ存在し、レガシーパーティションディスクには存在しません。通常、ここにはroot=/dev/sda1またはを指定する以外にユーティリティはありませんroot=8:1

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

私は信じてroot=LABEL=おりroot=UUID=、初期のユーザースペースによって実装されています。先日システムで見た初期化コードは、これらのパラメーターを/ 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#n183


正しい使用法があるように思われる-i1-i 1とは反対に、-i:1sgdisk 1.0.1で、。
チャールズダフィー

@CharlesDuffyはそのエラーを見つけてくれてありがとう。答えを編集して修正しました。
ジョンSグルーバー

7

これを行うスクリプトクリーンな方法は、どのタイプのファイルシステムでも動作します:

lsblk -no UUID <device-containing-FS>

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

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

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


1
blkidルートになる必要はないので、@ christopher-cashellからの回答よりも優れています。マウントポイントまたはファイルのためのより良い行いますlsblk -no UUID $(findmnt -n -o SOURCE --target <file>)
marcz

btrfsのサブボリュームに失敗し@marcz:findmnt -n -o SOURCE --target ~与える:/dev/mapper/vg_svelte-home[/@home]
トム・ヘイル

右@ tom-hale、lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)存在する場合はサブボリュームを削除する必要があります。
marcz

5

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

/sbin/tune2fs -l /dev/sda1

3
これは、ファイルシステムがext2、ext3、またはext4としてフォーマットされていれば機能します。ほとんどのファイルシステムはこれらの1つですが、すべてではありません。スワップパーティションでも機能しません。普遍的な方法については私の答えをご覧ください。
ハミッシュダウナー

これにより、私のケースは次のようになりますCouldn't find valid filesystem superblock.
。Michel

3

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

sudo vol_id -u /dev/sda2

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

この質問へのコメントで述べたように、vol_idはパスに含まれていない場合があります。Ubuntuでは/ sbinにあるため、上記が機能します。フェドラの場合、必要なようです

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

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


これは私のFedora 10ラップトップでは動作しません。
エディ

これは私のものよりもはるかに優れたソリューションです。Eddie、vol_idは/ lib / udevにあります。ミッシュ、答えを編集してvol_idの前にフルパスを付けることができますか?/ lib / udevは、私が知っているどのディストリビューションでも、デフォルトではルートのパスにありません。
ミハイリンバザン2009年

「/ lib / udev / vol_id / dev / sda2」が機能しているようです。/ lib / udevをパスに含める人はほとんどいません。
エディ

私のUbuntuのコンピュータ上からシンボリックリンクが存在/sbin/vol_idする/lib/udev/vol_id
ブラッド・ギルバート

4
vol_idはKarmic(9.10)の時点でUbuntuから削除されたため、もはや有用でも関連性もありません。これは、とそこにこじつけの多くを経てvol_idを交換するために構築された一点にあったBLKIDを
アランオディア


2

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のソリューションよりも工夫されてますが、root権限を必要とせ、2005年以降のカーネルで動作し、デフォルトでLinuxディストリビューションに存在するツールに依存することに注意してください任意のユーザーのパス。


これは、最近十分なdevfsを実行しているコンピューターで動作します。
エディ

1

これを使用して、すべての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
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

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

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

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

ソフトウェアを単一のマシンにエンコードするために使用されます。仮想化を許可するまでMACアドレスは問題ありませんでした。

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


0

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

sudo vol_id -u /dev/sda1

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

ls /dev/disk/by-uuid

vol_idが削除されたため、Ubuntu 9.10からは適用されなくなりました。
アランオディア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.