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

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

Ubuntu16.04LTS+Xen(その2: 急がば回れ!!)

ということで、VAIO Type Nで再度Lint Mint Mate 18.03をインストールしてXenに再トライです。このマシンのスペックは、

CPUCeleron 550 2GHz(シングルコア,64bit,Intel VT無し)
RAMDDR2 664:2GB(最大容量,増設不可)
HDD160GB
RAMが2GBで増設できないため、本家Ubuntu+GNOMEだと起動するだけで1GBくらいメモリ消費し、残り1GBしかありません。Linux Mint Mateだと、不要サービス(モデムサービスとかpppdとかavahi-deamonとか)を片っ端から止めると、デスクトップ起動した状態でメモリ使用量300MB弱くらいで本家Ubuntuよりはかなり余裕があります。 これに基本はほぼ https://help.ubuntu.com/community/Xen に従って、Xenのインストールと設定をしていきます。 若干、作業順は変えています。(オリジナルの通りでも内容理解していれば問題無いとは思います) またGuestOS用のcfg作成等に下記サイトも参考なりました。 https://wiki.archlinux.jp/index.php/Xen このサイトのおかげでDomUコンフィグファイルの構成がある程度理解できたので、virt-installやvirt-managerに頼らずに手作業でguestイメージのコンフィグレーションを作成していきます。 以下、host側はUbuntuもしくはLinux Mintは64bit版を前提にしています。試してませんが、おそらくUbuntu16.04LTSでも同じ手順で行けるだろうと思います。 (sudoでのパスワード入力は省略して書いています) またGuest(DomU)としてUbuntu Serverを最小構成でインストールします
  1. ネットワークマネージャー停止

    # echo "manual" | sudo tee /etc/init/network-manager.override

    この時点では停止していない。これで次回reboot時に停止する。

  2. bridge-utilsインストール

    # sudo apt-get install bridge-utils

  3. Xen用のbridgeを設定する

    # sudo vi /etc/network/interfaces
    auto lo enp2s0 xenbr0
    iface lo inet loopback
    
    iface xenbr0 inet dhcp
      bridge_ports enp2s0
    
    iface enp2s0 inet manual

    xenbr0という名前のbridgeを作り、有線LANにbridgeします
    基本的には参照ドキュメントの通りですが、最新のUbuntuやMintではネットワークインターフェイス命名規則が変わっています。自分のマシンの場合はeth0enp2s0になっています。

  4. bridgeに対するnetfilterの削除

    # sudo vi /etc/sysctl.conf
    net.bridge.bridge-nf-call-ip6tables = 0
    net.bridge.bridge-nf-call-iptables = 0
    net.bridge.bridge-nf-call-arptables = 0

    このあと、sysctlコマンドで設定を反映するのですが、実際にbridgeが生成されてからじゃないとsysctlコマンドが有効にならないようです。なので、Xenのインストールとrebootを先にやります。reboot後にbridge xenbr0ができているはずです。

  5. grubの設定を確認、変更

    Xenをインストールすると次回RebootからデフォルトでXen+Dom0としてのUbuntuなりLinux Mintが起動するようなります。grubの設定を下記の様にしておくと、Xenインストール後、再起動時にgrubメニューからXen無しのUbuntu/Mintも起動可能になります

    # sudo vi /etc/default/grub

    下記の行GRUB_HIDDEN_TIMEOUTを見つけてコメントアウト
    (Ubuntuだと多分、最初からコメントアウトされているので確認のみ)

    #GRUB_HIDDEN_TIMEOUT=0

    下記コマンドでgrub設定に反映

    # sudo update-grub

  6. Xenをインストール

    # sudo apt-get install xen-hypervisor-amd64

    Ubuntu16.04やLinux Mint 18.03の場合、上記でxen-4.6がインストールされます。
    インストール完了したらrebootします。

    # sudo reboot

  7. Xenの起動を確認

    再起動したらXenが起動していることを確認します。

    # sudo xl list
    Name                                        ID   Mem VCPUs	State	Time(s)
    Domain-0                                     0  1887     1     r-----     681.9

    またifconfigコマンド等でbridge xenbr0にIPアドレスが振られていること。
    インターネットに疎通あることを確認しておきます。(pingでもcurlでもなんでも)

    # ifconfig
    ....
    xenbr0    Link encap:イーサネット  ハードウェアアドレス xx:xx:xx:xx:xx:xx  
              inetアドレス:192.168.11.8  ブロードキャスト:192.168.11.255  マスク:255.255.255.0
              inet6アドレス: fe80::xxx:xxxx:xxxx:xxxx/64 範囲:リンク
              UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
              RXパケット:42649 エラー:0 損失:0 オーバラン:0 フレーム:0
              TXパケット:29644 エラー:0 損失:0 オーバラン:0 キャリア:0
              衝突(Collisions):0 TXキュー長:1000 
              RXバイト:55748291 (55.7 MB)  TXバイト:3242430 (3.2 MB)

    xenbr0ができているのを確認したら、reboot前に仕込んだnetfilter停止を実行しておきます。

    # sudo sysctl -p /etc/sysctl.conf

  8. DomUにインストールするUbuntu ServerのISOイメージ取得

    http://archive.ubuntu.com/ubuntu/dists/xenial-updates/main/installer-amd64/current/images/netboot/
    からmini.isoをダウンロードしました。
  9. DomUのKernelイメージを格納するディレクトリを作成。

    仮に/home/foo/ubuntu-serverとします。
  10. ダウンロードしたmini.isoをloopバックマウント

    mini.isoを置いたディレクトリにcd後、/mntにマウントする前提で以下のコマンドを実行

    # sudo mount -o loop -t iso9660 ./mini.iso /mnt
    mount: /dev/loop0 is write-protected, mounting read-only

  11. kernelとramdiskイメージ取り出し

    /mntに下にlinuxとinitrd.gzというファイルが見つかるはずなので、これを先ほど作成した/home/foo/ubuntu-server/にコピーします。

    # ls /mnt
    adtxt.cfg     f10.txt  f6.txt     isolinux.bin  linux       stdmenu.cfg
    boot          f2.txt   f7.txt     isolinux.cfg  menu.cfg    txt.cfg
    boot.cat      f3.txt   f8.txt     ldlinux.c32   prompt.cfg  vesamenu.c32
    exithelp.cfg  f4.txt   f9.txt     libcom32.c32  rqtxt.cfg
    f1.txt        f5.txt   initrd.gz  libutil.c32   splash.png
    # cp /mnt/linux /home/foo/ubuntu-server/
    # cp /mnt/initrd.gz /home/foo/ubuntu-server/
    # sudo umount /mnt

  12. DomU用のディスクイメージファイルを作成

    とりあえず10GBもあれば最小構成のUbuntu Serverには十分なので下記の様にファイルを作成しておきます。(LVM等で領域を開ける手もありますが、とりあえず動かすだけならこれが簡単です)

    $ truncate -s 10G /home/foo/ubuntu-server/ubuntu.img

  13. xl.cfgファイルを作成

    DomUのコンフィグファイルを作成します。とりあえずubuntu-svr.cfgというファイル名とします。内容は以下の通り。/home/foo/ubuntu-server/配下に置くものとします。

    name = "ubuntu"
    kernel = "/home/foo/ubuntu-server/linux"
    ramdisk = "/home/foo/ubuntu-server/initrd.gz"
    memory = 512
    vcpus = 1
    disk = [ 'file:/home/foo/ubuntu-server/ubuntu.img,xvda,w']
    vif = [ 'mac=00:16:3e:00:00:01,bridge=xenbr0']
    extra = "root=/dev/xvda1"
    # bootloader = '/usr/lib/xen-4.6/bin/pygrub'

    項目説明
    nameDomUの名称。xlでDomUを操作するのに使う。とりあえず"ubuntu"としましたが、DomU毎にユニークなら何でも良いです
    kernelインストール用のISOイメージから取り出したkernelイメージへのパス
    ramdiskインストール用のISOイメージから取り出したramdiskイメージへのパス
    memoryDomUに割り当てるメモリサイズ。とりあえず512MB
    vcpusDomUに割り当てるVCPU数。とりあえず1
    disk作成したDomU用のディスクイメージファイルへのパス
    vifDomU用の仮想ネットワークインターフェイスに割り当てるbridge名。macは省略するとランダムに割り当たるらしいです。固定で割り振る場合は、上位3オクテットは00:16:3e(Xen用に予約されているそうです)、下位3オクテットは任意の値。複数のDomUを作る場合、DomU毎にユニークになる様に
    extrakernelパラメータ。とりあえずrootのパーティション名を指定。
    bootloaderXengrubエミュレータへのパス。Xen4.6の場合は '/usr/lib/xen-4.6/bin/pygrub'。この段階ではコメントアウトしておきます。
  14. xlコマンドでDomU起動

    # sudo xl create -c /home/foo/ubuntu-server/ubuntu-svr.cfg

    これでネットワークインストール用のLinuxカーネルが起動し、インストーラーが立ち上がるはずです。
    もしも

    xenconsole: Could not read tty from store: Success

    というエラーが出たら、
    https://tipstricks.itmatrix.eu/ubuntu-16-10-xenconsole-could-not-read-tty-from-store-success/
    に記述に従って、xenconsoledを起動し、再度xlコマンドを実行してください。
    成功すると下記の様にインストーラの言語選択画面が表示されるはずです。

    
    
    
    
      ┌───────────────────────┤ [!!] Select a language ├────────────────────────┐
      │                                                                         │
      │ Choose the language to be used for the installation process. The        │
      │ selected language will also be the default language for the installed   │
      │ system.                                                                 │
      │                                                                         │
      │ Language:                                                               │
      │                                                                         │
      │                               C                                         │
      │                               English                                   │
      │                                                                         │
      │     <Go Back>                                                           │
      │                                                                         │
      └─────────────────────────────────────────────────────────────────────────┘
    
    
    
    
    <Tab> moves; <Space> selects; <Enter> activates buttons
    

    あとはインストーラの指示に従ってインストールしていくだけです。

  15. DomUを一旦削除。

    インストールが成功すると下記の様な感じで自動的にrebootしますが、このままでは再びインストーラが起動します。

    The system is going down NOW!                                                  
    Sent SIGTERM to all processes
    Sent SIGKILL to all processes
    Requesting system reboot
    [  181.999057] reboot: Restarting system

    従って一旦起動したDomUを削除します。

    # sudo xl list
     
    Name                                        ID   Mem VCPUs	State	Time(s)
    Domain-0                                     0  1753     1     r-----    1220.2
    ubuntu                                       3   512     1     -b----       3.5
    # sudo xl destroy ubuntu

  16. DomUのコンフィグファイル再編集

    /home/foo/ubuntu-server/ubuntu-svr.cfgを再編集します。

    name = "ubuntu"
    #kernel = "/home/toy/xen-work/ubuntu/linux"
    #ramdisk = "/home/toy/xen-work/ubuntu/initrd.gz"
    memory = 256
    vcpus = 1
    disk = [ 'file:/home/toy/xen-work/ubuntu.img,xvda,rw']
    vif = [ 'mac=00:16:3e:00:00:01,bridge=xenbr0']
    #extra = "root=/dev/xvda1"
    bootloader = '/usr/lib/xen-4.6/bin/pygrub'

    あとインストール時、メモリサイズ512MBにしましたがインストール後のRAM使用量が50MBくらいしか無いので、256MBに減らしています。メモリに余裕がある場合は変更は不要だと思います。(ちなみに128MBも試しましたが、起動途中でDomU内でout of memoryになり起動しませんでした。)
  17. 再度DomU起動

    # sudo xl create -c /home/foo/ubuntu-server/ubuntu-svr.cfg

    これでインストール済みのディスクイメージから起動し、ログイン画面が現れるはずです。

