web-dev-qa-db-ja.com

Mac OS XのボリュームのUUIDをSPECIFIED値に変更するにはどうすればよいですか?

これは、ここで尋ねられる質問に似ています。

Mac OS X 10.6でボリュームのUUIDを変更するにはどうすればよいですか?

唯一の違いは、ランダムな値ではなく、特定の値に変更したいということです。 hfs.utilはランダムにしか実行しないようです。

hfs.util source を変更して、値を指定できるようにすることを検討しました。変更を開始する場所を探してコードをざっと見ていたとき、Cが私のお気に入りの言語ではない理由を思い出しました。後でいくつかのコンパイルエラーとセグメンテーション違反が発生し、このツールを変更しようとする熱意を失いました。少し休んだ後、もう一度試してみるつもりですが、ボリュームのUUIDを変更するためのもっと簡単な方法が必要だと思います。

それで、私がもう時間を無駄にする前に、誰かがこれを行う簡単な方法を知っていますか?または、Cの専門家はhfsを作る私の努力に参加したいと思いますか? utilはUUIDを指定された値に変更しますか?

ソースOSX10.6.8からツールをコンパイルできるようにするために行った変更は次のとおりです。

hfsutil_jnl.c:

47: #include <hfs_fsctl.h>

hfsutil_main.c:

80: #include <uuid/uuid.h>
81: /* REMOVED */

そして、 この記事 で示唆されているように、 fs.cの166行目 からhfsutil_main.cに以下を追加しました(namespace.hはシステムのどこにも存在しないため):

static unsigned char kFSUUIDNamespaceSHA1[] = {0xB3,0xE2,0x0F,0x39,0xF2,0x92,0x11,0xD6,0x97,0xA4,0x00,0x30,0x65,0x43,0xEC,0xAC};

最後に、このファイルを取得して作業ディレクトリに追加しました http://www.opensource.Apple.com/source/xnu/xnu-1456.1.26/bsd/hfs/hfs_fsctl.h

6
bowmasters

私はhfs.utilのソースコードを調べたことがなく、おそらく手遅れであなたに役立つことはできませんが、私は何か役に立つものを提供できると思います。

HFS +ボリュームに使用されるUUIDは、UUID仕様でカバーされているすべてのバリアントであり、バージョン3タイプ、つまり名前空間と名前がMD5を介してUUIDに変換されているようです( ウィキペディアの詳細 を参照)。 =)。

実際のディスク識別子(仕様の名前の代わりになります)はわずか64ビットであり、名前空間Apple =はボリューム識別子に使用し、MD5ハッシュを適用しています。

これには、コンピューターコンポーネントの値、現在の時刻などは含まれません。これらは、他の種類のUUIDに使用されます。ただし、「名前空間」UUID(ディスクボリュームに「名前を付ける」という事実を識別するため)と「名前」(ディスクの実際の識別子)が含まれます。

私がそう思う理由の1つは、コードが64ビットしか使用していないように見えるという@chrivのステートメントだけでなく、SuperDuperに付属する「シークレット」ユーティリティによるUUIDの処理方法もあります。

SuperDuper! Mac OS Xのバックアップユーティリティには、ボリュームUUIDを取得して設定できる「非表示」コマンドラインツールがあります。ただし、64ビットのシーケンス(16進数で表される)として取得および設定します。そして、それらのビットは、Appleディスクユーティリティによって報告された実際の値とはかなり異なるようです。

詳細については、以下を参照してください。

http://www.shirt-pocket.com/forums/archive/index.php/t-1186.html

http://www.shirt-pocket.com/forums/archive/index.php/t-6173.html

注:再起動が必要になる場合など、いくつかの落とし穴があるように思われるので、これらのサポートに関するディスカッションを最後まで読んでください。


更新

Appleソース。上記で書いたことを確認します。ディスクに保存されるのは、ボリュームの64ビット識別子です(SHA1ハッシュの最初の64ビットを取得することでランダムに生成されます)。データの疑似ランダムビットのセット:稼働時間、起動時間、ホストID、ホスト名、カーネルリリース文字列、カーネルバージョン文字列、負荷平均、VM統計および現在の時間)。

バージョン3のUUID用語では、これは「名前」です。したがって、ディスクに保存されるのは、UUIDではなく、ボリュームの64ビットの「名前」です。

ツールによって報告される128ビットUUIDは保存されませんnot、表示目的で、「名前」と「名前空間」から毎回計算されます"(名前空間は固定されており、それを含むヘッダーが欠落しているため、OPがソースに手動で追加する必要があったkFSUUIDNamespaceSHA1定数です。これは、実際に保存される64ビットのものであるボリューム「名前」の「名前空間」を表します。それらを識別するためのボリューム)。

「名前」からUUIDに移動するのは簡単です(基本的にバージョン3 UUIDの標準アルゴリズムを適用します)が、UUIDから「名前」に戻ることは基本的に不可能です。言い換えると、OPに対する答えは次のとおりです。ボリュームの「名前」がわかっている場合(たとえば、バックアップを新しいディスクに復元する必要があり、その名前とデータを保存している場合)。 、ただし、UUIDしか知らない場合はそうではありません。名前を正しく設定すると期待されるUUIDになりますが、名前が必要であり、UUIDから計算することはできません。


