17 February 2012

(Linux) 重複したパーティションUUIDを変更する

パーティションをgpartedなどでコピーして複製すると、UUIDが重複したパーティションとなってしまう。UUIDをgrubの起動時に使ったり、fstabのデバイス名として使っていたり刷る場合、問題が起こる。

■ 全ディスクのUUIDを表示する


# blkid
/dev/sda1: LABEL=WINDOWS UUID=FCF847C4F8477C40 TYPE=ntfs
/dev/sda2: LABEL=DATA UUID=EA7CFEC57CFE8C17 TYPE=ntfs
/dev/sda3: UUID=b2a061de-6c0a-11e0-a070-000d5ec19938 TYPE=ext3
/dev/sdb1: UUID=b2a061de-6c0a-11e0-a070-000d5ec19938 SEC_TYPE=ext2 TYPE=ext3 LABEL=ubuntu-usb

■ UUIDが存在するクラスタを検索する

ディスクの先頭クラスタ(10クラスタ程度)を一時ファイルに書き出し、


# dd if=/dev/sdb1 of=./test.bin bs=512 count=10

UUIDの先頭1バイトが一致する所を検索する。
具体的には、odコマンドで UUID の1バイト目(ここでは B2)を検索し、存在するのを確認。


# od -x test.bin | grep b2
0000140 0000 0000 faff 9090 c2f6 7580 b202 ea80
0000160 7c74 0000 c031 d88e d08e 00bc fb20 64a0
0002140 0002 0000 0003 0000 a0b2 de61 0a6c e011
0012700 0000 0017 0001 0017 0002 0017 5b24 0a70

さらに、クラスタ一つずつを一時ファイルに書きだして検索して、何クラスタ目にUUIDが格納されているのか突き止める。

■ 一時ファイルに書き出して、UUIDを書き換える

前述の作業で 2クラスタ目にUUIDデータが格納されているのがわかったとする。 2クラスタ目をファイルに保存し


# dd if=/dev/sdb1 of=./test.bin bs=512 count=1 skip=2

bvi を使って編集する。UUIDデータがファイルのどこにあるのかは、コマンドモードで 「\\」 を入力して続けてバイナリ数値(今回は「B2」)とタイプして検索する。

UUIDはLSB形式でひっくり返って見えるので注意。

20120217-bvi-edit.jpg

コマンドモードで、編集可能に変更 :set memmove を行ってから、書き換えたい場所の上で R キーを押して1バイト書き換える。

その後、viエディタと同じく :wq でファイル保存

■ 一時ファイルをハードディスクに書き戻す

書き戻すときは、skip= ではなく seek= で特定のクラスタに書き込むことが出来る


# dd of=/dev/sdb1 if=./test.bin bs=512 count=1 seek=2

■ 書き換え後のUUIDを再確認


# blkid
/dev/sda1: LABEL=WINDOWS UUID=FCF847C4F8477C40 TYPE=ntfs
/dev/sda2: LABEL=DATA UUID=EA7CFEC57CFE8C17 TYPE=ntfs
/dev/sda3: UUID=b2a061de-6c0a-11e0-a070-000d5ec19938 TYPE=ext3
/dev/sdb1: UUID=b3a061de-6c0a-11e0-a070-000d5ec19938 SEC_TYPE=ext2 TYPE=ext3 LABEL=ubuntu-usb

ちゃんと変更されている。