タイトル通り,Windows Server 2019のHyper-Vで動かすUbuntu18.04にJupyterHub環境を構築した際の備忘録です.
Windows Server 2019でWSLやHyper-V上のUbuntu18.04にCUDA環境を構築しようとして断念
の,Hyper-V部分(Ubuntuのインストール)です.
BIOSの設定
WSLに書いた通りですが,WSLがVT-x使ってると思っており,てっきりWSLが動いた時点で有効になってると思っていたので,まず最初にVT-xが無効だと怒られました.
というわけで,「Intel (VMX) Virtualization Technology」とか「VT-d」とかを有効に.
あと,(出来なかったけど)この後DDAでpassthroughするのですが,そのときにSR-IOV (Single Root I/O Virtualization)が有効になっている必要があります.
これ,途中で変えてしまうとデバイスが再構成されるのかちょっと破茶滅茶になります(なりました笑).
なので,OSインストール前に有効にしておいた方が良いと思います.
Hyper-Vの有効化
「役割と機能の追加ウィザード」の「サーバの役割」にあります.
VT-xが無効な状態だとここで怒られます.
途中で仮想スイッチをどうするか聞かれます.
色々面倒なので,Windows Serverを入れるようなマシンなら物理的にLANポートも複数あるでしょうから,1つをHyper-V専用にしてしまい,そちらを使って用意しましょう.
仮想マシンへのUbuntu 18.04のインストール
ほぼ,
Windows 10 Pro Hyper-V に Ubuntu 18.04 LTS をインストール
の通りの手順で入れました.
仮想マシンの作成
イメージを落とす.
まずは https://ubuntu.com/download/desktop からubuntu-ja-18.04.2-desktop-amd64.iso
をダウンロードしておく.世代を選ぶ.
Should I create a generation 1 or 2 virtual machine in Hyper-V? 曰く,14.04移行は第2世代対応.メモリの割当.
64GBあるんだけど,どうせ後から変えられるので,とりあえず16GBにした.
あと,動的メモリにしておく.ネットワークアダプタの指定.
先程用意した仮想スイッチか,専用アダプタを指定.
ちなみにこの環境では,専用ではないがサブのアダプタで仮想スイッチを作ってそれを指定した.仮想HDDの指定.
保存先を指定し,サイズを指定する.
保存先はdefault,サイズはどうせ可変なので512GBにしておいた.インストール方法の指定.
先程落としておいたいisoファイルを指定する.後で挿入しても良いけれど,ここで指定しないメリットは特にないので.セキュアブートの設定.
出来上がった仮想マシンの設定画面を呼び出し,セキュアブートを無効にする.
(じゃないとインストール後に起動しないらしい.)メモリ関連の設定.
最初は↑こうなってるが,
後々のDDA関連でRAM=最小RAMになっている必要があるので合わせておく.
ついでに膨れ上がらないように最大も32GBに抑えておいた.
Ubuntu 18.04のインストール
作成および設定を終えた仮想マシンの「接続」を押すと電源入ってないよと言われるので「起動」を押す.
grubでの選択.
うまくいくなら直接インストールでも良いけど,後でゴニョゴニョするかもしれないので「Try Ubuntu without installing」にしておく.
(何故かインストールの最後でgrubのインストールに失敗して色々やらないといけないので,裏でOSが立ち上がってくれていた方が都合がいい.)Continue.
初期化されますって言われるけどそもそも作ったばかりのVirtualなディスクに過ぎないので心置きなく進める.grubのインストールに失敗…
こんな感じで何故かgrubがうまく入らない.
(うまくいく人はそのまま再起動すれば良いと思う.)
そしてこのウィンドウ達はボタンを押しても消えてくれない(笑)
Boot Repairでgrubの修復.
きれいにインストールが終わる人は要らない作業.
これがあるので「Try Ubuntu without installing」を選んでおきました.
簡単に言うと,CTRL+ALT+TとかでTerminalを開いて,以下のようにBoot Repairを呼び出し,後は言われるがままにコピペしていくだけ.
$ sudo add-apt-repository ppa:yannubuntu/boot-repair
$ sudo apt update
$ sudo apt install -y boot-repair
$ boot-repair
ちなみに作業している所はMACアドレスを登録申請しておかないとネットに繋がらないのですが,ifconfigも入っておらず,他の調べ方を知らなかったので詰んだかと思いました(T_T)
(なお,普通にGUI上の設定画面から調べられました,良かった)
細かな過程は長いので畳んでおきます↓
Boot Repairでgrubの修復過程
$ sudo add-apt-repository ppa:yannubuntu/boot-repair
でリポジトリを追加し,
$ sudo apt update
$ sudo apt install -y boot-repair
$ boot-repair
でインストールして起動.
すると,RAIDかい?って聞かれるので,
ただのVHDですよ!と「No」を選択.
いかにも直してくれそうな画面が出てくるので,
「おすすめの修復」を選択.コピペ指示が出てくるので,
別途Terminalを開いて
全部貼り付けてあげる.すると途中で言語は違うけど
「Yes選んでね」って言われてた画面が出てくるので「はい」を選択.
最後の1行には改行が含まれていないので手動でEnterを押し,終わったら
Boot Repairに戻って進む.すると,
またコピペ指示が出るので言われるがままに再度Terminalへコピペ.
すると終わりが見えてきたらしく,
こんな事を聞かれるのでお好きな方を選択.
最終的にSumallyが用意され,
こんな画面が出て終了,再起動すればOK.
最後に出てくるログ,一応バックアップしておいたので,気が向いたら何が起きてたのか見てみようかなぁ.
起動してアップデート.
以上の手順でインストールは完了,再起動する際にメディアを抜けと言われますが,Hyper-Vが勝手に抜いてくれます.
起動すると,
アプデのお誘いを受けるので従う.
その後再起動.今度は言語サポートがどうこう言われるので
従っておく.
grubの待機時間短縮.
このままだと起動する度に,
30sも待たされる(いちいちEnter押すのも面倒)ので,
$ sudo vi /etc/default/grub
GRUB_RECORDFAIL_TIMEOUT=3
とか追加してあげる.
ネイティブでデュアルブートな構成とかではないので,よく触るGRUB_DEFAULTとかはそのまま.
$ sudo update-grub
で/boot/grub/grub.cfg
を更新して再起動すると
このようにスクショを撮るのが大変な感じに10倍速.
homeディレクトリの言語変更.
日本語でインストールしてしまったので当然ですが,homeのディレクトリ群が
こんな感じで日本語になっているので,
$ LANG=C xdg-user-dirs-gtk-update
で
英語にしておいてもらう.ちなみに二度と聞くなって言っておかないと起動の度に日本語にしようとしてくるので注意.
net-toolsのインストール.
$ sudo apt install net-tools
で入れておく.要らなければ不要な作業.
[Alt]+[PrintScreen]が使えない.
ウィンドウのスクショ機能が動かない.
「設定→デバイス→キーボード」を確認すると,特に問題はない.
他のAltを使うショートカットは動いていて,AltとPrintが絡む「Alt+Print」と「Ctrl+Alt+Print」だけが動かない.
仕方がないので,とりあえず「Ctrl+Alt+P」にしておいた.
拡張セッションで繋ぐ
以上でとりあえず起動して使えるようになりますが,このままではクリップボードの共有等々ができません.
というわけで,拡張セッションモードで繋げるように環境を整えます.
Hyper-V Linux で拡張セッションを使う方法
辺りを参考にしました.
linux-vm-toolsのclone
$ git clone https://github.com/Microsoft/linux-vm-tools.git ~/linux-vm-tools
$ sudo apt install git
してからやる.そのままzipで落としてきて展開でも良いですが,どうせgitは使うし.
linux-vm-toolsのインストール
$ sudo bash ~/linux-vm-tools/ubuntu/18.04/install.sh
としてあげればインストールされる.
メッセージを眺めてると気付くけど,色々入ってめちゃ容量食うらしい.
終わったら一度再起動
$ sudo reboot
し,再度
$ sudo bash ~/linux-vm-tools/ubuntu/18.04/install.sh
二度目はそれほど時間かからず終わる.
終わったら一度落としておく.
$ sudo shutdown now
Hyper-V側の設定
PowerShellでEnhancedSessionTransportTypeを確認すると
> (Get-VM -VMName 'Ubuntu_1804').EnhancedSessionTransportType
VMBus
になってるはず.
> Set-VM -VMName 'Ubuntu_1804' -EnhancedSessionTransportType HvSocket
してあげて
> (Get-VM -VMName 'Ubuntu_1804').EnhancedSessionTransportType
HvSocket
HvSocketになったことを確認.
(Ubuntu_1804の所は適宜正しいVM名を入れる)
拡張セッションモードの確認
VMを起動してあげると,途中まで見慣れたUbuntuの画面で進み,ログイン画面辺りで
Enhanced Session Modeが使えるようになり,
お馴染みのxrdp画面になる.
拡張セッションモードを使えるようにxrdpを修復
これですんなり繋がるならそれで良いのだが,何故か
どうしても進めなくなる.
Xorgだとログイン操作以降
このように何も表示されないので,
Xvncを試してみても
やはり駄目.
https://github.com/Microsoft/linux-vm-tools/issues/76
仕方がないのでとりあえず通常接続にてログインする.
結論から言うと,
Ubuntu18.04.2 xorgxrdp Install error
にあるように18.04.2のバグらしい?
xrdp connectivity no longer works after `apt upgrade` in Ubuntu 18.04.1 LTS
や
Ubuntu 18.04 RDP sesseion ends as soon as I login.
曰くxorgxrdp
が入れば良い模様.
Ubuntu18.04.2にxrdpをインストールしてもRDP経由のログインでエラーになる事象のメモ
にあるように
$ sudo apt install xserver-xorg-core
$ sudo apt install xorgxrdp
でちゃんとログイン出来るようになりました.
ログ確認作業履歴.
Xorgだとログイン操作以降
このように何も表示されないし,
Xvncを試してみても
やはり駄目.
どうしようもないので通常接続にてログインし,
/var/log/xrdp-sesman.log
を確認すると,
errno: 2, description: No such file or directory
とか言ってる.さらに/var/log/xrdp.log
を確認すると,
[ERROR] Cannot read private key file /etc/xrdp/key.pem: Permission denied
と出ている.一応確認しに行ったけれど,
https://forum.openmediavault.org/index.php/Thread/24607-Remote-Desktop-xfce4-is-not-running-because-of-wrong-permissions/
曰く関係ないらしい.
続いて色々調べた結果が「結論から言うと,」の部分で,xorgxrdp
が問題だろうとなり,入れようとすると
こうなるので先にxserver-xorg-core
を入れ,
続いてxorgxrdp
を入れることで解決した.
IP固定
/etc/network/interfaces
じゃなくなったんですね…
[Ubuntu]ローカルIPアドレスを固定にする(18.04/16.04)
辺りを参考に,
ifconfig
とroute -n
とsudo systemd-resolve --status | grep -A 2 "DNS Servers"
で
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet xxx.xxx.xxx.xxx netmask 255.255.255.0 broadcast xxx.xxx.xxx.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (イーサネット)
RX packets 687302 bytes 795093959 (795.0 MB)
RX errors 0 dropped 52 overruns 0 frame 0
TX packets 118390 bytes 7294906 (7.2 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (ローカルループバック)
RX packets 3999 bytes 4745311 (4.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3999 bytes 4745311 (4.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ route -n
カーネルIP経路テーブル
受信先サイト ゲートウェイ ネットマスク フラグ Metric Ref 使用数 インタフェース
0.0.0.0 xxx.xx.xxx.254 0.0.0.0 UG 100 0 0 eth0
xxx.xxx.xxx.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
$ sudo systemd-resolve --status | grep -A 2 "DNS Servers"
DNS Servers: xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx
DNS Domain: xxx.ac.jp
(ここまで確認しなくてもサーバ構築してる段階で知ってるよねって話はさておき,)現状の値を確認.
DNSサーバ調べる際に-A 2
とか付けて少し後ろまで見ておいたのは,ココがセカンダリまで設定されるからです.
IPv6は使わないので放置.
参考記事の50-cloud-init.yaml
はServerの場合なので,Desktopな今回は
$ sudo vi /etc/netplan/01-network-manager-all.yaml
で編集し,
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
ethernets:
enp3s0:
dhcp4: no
addresses: [xxx.xxx.xxx.xxx/24]
gateway4: xxx.xxx.xxx.xxx
nameservers:
addresses: [xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx]
dhcp6: no
調べるとfalseだったりnだったりnoだったりするけど,まぁ肯定/否定出来てれば解釈してくれるんでしょう,きっと.
$ sudo netplan apply
で適用し,再度設定を見に行って変更されてればOK.