APFSのVolumeを活用する

f:id:siroanko:20181008122822p:plainHFS+から大幅刷新されたAPFS (Apple File System)には色々便利な機能があります。今回は、Hackintoshライフに役立つAPFS Volume機能をご紹介します。

(更新:Catalinaのことを追記しました。2020/3/3)

HFS+のVolume

HFS+でもAPFSでも、アプリケーションから見えるのは最終的にVolumeです。Volumeは物理的にはストレージの一部なのですが、アプリケーションからは

/Volumes/

以下にマウントされ、ディレクトリのように見えます。

物理的なストレージからVolumeに至る階層構造を以下にまとめます。HFS+では、

  1. 物理的なドライブ。物理的なSSDやHDDです。本当はファイルではないのですが、システムからは/dev/disk0のように見えます。ファイルのようにも見えますが、実際にはファイルではありません。ストレージの内容を読み書きするデバイスドライバへアクセスする場所として使われます。システムファイルとも呼ばれます。
  2. 物理的なパーティション。SSDやHDDを分割した領域です。これも/dev/disk0s1のようなスペシャルファイルとして現れます。
  3. HFS+のVolume。パーティションに名前をつけてHFS+でフォーマットしたもの。/Volumes以下にその名前で現れます。一つのパーティションに一つのVolumeを作ります。

という構造になっています。2個の異なる物理ドライブの2つのパーティションを一つにみなす機能もあって、それでRAID 1ミラーリングやFusion Driveを実現しています。

APFSのVolume

APFSではこの構造に、コンテナという要素が加わります。物理的なストレージからVolumeに至る階層構造はAPFSでは以下になります。物理的な構造であるドライブとパーティションはHFS+と同じです。

  • 物理的なドライブ
  • 物理的なパーティション
  • コンテナ。通常は1個のパーティションを1つのコンテナにします。2個のパーティションを1つのコンテナにするとFusion Driveになります。
  • APFSのVolume。コンテナの中にAPFSでフォーマットされたVolumeを作ります。これが/Volumes以下に現れます。容量はコンテナの容量と同じです。1つのコンテナを、複数のVolumeで共有することができます。複数Volumeの場合、容量はどれもコンテナの容量と同じですが、他のVolumeが領域を使用すると、その分空き領域が減ります。

High SierraやMojaveのインストーラはHFS+をAPFSに自動変換してしまいますが、そのとき、パーティション→Volumeの構造を、パーティション→コンテナ→Volumeに変換します。「コンテナが間に挟まってややこしくなってしまった」と感じていたのですが、実は便利だとわかりました。

Fusion Driveがコンテナの機能で実現されることは、以前の記事で紹介しました。

以下では、コンテナの中に複数のVolumeが作れる機能を利用して、Hackintoshの保守を簡単にする方法をご紹介します。

HFS+で複数Volumeを使う

HFS+以前は1パーティションが1 Volumeでした。

Hacintoshに限らないのですが、OSをインストールする際に、ストレージを用途ごとにパーティションに分け、別Volumeにする手法が一般的でした。LinuxなどのUnix系OSでは、システムが使用するルート/、利用者がファイルを置くホーム/home、一時ファイルが置かれる/tmpなどなどを、複数のドライブにまたがった複数のパーティションに割り当てます。ファイルシステムにトラブルがあってもパーティションごとに独立していれば被害は少ないし、パーティションごとにフォーマットし直したり、別のドライブに移動するのが容易だという理由です。

そこまで細かく分けなくても、macOSでも、システムと/Users以下を別パーティションにしている人も多いと思います。分けておけば、macOSのメジャーアップデートの時に、システムパーティションをフォーマットして、綺麗さっぱりクリーンインストールすることも容易です(利用者データは別パーティションに残っていますから)。

例えば、1TBのSSDがある場合、システムに120GB、/Usersに880GB割り当てたりします。でもmacOS Mojaveをインストールした直後のサイズは約13GBなので、この割り当てだと最初はシステムパーティションが勿体無いです。一方で、Xcodeなどのサイズの大きなアプリケーションをどんどんインストールしていくと、120GBでは苦しくなります。Disk Utility.appでパーティションサイズを変更できることになってはいます。ただ、制約が大きくて、変更できない状況がほとんどです。パーティションを分けるときに、割り当てサイズをどう決めるかは、いつもいつも難しい問題でした。

APFSで複数Volumeを使う例

APFSでは1パーティションが1コンテナになり、複数Volumeを作れます。

先ほどの例に対して、今度はAPFSコンテナのVolume共有機能を活用します。1TBのSSDを買ってきたら、とりあえず全体をAPFSでフォーマットしてmacOSをインストールします。ここで出来上がったVolumeの名前を例えばmacOSとします。SSD全体に1つのパーティションができて、これに1つのVolumeができるので、サイズは1TBになります。/Volumes/macOSというようにマウントされます。

次に、新しいVolumeを作って、そこにホームディレクトリを移動させてみましょう。デフォルトでは、/Users以下のアカウント名と同じディレクトリがホームディレクトリになっています。以下では、homeというVolumeを作ってその中にホームディレクトリを置くことにします。まず、Disk Utility.appを開いて、現在のコンテナを選択して、「パーティション作成…」ボタンを押します。すると以下の案内が出ます。

