macOSのデバイスを組織の従業員に貸与する場合、デバイスのトラブルや退職などのタイミングでデバイスを管理者で受け入れ、そのデバイスの購入時期が一定期間以内の場合、廃棄せずに初期化を行い、新たな従業員へデバイスを貸与することがあります。

その際デバイスの管理者は、なるべく組織で許容しているOSおよびバーションにアップグレードしたいことがあります。

また、COVID-19の影響によりリモートで対応することも多い中、何か問題が起きた際にOSの再インストールや、OSのアップデートをエンドユーザーに行ってもらう必要があるかもしれません。

今回はこれら課題を解決する方法を紹介します。

この記事はcorp-engr 情シス Slack(コーポレートエンジニア x 情シス) Advent Calendar 2020の15日目の記事でもあります。

従来のデバイスの初期化およびOS再インストールの課題

多くの場合、初期化およびデータは消さないOS再インストール作業は、

  • Intel版
    • ⌘ + R
      • 現在インストールされているOSの一番新しいOS
    • ⌥ + ⌘ + R
      • デバイスと互換性があるうちで一番新しいOS
    • ⇧ + ⌥ + ⌘ + R
      • 工場出荷時のOSバーションまたは工場出荷時のOSバーションがサポートされていない場合はそれに一番近いサポートされているOS
  • Silicon版
    • 電源ボタン長押し

などでリカバリーモードを介して行います。

または、事前にUSBなどの外部記憶媒体にmacOSのインストーラを作成しておき、起動オプションで外部記憶媒体を指定し、

  1. ディスクの消去
  2. OSのインストール

を行います。

(Intel版のみ)ファームウェアのパスワードを設定している場合、リカバリーモードにはファームウェアのパスワードを入れないといけず面倒です。

リカバリーモードの場合、

  1. FileVaultの暗号化の解除
  2. ディスクユーティリティでディスクの消去(フォーマット)
  3. インターネット経由でのOSのインストール

の手順で初期化しますが、OSインストール中にインターネット接続が不安定となるとOSがインストールされず、インターネットリカバリーを行うこととなり、初期化に多くの工数を割かなければいけないこともあります。

また、macOSインストーラを使用した場合、リカバリーモードのように不安定な作業にはならないものの、T2チップを搭載していると、外部起動を事前に有効にしておかなければ使用できません。 新しいOSが出た際には、そのたびにインストーラを作成するのもたいへんです。

従来のOSアップグレードの課題

メジャーバーションアップの場合、[システム環境設定] > [ソフトウェアアップデート]からアップグレードができます。

管理者権限を与えていない場合、インストーラが起動したところでアップグレードできないため、何かしらアップグレードするための方法を用意する必要があります。

それぞれ、エンドユーザーが自発的にアップグレードできます。しかし、ユーザーによってはまったくアップグレードを行わず、管理者が強制的にアップグレードを適用したいこともありますが、それにはスクリプトなどを用意する必要があります。

erase-installについて

erase-installはGraham Pugh氏が開発しているmacOSの初期化およびOSアップグレードが行えるスクリプトです。

大まかな処理としては、以下のようなことを行っています。

  1. munkiが作成しているinstallinstallmacos.pyをforkしたものをGraham Pugh氏が一部改変したものをダウンロード
  2. installinstallmacos.pyを実行し、最新バージョンのOSインストーラをダウンロード
  3. OSインストールを実行

installinstallmacos.pyが特定のOSバーションやBuildの指定、Apple Seed Programを使用できるため、そのサポートや、softwareupdateのフルインストーラにも対応しています。

Jamf Proがインストールされている場合は、Jamf Helperを使用してエンドユーザーに以下の内容を通知できます。

  • ディスクスペースの不足
  • OSインストーラのダウンロードの開始
  • OSインストーラの実行前の確認ダイアログ

課題の解決方法

事前に現在インストール可能なOS一覧を確認しておき、対応すると良いでしょう。

# 2020-12-15 02:00 JST 現在の結果
curl -s https://raw.githubusercontent.com/grahampugh/erase-install/master/erase-install.sh | sudo bash /dev/stdin --list

()

This Mac:
Model Identifier : MacBookPro16,2

