Virtual BoxをMacBook Air(M1, 2020)にインストールしようとしたら、CPUアーキテクチャの違いで詰まったので学び直した

## はじめに
MatsuribaTech（祭り場Tech） Advent Calendar 2023の17日目です。
Linuxの学習用に、自分の使っているPCのMacBook Air(M1, 2020)でもLinuxを手軽に使えないかなと思い、仮想化アプリケーションのVirtual Boxをインストールすることにしました。(実のところ数年前にもインストールしようとしたのですが、その時はM1Macにはインストール出来ないと言う結論に至り、数年経ったのでできるようになっているんじゃないかな〜と淡い期待を込めて再挑戦しました。)
しかし、CPUアーキテクチャがサポートしていないという旨のエラーが出て、そういえばCPUアーキテクチャ、理解があやふやな部分あるな〜と思ったのでこの際に学び直すことにしました。
結論から言うとAppleシリコンのPC(M1, M2など)にVirtual Boxをインストールすることはできます！が、少しだけコツがいります。

## 対象読者
- AppleシリコンのPC(M1, M2など)にVirtual Boxをインストールしたい人
- CPUアーキテクチャの違いがあやふやな人

## Virtual BoxをMacBook Air(M1, 2020)にインストールしてみる
今回はパッケージ管理ツールのHomebrewを使ってVirtual BoxをM1Macにインストールしてみます。
ターミナルで以下のコマンドを実行します。

```
$ brew install --cask virtualbox
```

すると、このようにエラーになるかと思います。
```
==> Downloading https://raw.githubusercontent.com/Homebrew/homebrew-cask/8290ef01e26f1fe87714eea55b1175ae1910583b/Casks/v/virtualbox.rb
Already downloaded: /Users/leminhthientoan/Library/Caches/Homebrew/downloads/f8c3d1134ba4b9df0f82b944132ac0b0aca3df829588d69591bf17185b700836--virtualbox.rb
Error: Cask virtualbox depends on hardware architecture being one of [{:type=>:intel, :bits=>64}], but you are running {:type=>:arm, :bits=>64}.
```
Errorの行を見てみると、Virtual Boxはintel 64bitのCPUアーキテクチャを必要としているのに対して、あなたのPCはarm 64bitのCPUアーキテクチャを使用していますよと言われています。

## CPUアーキテクチャについて整理する
上記のintel 64bit CPUアーキテクチャとかarm 64bit CPUアーキテクチャとはなんでしょうか？
CPUアーキテクチャにはx86とかx64とかx86_64とかarmとかいろいろあって混乱します。呼び方が複数あるものとかもありますし。
プログラムをインターネットからダウンロードするときなどに、自分のPCのCPUアーキテクチャに合わせてダウンロードするものを選んだりしなければいけない場面があり、今後困る可能性もあるのでここで整理しておこうと思います。

## CPUアーキテクチャにはCISCとRISCの２種類が存在する
CPUには大きく分けてCISC(シスク)とRISC(リスク)の２種類が存在します。
CISC、RISCとは、命令セットアーキテクチャの設計手法を指す言葉です。もっと簡単にいうと、命令の仕方の違いを表しています。

### CISC(Complex Instruction Set Computer)
日本語に訳すと「複雑命令セットコンピュータ」となります。
複雑命令とは、1つの命令が一連の複雑な処理を実行する方式です。
x86，x86_64といったものがあります。

#### x86
x86はPCのビット数が**32bit**のものを表します。
PCのビット数とは頭脳部分であるCPUが扱う情報量を示します。

#### x86_64
x86_64はx86を**64bit**に拡張させたものを表します。
他に**x64,amd64**とも呼ばれます。

#### x86アーキテクチャを採用している企業
x86のアーキテクチャを採用している企業は、有名どころだと**Intel社**と**AMD社**です。
Intel社の有名な商品には、**Xeon、Core、Pentium、Celeron**などがあります。
AMD社の有名な商品には、**Ryzen、Athlon、Optelon**などがあります。

### RISC(Reduce Instruction Set Computer)
日本語に訳すと「縮小命令セットコンピュータ」となります。
縮小命令とは、１つの命令が簡単な処理しか行わない方式です。
armはRISCです。

#### arm
armにはバージョンがあり，**ARMv7**と**ARMv8**があります。

#### ARMv7
以前のバージョンのARMv7はPCのビット数が**32bit**のものを表します。

#### ARMv8
今のバージョンのARMv8は**AArch32(32bit)**と**AArch64(64bit)** の２種類があります。
Linuxでは**AArch32のアーキテクチャをarm**と表記し，**AArch64をarm64**と表記しています。

