ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

VyOSをXenの準仮想化(PV)モードで動かす

ちょっとBGPとかISISとかのお勉強をしたいなと思い、VyOSを実験マシンで動かすことにしました。
VyOSはVyattaというソフトウェアルーターオープンソースから派生したLinuxベースのルーティングソフトです。
実験に使う機材は例によってIntel VTの使えないシングルコアCeleron 550マシンなのでXen準仮想化(PV)モードで動かします。
環境はLinux Mint Mate 18.3 + Xen 6.4Ubuntu 16.04 LTSでも同じ手順で行けると思います

そしてまたまたハマりました(笑)
Xenを使い始めた頃にUbuntu ServerをXen PVモードで起動出来るまで2週間かかったのに比べると今回は約3晩、時間にして10時間くらいで解決できました。だいぶ準仮想化Linux動かすノウハウがついてきました。

備忘録としてハマりポイントとか書いていきます

  1. ISOイメージ入手

    https://vyos.io/
    のDownloadsからLive CDのISOイメージを入手します。2018/4/13時点の最新stable版は1.1.8でvyos-1.1.8-amd64.isoというのが物理サーバー上でも仮想マシンでも動く64bit版のVyOSのLive CDイメージです
  2. ISOをloopbackマウントし、kernelとramdiskイメージを取り出す

    PVモードではBIOSのエミュレーションが出来ないので、kernelイメージを取り出して、それを元にLive CD起動する必要があります。とりあえず、下記の様に/mnt下にマウントします

    # sudo mount -o loop -t iso9660 vyos-1.1.8-amd64.iso /mnt

    /mntの下を見るとdoc,isolinux,liveというディレクトリがあります
    liveの下にvmlinuzとinitrd.imgがあるので適当なディレクトリにコピーします

    # ls /mnt
    doc  isolinux  live  md5sum.txt
    # ls /mnt/live
    filesystem.packages  initrd.img    parameters.txt
    filesystem.squashfs  packages.txt  vmlinuz
    # cp /mnt/live/vmlinuz /home/foo/xen-work/vyos/
    # cp /mnt/live/initrd.img /home/foo/xen-work/vyos/

    ちなみにliveの下にあるparameters.txtには起動時に使えるkernelオプション一覧が載っているので、これも参考用に取り出しておくと良いです。これとisolinuxの下にあるisolinux.cfgがインストーラを起動するためのKernelオプション指定の参考なりました

    # cp /mnt/live/parameters.txt /home/foo/xen-work/vyos/
    # cp /mnt/isolinux/isolinux.cfg /home/foo/xen-work/vyos/

    必要なファイルを取り出したら、ISOイメージをアンマウントします

    # cd /home/foo/xen-work/
    # sudo umount /mnt

  3. イメージファイルを作成する

    最低スペックはHDD 2Gということで2GBのRAWイメージファイルを作成します
    (ストレージに余裕がある人はもっと大きいイメージファイルを作っても構いません)

    # truncate -s 2G vyos.img

  4. インストール用のxl.cfgを作成する。

    vyos-inst.cfgというファイル名で下記の内容のファイルを作成しました
    /home/foo/xen-work/下にisoイメージ、/home/foo/xen-work/vyos下に先ほどのkernelとramdiskがあるものします。

    name = "vyos"
    kernel = "/home/toy/xen-work/vyos/vmlinuz"
    ramdisk = "/home/toy/xen-work/vyos/initrd.img"
    # 最低メモリ量512MB(実際は256MBでも起動はできる)
    memory = 512
    vcpu = 1
    disk = [ 'file:/home/foo/xen-work/vyos.img,xvda,w','file:/home/foo/xen-work/vyos-1.1.8-amd64.iso,xvdb:cdrom,r' ]
    
    # networkインターフェイス xx:xx:xxには任意のMACアドレス下位3オクテットを記載
    vif = [ 'mac=00:16:3e:xx:xx:xx,bridge=xenbr0']
    
    hostname=vyos"
    # Kernel Bootオプション
    #   console=hvc0 xencons=ttyはXen用の仮想コンソール
    #   boot=liveはVyOS用kernelの最低限の起動オプション
    extra = "console=hvc0 xencons=tty boot=live"
    
    # インストール時VGAコンソールが必要なのでVNCを有効化
    vnc=1

    ここでのポイントは以下の通りです

    1. Kernel起動オプションは"boot=live"がミニマム。これはisolinux.cfgを見て判断しました
    2. Kernel起動オプションに"console=hvc0 xencons=tty"を付ける。デフォルトではttyS0を使おうとしてブート中にpanicを起こすため、Xen用のコンソール指定を付けています。"xencons=tty"は要らないかもしれませんが一応付けました
    3. VNCを有効にする。実はconsole=hvc0を指定していても、ある程度までbootが進んだところでコンソールは無応答になります。ここの解決にハマったのですが、実はVGAコンソール側にコマンドプロンプトが出ており、そちらからインストール作業が出来る状態になりますvnc=1を指定しておいて、ある程度bootが進んだところで適当なvnc viewerでVGAコンソールに接続します
  5. LiveCD起動

    # sudo xl create -c vyos-inst.cfg

    これでkernel bootが始まります。以下にようなメッセージがコンソールに出力されるまで待ちます

    Starting routing daemons: ripd ripngd ospfd ospf6d bgpd.
    Mounting VyOS Config...done.
    Starting VyOS router: migrate rl-system firewall configure.
    Starting vyos-intfwatchd: vyos-intfwatchd.

    この状態でvncviewerを起動しますvnc=1のみの設定ではlocalhost:5900にvncviewerを繋げばLiveCDの操作画面にアクセス出来ます

    Linux vyatta 3.13.11-1-amd64-vyatta #1 SMP Sat Nov 11 12:10:30 CET 2017 x86_64
    Welcome to VyOS.
    This system is open-source software. The exact distribution terms for 
    each module comprising the full system are described in the individual 
    files in /usr/share/doc/*/copyright.
    vyos@vyos:~$ 

    こんな感じの画面がvncviewer側に表示されていますので、公式のwikiを参考にインストールコマンドを入力するとインストールが進みます

    vyos@vyos:~$ install image

    インストールが終わったらrebootするか聞かれるので、yesと入力しますが、このままでは、またLiveCDが起動するため、起動したのを見届けたら適当に別端末開いて

    # sudo xl destroy vyos

    としてVM止めます

  6. インストール済みイメージ起動用のxl.cfgを作成

    ファイル名をvyos.cfgとすると下記の内容になります

    name = "vyos"
    memory = 512
    vcpu = 1
    disk = [ 'file:/home/foo/xen-work/vyos.img,xvda,w']
    
    vif = [ 'mac=00:16:3e:xx:xx:xx,bridge=xenbr0']
    # VNC設定は不要。
    # vnc = 1
    bootloader = "/usr/lib/xen-4.6/bin/pygrub"

    最新のubuntuCentOSと異なり、bootloaderはpygrubが使えます。

  7. vyos.imgをloopbackマウントしてgrub.cfgを書き換え

    vyos.imgをkpartxを使いloopbackマウント、/boot/grub/grub.cfgを編集します

    # sudo kpartx -av vyos.img
    add map loop0p1 (253:0): 0 4192256 linear 7:0 2048
    # sudo mount /dev/mapper/loop0p1 /mnt
    # sudo vi /mnt/boot/grub/grub.cfg

    grub.cfg内には「VyOS 1.1.8 Linux (KVM console)」というメニューアイテムが定義されていますがこれを「VyOS 1.1.8 Linux (Xen console)」に書き換えると共に、console指定をconsole=hvc0に書き換えます。オリジナルはconsole=ttyS0等になっていますが、ttyS0ではXenのPVモードで起動出来ないためです。

    # Generated by /opt/vyatta/sbin/vyatta-grub-setup at Thu Apr 12 13:56:00 UTC 2018
    set default=0
    set timeout=5
    serial --unit=0 --speed=9600
    terminal_output --append serial
    
    echo -n Press ESC to enter the Grub menu...
    if sleep --verbose --interruptible 5 ; then
            terminal_input console serial
    fi
    
    menuentry "VyOS 1.1.8 linux (Xen PV console)" {
            linux /boot/1.1.8/vmlinuz boot=live quiet vyatta-union=/boot/1.1.8  console=hvc0
            initrd /boot/1.1.8/initrd.img
    }
    menuentry "Lost password change 1.1.8 (Xen PV console)" {
            linux /boot/1.1.8/vmlinuz boot=live quiet vyatta-union=/boot/1.1.8 selinux=0 console=hvc0 init=/opt/vyatta/sbin/standalone_root_pw_reset
            initrd /boot/1.1.8/initrd.img
    }
    # sudo umount /mnt
    # sudo kpartx -d vyos.img
    loop deleted : /dev/loop0

    これで後はxlコマンドで先ほど作成したvyos.cfgを使ってVMイメージを起動します

    # sudo xl create -c vyos.cfg

    後はコンソールからユーザーガイド
    ユーザーガイド - VyOS jp
    に従って各種設定を実施しますが、コンソールに関して以下の設定をしておくと余計なメッセージがコンソールに出なくなります

    $ configure
    # delete system console device ttyS0 
    # set system console device hvc0
    # commit
    # save 

    ネットワークの設定などは特殊な部分は無いのでVyOSのユーザーガイドを参照してください。

    ユーザーガイド - VyOS jp

今回のハマりポイント

  • インストール時のkernelの起動オプションを解析
  • コンソール指定の各所での書き換え(ttyS0をhvc0に変更)

の2点でした。