Ubuntu仮想環境 "Multipass" にトライした話(2)Windows編

 レンタルサーバ上のUbuntuの上で multipass が動かなかったので、手元のWindows上で試すことにしました。とりあえずMySQLを動作させるところまでは成功。

環境・前提条件等

  • OS: Windows 10 Pro 64bit 1909
  • Memory: 十分にあるので細かいことは気にしない(32GB)
  • Disk: 十分にあるので細かいことは気にしない(>200GB)
  • CPU: i7-7700K@4.20GHz
  • Hyper-V: VirtualBox等を動作させるために、有効にはしない(有効にしてもVirtualBoxが動作するという話も散見されたが、私の環境では動作しなかったので、有効にしない)
    • multipass は基本的にHyper-Vを要求するが、VirtualBoxを使っての動作もするようなので、こちらを試みることにする(VirtualBox 6.1インストール済)
  • やりたいことは色々あるが、まずは1台のUbuntuを立ち上げてMySQLを動作させることを目的とする

multipass のインストールと環境設定

Multipass orchestrates virtual Ubuntu instances より multipass Windows版をダウンロードし、インストール。

 インストール後、試しにバージョンを確認してみた。

D:\>multipass version
multipass  1.1.0+win
multipassd 1.1.0+win

 今回、Hyper-Vではなく VirtualBoxの機能を使って(←よくわかっていないけど「ドライバーとしてVirtualBoxを使用」という感じになるらしい)動作させたいので、以下の指定を行う。この指定は管理者として立ち上げたDOS窓で行った(一般ユーザでは設定できない)。

D:\>multipass set local.driver=virtualbox

multipass で一台目のUbuntuの作成と起動

まずどんなイメージから作成可能かを確認する。find を使う。

D:\>multipass find
Image                   Aliases           Version          Description
16.04                   xenial            20200218.1       Ubuntu 16.04 LTS
18.04                   bionic,lts        20200218         Ubuntu 18.04 LTS

 Ubuntu上で試したときと比べて、使えるイメージが随分少ないが、今回はとくに色々なバージョンで試したいという目的ではないので、18.04を使うことでいいかなということにする。

 まず実行前に、念のため、作成済みの環境がないことの確認。list命令使用。

D:\>multipass list
No instances found.

 18.04 を myubu01 という名前で作成。作成後、list命令でできあがりを確認。

D:\>multipass launch --name myubu01 18.04
Launched: myubu01

D:\>multipass list
Name                    State             IPv4             Image
myubu01                 Running           N/A              Ubuntu 18.04 LTS

 できあがった「myubu01」に接続する。接続にも multipassを使用する。shell命令で。

D:\>multipass  shell myubu01
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-88-generic x86_64)
(略)
ubuntu@myubu01:~$

 立ち上がりました。

MySQLのインストール

 さくっと。

$ wget https://dev.mysql.com/get/mysql-apt-config_0.8.14-1_all.deb
$ sudo dpkg -i mysql-apt-config_0.8.14-1_all.deb 
$ sudo apt-get update 
$ sudo apt-get install mysql-server -y

立ち上がりました。

ubuntu@myubu01:~$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.19 MySQL Community Server - GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

その他初期設定

 パスワード設定

ubuntu@myubu01:~$ sudo passwd ubuntu
  • sshd_config 書き換え
  • インストール時の設定ファイル削除

課題

 WindowsVirtualBox使用の場合、動作中のubuntuIPアドレスがわからない。以下のようにIPv4欄が N/A となっている。こうなるのは、VirtlalBoxを使っていれば、こういうものらしい。

D:\>multipass list
Name                    State             IPv4             Image
myubu01                 Running           N/A              Ubuntu 18.04 LTS

動作している Ubuntu 自体は、10.0.2.15 になっている。sshd_config を書き換えて(パスワードアクセス可能にして22番ポートで待ち受けるように設定)自分自身からsshで接続できることは確認済み。

root@myubu01:~# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:86:0f:a8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 81969sec preferred_lft 81969sec
    inet6 fe80::a00:27ff:fe86:fa8/64 scope link
       valid_lft forever preferred_lft forever

 2つ以上のubuntuを立ち上げて相互に通信させたいので、この問題を解決しないと先に進めないなぁ。要調査。

追記:cloud-config を使って諸々初期設定

 cloud-config を使うと、multipassでubuntuを立ち上げるときに諸々初期設定をしてくれるらしい。とりあえず「サラのMySQL環境を手軽に手に入れる」目的にはちょうど良さそう。
 以下のファイルを作成します。(cloud-config_my2.yamlという名前にしました)

#cloud-config

