[メモ] macOS11のboxファイルをつくる

![スクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/80beeea7-0e2b-acfe-c21a-52f6e963da2e.png)
##  概要
- Vagrant + VMWareで使う、macOSのboxファイルを作成する。
- ↓こちらを使って、VMWareのイメージを作成
    - https://github.com/trodemaster/packer-macOS-11
    - `metadata.json` と`Vagrantfile`を作成、gzipで固めて、`.box`を作成
	- ユーザ名/パスワード = packer / packer でつくられる
- 記事が消えたら、察して下さi..

## 環境
- macOSの実行環境
- 十分なストレージの空き 100GB+ くらい? 


## 手順
1. brewのインストール (参考: https://brew.sh)
2. 必要なツール類のインストール
    `% brew install vmware-fusion packer pigz`
	- packer
	- VMWare Fusion: インストール後、一度起動して、EULAとかセキュリティ関係とか通して動くようにしておく。
	- pigz: gzipの圧縮のマルチコア対応版

<!-- - `sudo xattr -rd com.apple.quarantine /Applications/VMware\ Fusion.app/Contents/Library/LaunchServices/*Helper`  --> 

3. `git clone`して、macOSインストールISOイメージ作成
    - 途中、どのバージョンをダウンロードするか聞かれるので、番号を入れる
    - BigSurは11GBくらいのdmgイメージをダウンロードするので、時間かかる
	- 実行後、`install_bits`フォルダに成果物ができる
	- ISOイメージ作成後、Diskの空きが心配であれば、`submodules`フォルダ を消してしまってもよい

    ```bash
    mkdir ~/code
    cd ~/code
    git clone --recursive https://github.com/trodemaster/packer-macOS-11
    cd packer-macOS-11
    ./scripts/buildprerequs.sh 
    ```

4. packerにて、VMwareイメージ作成
    - 使用するISOファイル名の変更を`macOS_11.pkr.hcl`におこなう。
	- `macOS_1152_installer.iso` の例
    - 5分後に、キーボードをうちこむのシミュレーションがはじまって、インストールがすすむ。

        ```bash
        # macOS_
        sed -i .bak -e 's/_1120_/_1152_/g'  ./macOS_11.pkr.hcl
        #
        # packer実行
        time packer build -force -only base.vmware-iso.macOS_11_base macOS_11.pkr.hcl 
        ```

5. Box ファイル作成
	- `metadata.json` と`Vagrantfile`を作成、gzipで固めて、拡張子を`.box`に。

    ```bash
    # VMware Fusionを終了させる。
    osascript -e 'quit app "VMware Fusion"'
    #
    # 成果物のあるフォルダに移動
    cd ./output/macOS_11_base
    #
    # metadata.json と Vagrantfileを作成
    echo '{"provider":"vmware_desktop"}' >./metadata.json
    cat <<'EOF' > Vagrantfile
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    Vagrant.require_version ">= 1.6.2"
    Vagrant.configure("2") do |config|
        config.ssh.username = "packer"
        config.ssh.password = "packer"
        config.vm.provider :vmware_fusion do |v, override|
            v.gui = true
            v.vmx["memsize"] = "6144"
            v.vmx["numvcpus"] = "2"
            v.vmx["ethernet0.virtualDev"] = "vmxnet3"
            v.vmx["tools.upgrade.policy"] = "manual"
            v.vmx["smc.present"] = "TRUE"
            v.vmx["smbios.restrictSerialCharset"] = "TRUE"
            v.vmx["ulm.disableMitigations"] = "TRUE"
            v.vmx["ich7m.present"] = "TRUE"
            v.vmx["hw.model"] = "MacPro7,1"
            v.vmx["hw.model.reflectHost"] = "FALSE"
            v.vmx["smbios.reflectHost"] = "FALSE"
            v.vmx["serialNumber.reflectHost"] = "FALSE"
            v.vmx["SMBIOS.use12CharSerialNumber"] = "TRUE"
            v.vmx["RemoteDisplay.vnc.enabled"] = "false"
            v.vmx["RemoteDisplay.vnc.port"] = "5900"
            v.vmx["gui.fitguestusingnativedisplayresolution"] = "TRUE"
            v.vmx["mks.enable3d"] = "TRUE"
            v.vmx["mks.forceDiscreteGPU"] = "TRUE"
            v.vmx["gui.fullscreenatpoweron"] = "TRUE"
            v.vmx["gui.viewmodeatpoweron"] = "fullscreen"
            v.vmx["gui.lastPoweredViewMode"] = "fullscreen"
            v.vmx["sound.autodetect"] = "TRUE"
            v.enable_vmrun_ip_lookup = false
            v.whitelist_verified = true
            v.vmx["hgfs.linkRootShare"] = "FALSE"
        end
        ["vmware_workstation", "vmware_desktop"].each do |provider|
            config.vm.provider provider do |v, override|
                v.gui = true
                v.vmx["memsize"] = "6144"
                v.vmx["numvcpus"] = "2"
                v.vmx["ethernet0.virtualDev"] = "vmxnet3"
                v.vmx["tools.upgrade.policy"] = "manual"
                v.vmx["smc.present"] = "TRUE"
                v.vmx["smbios.restrictSerialCharset"] = "TRUE"
                v.vmx["ulm.disableMitigations"] = "TRUE"
                v.vmx["ich7m.present"] = "TRUE"
                v.vmx["hw.model"] = "MacPro7,1"
                v.vmx["hw.model.reflectHost"] = "FALSE"
                v.vmx["smbios.reflectHost"] = "FALSE"
                v.vmx["serialNumber.reflectHost"] = "FALSE"
                v.vmx["SMBIOS.use12CharSerialNumber"] = "TRUE"
                v.vmx["RemoteDisplay.vnc.enabled"] = "false"
                v.vmx["RemoteDisplay.vnc.port"] = "5900"
                v.vmx["sound.autodetect"] = "TRUE"
                v.enable_vmrun_ip_lookup = false
                v.whitelist_verified = true
                v.vmx["hgfs.linkRootShare"] = "FALSE"
            end
        end
    end
    EOF
    #
    # tar+gzip形式でフォルダ内のファイルを固める (pigz使用 -p 8 で8スレッド)
    time tar cvzf ~/macOS_1152_base.box ./*
    tar cf - ./* | pigz -9 -p 8 > ~/macOS_1152_base.box
    ```

## Vagrant + VMWareで使ってみる

```
# ツール類のインストール 
brew install vagrant vagrant-vmware-utility vmware-fusion
vagrant plugin install vagrant-vmware-desktop
#
# boxの登録
vagrant box add ~/macOS_1152_base.box --name 'macOS11'
#
# 作業フォルダ
mkdir ~/Vagrant/
cd ~/Vagrant
mkdir macOS11
cd macOS11
#
# Vagrantfile 作成
vagrant init -m macOS11
# 起動
vagrant up

```


## その他
- VMware Toolsは、再インストールしないといけないっぽい?
- MEMORY MODULE MISCONFIGURED が出る
- unloc...したVMwareWS でもいける..
- (TODO) ユーザ名/パスワードを変更したい