レンタルサーバ上の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>
課題
Windows版 VirtualBox使用の場合、動作中のubuntuのIPアドレスがわからない。以下のように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からのレスポンスが!
あ、socket_authプラグインは「OSユーザーの名前とMySQLアカウントの名前が一致している必要がある」ので、OSもrootアカウント使ってみてください!
— yoku0825 (@yoku0825) 2020年3月8日
はい。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アドレスがちゃんと表示されているので、
ということになりそうです。
twitterその他で色々教えてくださったみなさん、ありがとうございました!!
久々にトライ&エラー&エラー&エラー で、存分にシステムと戯れることができた気がします(笑)。