1つのコンテナは1つのパーティションを占有し、コンテナ内のストレージ領域はコンテナ内の複数のAPFSボリュームで共有されます。APFSボリュームの追加や削除は、パーティションマップを編集するよりも簡単かつ高速に実行できます。

ここに書いてあるように、新しいVolumeを作るためには、“編集”メニューの“APFSボリュームを追加”コマンドを使用するか、ツールバーの“ボリュームを追加/削除”ボタンを使用しても良いです。本当はそちらの方法が正当で、このメッセージは従来のパーティション作成を試みようとしたユーザにAPFSへの移行を促す目的の案内なのだと思います。

ここで「ボリュームを追加」を選ぶと、このコンテナにVolumeを追加できます。homeという名前のVolumeを追加します。結果を以下に示します。「このMacについて」から見たいストレージの状況です。ここでお詫びです。ここまで1TBのSSDなどと豪勢なことを言っておりましたが、余分な1TB SSDを持っていなかったので打ち捨てられていた160GB HDDを使いました。

/Volumes/macOSも/Volumes/homeも同じ容量であることがわかります。同じ1つのパーティションを共有しているためです。それぞれのVolumeで使った分だけ空き容量が同じように減っていきます。パーティションのサイズで悩む必要がなくなったのです。

ターミナルのdiskutil listコマンドで見ると、以下のようになります。

$ diskutil list
/dev/disk1 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0:     GUID_partition_scheme *160.0 GB disk1
1:     EFI EFI 209.7 MB disk1s1
2:     Apple_APFS Container disk4 159.7 GB disk1s2

/dev/disk4 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0:   APFS Container Scheme - +159.7 GB disk4
Physical Store disk1s2
1:   APFS Volume macOS 13.3 GB disk4s1
2:   APFS Volume home 57.6 MB disk4s2
3:   APFS Volume Preboot 46.1 MB disk4s3
4:   APFS Volume Recovery 512.4 MB disk4s4
5:   APFS Volume VM 20.5 KB disk4s5

今回作成したコンテナの物理的な実体は、disk1s2にあります。コンテナの中には現在5個のVolumeができていて、コンテナ全体を共有していますそれぞれの使用量は、macOSが13.3GB(これがmacOS Mojaveの本体です)、homeが57.6MB(こちらは/Users以下のサイズです)などとなっています。

こうして作った/Volumes/homeの中にホームディレクトリを移動するには以下のようにします。まずアカウント名と同じ名前で空のディレクトリを作ります。アカウント名が例えばhogeだったら /Volumes/home/hoge を作ります。次にシステム環境設定から「ユーザとグループ」を選び、ウィンドウ左からユーザhogeを選んで、右クリックで「詳細オプション」を選び、ホームディレクトリとして/Volumes/home/hogeを指定します。これで再起動すれば、このディレクトリがホームディレクトリになります。

CatalinaからはmacOS本体の部分が二つに分割されるようになりました。macOSの基本部分は保護されてrootアカウントからも書き込み禁止になりました。別のボリュームの例ですが、以下のようになります。

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +249.8 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Preboot                 127.3 MB   disk1s1
   2:                APFS Volume Recovery                1.0 GB     disk1s2
   3:                APFS Volume VM                      2.1 GB     disk1s3
   4:                APFS Volume Macintosh HD - Data     41.7 GB    disk1s4
   5:                APFS Volume Macintosh HD            11.6 GB    disk1s5

ここで Macintosh HDと書かれた部分が保護されたエリアで、Macintosh HD – Dataがそれ以外の書き込み可能な部分です。/User以下も通常はここに書き込まれます。

OS切り替えにも複数Volumeが便利

APFS Volumeは、簡単に追加したり削除したりできます。ストレージの容量は実際に使用している分だけしか消費しません。Mojaveならたったの13GBです。なので、複数Volumeを用意して、複数のmacOSをインストールしておけば、以下のようなことが可能です。

  • 別バージョンのmacOSに切り替える。例えば別のVolumeにCatalina, Mojave, High Sierraをインストールしておく。
  • テストバージョンのmacOS、例えばCatalinaを別Volumeにインストールする。古いmacOSは残っていますから、不具合があったらすぐに戻れます。新OSのベータ版を試すような場合にも便利です。
  • メインで使うVolumeの他に、別 VolumeにもmacOSをインストールしておく。うっかり怪しいアプリやkextをインストールして起動できなくなった場合でも、バックアップから起動して、修正作業ができます。

などの使い方が考えられます。

バニラなインストールをしておけば、macOSは通常のインストールで機能するので、管理が簡単です。

不具合があっても別のVolumeのmacOSから起動できます。ただし、ESPの部分は同じものを使いますので、こちらもバックアップをしておくと安心です。

3件のコメント

  1. はじめまして。いつも拝見しております。
    > 次に、新しいVolumeを作って、そこに/Users以下を移動
    この方法についてですがどのようにすれば良いでしょうか?

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です