5

Macのディスクのパーティションテーブルに微妙な変更を加えようとしています。特に、パーティションの種類を変更する必要があります。diskutilこれをサポートしていないので、使用できません。ディスクが使用されていない場合は、 (たとえば、変更されたgptコマンドラインユーティリティを介して)正常に動作します。そうである場合、デバイスファイルを開くときに失敗します。

int fd = open("/dev/disk1", O_RDWR);

fdは-1でerrno、エラー「リ​​ソースビジー」を示します。

別のドライブからマシンを再起動し、そこから元のディスクを変更してから、再起動できることに気付きました。ただし、これは、アプリケーション内から自動化/信頼できるものにするのは簡単ではありません。さらに、diskutilライブデバイスのパーティションテーブルの編集に問題はなく、bootcampインストーラーもありません。

これを行うための既知の方法はありますか?最悪の場合、私はカーネルでそれを試みることができますが、kextsは実際には一回限りのことを行うように設計されておらず、私がする必要があるのはユーザースペースでは非常に概念的に単純ですが、カーネルでは非常に難しいです。

何か案は?

注:私はすべてをsudoで実行しているので、権限の問題ではないはずです。

4

2 に答える 2

8

Apple のやり方

と逆アセンブラを使って調査しotoolた結果、Applediskutilはその仕事をするためにいくつかのプライベート フレームワークを使用していると判断しました。(コマンド ライン バージョンを見ましたが、GUIディスク ユーティリティの機能セットとステータス/エラー メッセージが非常によく一致しているため、違いがあるとは思えません) 特に、Objective-CDiskManagement.frameworkには、1 をマップするクラスとメソッドが含まれています。 :1diskutilコマンドに。多くのエラー メッセージは、MediaKit.frameworkObjective-C ベースではない から出力されているようです。そのため、その API は では表示されませんotool

一部の関数を簡単に分解してみると、Mach Ports とMIGが多用されているように見えます。リバース エンジニアリングのうさぎの穴がどれほど深いのか、それがどこに役立つのかはわかりません。結局のところ、DiskManagement.frameworkは正確に何をしているように見えますdiskutilが、それ以上ではないので、パーティション テーブルの直接編集は含まれていません。ボンネットの下でそれがどのように行われるかを理解したとしても、それは私の問題を解決するのに役立たないかもしれません.

やり方は

そのため、成功の可能性が疑わしい活動にこれ以上時間を浪費するのを避けるために、カーネル拡張機能を介してそれを行うことになりました。まさに私が避けようとしていたことです。私は基本的に、コンパニオン サブクラスIOServiceと共に一般的なサブクラスを作成しました。IOUserClientこれにより、既存のパーティション テーブルを新しいテーブルに置き換えるいくつかの方法が、ルートとして実行されているユーザー空間プロセスに公開されます。デバイス名に対応するオブジェクトを検索し、IOMediaいくつかのトリックを使用して、それに対して直接読み取り/書き込み操作を行います。古いパーティション テーブルを渡して、実際に正しいものを更新していることを確認できるようにします。ユーザー空間側では、gptユーザー空間 I/O Kit ライブラリを使用して kext と対話するためのユーティリティ。変更を加えるために kext を一時的にロードしてから、再度アンロードします。2日間の大部分を費やしましたが、うまく機能しています。

于 2012-02-19T12:09:35.593 に答える
-1

rawディスクデバイスを使用する必要があります-あなたの場合はそうなるでしょう/dev/rdisk1。また、明らかに、あなたはである必要がありますroot

于 2012-02-09T21:54:09.837 に答える