VMware Fusion - macOS アプリケーションナビ

macOSAppNavi macOS VMware 2019年 6月 30日

VMware fusion と Ubuntu Server のインストール

Docker を使って大きめのシステムを作成したくなったため、Docker for Mac を止め、VMware fusion 上の Ubuntu Server で docker を動かすことにした。

  1. すでに Brewfile で以下のように設定しているため、VMware fusion のインストールは終わっている。
    cask "vmware-fusion"
  2. Ubuntu Server の Download サイトから Ubuntu Server 18.04.2 LTS をダウンロードする。 Download Ubuntu Server
  3. ダウンロードした ISO ファイルが正しいことを shasum で確認する。
    hkob@hMBP ~/Downloads> echo "ea6ccb5b57813908c006f42f7ac8eaa4fc603883a2d07876cf9ed74610ba2f53 *ubuntu-18.04.2-live-server-amd64.iso" | shasum -a 256 --check
    ubuntu-18.04.2-live-server-amd64.iso: OK
  4. ダウンロードした ISO イメージを使ってインストールする。ホスト名は dockerhost とした。ファイルシステムを xfs にした以外は通常通りのインストールをした。macOS 側と同じ hkob ユーザを設定した。以下、インストール後にいくつかの設定をした。
    • そのままだと sudo 時に名前の逆引きに失敗するので、/etc/hosts の 1 行目にに名前を追加した。
      127.0.0.1   localhost.localdomain  locahost dockerhost
    • apt を更新しておく。
      sudo apt update; sudo apt upgrade
    • hkob ユーザに何か問題が会った時のために、別途 admin ユーザを作っておく。
      sudo adduser admin
    • admin ユーザを sudo ユーザに登録しておく。
      sudo gpasswd -a admin sudo

headless 起動の設定

Ubuntu Server は Docker 専用に使うため、GUI は必要ない。そこで通常は headless で起動したい。

  1. vmrun というコマンドをターミナルから実行したいため、/usr/local/bin/vmrun の確認をする。以下のように Symbolic link になっていれば問題ない。
    > ls -l /usr/local/bin/vmrun
    lrwxr-xr-x  1 hkob  admin  54  6  4 18:05 /usr/local/bin/vmrun -> /Applications/VMware Fusion.app/Contents/Library/vmrun
  2. もしなっていない場合には、以下のようにシンボリックリンクを作成しておく。
    ln -s /Applications/VMware\ Fusion.app/Contents/Library/vmrun /usr/local/bin
  3. headless 起動は上記の vmrun に nogui オプションを設定することで実行できる。毎回コマンドに VM ファイルを設定するのが面倒なので、シェルスクリプトを作成しておく。
    #!/bin/sh
    
    VMRUN="vmrun -T fusion"
    VM="$HOME/Virtual Machines.localized/Ubuntu (64 ビット) Server 18.04.2.vmwarevm/Ubuntu (64 ビット) Server 18.04.2.vmx"
    
    case "$1" in
      "start" ) $VMRUN start "$VM" nogui ;;
      "stop" ) $VMRUN stop "$VM" ;;
      "suspend" ) $VMRUN suspend "$VM" ;;
      "stopsoft" ) $VMRUN stop "$VM" soft ;;
      "suspendsoft" ) $VMRUN suspend "$VM" soft ;;
      * ) echo "ubuntu.sh [start|stop|suspend|stopsoft|suspendsoft]" ;;
    esac
  4. これで ubuntu.sh start とすると Ubuntu server がヘッドレスで起動する。

ssh の設定

macOS 側から色々と ssh アクセスすることがあるので、authorized_keys の設定などをしておく。

  1. Ubuntu Server の IP アドレスを .ubuntu_ip というファイルに記載しておく。
    echo 172.16.103.135 > .ubuntu_ip
  2. ubuntu 側に .ssh フォルダを作成する。なお、macOS では fish を使っているので、`` ではなく () を使っている。
    ssh (cat ~/.ubuntu_ip) -C mkdir -p .ssh
  3. macOS 側の id_rsa.pub を ubuntu 側の authorized_keys にコピーする。
    scp .ssh/id_rsa.pub (cat ~/.ubuntu_ip):.ssh/authorized_keys
  4. 公開鍵でログインできることを確認する。
    ssh (cat ~/.ubuntu_ip)
  5. ubuntu 側でも公開鍵を作っておく。
    ssh-keygen

ubuntu → macOS の共有フォルダ設定(あまり使わない)

