Ubuntu Bionic BeaverことUbuntu 18.04 LTSが2018年4月にリリースされました。

リリースから半年近く経ったのでUbuntu 16.04の仮想環境から移行してみました。

Table of Contents

はじめに

読者の前提

以下の技術を理解している前提で進めます。

  • Vagrant
  • Ansible

ホストマシンの環境

  • Windows10 Home 10.0.17134
  • Vagrant 2.1.2
  • VirtualBox 5.2.18 r124319

ゲストマシンの環境

  • Lubuntu18.04 (Ubuntu18.04)
  • 日本語対応版

Vagrantプラグインのインストール

Vagrantのプラグインを2つインストールします。

$ vagrant plugin install vagrant-vbguest vagrant-disksize

vagrant-vbguest

ホストOSとゲストOSでVirtualBox Guest Additionsのバージョンが一致するようにゲストOSへインストールするプラグインです。

このプラグインによってVirtualBox Guest Additionsのバージョンの差異がなくなると、以下の様な不都合を防止できます。

  • ウィンドウが自動でリサイズしない
  • ホストとゲストでクリップボードを共有できない

vagrant-disksize

VMのディスク容量を増やすことができるプラグインです。

40GBで足りなかったため、今回から80GBに増やしてみました。
色々な言語で開発する身としてはストレスが無くなって快適 ☺️

Lubuntu Desktopの作成

VagrantとVirtualBoxを使ってLubuntu Desktopを作成します。

Boxの追加

ubuntu/bionic64のイメージをローカルに追加します。

$ vagrant box add ubuntu/bionic64

手順としてはvagrant box addを必ず実行する必要はありません。
ここでは失敗した際に再度通信する手間を省くため、明示的に実行しています。

Vagrantfileの作成と実行

以下のファイルを作成してvagrant up --provisionを実行します。

2回ほど権限の許可を求められますので画面からは離れないで下さい。

Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"
  config.disksize.size = "80GB"
  # config.vm.box_version = "v20180823.0.0"

  # port forward
  ([80, 1313, 3000, 4200, 6006, 8000] + (8080..8090).to_a).each do |port|
    config.vm.network "forwarded_port", guest: port, host: port + 10000, host_ip: "127.0.0.1"
  end
  config.vm.network "forwarded_port", guest: 61208, host: 61208, host_ip: "127.0.0.1"
  config.vm.network "private_network", ip: "192.168.33.10"

  # VirtualBox VM options
  config.vm.provider "virtualbox" do |vb|
    vb.name = "ubuntu-gui"
    vb.cpus = "2"
    vb.memory = "4096"
    # GUI settings
    vb.gui = true
    vb.customize [
      "modifyvm", :id,
      "--vram", "256",
      "--accelerate3d", "on",
      "--hwvirtex", "on",
      "--nestedpaging", "on",
      "--largepages", "on",
      "--ioapic", "on",
      "--pae", "on",
      "--paravirtprovider", "kvm",
      "--clipboard", "bidirectional",
      "--draganddrop", "bidirectional",
      "--monitorcount", "1",
      "--nictype1", "virtio",
      "--nictype2", "virtio",
    ]
  end

  # sync
  config.vm.synced_folder "../../", "/vagrant"
  config.vm.synced_folder "../../../../", "/whome"

  # Provisioning with ansible
  config.vm.provision "shell", inline: <<-SHELL
    # Install ubuntu-desktop
    sudo apt -y update
    # See https://github.com/chef/bento/issues/661
    #sudo apt-get -y upgrade
    DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::="--force-confdef" -o Dpkg::="--force-confold" upgrade
    sudo apt-get -y dist-upgrade
    sudo apt-get -y install ubuntu-desktop

    # Install for japanese
    wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
    wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -
    sudo wget https://www.ubuntulinux.jp/sources.list.d/xenial.list -O /etc/apt/sources.list.d/ubuntu-ja.list
    sudo apt -y update
    sudo apt-get -y upgrade
    sudo apt-get -y install ubuntu-defaults-ja

    # Set timezone and locale
    sudo timedatectl set-timezone Asia/Tokyo
    sudo localectl set-locale LANG=ja_JP.utf8
  SHELL

  # Install docker
  config.vm.provision "docker"

  # Install ansible and provisioning
  config.vm.provision "ansible_local" do |ansible|
    ansible.playbook = "ansible/site.yml"
    ansible.inventory_path = "ansible/local"
    ansible.limit = "localhost"
    ansible.raw_arguments = ["-K"]
    ansible.extra_vars = {
      env: 'vm-gui'
    }
  end

