動かざることバグの如し

近づきたいよ 君の理想に

limaで作成した仮想VMにホスト側からアクセスしたい

環境

  • lima 0.11.3

やりたいこと

limaを使うとアーキテクチャの壁を超えて仮想マシンを構築できるが、デフォルトではホストOS側とネットワークの共有されていないため、 Macからネットワーク経由でアクセスすることはできない。

それをいなんとかしたい

昔は自分で結構しなきゃいけなかったようだが、最近のlimaではVirtualBoxみたいに簡単に共有設定が出来る。

やり方

実は公式ドキュメントに詳しく載ってる

github.com

まずvde-2lima-vm/vde_vmnetってのをビルドインストールしなきゃいけない

必要なビルドツールをインストール

brew install autoconf automake

vde-2を適当にダウンロードして解凍

ビルドに必要なファイル生成

autoreconf --install

./configure が生成されるので実行

./configure

ビルド

make
sudo make install

lima-vm/vde_vmnet も同様にダウンロードしてインストール

sudo make PREFIX=/opt/vde install

ホスト(MacOS)側のルーティングをlimaが弄る必要もあるのでsudoなしで実行できるようにする

limactl sudoers | sudo tee /etc/sudoers.d/lima

設定方法

デフォルトだと limaのVMの設定は ~/.lima/<インスタンス名>/lima.yaml に格納される。(例えば lima start docker.ymlなら ~/.lima/docker/lima.yaml

そこに設定を足して limactl stop <インスタンス名> limactl start <インスタンス名> すればおk

limaのネットワーク設定種類

いくつかある

shared

networks:
  - lima: shared

ホストとlimaの仮想VM同士共通のネットワークを作成し共有する方法。例ではlima0が作成されて 102.168.105.2 でアクセス可能

3: lima0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:55:55:76:5b:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.105.2/24 metric 100 brd 192.168.105.255 scope global dynamic lima0
       valid_lft 83948sec preferred_lft 83948sec
    inet6 fd17:fb46:3fa2:c696:5055:55ff:fe76:5b27/64 scope global dynamic mngtmpaddr noprefixroute
       valid_lft 2591982sec preferred_lft 604782sec
    inet6 fe80::5055:55ff:fe76:5b27/64 scope link
       valid_lft forever preferred_lft forever

host

networks:
  - lima: host

sharedと似てるが、仮想VM内同士の共有も可能な点が異なる。同様にlima0が作成されて 192.168.106.2 でアクセス可能。

3: lima0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:55:55:76:5b:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.106.2/24 metric 100 brd 192.168.106.255 scope global dynamic lima0
       valid_lft 86194sec preferred_lft 86194sec
    inet6 fe80::5055:55ff:fe76:5b27/64 scope link
       valid_lft forever preferred_lft forever

bridged

networks:
  - lima: bridged

ホストと同じIPをlimaの仮想VMも持つ。ので例えばlimaの仮想VM内で python -m http.server -p 8000 すれば 192.168.1.117:8000 または localhost:8000 でアクセス可能

3: lima0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:55:55:76:5b:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.117/24 metric 100 brd 192.168.1.255 scope global dynamic lima0
       valid_lft 259031sec preferred_lft 259031sec
    inet6 fe80::5055:55ff:fe76:5b27/64 scope link
       valid_lft forever preferred_lft forever

ネットワーク自体の設定はどこ?

~/.lima/_config/networks.yaml に定義されている

デフォルトだとこんな感じ

# Paths to vde executables. Because vde_vmnet is invoked via sudo it should be
# installed where only root can modify/replace it. This means also none of the
# parent directories should be writable by the user.
#
# The varRun directory also must not be writable by the user because it will
# include the vde_vmnet pid files. Those will be terminated via sudo, so replacing
# the pid files would allow killing of arbitrary privileged processes. varRun
# however MUST be writable by the daemon user.
#
# None of the paths segments may be symlinks, why it has to be /private/var
# instead of /var etc.
paths:
  vdeSwitch: /opt/vde/bin/vde_switch
  vdeVMNet: /opt/vde/bin/vde_vmnet
  varRun: /private/var/run/lima
  sudoers: /private/etc/sudoers.d/lima

group: everyone

networks:
  shared:
    mode: shared
    gateway: 192.168.105.1
    dhcpEnd: 192.168.105.254
    netmask: 255.255.255.0
  bridged:
    mode: bridged
    interface: en0
    # bridged mode doesn't have a gateway; dhcp is managed by outside network
  host:
    mode: host
    gateway: 192.168.106.1
    dhcpEnd: 192.168.106.254
    netmask: 255.255.255.0