macOS のホームは、Ubuntu Server 側から読み書きできるようにしたい。以下の手順で設定する。

  1. VMware fusion の共有設定で、hkob フォルダを「読み取り/書き込み」でアクセス許可する。 vmwareShares
  2. この作業だけで自動的に /mnt/hgfs というフォルダに /Users/hkob がマウントされていた。

macOS → ubuntu の共有フォルダ設定 (NFS)

上記の設定で、ubuntu 側から macOS のフォルダは見えるようにはなったが、権限などが色々と面倒そうだった。 実際、docker を共有フォルダの上で動作させたところ、権限の問題があって色々とトラブった。 ということで、逆に ubuntu 側のディスクを macOS 側でアクセスできた方が便利かと考えた。 Linux と macOS なので、せっかくなので NFS で共有することにしてみる。 NFS の場合、ubuntu 側と macOS 側で uid を揃える必要がある。 今回は、ファイルがまだほとんど入っていない ubuntu 側の uid (1000) を macOS と同じ uid (502) に設定することにした。 なお、ログインユーザしているユーザの uid は変更できないので、先ほど作成した admin ユーザで実施する。 参考: Ubuntu で uid、gid、グループ名の変更

  1. 現在の状態を確認
    admin@dockerhost:~$ id hkob
    uid=1000(hkob) gid=1000(hkob) groups=1000(hkob),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd)
  2. ダミーグループの tmpgroup を作成
    admin@dockerhost:~$ sudo groupadd -g 3000 tmpgroup
  3. ダミーグループに変更
    admin@dockerhost:~$ sudo usermod -g tmpgroup hkob
  4. 変更を確認
    admin@dockerhost:~$ id hkob
    uid=1000(hkob) gid=3000(tmpgroup) groups=3000(tmpgroup),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd)
  5. hkob グループを削除
    admin@dockerhost:~$ sudo groupdel hkob
  6. hkob グループを再作成
    admin@dockerhost:~$ sudo groupadd -g 502 hkob
  7. hkob グループに変更
    admin@dockerhost:~$ sudo usermod -g hkob hkob
  8. 変更を確認
    admin@dockerhost:~$ id hkob
    uid=1000(hkob) gid=502(hkob) groups=502(hkob),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd)
  9. ダミーグループを削除
    admin@dockerhost:~$ sudo groupdel tmpgroup
  10. uid を変更。hkob ユーザのプロセスが動いていたら変更できないので、動いているプロセスを削除すること。
    admin@dockerhost:~$ sudo usermod -u 502 hkob
  11. hkob でログイン後、id コマンドで自分のアカウントの変更を確認
    hkob@dockerhost:~$ id
    uid=502(hkob) gid=502(hkob) groups=502(hkob),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd)
  12. nfs をインストール
    hkob@dockerhost:~$ sudo apt install nfs-kernel-server
  13. export の設定を /etc/exports に追記
    echo '/home/hkob 172.16.103.1(rw,no_subtree_check)' | sudo tee -a /etc/exports > /dev/null
  14. nfs-kernel-server を起動
    hkob@dockerhost:~$ sudo systemctl start nfs-kernel-server
  15. nfs-kernal-server を有効化
    hkob@dockerhost:~$ sudo systemctl enable nfs-kernel-server
  16. 先ほど記載した /etc/exports の内容を更新
    hkob@dockerhost:~$ sudo exportfs -ra
  17. macOS 側で $HOME/bin/nfs_mount.sh を記述
    #!/bin/sh
    sudo mount_nfs -P `cat $HOME/.ubuntu_ip`:/home/hkob $HOME/ubuntu
  18. nfs_mount.sh に実行属性を付加
    chmod +x ~/bin/nfs_mount.sh
  19. nfs_mount.sh を実行
    nfs_mount.sh
  20. mount を確認
    df
    172.16.103.135:/home/hkob  536602632  13042304  523560328     3%       75357           134140835    0%   /Users/hkob/ubuntu
  21. umount の際に ubuntu の IP が必要となる。面倒なので、$HOME/bin/nfs_umount.sh を作っておいた。
    #!/bin/sh
    sudo umount `cat $HOME/.ubuntu_ip`:/home/hkob
  22. ubuntu をシャットダウンするときに nfs_umount を忘れそうなので、ubuntu.sh に umount を追加した。
      "stop" ) nfs_umount.sh; $VMRUN stop "$VM" ;;
      "suspend" ) nfs_umount.sh; $VMRUN suspend "$VM" ;;
      "stopsoft" ) nfs_umount.sh; $VMRUN stop "$VM" soft ;;
      "suspendsoft" ) nfs_umount.sh; $VMRUN suspend "$VM" soft ;;"

これでだいたいやりたいことはできるようになった。