hiroの長い冒険日記

主にコンピュータ周辺の興味を持った内容を綴ります

qemu (kvm) に Ubuntu 18.04 minimal install その4

前回までに、qemu (kvm) で virtual disk image と network に Virtio を使用し、linux の仮想 bridge に手動で接続して外部の network に接続できる事を確認した。
hiro20180901.hatenablog.com
今回は、Host の bridge 接続を起動時から有効にするように設定してみた。

debian の network 設定

以下に参考にさせて頂いたサイトを記載する。
Debian ネットワークの設定:
www.debian.org

Debian BridgeNetworkConnections :
wiki.debian.org

Debian 9: bridgeインターフェースの設定 :
www.hiroom2.com

  • 今時の debian では、昔ながらの net-tools (ifconfig、route) を使用した network 設定は時代遅れ (obsolete) らしい。私が設定方法を覚えているのはこのやり方。確認に使うのは良いみたい。
  • linux で手動で設定する場合でも iproute2 (ip command) を使うのを推奨されていた。これからはこちらを使うようにしよう。
  • debian 系では、/etc/network/interfaces で設定し、ifup/ifdown を使うやり方。これも旧式。複雑な設定ならこちらも現役。
  • 今時は、GUI client を持つ Wicd や NetworkManager を使うのが良い。Windows と同じ感覚で設定できるし、Wifi への接続だとはるかに便利だろう。linux を client として接続させる場合にはこちらを使う。

LXDE (Window System) を入れてから network に繋がるようになったのは、Wicd が入ったからなんだね。
hiro20180901.hatenablog.com
この時の疑問が一つ解消した。

wicd の削除

wicd を入れていると、systemd や init.d script で停止しても dhclient が残ってしまい、/etc/network/interfaces の設定と重なってしまう。ArchLinux や Debian の network 設定のページを見ても、複数の network 管理 software の導入は trouble を発生させると記載されている。(ArchLinux WikiDebian Handbook)

今回は、network の管理を ifupdown で行う事とし、wicd を削除した。

$ sudo apt purge wicd
$ sudo apt autoremove

autoremove を使うと、wicd への依存関係で install され且つ wicd を purge して不要となっている package を削除できる。

/etc/network/interfaces による設定

まずは Host 単独で、loopback と enp3s0 を設定してみた。
/etc/network/interface:

auto lo
iface lo inet loopback

auto enp3s0
allow-hotplug enp3s0
iface enp3s0 inet dhcp
iface enp3s0 inet6 auto

ifdown/ifup して確認した。

$ sudo ifdown enp3s0
$ sudo ifup enp3s0
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
    inet 192.168.n.n/24 brd 192.168.n.255 scope global enp3s0
       valid_lft forever preferred_lft forever
    inet6 nnnn:nn:nnn:nnn:nnnn:nnnn:nnnn:nnnn/64 scope global mngtmpaddr dynamic 
       valid_lft 298sec preferred_lft 298sec
    inet6 fe80::nnnn:nnnn:nnnn:nnnn/64 scope link 
       valid_lft forever preferred_lft forever

問題なく設定できていた。ip は短縮コマンドがあるみたいなので、「ip a」だけで表示できた。

次に、bridge を有効にして設定してみた。
/etc/network/interface:追加

iface br0 inet dhcp
      bridge_ports enp3s0
iface br0 inet6 auto

ifupdown して同様に試してみた。

$ sudo ifdown enp3s0
$ sudo ifup br0
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
    inet 192.168.n.n/24 brd 192.168.n.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 nnnn:nn:nnn:nnn:nnnn:nnnn:nnnn:nnnn/64 scope global mngtmpaddr dynamic 
       valid_lft 268sec preferred_lft 268sec
    inet6 fe80::nnnn:nnnn:nnnn:nnnn/64 scope link 
       valid_lft forever preferred_lft forever

enp3s0 には ip address は振られず、br0 に付いている。

最終的に lo と br0 を使うようにした。

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
      bridge_ports enp3s0
iface br0 inet6 auto

再起動して、Host 側が問題なく使える事を確認した。

/etc/network/interfaces に記載する bridge の man page

因みに、man interfaces には bridge の設定は記載されていない。bridge-utils package の中に含まれている。

$ dpkg -L bridge-utils | grep man
/usr/share/man
/usr/share/man/man5
/usr/share/man/man5/bridge-utils-interfaces.5.gz
/usr/share/man/man8
/usr/share/man/man8/brctl.8.gz
$ man bridge-utils-interfaces
BRIDGE-UTILS-INTERFACES(5)       File formats       BRIDGE-UTILS-INTERFACES(5)

NAME
       bridge-utils-interfaces - bridge-utils extensions for the interfaces(5)
       file format

DESCRIPTION
       /etc/network/interfaces contains network interface configuration infor‐
       mation  for the ifup(8) and ifdown(8) commands.  This manpage describes
       the bridge extensions to the standard interfaces(5) file format.
... 略 ...

最近の人達は man page 読むのかな? ググった方が早い場合が多いけど、信頼性の高い情報かどうかの判断が必要だから、どうせなら一次情報に接するのが良いかと思う。(man page と source が違う事も昔はよくあったが...)

qemu (kvm) の network 接続確認

br0 有効な状態で qemu (kvm) を起動してみた。
Host:

$ sudo brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.20cf30877f51	no		enp3s0
							tap0

qemu (kvm) を起動するだけで tap で bridge に接続し、外にも繋がっている状態となった。

結果

  • 最近の linux/debian の network 設定について調べてみた。これからは次のように使い分けてみる。
    • 手動で設定する場合は iproute2 を使う (net-toool は obsolete なので出来るだけ使わない)
    • ちょっと複雑な設定を起動時に設定したい場合には /etc/network/interfaces で設定する
    • Desktop 環境でお手軽に使いたい場合には Wicd or NetworkManager を使う
    • 複数の network 設定 software は同時に使用しない。適材適所。
  • /etc/network/interfaces に設定する事で、起動時から bridge が有効になった。仮想マシンを tap 有効にして起動するだけで、bridge 経由で外の世界に繋がるようになった。

今後調べる事(順不同):

  • 最近の daemon の起動/停止方法について調べてみる。SysVinit の時代の人なので、systemd はよく分からない。
  • 起動時の kernel、initramfs、systemd の中身を調べてみる。仮想マシンと比べて実 PC の起動に時間を要している。何がひっかかっているのか。
  • qemu (kvm) の /etc/qemu-ifup と /etc/qemu-ifdown script の中身を読んでみる。もっと簡単に出来るかも。

最近の linux に追いつくのには時間がかかる。でも面白い。昔を思い出して懐かしい所もある。昔は input ばかりだったけど、今は output を増やしたい。