ローカルPC上にLinux仮想環境を構築する

## 経緯
ドットインストールで「[git入門](https://dotinstall.com/lessons/basic_git)」の学習をしようとしたところ、Linux環境が必要とのことだったため構築。
何年か前に一度構築したことがあったが、手順は完全に頭から消えていた。

一番参考になったのはこちらのページ。わかりやすい。
[【Linux環境構築】VagrantとVirtualBoxとは？使い方を初心者向けに解説！](https://kitsune.blog/linux-environment)

## 環境
ローカルPCのOS：Windows10
仮想マシンのOS：CentOS 7.0

## VirtualBoxをインストール
よくわからないが、とりあえず言われるがままに謎の箱をインストール。

https://www.virtualbox.org/

ローカルPCはWindows10なので、Windows hostsを選択。

## Vagrantをインストール
こちらもよくわからないまま、インストール。

https://www.vagrantup.com/

HashiCorpという会社が開発しているらしく、めっちゃ日本っぽいやんと思ったら、創業者のMitchell Hashimotoはやはり日本人の血が入っているらしい。すげぇ。

ダウンロードページで、Windows用を選択。（ダウンロードに30分～1時間くらいかかった）

## Vagrantの環境準備
まずはコマンドプロンプトを開いて、Vagrantがインストールされていることを確認。

```hoge:コマンドプロンプト
> vagrant -v
```

Vagrant 2.2.14みたいなバージョンの数字がでればOK。

次に、フォルダをつくります。
なんとなくCドライブ直下にしました。

```hoge:コマンドプロンプト
> mkdir C:\vagrant
```

## CentOSのインストール
仮想環境として利用したい無償OSを探して、Vagrantの中にインストールします。

http://www.vagrantbox.es/

この中から適当に選んで、「Copy」ボタンを押してダウンロード用のURLをコピーしてきます。

VirtualBox用とも書いててそれっぽいこちらを選んでみました。
CentOS 7.0 x64 (Minimal, VirtualBox Guest Additions 4.3.28, Puppet 3.8.1 - see here for more infos)

もう一度コマンドプロンプトを開き、先ほど作成したフォルダに移動します。

```hoge:コマンドプロンプト
> cd C:\vagrant
```

Vagrantに仮想マシン（OS）をインストールします。

```hoge:コマンドプロンプト
> vagrant box add centos-7.0 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
```

addの後ろの「centos-7.0」はなんでもいいみたい。
URL部分はコピーしてきたものを貼り付けてください。

Progressが100%になって、Successfully added box 'centos-7.0' (v0) for 'virtualbox'!みたいなのが出たらインストール完了です。

再度コマンドプロンプトを開いて、Vagrantの初期化を行うコマンドを実行します。（「centos-7.0」はインストール時に付けた名前）

```hoge:コマンドプロンプト
> cd C:\vagrant　　（念のため）
> vagrant init centos-7.0
```

すると、C:\vagrantにVagrantfileなるものが作成されます。


作成されたVagrantfileをテキストエディタ（メモ帳でもなんでもOK）で開き、修正していきます。

修正するのは1ヶ所で、「config.vm.network "private_network", ip: "192.168.33.10"」の前の#を消すだけ。

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "centos-7.0"

  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
  # `vagrant box outdated`. This is not recommended.
  # config.vm.box_check_update = false

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine and only allow access
  # via 127.0.0.1 to disable public access
  # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"  ←ここのコメントアウト(#)を外す

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  # config.vm.network "public_network"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Enable provisioning with a shell script. Additional provisioners such as
  # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end
```

## 仮想マシンを起動
こちらのコマンドで仮想マシンを起動します。

```hoge:コマンドプロンプト
> vagrant up
```

ところが、ここでエラーが発生。。

```
Stderr: VBoxManage.exe: error: Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter #2' (VERR_INTNET_FLT_IF_NOT_FOUND).
VBoxManage.exe: error: Failed to attach the network LUN (VERR_INTNET_FLT_IF_NOT_FOUND)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
```

ググったところ、こちらの記事の手順で解消できました。

[VirtualBox で Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Adapter' が出た時の対処](https://qiita.com/ExA_DEV/items/ae80a7d767144c2e1992)

再度気を取り直して、vagrant upを実行すると、VirtualBoxにマウントできたみたいな内容のログが吐かれた。

仮想マシンの起動完了。


## Vagrantから仮想マシンにログイン
vagrant upした後に、こちらのコマンドを実行。

```hoge:コマンドプロンプト
> vagrant ssh
```

こんな感じで表示されたらログインできてます。

```hoge:コマンドプロンプト
> vagrant ssh
c:\vagrant>vagrant ssh
Last login: Thu Jul 16 08:48:31 2015 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$
```

例えば、pwdとかしてみると、カレントディレクトリがわかりました。

```
[vagrant@localhost ~]$ pwd
/home/vagrant
[vagrant@localhost ~]$
```

ちなみに、初期のユーザとパスワードはこのようになってるようです。

| ユーザー | パスワード |
|:------- |:----------|
| vagrant | vagrant   |
| root    | vagrant   |

ログアウト（exit）して、仮想マシンを停止（vagrant halt）しておきます。

```hoge:コマンドプロンプト
[vagrant@localhost ~]$ exit
Abgemeldet
Connection to 127.0.0.1 closed.

c:\vagrant>vagrant halt
==> default: Attempting graceful shutdown of VM...

c:\vagrant>
```

## VirtualBoxから仮想マシンにログイン
WindowsのスタートメニューからVirtualBoxを開きます。

![2021-02-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433879/d546a91b-8d66-a15d-a823-9ac462947046.png)

開くとvagrant～みたいなマシンが選択できるようになっているので、起動を押すとターミナルが開いてログインできます。

## 仮想マシンの言語設定
まずは、localeコマンドで今の言語がどのように設定されているか（環境変数）を確認します。

```hoge:コマンドプロンプト
[vagrant@localhost home]$ locale
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
```

なぜかドイツ語っぽいので、英語に変更します。


```hoge:コマンドプロンプト
[vagrant@localhost home]$ LANG=C
```

LANGという環境変数をC（英語）にするというような意味らしいです。

```hoge:コマンドプロンプト
[vagrant@localhost home]$ locale
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
```

これで英語になりました。

## 仮想マシンの時刻設定
dateコマンドで時刻を表示してみます。

```hoge:コマンドプロンプト
[vagrant@localhost home]$ date
Thu Feb  4 14:06:59 CET 2021
```

CET（中央ヨーロッパ時間）になってます。
タイムゾーンでも確認してみます。

```hoge:コマンドプロンプト
[vagrant@localhost home]$ timedatectl status
      Local time: Thu 2021-02-04 14:20:54 CET
  Universal time: Thu 2021-02-04 13:20:54 UTC
        Timezone: Europe/Berlin (CET, +0100)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: no
 Last DST change: DST ended at
                  Sun 2020-10-25 02:59:59 CEST
                  Sun 2020-10-25 02:00:00 CET
 Next DST change: DST begins (the clock jumps one hour forward) at
                  Sun 2021-03-28 01:59:59 CET
                  Sun 2021-03-28 03:00:00 CEST
```

やはりヨーロッパっぽいので、日本のタイムゾーンに変更します。（途中でrootユーザのパスワードを入力する必要があります。）

```hoge:コマンドプロンプト
[vagrant@localhost home]$ timedatectl set-timezone Asia/Tokyo
==== AUTHENTICATING FOR org.freedesktop.timedate1.set-timezone ===
Authentication is required to set the system timezone.
Authenticating as: root
Password:
==== AUTHENTICATION COMPLETE ===
[vagrant@localhost home]$
```

もう一度タイムゾーンを確認すると、、

```hoge:コマンドプロンプト
[vagrant@localhost home]$ timedatectl status
      Local time: Thu 2021-02-04 22:23:59 JST
  Universal time: Thu 2021-02-04 13:23:59 UTC
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
[vagrant@localhost home]$ date
Thu Feb  4 22:24:49 JST 2021
```

日本時間になりました。