Windows10にUbuntu20.04入れて開発を始める方法

#環境
OS：Windows10 HOME 64bit
SHELL：PowerShell Version 5.1.19041.610

基本的にPowerShellは管理者権限で起動してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/517326e2-a072-5b66-ee31-1fca6ed0fdce.png)

powershell と入力してから管理者として実行を押すと下のような確認画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/a7d8d492-418b-5858-a6b7-614d0bed36ab.png)

管理者権限のダイアログが開くので はい を選択してください。

#使用するもの
Chocolatey 0.10.15　ー パッケージマネージャー
VirtualBox 6.1.18　ー 仮想環境を構築するためのソフト
Vagrant 2.2.14　ー VirtualBox の操作を簡単にしてくれるツール
Rlogin 2.25.0　ー 仮想環境に入るためのSSH クライアント
Ubuntu 20.04　ー Linuxのディストリビューション

#1. Chocolateyの導入

Chocolatey の[公式サイト](https://chocolatey.org/install)にアクセスします。
以下のコードをコピペして管理者権限で開いたPowerShellで実行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/5a911374-0d6b-3e0b-c87d-4299cd95c45b.png)


めんどくさがりなあなたのためにコードを貼っておきました。↑と同じものです。

```
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

ダウンロードが完了したら choco と打って実行してみてください。
以下の画像のようになっていたら成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/51871ccd-41a0-ff10-8a25-7272824ae4d1.png)

ちなみにChocolateyの使い方を詳しく知りたい方は以下の記事をご覧ください。
[chocolatey 基本情報まとめ](https://qiita.com/NaoyaOura/items/1081884068fe3ea79570)

#2. VirtualBox・Vagrant の導入

まず VirtualBox を入れます。

```
choco install virtualbox
```
↑のコマンドを実行してください。
※実行中に赤色で大量のメッセージが表示されますが、それが正常なのでご安心を。


続いて Vagrant を入れます。

```
choco install vagrant
```

↑のコマンドを実行してください。

実行が完了したらWindowsの再起動が必要なので再起動を行ってください。

ちなみに、以下のコマンドでも再起動できます。
※ただし、実行した瞬間に再起動が始まるので、他のソフトを起動しているときなどはご注意ください。

```
Restart-Computer
```

再起動が完了したら以下のコマンドを実行して、VirtualBoxとVagrantが正しくインストールされているか確認してください。

```
choco list -localonly
```

こんな感じで表示されていたら成功です。

```
Chocolatey v0.10.15
chocolatey-core.extension 1.3.5.1
vagrant 2.2.14
virtualbox 6.1.18
```

#3. Ubuntu20.04の導入

Ubuntuを入れます。

Ubuntuを入れるディレクトリを作成してください。
おすすめは
`PS C:\Users\あなたのユーザ名\`
↑のディレクトリの中に`ubuntu20.04`などのディレクトリを作ってそこで作業すると良いと思います。

ちなみにめんどくさい人は以下を実行したら筆者が紹介したディレクトリ構成になります。

```
mkdir ~\ubuntu20.04
cd ~\ubuntu20.04
```

※ここから先の内容は基本的に`PC C:\Users\あなたのユーザ名\ubuntu20.04`に移動している状態で行ってください。ubuntu20.04のところは別に他の名前でも良いです。

[Vagrant Cloud](https://app.vagrantup.com/boxes/search)というサイトで`Ubuntu 20.04`と検索してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/da2cd718-b5e2-256f-82bb-dead25356666.png)

こんな感じで出てくるので、とりあえず一番上のgeneric/ubuntu2004を選択しましょう。
（多分下のやつでもいいと思いますが、ダウンロード数が多いやつの方が信頼度が高いと判断しました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/08194c1c-471a-ca0a-efc8-f6f1d84633d3.png)

Newをクリックして出てきたコードを実行しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/5a1c2ac4-a0b9-b6b7-4172-2b077be3c497.png)

これまた、めんどくさがりなあなたのためにコードを貼っておきますね。

```
vagrant init generic/ubuntu2004
vagrant up
```

これで仮想環境のマシンに電源が入りました。

```
vagrant status
```

一応 Vagrant の起動確認のため↑のコマンドを実行してください。
以下のように表示されていたら、成功です。。

```
default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
```



#4. Rlogin の導入

Rloginをいれます。

```
choco install rlogin
```

インストールが完了したら、以下のコマンドを実行してRloginを開きましょう。

```
rlogin
```

起動したら`新規`をクリックしてください。
以下のような画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/27af4c2e-869b-42a4-f85c-c41b26b9c857.png)

ここで一旦 PowerShellに戻って、以下のコマンドを実行してください。

```
vagrant ssh-config
```

すると以下のような感じで表示されます。
※表示されない人はVagrantが立ち上がっていないので`vagrant up`を実行してください。

```
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/Users/ユーザー名/ubuntu20.04/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

表示された内容をもとにRloginの設定を埋めます。

