M1 Mac + VMware Fusion + Ubuntu Server (ARM) でaptを使えるようにした備忘録(日記)

# 事の発端
VMwareにUbuntuをインストールしてC言語やっちゃうぞ❣️と思ってたらgccインストールできなくて詰んでました
多分また同じことをやらかすので自分用に残しときます


# 使ってるもの
・MacBook Pro(Apple M1/Macintosh HD/Sequoia 15.5)
・VMware Fusion(13.6.3)
・ubuntu 64bit ARM server 24.04.2(iso)


# 何がしたくて何ができなかったのか
・Ubuntuをインストールして，CUIで操作したかった(かっこいいから)
・hello world表示をc言語で行いたかった
・そのためにsudo apt install gccを実行すると，「Unable to locate package gcc」となる
・**sudo apt updateを何回やってもダメ**


# sudo apt updateのエラー原因
実際にトライした順にダラダラと書いていくので先に結論を示しておく．

## 結論
・仮想マシンのネットワーク未接続問題
・DHCPでIPが取れていない
・netplanファイルが無い(手動で作成)

ここから何をやったか以下に示す．

## 対処1.DNSを機能させる
ここら辺からchatGPTに聞くと，
```
pinc -c 3 google.com
```
を実行してみてほしいと言われたので素直に実行．
結果は
```
Temporary failure in name resolution
```
となった．

子曰く，**DNSが機能していない**ことになるらしい．

これをなんとかするために，以下の手順でDNSを手動固定した．
上書きを無効化する場合としない場合でやり方が異なるので，①〜③くらいで以下のように分岐後，④に戻ってきてほしい．

### 上書きを無効化する場合
#### ①"/etc/resolv.conf"のシンボリックリンク(自動生成)を削除．
ファイルの上書きが無効化されている状態を解消．
```
sudo rm /etc/resolv.conf
```
#### ②新しくDNS設定ファイルを作成．
```
echo -e "nameserver 8.8.8.8\nnameserver 1.1.1.1" | sudo tee /etc/resolv.conf
```
#### ③書き込まれたか確認
```
cat /etc/resolv.conf
```
出力が以下のようになっていればok.
```
nameserver 8.8.8.8
nameserver 1.1.1.1
```

### 上書きを無効化せず進む場合
#### ①'
```
sudo nano /etc/resolv.conf
```
#### ②'中身全消去からの以下の文に書き換え
```
nameserver 8.8.8.8
nameserver 1.1.1.1
```
ctrl+X→enterで保存．

### 書き換え終了後
#### ④再度通信確認
```
ping -c 3 google.com
```

### ‼️上の①で以下のエラーが出た場合
```
sudo:unable to resolve host server:tem @ prary failure in name resolution
```
#### ①仮想マシンのホスト名を確認
```
hostname
```
#### ②"/etc/hosts"を開いて以下の行があるかを確認
```
sudo nano /etc/hosts
```
出力例↓
```
127.0.0.1  localhost
127.0.1.1  [[hostnameの出力]]
```

## 対処2.仮想マシンのネットワークを使えるようにする
私の場合，そもそもVMwareでこの仮想OSを起動した時点で，VMware側から
**「仮想デバイス[Ethernet0]は切断された状態で起動しています」**
とエラーが出てきていた．
解決方法を以下に示す．

#### ①シャットダウン(仮想OS)
```
sudo shutdown now
```
でシャットダウンしてもいいし，VMwareから操作しても良い．

#### ②VMwareで該当マシンの設定を開く

#### ③「ネットワークアダプタ」を選択
③-1　「ネットワークアダプタを接続」チェックボックスにチェックをいれる
③-2　「ブリッジされたネットワーキング」を選択(**自動検出**or**Wi-fi**)

#### ④仮想マシンを起動後，以下のコマンドで実行結果確認
```
ip a
```
私の場合，実行結果は，
```
1:lo ~~~
    inet xxx.xxx.x.x
    ~~~
    ~~~
    inet6 xxx.xxx.x.x
2:ens160 ~~~
    ~~~
```
だった．
この時，**ens160の方に「inet」が表示されていないといけない**が，ないのでIPアドレスをそもそも仮想マシンが貰えていないことが発覚．
表示されていれば以降の行程は飛ばして良い．多分．

#### ⑤手動でIP取得を試す
```
sudo dhclient ens160
```
これでうまくいく人もいるかもだが，私の場合はコンピュータくんから
「sudo dhclient : **command not found**‼️😁✋」
と言われたのでさらに以下の工程を踏む．

#### ⑥netplanを使って手動でip取得させる
⑥-1 設定ファイルを確認
```
ls /etc/netplan/
```
⑥-2 .yamlファイルを編集
```
network:
    version: 2
    ethernets:
        ens160:  # ここの名前はip aで確認した名前
            dhcp4: true
```
⑥-3　設定を反映
```
sudo netplan apply
```

と，進むはずだった．
⑥-1で本来なら.yamlファイルが出るらしいが，私は出なかったので出なかったので更に色々とやる．だいぶややこしくなっているのは本当に申し訳ない．
ちなみにこれがネットワーク設定ファイルが一切用意されていない状況である．

## 対処3.ネットワーク設定ファイルが一切ないので作る
#### ①設定ファイルの新規作成
```
sudo nano /etc/netplan/01-network.yaml
```
#### ②内容を書き込む
```
network:
    version: 2
    ethernets:
        ens160:  # ここの名前はip aで確認した名前
            dhcp4: true
```
#### ③保存
多分ctrl+x→Enterでいけると思う．
#### ④設定を適用
```
sudo netplan apply
```
‼️ここで警告が以下のように出る場合がある
```
permissions for /etc/netplan/01-network.yaml are too open. Netplan configuration should NOT be accessible by others
```
なんかこれはアクセス権限が緩いからセキュリティとしてよろしくないよ〜んってことらしいが設定には影響しないらしいので話を進める．
解消したい場合は
```
sudo chmod 600 /etc/netplan/01-network.yaml
```
を実行．
#### ⑤IPアドレスが取れたかの確認
```
ip a
```
結果として，ens160のところに「inet 192.168.x.x」のような項目があればOK.
#### ⑥DNSで名前解決できるか
```
ping -c 3 google.com
```
多分以下のようになれば成功．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821883/9c900b7d-ae77-41ce-a5c8-9c699ce5a8c6.png)

成功したら次に進む．ここで成功してしまったので，成功できなかった方は各自でこれ以降は調べてほしい．
だが，道中で結構ほぼ詰みかけていたので，もしかするとこれ以上はもう本当にどう足掻いても無理かもしれない．力になれず申し訳ない．
#### ⑦aptのアップデート，インストール
念願のコードを実行．
```
sudo apt update
sudo apt install gcc
```

これで，動くように，なりました．
長すぎて草　お疲れ‼️😭🫶😭


# あとがき
本当に長かった．
chatGPTを実はお供に頑張っていたけど，そもそもGPTくん曰くM1 Mac+ARM Ubuntu+VMwareのケースは少ないらしい．
本当に日記みたいな書き方になったのでQiitaとしては適切では無いかもしれないけど残しておきます．
もしこここう書いた方が良いかもとかあったら教えてください．じゃ‼️😘