#package_update: true
#package_upgrade: true
#ssh_pwauth: true
#password: ubupass

write_files:
  - content: |
      # sudo sh -c "cat ./my.cnf >> /etc/mysql/my.cnf"
      # sudo systemctl restart mysqld
      [mysqld]
      skip-grant-tables
    path: /home/ubuntu/my.cnf

runcmd: 
  - wget https://dev.mysql.com/get/mysql-apt-config_0.8.14-1_all.deb
  - sudo DEBIAN_FRONTEND=noninteractive dpkg -i mysql-apt-config_0.8.14-1_all.deb 
  - sudo apt-get update -y
  - sudo DEBIAN_FRONTEND=noninteractive apt-get install mysql-server mysql-shell -y


 そして、新しいubuntu環境を作る(launch)際に、オプションで指定。

multipass launch --name myubu03 18.04 --cloud-init cloud-config_my2.yaml

これで、MySQLのインストールされたubuntu環境が手に入ります。
設定ファイルの先頭のほうをコメントアウトしているのは、launchの際にタイムアウト表示になってしまうことが多かったので、とりあえず時間のかかる処理を省いたもの。個人的には update はオンにしておきたいところ。

 MySQLのパスワード設定の方法がわからず(ヒントは多くいただいたのですが試しきれず)、noninteractive モードでインストールしています。error.logを見ると

2020-03-08T09:18:32.175386Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

 となってるため、パスワードなしで接続できるようになっているのかなと思ったけど、違うみたい。skip-grant-tables でアクセスして確認してみたら、rootユーザの認証方法が auth_socket になっていました(caching_sha2_passwordとかではなくて)。 
 でも、 mysql --protocol=socket -uroot などを試しても Access denied のまま。もはや諦めかけていたころに、天のAPIからのレスポンスが!

 はい。sudo su - してrootになって、mysql -uroot だけで、あっさりつながりました。瞬間解決! ありがとうございます! sudo mysql -uroot でもOKでした。

 でも、mysqlを利用するためにrootになるのも何だな、という思いのほうが強いので、たぶん私は ski-grant-tables を当面使うことになりそうです(こっちのほうがより幅広いアクセスを許容しているので危ないのですが、ローカル(Windows)の virtualboxをドライバとしたmultipass上のubuntu上のMySQLなので、問題となることは少ないかな、と今のところ判断しています。

 その方法が、上記 cloud-config を使ってlaunchした際に、ubuntuユーザのフォルダ化に置かれているファイル。このファイルに書かれたとおりに、

  $  sudo sh -c "cat ./my.cnf >> /etc/mysql/my.cnf"
  $  sudo systemctl restart mysqld

 を実行すれば、skip-grant-tablesでのMySQLが起動されるという仕組み。繰り返しますが、普通はこの状態で稼働を続けてはいけません! パスワードなしでMySQLに接続できる設定です。←に書いた意味を理解してリスクを評価できる人以外は、やめたほうがいいです。

追記:顛末

 土日の2日間をかけて、結構ずっぽりと multipass三昧だったのですが、レンサバ(VPS)のUbuntu上で失敗→手元のWindows上でHyper-V関連で苦労→ドライバとしてVirtualBoxを使う方法に切り替え→IPアドレスが得られない&ホストマシン側からssh等で接続する方法がわからない(未解決)→cloud-configでMySQL自動インストールトライ→インストール中に対話型でいろいろ聞いてくるので聞かれないようにする方法に苦労→インストールできたけどMySQL接続パスワードがわからない→skip-grantの路線で一応の解決に→そもそも パスワードではなくauth_socket認証だと判明→解決できず悶々→神降臨 
 という流れで、まぁあっちいったりこっち来たり、解決すべき課題が多岐に亘ったため(時間にも制約があるので)半端につまみ食いしたような気分ではありました。ヒントも色々いただいていて、ひとつひとつ試したいんですけどね。。

 先ほど、VirtualBox上に Ubuntu をインストールしまして、その上で multipassを動かすことにしました。VirtualBox側で Hyper-V有効とかネットワーク設定を適切にするとか気遣いポイントはありますが、比較的あっさり設定できました(MySQL関連は、まだ)。 multipass list で得たインスタンス一覧にもIPアドレスがちゃんと表示されているので、

  • 素のまっさらなMySQLをとりあえず欲しいとき→Windows上のmultipassで
  • 2台以上のMySQLで遊びたいとき→VBox上のUbuntu上のmultipassで

ということになりそうです。

 twitterその他で色々教えてくださったみなさん、ありがとうございました!!
久々にトライ&エラー&エラー&エラー で、存分にシステムと戯れることができた気がします(笑)。