- エントリー（上）← `vagrant`と入力
- プロトコル ← `ssh`を選択
- ホスト名（サーバー IP アドレス）: `localhost`を選択
- TCP ポート : ↑で表示されたPortの番号（多分2222か2000です。）を入力
ログインユーザー名 : ↑で表示されたUser名（今回は vagrant ）を入力
- SSH 認証鍵 :↑で表示されたIdentityFileがカギの場所なので、そこを選択してください。
- デフォルト文字セット : `UTF-8`を選択

以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/01706b70-92c2-be23-b060-9b45d64cc624.png)

ssh認証鍵はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/6ba74545-a893-4c52-31c9-274a2ddcad34.png)

全て埋めれたらOKを選択し、追加されたところをダブルクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/7d96a4d9-4a64-fbda-9d77-696a7e303554.png)

ダブルクリックすると以下のように表示されますが`接続する`を押してください。
（緑の進捗バーは気にせずに押してもらって大丈夫です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/54979cb8-87b6-d1ef-389f-2fde2262210a.png)

すると、こんな感じのが表示されるので`はい`を選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440704/9834a7d9-b243-7731-a343-ced70a27db65.png)

ubuntuが起動したら日本語化のため以下のコマンドを実行してください。

```
sudo locale-gen ja_JP.UTF-8
echo export LANG=ja_JP.UTF-8 >> ~/.profile
source ~/.profile
sudo timedatectl set-timezone Asia/Tokyo
```

実行が完了したら`date`と打ってください。
以下のように表示されれば成功です。

```
date


2021年  4月  1日 木曜日 11:44:22 JST
```

#5. Vagrantfileの編集

/ubuntu20.04（vagrant initを実行したディレクトリです）のディレクトリの中にVagrantfileなるものが存在しています。

vscodeなどのエディターを開いて以下の内容に変更してください。


仮想化された Ubuntu のポートへの通信を、実際に使っている Windows のポートに転送するために27行目くらいに以下を追加してください。
```
config.vm.network "forwarded_port", guest: 8000, host: 8000
```

また、35行目くらいの以下の内容をコメントの#を外してください。
これは、固定ipを指定するもので既存の設定だとubuntuのlocalhostでサーバーが立ち上がってしまい、ホスト（windows）からlocalhostに接続しても接続できません。なので、以下のように固定ipをしていています。別に変更してもらっても大丈夫です。

※railsやlaravelなどで開発用のサーバーを立てて開発を進める場合には必ずオプション指定でここで指定した`192.168.33.10`で立てるようにしてください。（自分はこれに気が付くのに3~4時間くらいかかりました笑）お気をつけて・・・。

```
config.vm.network "private_network", ip: "192.168.33.10"
```


ubuntu内のフォルダーを同期するために47行目くらいに以下の行を追加してください。
ちなみに、ここではworkspaceとしていますが好きな名前に変えてもらって大丈夫です。
ここで使用するフォルダーはあらかじめ/ubuntu20.04/workspaceのようにフォルダーを作っておいてください。

```
config.vm.synced_folder "./workspace", "/home/vagrant/workspace"
```

仮想マシンで利用できるメモリの量を増やすために52~58行目くらいを以下のように変更してください。
```
 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
```

一応自分の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 = "generic/ubuntu2004"

  # 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
  config.vm.network "forwarded_port", guest: 8000, host: 8000
  # 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"
  config.vm.synced_folder "./workspace", "/home/vagrant/workspace"
  # 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

```

変更を保存したら、Rloginからの接続を切るためにubuntuで以下のコマンドを実行してください。
※PowerShellじゃなくてubuntuの方です。

```
exit
```

完了したらPowerShellの方で以下のコマンドを実行しVagrantを再起動してください。

```
vagrant reload --provision
```

最後にもう一度Rloginを立ち上げて`ls`コマンドで先ほど同期したファイルがubuntuの中に入っているか確認してください。
※PowerShellじゃなくてubuntuで実行してください。

```
ls

workspace ←　さっき同期させたファイル名
```

表示されたら同期されているかの確認のためにファイルを作って確認して見ましょう。

```
cd workspace
touch a
```

Windowsで　`PC C:/Users/ユーザー名/ubuntu20.04/workspace/`の中を確認して`a`というファイルが作成されていれば成功です！

#さいごに
久しぶりにQiitaを書きました。
というか環境構築系の記事は初めて書いたのですがめっちゃ時間かかる(笑)
なんと2時間13分かかりました(笑)

Qiitaにたくさん投稿している人は本当にすごいですね（痛感）
先人の皆様に感謝する限りでございますorz
昨日の技育CAMPでアウトプットが大切と聞いたので早速やってみました。
頑張って、つよつよ　で　てぇてぇ　エンジニアになりたいものです。

あと何か質問・疑問、訂正ありましたらコメントお願いします！
そして、LGTMしてくださるとやる気が・・・・・でます！

ありがとうございました！！