High Sierra でも NetRestore イメージが作れた話（追記: リストアは失敗）

> 2018.09.05 追記
> 上手く行っていたと思ったのですが、リストアには失敗していました。
> NetRestore イメージの作成と配信設定まではこの方法でできており、クライアントからも見えているので、引き続き検証して行きます。

# 概要
- モバイルアプリ開発のトレーニングなどを提供しているカサレアルでは、トレーニングの実施ごとに受講者用の Mac をセットアップしています
- Apple の NetRestore を利用してセットアップしていたのが、 High Sierra になったら上手く動作せずに困っていました
- 問題の原因と、その解決方法です

# 昔は良かった
- 弊社では、トレーニングで使う Mac は macOS Server の持つ NetRestore を使ってイメージを配布してました
- 簡単に言うと、セットアップ済みの環境そのものをバックアップし、そこからリストアすることで完全に同じ環境を作っていました
    - Time Machine と異なり、イメージをそのままコピーするのでリストアがとても速いです
- これは、ソフトウェアをトレーニング実施ごとにインストールして、設定を毎回行って、必要なファイルもコピーして…という方法よりも、圧倒的に楽でミスが少ない便利な方法でした
    - 特に、 Xcode のダウンロードとインストールは大変時間が掛かりますよね

# 立ちはだかる APFS
- ところが、 High Sierra の新機能である APFS(Apple File System) と NetRestore の相性が非常に悪いことが発覚しました

## APFS とは？
- 従来の HFS+ は HDD のようなディスクベースのストレージを前提とした非常に古いファイルシステムであり、 SSD のような非ディスク型のストレージではパフォーマンスが発揮できません
- なので、非ディスク型に特化したファイルシステムとして、 High Sierra から正式採用されたのが APFS です

## APFS とイメージングとの相性
- これまでの HFS+ は**「ディスクの中にボリューム」**という単純な形式でした

```bash
ディスク
├── ボリューム
└── ボリューム
```

- ですが、 APFS は**「ディスクの中にコンテナ、コンテナの中にボリューム」**という形式を取っています

```bash
ディスク
├── コンテナ
│   ├── ボリューム
│   └── ボリューム
└── コンテナ
    ├── ボリューム
    └── ボリューム
```

- このコンテナがボリュームに関する低レベルな情報を持っていて、従来のようにボリュームからのイメージの作成・配布ができないようです
- そのため、これまで NetRestore のようなイメージング技術を使ってきたエンジニアたちは嘆いています[^1]
- 「APFS に変換せずに HFS+ を使い続ければいいのでは？」という気がしますが、**「フラッシュストレージののみを搭載した Mac は High Sierra のインストール/アップグレード時に自動的に APFS に変換」**されます
    - Fusion Drive を搭載した iMac などでは、 APFS に変換されない

[^1]: [Imaging is Dead… Long Live the Installer! – Scripting OS X](https://scriptingosx.com/2017/10/imaging-is-dead/)

# これまでの試み
## Apple に問い合わせ
- Apple のサポートに問い合わせてみました
- が、「その問題は他のユーザからも報告があって把握しており、調査中」のまま、数ヶ月経過しても進展はないです

## ASR(Apple Software Restore) を試す
- man を読む限り、 APFS に一応対応しているようです
- が、 APFS を正しく扱う方法がイマイチよくわかりませんでした[^2]

[^2]: 詳しい方がいらっしゃれば、アドバイスを頂けるととても喜びます

## Time Machine サーバを試す
- High Sierra から、 macOS Server がなくても Time Machine サーバを立てられるようになりました
- そこで考えたのが、「サーバ上にバックアップを作成し、そのイメージから複数クライアントをリストア」する方法です
- が、試したところ「一度にリストアできるのは 1 台のみ」という制約があり、挫折です

# 解決（イメージの配信設定まで）
## そもそも、何がダメなんだっけ？
- macOS のバージョンというよりも、 APFS がネックになっているわけです
- ということは、「High Sierra だけど HFS+」が実現できれば道が拓ける可能性があります

## HFS+ の High Sierra できた！
### startosinstall コマンドを使う
- 調べた結果、**「macOS インストーラに入ってる startosinstall コマンドを使って High Sierra をインストールすると、 APFS への変換を回避できる」**ことがわかりました
- Terminal から以下のように実行します（Recovery Mode から実行した場合）[^3]
    - この例では、 USB メディア上に作成したインストールディスク（createinstallmedia コマンドにより）を利用しています
    - あらかじめ、 Disk Utility でターゲットドライブは初期化した状態で実行しています

[^3]: 普通にログインした状態で実行し、かつクリーンインストールしたい場合は --eraseinstall と --newvolumename オプションを指定します。 --eraseinstall と --volume オプションを同時に指定することはできません。

```bash
/Volumes/Image\ Volume/Install\ macOS\ High\ Sierra.app/Contents/Resources/startosinstall --converttoapfs NO --volume /Volumes/Macintosh\ HD
```

### 結果
- 実際に startosinstall コマンドを利用した結果、 HFS+ の High Sierra が作成でき、かつそれをベースに NetRestore イメージを作成~~・配布~~できました
- 配信は途中で止まってました

# 今後の懸念など
- 今回は、 HFS+ の High Sierra を作成することで無事に乗り切ることができました
    - すみません、イメージの作成と配信設定までは、です
- ただし、まだ懸念は残っています

## いつまで HFS+ が使えるのか？
- 現状、 macOS は APFS 以外に HFS+ をまだサポートしています
- が、もし APFS がディスク型のストレージでもパフォーマンスを発揮できるようになった場合には完全に APFS に移行されるかもしれません
- その場合は、完全に別の方法を再度模索する必要が出てきます

## NetRestore が使えなくなる？
- NetRestore(NetInstall) は、 macOS Server の機能です
- ところが、2018 年の秋リリースからはこの機能が削除され、 OSS を利用して各自環境を作る必要があるとのアナウンスがされています[^4]
- NetInstall については移行先 OSS が示されていますが、 NetRestore もサポートしているかは明記されていません
- これも、引き続き検証していく必要があるようです

[^4]: [macOS Server の変更点に備える - Apple サポート](https://support.apple.com/ja-jp/HT208312)