end

私個人用に設定などをカスタマイズしています。あくまで参考程度に。

Error: Could not resolve host: vagrantcloud.com

以下エラーのようにログインを促される場合

The box 'ubuntu/bionic64' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Vagrant Cloud, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://vagrantcloud.com/ubuntu/bionic64"]
Error: Could not resolve host: vagrantcloud.com

以下のアクションが必要です。

  • HashiCorpのアカウントを作成
  • vagrant login

Lubuntu Desktopのインストール

ここまでの手順でUbuntu Desktopが構築されています。
ここでは更に、軽量なディストリビューションのLubuntu Desktopをインストールします。

作成された仮想環境のターミナルを開き、以下のコマンドを実行するだけです。

$ sudo apt-get install -y lubuntu-desktop

途中でディスプレイマネージャーの選択を求められます。
私はGDMを選択しました。

Vagrantfileでlubuntu-desktopをインストールする場合の注意

VagrantfileのProvisioning処理でlubuntu-desktopをインストールすると、ディスプレイマネージャー選択画面の表示に問題が生じます。
画面に変化はなくても処理は完了するかもしれませんが、視覚フィードバックが得られないためオススメしません。

Provisioning完了後にUbuntuへログインしてからインストールすることを強く推奨します。

なぜディスプレイマネージャーにGDMを選ぶのか?
Ubuntu 17からデフォルトのディスプレイマネージャーがGDMに変更されたからです。
以前はLightDMがデフォルトでしたが、今後を考えるとGDMにしておいた方が良さそうだと判断しました。
なぜLubuntuを使用するのか?

Ubuntuでは以下ツールを使用する際、画面描画に大きな遅延が生じるからです。

Lubuntuは軽量ディストリビューションのため、画面描画を実用的な速度まで引き上げてくれます。
なんてクールなんだ!

Lubuntuでログイン

ログイン画面でLubuntuを選択します。
LightDMに慣れていると切り替えに戸惑いますが、以下画像のように変更できます。

ユーザーを選択してからでないと歯車マークは出ませんのでご注意。

日本語化

言語設定とキーボードを日本語化します。

言語設定

まずは言語設定を日本語化しましょう。
以下の画像のようにLanguage Supportから日本語を追加します。

ubuntuユーザのログインパスワードを求められて認証できない場合は...

sudo passwd ubuntuコマンドでubuntuユーザのパスワードを変更しましょう。
再び入力を求められたら、再設定したパスワードを入力すればOKです。

※ 初期パスワードが分かっていればこの工程は不要かもしれませんがvagrantでは認証が通りませんでした..

インストール成功したらLanguageRegional Formatsを日本語に設定します。
Apply System-Wideをクリックしてシステム全体へ適応するのを忘れないようにしてください。

キーボード設定

次に日本語対応のキーボードを設定します。
この設定をしなければ日本語入力することができません。

キーボードアイコンから設定を開きます。

キーボードアイコンが表示されない場合は...

理由は分かりませんが表示されなくなることがあります。一度VMを再起動してみましょう。

vagrant reloadでは改善しない場合がありますので、vagrant halt && vagrant upを推奨します。

ダイアログ下部のボタンを使って、入力メソッドのキーボードを以下のように配置します。

後は好みに応じて設定を変更して下さい。
私はAutoHotKeyでカスタマイズをしているため以下のような設定をしています。

Ansibleで環境構築

ベースはできましたのでAnsibleを使って開発環境その他を構築します。
私の場合は以下で環境を管理しています。

自分だけのPlaybookを作成しておくと環境再構築が楽チンですのでオススメです。

ハマッタところ

tmuxのpowerlineが表示されない

環境変数LC_ALLが設定されていなかったためでした。

tmux \+ Powerline が上手く動作しない場合の確認ポイント

WSL Terminal上のVimとClipboardの共有ができない

ホストとゲストの共有はできているケース。
環境変数DISPLAYの設定を変更すると解決しました。

  • 変更前: set -x DISPLAY :0
  • 変更後: set -x DISPLAY :1.0

恐らくディスプレイマネージャーをLightDMからGDMに変更した影響だと思います。
xselコマンドでコケていました..。

総括

Ubuntu 18.04 LTSの仮想環境をVarant/Virtualboxで作成してみました。

LTS版ですのでしばらくの間は安心して開発することができそうです 😄