【CentOS7】仮想環境でyumが使えない問題を解決

# 結論
ゲストOSから外部へアクセスする際に、**ネットワークインターフェースを有効化**していなかった。
> ネットワークインターフェース 
→ 通信するときの規約、設定事項のこと

# 経緯
1. `Virtual Box`に`CentOS7`を入れる（UTMなどの他の仮想環境も同様）
1. Linux操作で`tabキー`の補完が効かない事を知る
1. `yum`で`bash-completion`をダウンロード
1. エラーが起こってダウンロードができない


# 該当のソースコード
```shell:Terminal
yum install bash-completion
```

# エラー文
```shell:error
Cannot find a valid baseurl for repo base/7/x86_64
```

# 原因

**DNSの名前解決**ができていないみたいだった。

> 例えば、googleのトップページ（ https://google.com ）をIPアドレスに直すと
[172.217.161.46](http://172.217.161.46)
となり、実際にアクセスしてもらうとそのページに遷移してくれる。
その`google.com`のような文字列を192.168.?.?みたいなIPアドレスに直してくれるやつを**DNS**といい、変換することを**名前解決**という。

pingを打って通信ができているか試してみる

```bash:Terminal
ping google.com

>>> ping: google.com: Name or service not known 
```
確かにうまくいかなかった。

# 試したこと

## DNSサーバーのIPアドレスの設定ファイルをいじる
googleがDNSサーバーを運用していて、しかも自由に使えるパブリックDNSサービスとなっているため使わせてもらう。

```bash:/etc/resolve.conf
# 追加
nameserver 8.8.8.8
```

再起動してやり直すも効かず。

https://studyinfra.net/linux/error-centos7-cannot-find-baseurlforrep/#%E3%80%90%E5%8E%9F%E5%9B%A0%E3%80%91DNS%E8%A8%AD%E5%AE%9A%EF%BC%88%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%90%8D%E3%81%AE%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA%EF%BC%89%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%AA%E3%81%84

## ネットワークインターフェースをいじる

### DNSの指定
```bash:/etc/sysconfig/network-scripts/ifcfg-eth0
#　追加
DNS1=8.8.8.8
# こいつは代替DNS
DNS2=8.8.4.4
```
再起動して試すも撃沈

https://teratail.com/questions/189439

### イーサネット設定をいじる
実は自分の環境では複数のイーサネット設定ファイルが存在した
```bash:
ls /etc/sysconfig/network-scripts
```
そのうちの1つが`/etc/sysconfig/network-scripts/ifcfg-enp0s3`ってファイルで、そこにはいろんな設定が書き込まれていた。

```bash:/etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
...
...
ONBOOT=off
```
この、`ONBOOT`ってやつを「on」に変えてみるといいらしい。
```bash:Terminal
cat /etc/sysconfig/network-scripts/ifcfg-enp0s3 | grep ONBOOT | sed -i 's/no/yes/' && systemctl restart network
```

> 再起動は手間なので、コマンドでrestartする。
grepで`ONBOOT`のみをしっかり取り出さないと、他のnoになってる項目がyesになってうまく動かないかも。
sedのiオプションが上書きなので、注意して使う必要がある。

無事名前解決、yumもしっかり動いたよ。

https://python-konbu.hateblo.jp/entry/2018/03/27/033253

---
`ONBOOT`が一体なんなのかというと、「**デバイスが起動したときに、この設定ファイルを有効化しますか？（yes/no）**」って意味だったっぽい。
Linuxを立ち上げたときに、この`ONBOOT`が`on`になっているファイル（今回は`/etc/sysconfig/network-scripts/ifcfg-enp0s3`）で通信を行うってことか。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s1-networkscripts-interfaces

最初からonにしてくれてもいいじゃんって思ったら、ホームディレクトリになぜかインストール初期からあった`anaconda-ks.cfg`ファイルに`off`にするような記述があった。

```bash:anaconda-ks.cfg
...
# Network information
network  --bootproto=dhcp --device=enp0s3 --onboot=off --ipv6=auto --no-activate
network  --hostname=localhost.localdomain
...
...
```
やられた。。

https://qiita.com/miyuki_samitani/items/d0b4a60bdef573e57687

# 結果
まとめると、
1. `yum`が`bash-completion`を**ダウンロードできなかった**。
1. `bash-completion`をダウンロードするurlを見つけたはいいけど、**DNSサーバーが名前解決（IPアドレスに変換）できてなかった。**
1. イーサネット設定ファイル（通信規約）が`ifcfg-eth0`ではなく、自分の場合は`ifcfg-enp0s3`だった
1. システム起動時に設定ファイルを有効化する`ONBOOT`が`off`だった
1. offになっているのは、OSインストール時に勝手に作られる`anaconda-ks.cfg`の仕業だった

こんな単純なミスなのに、この遠回り具合がプロダクト作る時と違って慣れない。。


# 反省
何がどう動いているのかと疑問に思ったことはしっかり学ぼうと思いました、反省。

# 終わりに

よくよく考えればいろんなサイトにいろんないい情報が載ってるんだけど、「**`yum`コマンドが動かない**」から派生して考えるのが難しかった。
誰かの参考になることを祈っております。

https://qiita.com/liqsuq/items/50173a587029e5d6ca23

https://atmarkit.itmedia.co.jp/ait/articles/1612/01/news180.html

# ちなみに
ほんとはコマンドを打ち終わった後に、**複数ファイルがあったら`tabキー`で候補を切り替える機能**が欲しかったんだけど、`bash-completion`は途中までコマンドを打ったらその後を補完してくれる機能だったっぽくて自分の求めてるものじゃなかった。