Bridge ID        : J214kAP
Board ID         : Mac-5F9802EFE386AA28
OS Version       : 10.15.7
Build ID         : 19H2

 #  ProductID       Version    Build    Post Date   Title                          Notes/Warnings
 1  001-15219       10.15.5    19F2200  2020-06-15  macOS Catalina                 Unsupported macOS version
 2  001-68446       10.15.7    19H15    2020-11-11  macOS Catalina
 3  001-04366       10.15.4    19E2269  2020-05-04  macOS Catalina                 Unsupported macOS version
 4  061-86291       10.15.3    19D2064  2020-03-23  macOS Catalina                 Unsupported macOS version
 5  041-91758       10.13.6    17G66    2019-10-19  macOS High Sierra              Unsupported macOS version
 6  001-57224       10.15.7    19H4     2020-10-27  macOS Catalina
 7  061-26589       10.14.6    18G103   2019-10-14  macOS Mojave                   Unsupported macOS version
 8  001-51042       10.15.7    19H2     2020-09-24  macOS Catalina
 9  001-36735       10.15.6    19G2006  2020-08-06  macOS Catalina                 Unsupported macOS version
10  001-83532       11.0.1     20B50    2020-11-19  macOS Big Sur
11  041-88800       10.14.4    18E2034  2019-10-23  macOS Mojave                   Unsupported macOS version
12  041-90855       10.13.5    17F66a   2019-10-23  Install macOS High Sierra Beta Unsupported macOS version
13  061-26578       10.14.5    18F2059  2019-10-14  macOS Mojave                   Unsupported macOS version
14  001-36801       10.15.6    19G2021  2020-08-12  macOS Catalina                 Unsupported macOS version

デバイス初期化およびOS再インストールのケース

最新バージョンで初期化を行う場合は、

curl -s https://raw.githubusercontent.com/grahampugh/erase-install/master/erase-install.sh | sudo bash /dev/stdin --erase

OSの再インストールを行う場合は、

curl -s https://raw.githubusercontent.com/grahampugh/erase-install/master/erase-install.sh | sudo bash /dev/stdin --reinstall --sameos

を実行します。実際には現在のメジャーバーションと一致する最新バージョンのOSをインストールしますが、往々にして現在のOSの最新バージョンにするケースが多いためこのようにしています。

もし、指定したバーションにしたい場合は、--osオプションを使用してください。

これにより、リカバリーモードやOSインストーラを使用せずとも初期化およびOSの再インストールが可能となります。

OSアップグレードのケース

最新バージョンにアップグレードする場合は、

curl -s https://raw.githubusercontent.com/grahampugh/erase-install/master/erase-install.sh | sudo bash /dev/stdin --reinstall

バーションを指定したい場合は、

# パッチバージョンまで指定
curl -s https://raw.githubusercontent.com/grahampugh/erase-install/master/erase-install.sh | sudo bash /dev/stdin --reinstall --os="11.0.1"
# マイナーバージョンまで指定
curl -s https://raw.githubusercontent.com/grahampugh/erase-install/master/erase-install.sh | sudo bash /dev/stdin --reinstall --os="11.0"

を実行します。

これにより、OSのアップグレードが可能です。

Jamf Proを使用したお勧めの設定方法

上記はコマンドを使用しましたが、Jamf Proを使用されている場合、お勧めの設定方法があるので紹介します。

事前にerase-installのリリース一覧からから最新バージョンを選択し、Jamf ProサーバーのScriptにerase-install.shを設定しておきます。

初期化用のポリシーをSelf Serviceから実行できるようにする

初期化用のポリシーをSelf Serviceから実行できるようにすることで、エンドユーザーやデバイス管理者がワンボタンでいつでも実行できます。

初期化用のポリシー設定

  1. [コンピュータ] > [ポリシー]から新規作成に進みます。
  2. Generalセクションで各値を設定します。
    • 表示名: Erase and reinstall latest OS
      • これは例ですが、分かりやすい名前をつけてください。
    • カテゴリ: Admin
      • カテゴリの設定は任意です。
    • 実行頻度: Ongoing
      • トリガーはなしで、Self Serviceで実行するためOngoingで問題ないです。

    初期化および最新バージョンのOSインストールポリシー作成のオプションセクションのGeneral項目設定

  3. 次に、スクリプトの項目を選択し、登録したerase-installのスクリプトを追加します。
  4. パラメータ4とパラメータ5に値を設定します。
    • パラメータ4: --erase
    • パラメータ5: --confirm
      • confirmオプションを使用するとJamf Helperを使用してOSインストーラを実行する前に確認ダイアログを表示できます。

    初期化および最新バージョンのOSインストールポリシー作成のオプションセクションのスクリプト項目設定

  5. 次に、Scopeセクションで実行を許可するスコープを絞ります。
  6. 最後に、Self Serviceセクションで「Self Service でポリシーを使用可能にする」を有効にします。

    初期化および最新バージョンのOSインストールポリシー作成のSelf ServiceセクションのSelf Service設定

  7. [保存]してポリシーの登録は完了です。

