新しいノートパソコンを買ったので、Windows上でLinux活動するための環境構築します。
Windows Terminal
とりあえずターミナルがないと落ち着かない
コマンドプロンプト?んなもんターミナルソフトに含めねぇよ!
Windows Terminalをインストールします。
wingetはプリインストールされていました。
PS> winget install terminal
CmderとかMsys2とかのターミナルエミュレータソフトは使っていたことがあり、それと似たような作りこみです。
Cmderにあった文字化けとか文字のずれとかがなくてより快適になりました。
デフォルトで立ち上がるシェルがPowerShellだったので、下記のWSL2設定後、Ctrl+,でWSL2に変更しておきました。
以後、powershellのプロンプトは"PS>"で示します。
SSHでメインマシンンのデスクトップつなぐとかに使うためWSL2は入れておきます。
WSL2
普通にストアからWSL2落としました。
その後ターミナル上から
PS> wsl --install -d ubuntu
基本後述のmultipass上にdocker展開して進めるつもりですが、わざわざmultipassつなげなくても、
Vimでメモとったり、デスクトップにsshする時くらいの目的だったらwslでいいかなと思いますので入れました。
フォント
zsh, neovimでpowerlineを使っていますので、powerline fontをWindowsOSにインストールしておきます。
Dropboxによく使うフォント類はためてあるので、.ttfファイルを右クリック→インストールしました。
私は Ubuntu Mono delivative Powerline を使っています。
multipass
dockerで開発進めたいので、 multipass 入れます。
WSL2上でdocker構築するのはDocker for Desktopインストールしたりで骨が折れました。
Vagrantとも相性悪く、今まで使っていたVagrant+Virtualbox環境が使えなくなって、Docker for Desktopはもう使いたくありません。
だいたいDockerにGUIとかいらねーだろ
multipassでDocker環境構築する参考はこの辺
MacでDocker Desktopを入れずにDocker CLI+Multipassで代替してみる
multipassのことはじめはこの辺
仮想環境multipassを試す
multipass vs Virtualbox+Vagrant
multipassはVirtualbox+Vagrantでやっていた環境構築と似たようなことができます。
Virtualboxは通常GUI操作、そこを Vagrantをはさむことでheadless起動(CUI操作)、仮想マシンの構築、設定のコード化ができます。
multipassの特徴は下記。
結局Virualbox+Vagrantでやっていることとあまり変わらないです。
- ホストのOSがクロスプラットフォーム
- Hypyer-V, QMU, Virtualbox等、踏み台にできる仮想環境が多岐に渡る
- イメージはUbuntu固定
- 操作はCUI限定
- cloud-initによる柔軟な初期設定のコード化
Virtualbox+Vagrantと比べたメリットは余計なGUIがないこととイメージがUbuntu固定とマシンの立ち上げが高速(らしい)ことかな。
WSLが一般的になってきても,なぜmultipassを使うか?
WSLがDocker for Desktopを使わないとDocker使えないからです。
インストール
PS> winget install multipass
wingetは管理者権限で実行してください。
インスタンス立ち上げ
試しにインスタンスを一個作ってみます。
PS> multipass launch
multipass launch
launch failed: Hyper-V is not available on this edition of Windows 10. Please upgrade to one of Pro, Enterpriseor Education editions.
エラーで立ち上がりませんでした。
Windows10 Home Editionを使っているので、Hyper-Vをサポートしていないようです。
公式にも書いてありました。
Prerequisites
Hyper-V
Only Windows 10 Pro or Enterprise, version 1803 (“April 2018 Update”) or later is currently supported. It’s due to the right version of Hyper-V only being available on those versions.
Hyper-Vの代わりに、Virtualboxで立ち上げる設定をします。
まずはVirtualboxをインストールします。
PS> winget install virtualbox
次にlocal.driverを設定します。
PS> multipass set local.driver=virtualbox
コア数、メモリ、ディスク設定を変更したインスタンスの立ち上げ
先ほどの参考を例に
下記設定でインスタンスを立ち上げます。
- インスタンス名: master
- CPU: 4コア
- メモリ: 4GB
- ストレージ: 40GB
PS> multipass launch --name master --mem 4G --disk 40G --cpus 4 --cloud-init ./cloud-config.yml
docker, docker-composeをプリインストールしたインスタンスを立ち上げるcloudinitのconfigファイルの記述です。
#cloud-config
groups:
- docker
system_info:
default_user:
groups: ["docker"]
package_update: true
packages:
- docker
- docker.io
- docker-compose
snap:
commands:
- 'snap install multipass-sshfs'
うまくたちあがりました。
共有フォルダとしてmount
ローカルディレクトリをmountします。
設定項目があるようなので、設定します。
管理者権限で実行してください。
PS> multipass.exe set local.privileged-mounts=true
PS> multipass.exe mount Dropbox master:/home/ubuntu/Dropbox
mount failed: cannot connect to the multipass socket
まだできない。
PS> multipass.exe mount C:\Users\yuich\Dropbox\ master:/home/ubuntu/Dropbox
sourceは絶対パスが必要だそうです。
これで成功しました。
Port Forwarding
今のところmultipassには簡単にport forwardingを設定できる機能が備わっていないので、ssh port forwardingを設定する方法をGithubで見かけました。
canonical / multipass Port forwarding #309
Possible w/ ssh local (or remote) port forwarding:
• forward requests from multipass host (port 9000) to multipass instance (port 80)
sudo ssh \ -i /var/root/Library/Application\ Support/multipassd/ssh-key/id_rsa \ -L 9000:localhost:80 \ multipass@<multipass instance ip>
• access multipass instance (port 80) from any box that can access multipass host
curl <mutlipass host ip>:9000
もう一つの方法として、Virtualboxを使っていることをいいことに、無理やりVirtualbox GUIからport forwarding の設定を行います。
ただし、multipassから起動したVirtualboxの仮想マシンは管理者権限で実行しているため、普通に開いても仮想マシンが見えません。下記のようにして、pstoolsを使用して、仮想マシンが見える状態でVirtualbox UIを開き、さらにそこからport forwadingの設定をします。
通常ユーザで VirtualBox を起動しても k3s の仮想 OS は見えません。管理者権限で動いているからです。pstools をインストールし、管理者権限で以下を実行すると出てきます。
PS> PsExec64.exe -s -i "C:\Program Files\Oracle\VirtualBox\VirtualBox.exe"
参考: multipass 上に kubernetes 環境を最速で作る
設定は仮想マシンがrun状態で行います。
わざわざshutdownしてから設定したら、Virtualboxからエラーダイアログが出まくりました。
設定完了後に仮想マシンを再起動することも忘れずに行いましょう。
PS> multipass restart
仮想環境を再起動してport forwading設定完了。
port設定の反映は適当なindex.htmlを用意して、pythonのhttp.serverモジュールでサーバーを立ち上げ、pingやcurlやブラウザからのアクセスをもって確認します。
$ python3 -m http.server 8888
クライアント側で8888番ポートでサーバー立ち上げ
$ curl -fsSL localhost:8888
ホスト側(Windows)から疎通確認。
またはブラウザのアドレス欄にhttp://localhost:8888
を入力。
Snapshot / Backup
Snapshotとかとれる機能はついていないようです。
VirtualboxのGUIからスナップショット作成したり、CUIから
VBoxManage snapshot snapshot1
でスナップショット作成したり
Vagrantを使っていたら
vagrant snapshot save snapshot1
とか vagrant sandbox on
でスナップショットとれるのですが。
基本的にDocker上でしか作業しないので、システム的になんかあったらコンテナを再作成するだけでおしまいですけどね。
コンテナイメージがGBオーダーなので、本当に仮想マシンが立ち上がらなくなって困った場合、スナップショットないと再作成が結構な時間とネットワーク帯域使うので嫌だ、というくらいです。
cloud-initでmultipassインスタンス立ち上げて、docker-compose up -d
打てば再構築おしまい。
エディタ
テキストエディタ勉強用にVScode入れておきます。
気が向いたら扱えるようになっておきたいです。
Vimしか使えないと周りと話が合わないので。
PS> winget install vscode
今のところWindows TerminalでCtrl+,を間違えてCtrl+Shift+,としてしまうと立ち上がってしまうくらいしか登場シーンがありません。
結局
Vagrant + Virtualbox + Dockerでも同じようなことができます。
DockerをプリインストールするVagrantfile
しかしながら今回は新技術に興味あるので、multipassでDocker環境構築してみました。
このままmultipass + Dockerで作業進めていこうと思います。 ( 外出時は。 )
...とはいえ、やっぱり一番使う時間長いのは
WSL2からssh u1and0@192.***.***.***
しちゃうんですけどね。結局。 ( 在宅時 )