Windows10のHyper-vにUbuntuをインストールしてそこにLAMP環境を作りました

Hyper-vを使えるようにする
まずWindows10でHyper-vを使えるようにします。
Hyper-vはWindows10 Proで利用できますがHomeではできないので気をつけてください。
「Windowsメニュー」ー「設定」ー「アプリ」を開いて、「アプリと機能」画面の右にある「プログラムと機能」をクリックします。

「プログラムと機能」画面の左にある「Windowsの機能の有効化または無効化」をクリックします。

Windowsの機能の有効化または無効化の画面で、Hyper-vにチェックを入れてOKを押して有効化します。

これでWindowsを再起動するとHyper-vが使えるようになっています。
もし、ここでHyper-vがグレーアウトしていてチェックを入れられない状態のときは、PCのBIOS設定でVirtualization Technologyを有効にする必要があります。
BIOS設定方法は各PCメーカーや機種によって異なりますが、Virtualization Technologyの有効/無効設定は、大きくIntelのCPUを搭載しているものとAMDのCPUを搭載しているもので設定名が違います。
ここでは設定名の違いについてだけ説明します。
IntelのCPUを搭載しているPCの場合は設定名が「Intel VT」となっていると思います。
もしくはIntel(R) Vertualization Technologyと書かれているかと思います。
AMDのCPUを搭載してるPCの場合は設定名が「AMD SVM」となっているかと思います。
もしくは AMD-Vと書かれているかと思います。
BIOS設定したあと再度Windows10を起動して設定を行ってください。
Ubuntu用仮想マシンの作成
WindowsメニューからHyper-vマネージャーを起動します。

Hyper-vマネージャーの画面で「操作」ー「新規」ー「仮想マシン(M)」を選ぶと、仮想マシンの新規作成ウィザードがはじまります。

ウィザードの「開始する前に」では「次へ」を押して進みます。

「名前と場所の指定」ではインストールするOS名を入れます。
ここではubuntu20.04としています。

「世代の指定」では第2世代を選択します。

「メモリの割り当て」ではOS推奨の最小限より大きい値を指定するので、ここでは4GBとしています。

「ネットワークの構成」ではDefault Switchを選択します。

「仮想ハードディスクの接続」ではそのまま「次へ」で進んでもよいですが、仮想ハードディスクのファイル名や保存場所とサイズを指定することができます。

「インストールオプション」では、先程ダウンロードしたUbuntuのisoイメージファイルを設定します。
参照ボタンを押してisoイメージを指定します。

「仮想マシンの新規作成ウィザードの完了」で完了ボタンを押して終了します。

Ubuntuのインストール
ここでは現時点で最新のUbuntu20.04LTSをインストールします。
Ubuntu公式サイトからISOイメージをダウンロードします。
URL:https://ubuntu.com/download/desktop

仮想マシンを起動するとインストールは始まりますが、その前にいくつかの設定をしておく必要があります。
Hyper-vマネージャーの画面で作成した仮想マシンを選択し、「操作」ー「設定」をクリックします。

表示された設定画面の「セキュリティ」を選択し、「セキュアブートを有効にする」のチェックを外します。
セキュアブートが有効だと、ダウンロードしたISOイメージファイルからの起動ができないのでこれを無効にします。

「メモリ」を選択し動的メモリの最大RAMを16384MB(16GB)に設定します。
デフォルトの数値が大きいので、あまりに多くのメモリ量を確保すると他にも影響がありそうなので、最大RAMを小さくしました。
ここは自由に数値を変えても変えなくてもいいと思います。

「プロセッサ」を選択し仮想プロセッサの数を変更します。
デフォルトだと1なので、ここでは2にしました。
これも自由に数値を変えなくてもいいし、4など数値を増やしてもいいと思います。

「統合サービス」を選択しゲストサービスにチェックを入れて有効にします。

これらの設定ができたらOKボタンを押して設定を終了します。
それから仮想マシンを選択し「操作」ー「起動」をクリックして起動します。

するとUbuntuのインストールが始まります。
画面の指示に従ってどんどん進めていきます。



今回はLAMP環境を作成するだけなので最小インストールにしています。





インストールが完了するとUbuntuが起動できるようになります。
以降Ubuntuの起動はHyper-vマネージャーで「操作」ー「起動」で行いますが、それだけではUbuntuの画面は表示されません。
リモートで接続して使用する場合はいいですが、画面を操作する場合は「操作」ー「接続」を選ぶと画面が表示されます。