Appleのコードに関する注記(これらを読んでコードを見るとすべてが明らかになります):

私が書いたように、ディスク上にあるのは「名前」だけです。 UUIDは、バージョン3アルゴリズム(「名前空間」内の「名前」のUUID)を使用して、視覚化のためにのみ計算されます。

  • kFSUUIDNamespaceSHA1は、上で説明したように、「名前空間」定数です。
  • uuid_create_md5_from_nameは、「名前空間」と「名前」を指定してバージョン3のUUIDを計算するバージョン3のUUIDアルゴリズムです。
  • GenerateVolumeUUIDは、新しいランダムな「名前」を生成します(注:関数の名前にもかかわらず、UUIDではなく「名前」のみ)。

「名前」の設定とディスクへの取得は、ボリュームが現在マウントされているかどうかによって異なります。 「名前」はボリュームの「ファインダー情報」に保存されます。マウントされたボリュームの「FinderInfo」データの取得と設定は、getattrlistおよびsetattrlistを使用して実行できますが、ボリュームがそうでない場合マウントされている場合は、ボリュームデータに直接アクセスすることになります(結局のところ、これはUNIXであり、マウントされていないボリュームは、ルートからファイルとしてアクセスできるブロックデバイスです)。

  • SetVolumeUUIDSetVolumeUUIDRawSetVolumeUUIDAttr GetVolumeUUIDGetVolumeUUIDRawGetVolumeUUIDAttrは、「名前」の読み取り/書き込みを行います(ここでも、名前にもかかわらず、ボリュームの「名前」のみを処理し、UUIDは処理しません)。 * Raw関数は、マウントされていないボリュームのデバイス「ファイル」を介した直接アクセスを処理します。* Attr関数は、get/setattrlistAPIを使用します。プレーンなものは、ボリュームがマウントされているかどうかを確認し、適切な* Raw/* Attrバージョンを呼び出します。

次に、ツールの機能を実装する「高レベル」機能があります。

  • DoGetUUIDKeyは「名前」を取得し、エンディアンを調整してから、表示用のUUIDを計算します。
  • DoChangeUUIDKeyは、新しいランダムな「名前」を作成し、それをボリュームに書き込みます。

したがって、できる最善のことは、ShirtPocketのSuperDuperに埋め込まれている小さなコマンドラインツールと同じ機能を再コーディングすることです。 (私が上に投稿したリンクを参照してください)。

7
Analog File

私はこれに取り組みました。 hfs.utilのソースをダウンロードし、(コンパイルできるように)言及した変更を加え、UUID機能を再度有効にし(現在のソースで無効になっている-sなど)、新しいコマンドを追加しました(- UUIDを指定するために使用されるS)。

新しいコマンドの形式は次のとおりです。

Sudo hfs.util -S disk0s2 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Sudoを使用するか、rootとして実行する必要がありますが、ボリュームをマウント解除する必要はありません(現在のシステムボリュームであっても)。

しかし、私はまだそれをデバッグしています(私はCでひどいです)。エラーなしで実行できますが、それでも-Sを使用して新しいUUIDを効果的にランダム化しています。指定したUUIDに関係なく、まだ別のUUIDを取得しています。

動作するようになったら、ここに差分を投稿するか、変更したソースをアップロードする場所を見つけて、ここからリンクします。

失敗した場合でも、おそらく差分を投稿し、他の誰か(Cの方が優れている)がそれを修正できる可能性があります。

編集: OK。 Apple hfs.utilのソースコード)のUUID文字列<->バイナリ関数を処理する関数の主要なバグと思われるものを見つけました。バイナリ値として、4が必要です。 (符号なし)128ビットUUIDを格納する32ビットワード。Appleソースは16個の16進文字のみを処理するように見えます(それぞれ2つの16進文字の16オクテットである必要があります)。

また、欠陥のある構造を使用してUUIDを保持しているようです(「高」32ビットワードと「低」32ビットワードのみを格納しているように見えますが、4つの(符号なし)32ビットワードが必要です)。修正できると思いますが、構造体とその構造体を使用するすべての関数を変更する必要があります(時間がかかる場合があります)。

編集#2:デバッグに多くの時間を費やした後、Apple hfs.utilのソース(私は実際にはCプログラマーではありません)Apple意図的にはUUIDを処理するときに64ビットのみを処理します。残りは64ビット定数のハッシュから生成されます。コンピュータコンポーネントの値、現在の時刻など。したがって、同じ64ビットの「キー」を2回使用した場合、2つの異なるUUIDが発生します(同じコンピュータを使用した場合でも、時刻は変更されています)。 。ボリュームヘッダーへの実際の書き込みが実際のUUID(キーだけでなく)を送信する限り、およびボリュームヘッダーが実際のUUID(および計算に使用できるキーや値だけでなく)を格納する限りUUID)、それなら希望があります。私のデバッグはまだそれほど進んでいません。もっとわかったらまた投稿します。

6
chriv