OSアップグレード用のポリシーを用意する

OSアップグレードのポリシーを用意することで、デバイス管理者が強制的にポリシーを適用したり、Self Serviceを介してエンドユーザーに自由に実行してもらったりできます。

最新バージョンのOSを事前にダウンロードするポリシーの設定

OSインストーラは数GBと少々重たいので、事前にダウンロードするためのポリシーを作成します。

  1. [コンピュータ] > [ポリシー]から新規作成に進みます。
  2. Generalセクションで各値を設定します。
    • 表示名: Download latest OS installer
      • これは例ですが、分かりやすい名前をつけてください。
    • カテゴリ: OS Update
      • カテゴリの設定は任意です。
    • 実行頻度: Ongoing
      • トリガーはなしで、Self Serviceで実行するためOngoingで問題ないです。

    OSインストーラダウンロード用のポリシー作成のオプションセクションのGeneral項目設定

  3. 次に、スクリプトの項目を選択し、登録したerase-installのスクリプトを追加します。
    • パラメータには何も設定しません。

    OSインストーラダウンロード用のポリシー作成のオプションセクションのスクリプト項目設定

  4. 次に、Scopeセクションで実行を許可するスコープを絞ります。
  5. 最後に、Self Serviceセクションで「Self Service でポリシーを使用可能にする」を有効にします。

    OSインストーラダウンロード用のポリシー作成のSelf ServiceセクションのSelf Service設定

  6. [保存]してポリシーの登録は完了です。

OSアップグレード用のポリシーの設定

今回はSelf Serviceで実行できるようなポリシーを作成してみます。

  1. [コンピュータ] > [ポリシー]から新規作成に進みます。
  2. Generalセクションで各値を設定します。
    • 表示名: Upgrade latest OS
      • これは例ですが、分かりやすい名前をつけてください。
    • カテゴリ: OS Update
      • カテゴリの設定は任意です。
    • 実行頻度: Ongoing
      • トリガーはなしで、Self Serviceで実行するためOngoingで問題ないです。

OSアップグレード用のポリシー作成のオプションセクションのGeneral項目設定

  1. 次に、スクリプトの項目を選択し、登録したerase-installのスクリプトを追加します。
  2. パラメータ4とパラメータ5に値を設定します。
    • パラメータ4: --reinstall
    • パラメータ5: --confirm
      • confirmオプションを使用すると、Jamf Helperを使用してOSインストーラを実行する前に確認ダイアログを表示できます。

    OSアップグレード用のポリシー作成のオプションセクションのスクリプト項目設定

  3. 次に、Scopeセクションで実行を許可するスコープを絞ります。
  4. 最後に、Self Serviceセクションで「Self Service でポリシーを使用可能にする」を有効にします。

    OSアップグレード用のポリシー作成のSelf ServiceセクションのSelf Service設定

  5. [保存]してポリシーの登録は完了です。

今回は事前にOSインストーラをダウンロードするポリシーを作成していましたが、--updateオプションを使用すると、もしそのインストーラが古い場合は新しいOSインストーラをダウンロードしてからインストールを実行します。 もし必要でしたらオプションを有効にしてください。

終わりに

erase-installという名前が誤解を生みそうな名前ですが、初期化、OS再インストールおよびOSアップグレードが可能なスクリプトでした。

紹介した以外にもいくつかオプションがあります。詳しくはerase-installのREADME、または

curl -s https://raw.githubusercontent.com/grahampugh/erase-install/master/erase-install.sh | bash /dev/stdin --help

を参照してください。

このスクリプトはOSインストーラのシグネチャの検証をしていないので、理解したうえで使用してください。1

もし、OSアップグレードの際にOSインストーラーのシグネチャの確認をしたい場合や、ACアダプタからの給電がされているかの事前確認などをしたい場合は、macOSUpgradeの使用を検討してみてください。

  1. Signature verification of the os installerのIssueを立てました。