🏵️

Jamf ProからRosetta 2をインストールする

2021/07/08に公開

初期設定時

macOS デバイスの初期設定にJAMF-Enrollment-Kickstartを使っているのですが、一番初めにインストールするdaemonが.pkgで配布されており、これがM1搭載のMacでは正しく動作しませんでした。

Rosetta2をインストールすれば解決するのですが、このpkgより先にインストールする必要があり、またこのpkgのインストールはJAMF-Enrollment-Kickstartが完了するまで何度も実行されます。
CPUのアーキテクチャやRosetta 2のインストールの有無によって初期設定のためのポリシーを分けるのはスマートではないので、pkgファイルをインストールするポリシーを実行する前に

  • CPUのアーキテクチャを判別する
  • Rosetta2が既にインストールされていないかを調べる
  • アーキテクチャがarm64で、Rosetta 2がインストールされていない場合はRosetta2をインストールする

というスクリプトを実行しようと考えました。
自分で書こうと思っていたのですが、Jamf Nationにそのものズバリなスクリプトが投稿されていたので使わせてもらいました。
https://community.jamf.com/t5/jamf-pro/deploy-rosetta-on-m1-machines-before-everything-else/m-p/223539/highlight/true#M211948

#!/bin/bash

# Installs Rosetta as needed on Apple Silicon Macs.

exitcode=0

# Determine OS version
# Save current IFS state

OLDIFS=$IFS

IFS='.' read osvers_major osvers_minor osvers_dot_version <<< "$(/usr/bin/sw_vers -productVersion)"

# restore IFS to previous state

IFS=$OLDIFS

# Check to see if the Mac is reporting itself as running macOS 11

if [[ ${osvers_major} -ge 11 ]]; then

  # Check to see if the Mac needs Rosetta installed by testing the processor

  processor=$(/usr/sbin/sysctl -n machdep.cpu.brand_string | grep -o "Intel")

  if [[ -n "$processor" ]]; then
    echo "$processor processor installed. No need to install Rosetta."
  else

    # Check Rosetta LaunchDaemon. If no LaunchDaemon is found,
    # perform a non-interactive install of Rosetta.

    if [[ ! -f "/Library/Apple/System/Library/LaunchDaemons/com.apple.oahd.plist" ]]; then
        /usr/sbin/softwareupdate --install-rosetta --agree-to-license

        if [[ $? -eq 0 ]]; then
            echo "Rosetta has been successfully installed."
        else
            echo "Rosetta installation failed!"
            exitcode=1
        fi

    else
        echo "Rosetta is already installed. Nothing to do."
    fi
  fi
  else
    echo "Mac is running macOS $osvers_major.$osvers_minor.$osvers_dot_version."
    echo "No need to install Rosetta on this version of macOS."
fi

exit $exitcodeho "Unknown Architecture"
fi

このスクリプトを、JAMF-Enrollment-Kickstartのpkgをインストールするポリシーのスクリプト ペイロードで、優先順位をBeforeにして登録します。

macOSアップデート時

macOS Big Surをアップデートすると、Rosetta 2が消えてしまうという仕様があるそうです。
先ほどのスクリプトが投稿されていた同じトピック内に、アーキテクチャがarm64でかつRosetta 2がインストールされていないmacを識別するための拡張属性がポストされていました。
https://www.jamf.com/jamf-nation/discussions/37357/deploy-rosetta-on-m1-machines-before-everything-else#:~:text=%23!/bin/bash ​ %3A << DOC,result>%24result</result>"

#!/bin/bash: << DOC
EA to determine whether Rosetta is installed. 
Possible results:
"installed"    - arm64 Mac - Rosetta is installed
"missing"      - arm64 Mac - Rosetta is not installed
"ineligible" - Intel Mac - Rosetta cannot be installed
DOC# is this an ARM Mac?
arch=$(/usr/bin/arch)
if [ "$arch" == "arm64" ]; then
    # is rosetta 2 installed?
    if [[ -f "/Library/Apple/System/Library/LaunchDaemons/com.apple.oahd.plist" ]]; then
        result="installed"
    else
        result="missing"
    fi
else
    result="ineligible"
fiecho "<result>$result</result>"

この拡張属性がmissingになるMacに対して、先ほどのスクリプトを実行すればRosetta2が再びインストールされます。

Discussion