#### armアーキテクチャを採用している企業
armのアーキテクチャを採用している企業は、有名どころだと**ARM社**です。

## 自分のPCのCPUアーキテクチャを調べる
CPUアーキテクチャの整理が大体できたところで自分のPCのCPUアーキテクチャを調べてみます。
### Rosettaを使用しない場合
まずはFinderから「アプリケーション」のタブを選択し、使っているターミナルアプリケーションの上で右クリックして、「情報を見る」を選択して下さい。「Rosettaを使用して開く」という項目に**チェックが入っていない**ことを確認して下さい。

ターミナルで```uname -m```コマンドを実行してみて下さい。
```
$ uname -m
arm64
```
arm64と出力されたので、MacBook Air(M1, 2020)はARMv8のAArch64(64bit)であることが分かりましたね！

### Rosettaを使用した場合
今度も同じようにFinderから「アプリケーション」のタブを選択し、使っているターミナルアプリケーションの上で右クリックして、「情報を見る」を選択して下さい。「Rosettaを使用して開く」という項目に**チェックを入れて下さい**。そして使っているターミナルアプリケーションを再起動します。

同じくターミナルで```uname -m```コマンドを実行してみて下さい。

```
$ uname -m
x86_64
```
x86_64と表示されたので、MacBook Air(M1, 2020)はx86_64として認識されました！
同じPCなのにCPUアーキテクチャが別のCPUアーキテクチャとして認識されました。これはなぜでしょう？それはRosettaというものを使用しているからです。

## Rosettaとは
**RosettaとはIntelプロセッサ搭載Mac(M1以前のMac)用に開発されたアプリケーションをAppleシリコン搭載Mac(M1, M2など)でも使えるようにするためのアプリケーションです。**

このアプリケーションはユーザーが開いたり操作したりするものではなく、自動的にバックグラウンドで動いてくれるアプリケーションで、Appleシリコンで使えるようにAppを自動変換してくれます。

つまり、ターミナルアプリケーションをRosettaを使用して開くことにより、arm64アーキテクチャをx86_64アーキテクチャだと認識して表示してくれていたということですね。(実際にCPUのアーキテクチャが変換されているわけではありません。)

## Rosettaを使用して再びVirtual Boxをインストールしてみる
ターミナルアプリケーションの「Rosettaを使用して開く」という項目にチェックが入ったまま最初と同じようにVirtual Boxをインストールしてみます。

```
$ brew install --cask virtualbox
```

```
==> Downloading https://raw.githubusercontent.com/Homebrew/homebrew-cask/8290ef0
Already downloaded: /Users/leminhthientoan/Library/Caches/Homebrew/downloads/f8c3d1134ba4b9df0f82b944132ac0b0aca3df829588d69591bf17185b700836--virtualbox.rb
==> Downloading https://download.virtualbox.org/virtualbox/7.0.12/VirtualBox-7.0
######################################################################### 100.0%
==> Installing Cask virtualbox
==> Running installer for virtualbox with sudo; the password may be necessary.
Password:
installer: Package name is Oracle VM VirtualBox
installer: choices changes file '/private/tmp/choices20231023-7920-zyiodv.xml' applied
installer: Installing at base path /
installer: The install was successful.
🍺  virtualbox was successfully installed!
```
今度はインストールできたようですね！
Rosettaを使用したことにより、Intelプロセッサ搭載Mac(M1以前のMac)用に開発されたアプリケーションをAppleシリコン搭載Mac(M1, M2など)でも使用できるようにAppを自動変換してくれていたのです。
現在のM1Macはx86_64アーキテクチャとして認識されていますから、問題なくインストールできたというわけです。

## まとめ
少々長くなってしまいましたが、Virtual BoxをMacBook Air(M1, 2020)にインストールすることを通して、CPUアーキテクチャの違いについて整理しました。
CPUアーキテクチャはCISCとRISCの2つに大別できます。
CISCにはx86やx86_64などのCPUアーキテクチャがあり、Intel社やAMD社が有名です。
x86_64はx64やamd64と呼ばれることもあります。
RISCにはarmやarm64などのCPUアーキテクチャがあり、ARM社が有名です。

### 補足
今回は仮想化アプリケーションにVirtual Boxを使ってみましたが、検索してみるとAppleシリコンのMacでは、UTMという仮想化アプリケーションを使用している記事が散見されました。
ただのLinuxの学習目的ならVirtual Boxに固執する必要はなく、UTMを使ってみるのも手かもしれません。自分も時間があったら使ってみようと思います。

## 参考
https://edn.itmedia.co.jp/edn/articles/1404/07/news001.html

https://qiita.com/rihib/items/6b70361b48c3840d09b0