LAMP環境の構築
UbuntuのLAMP環境の構築については他の記事(VirtualBoxのUbuntuにLAMP環境構築)でも記述しています。
ここでは記事の内容に合わせてそれぞれのサービス構築について説明します。
まずはUbuntuを最新の状態にしておきます。
$ sudo apt update
$ sudo apt upgrade
Apache2のインストール
以下のコマンドでApache2のパッケージをインストールします。
$ sudo apt install apache2
インストールが完了したらバージョンを表示してみましょう。
$ apachectl -v
Server version: Apache/2.4.38 (Ubuntu)
Apacheを起動します。
$ sudo service apache2 start
Apacheの起動・停止・再起動・状態の各コマンドについてまとめておきます。
起動 | $ sudo service apache2 start |
停止 | $ sudo service apache2 stop |
再起動 | $ sudo service apache2 restart |
状態 | $ sudo service apache2 status |
これでWebサーバーは利用できるようになるのですが、ブラウザでWebサーバー上のコンテンツを表示するには、Hyper-vのネットワーク環境を知っておく必要があります。
Hyper-vのネットワーク
Ubuntuをインストールする前に仮想マシンを作成する際、ネットワークの構成で「Default Switch」を選択しました。
この設定はHyper-vの仮想ネットワークと物理ネットワークとは接続できませんが、ホストWindowsと接続でき、WinNAT経由でインターネットも接続できます。
なので、仮想ネットワークでUbuntuが持っているIPアドレスを確認して、ホストWindows上のブラウザからそのアドレスにアクセスして利用します。
Hyper-vの仮想ネットワークから物理ネットワークへ接続できる設定もありますが、本来Windows Server用に作られているのでホストWindowsのネットワーク周りがどのようになるのか理解せずに利用するのは危険なようです。
詳細はこちらの記事に掲載されているので参考にどうぞ(@ITの記事)
ここでは「Default Switch」の設定上で動作することを前提に見ていきましょう。
まずはUbuntuに割り当てられているIPアドレスを確認します。
Ubuntuのターミナルで以下のコマンドを実行しIPアドレスを確認します。
$ ip a

確認したUbuntuのIPアドレスにホストWindowsでアクセスできるとこのようなページが表示されます。

(apache-check)
これでApacheが動作していることが確認できます。
LinuxとWindows間でファイル共有をできるようにしておくと便利です。
ファイ共有方法はこちらの記事を参考に見てみてください。
PHPのインストール
PHPはApache配下で動作しMySQLと連携する必要があるので、そのためのパッケージも合わせてインストールします。
$ sudo apt install php libapache2-mod-php php-mysql
インストールが完了したらApacheを再起動します。
$ sudo service apache2 restart
PHPが動作するかどうかを確認するため、簡単なPHPコードが書かれたphpファイルを作成してブラウザでアクセスします。
以下のコードが書かれた「index.php」ファイルを作成します。
<?php
phpinfo();
?>
このファイルをApacheのWebルートである「/var/www/html」ディレクトリに保存しブラウザでアクセスします。
例えば「http://192.168.0.1/index.php」URLをブラウザでアクセスします。
ブラウザ画面に以下のような画面が表示されればPHPは動作しています。

MySQLのインストール
MySQLを以下のコマンドでインストールします。
$ sudo apt install mysql-server
インストールが完了したらMySQLを起動して動作確認します。
$ sudo service mysql start
$ sudo mysql -u root
mysqlコマンドを入力するとMySQLのコマンドプロンプトが表示されます。
バージョンを表示し動作しているかを確認します。
mysql> select version();
+-------------------------+
| version() |
+-------------------------+
| 8.0.21-0ubuntu0.20.04.4 |
+-------------------------+
1 row in set (0.00 sec)
次にMySQLのrootパスワードを設定します。
MySQLインストール直後はrootにパスワードが設定されていません。
まずは以下のコマンドで今の認証の内容をチェックします。
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | | auth_socket | localhost |
以下のコマンドでrootパスワードを設定します。
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'root';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
パスワードが設定されているかどうかを確認するため再度認証内容をチェックします。
mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *81F5E21E35407D884A6CD4A6CD4A731AEBFB6AF209E1B |
mysql_native_password | localhost |
rootの認証が「mysql_native_password」となっていれば設定完了です。
パスワードが有効になっているのを確認するため、一度exitしてから再度rootでログインします。
mysql> exit
Bye
$ mysql -u root -p
Enter password:
パスワードを入力してMySQLのプロンプトが表示されれば成功です。
phpMyAdminのインストール
phpMyAdminはブラウザを使ってMySQLのデータベースを操作するためのツールです。
以下のコマンドでインストールします。
$ sudo apt install phpmyadmin


WebサーバーはApacheを選択し、任意のパスワードを設定します。
インストールが完了したら、ブラウザでphpMyAdminにアクセスします。
例えば「http://192.168.0.1/phpmyadmin」

ログイン画面が表示されたら、先程パスワード設定したrootでログインします。

これで一通りのLAMP環境構築は完了です。
あとがき
この記事ではサーバーサイドスクリプトとしてPHPの環境を構築しました。
PHP以外にもPythonやPerlなどのスクリプトでも構築可能なので試してみてください。