これで一通りインストール完了です。
ちなみにDomUで起動したUbuntu serverの起動直後のメモリ使用量はざっとこんな感じです。Linux Mintであればメモリ2GBのマシンでも256MBのUbuntuサーバーを2本くらいDomUで上げても大丈夫そうです。

user1@ubuntu-03:~$ free
              total        used        free      shared  buff/cache   available
Mem:         240904       52024       60436         944      128444      174532
Swap:        520188           0      520188

まだほとんど何も試していませんがUbuntu serverを起動するだけなら、host側のLinux MintChrome等立ち上げてブラジングしていてもさほど待つこともないしconsoleやsshアクセスに対する応答も特に問題ありません。以前同じマシンでvirtual box+CentOSをインストールしたことがありますが、到底我慢できるレベルの遅さでは無かったのでXenの準仮想化は10年前のマシンで仮想化遊びをやるにはかなり良い感じです。

ただ、今となってはKVMほど情報が無いのがキツイですね。

その他:

  • 同じ手順でCentOS7を立ち上げようとしていますが、うまく行っていません。

色々試してイメージファイルへのOSインストールまでは成功しましたがpygrubがbootパーティションを認識してくません。ただいま解決策模索中。
→一応解決しました。Xen用のgrub2をbuildしてbootloaderとして使うというのが解決策。下記を参照してください。
rc30-popo.hatenablog.com

  • 自分のマシンだとXen+Dom0(Linux Mint)を起動するとWi-Fiが使えなくなります。

Xen+Dom0(Ubuntu)だとWi-Fiも大丈夫でした。ただしxenbr0をWi-Fiにブリッジするのは試していません。

2018/09/02追記:
Lint Mintを載せていたPCが故障したので、Ubuntu 16.04LTSに同じ手順で環境を作ったのですが、network managerの停止と、bridgeのnetfilter停止はやらなくても問題無さそうです。
network managerは停止すると、LANの物理ifとbridgeをifupコマンド等で手動upする必要があり面倒です。

Mintを載せていたVAIO TypeNは本体は多分問題なしで、電源アダプタが逝ってしまったみたいで、ネット通販で互換性のあるアダプタも購入可能なのですが、さすがにこれ以上お金かけて運用継続するのもコスパ悪いのでHDDだけ抜き取ってメーカーのPCリサイクルに出す事に。
Mint機で作成していたXen用のDomUイメージ(Ubuntu Server,CentOS,VyOS)はそのまま移行先のUbuntuマシンで動いています。
今更だけど仮想化は便利ですね。