Ubuntu14.04にソースコードからXen4.5をインストール

  1. まず、aptをアップデートする

  2. 次に必要なパッケージをインストールする

  3. 次にXen4.5のソースコードをダウンロードする

  4. 次に、コンパイルする

  5. 次に、インストールする

  6. 次に、bootの順序をXenから起動するように変更する
    まず、カーネルのバージョンを以下のコマンドで確認する

    /etc/default/grubに以下の内容を追加する
    カーネルのバージョンは適宜置き換える

    最後に、grubの設定をアップグレードする

  7. 再起動する

  8. 以下のコマンドでうまくインストールされたことを確認する

Xenをインストールし,準仮想化

オフィシャルサイトに従い,Ubuntu Server 14.04 64bitを使ってUbuntu 14.4をdomUとしてインストールする

1. Ubuntu Serverをインストールする

    • 普通にインストールよいが,パーティションのところで”Guided  - use the entier disk and setup LVM”を選択し,Dom0(つまり今インストールしているUbunu Server)の領域を最小限サイズにして残りをLVMボリュームとして残しておく.これを失敗するとXenの中でdomUに割り当てる領域が確保できなくなる.
    • インストール後,以下のコマンドでaptをアップデート.
      • $sudo apt-get update
      • $sudo apt-get upgrade

2. Xenのインストール

    • 以下のコマンドを実行
      • sudo apt-get install xen-hypervisor-amd64
      • sudo reboot
    • うまくいっていれば,リブート後,ブートローダーでXenのメニューが出てくる.また,ブートの途中のメッセージが変わる.
    • ログイン後,以下のコマンドで確認
      • $sudo xl list
    • これで”Domain-0″が見えていれば,今起動しているのはXenからdom0として起動したUbuntuということになる.

3. ネットワークの設定

以下の前提で話を進める.

      • ホスト側物理IP:172.21.33.20
      • ホスト側物理インタフェース:em1
      • デフォルトゲート: 172.21.33.1
    • bridge-utilsのインストール
      • $sudo apt-get install bridge-utils
      • ただし,これは既にインストールされているかもしれない.
    • ブリッジインタフェースの定義(重要). xenbr0という仮想インタフェースを作成し,em1でブリッジする
        • $sudo vi /etc/network/interfaces

      # The loopback network interface
      auto lo
      iface lo inet loopback
      # The primary network interface
      auto em1 xenbr0       –> xenbr0を加える
      iface em1 inet static  –> ホスト側インタフェース(em1)の設定
      address 172.21.33.20
      netmask 255.255.255.0
      network 172.21.33.0
      broadcast 172.21.33.255
      gateway 172.21.33.1
      dns-nameservers 172.21.33.16
      dns-search fd.ise.shibaura-it.ac.jp

      まちがい.これは行う必要はない.

      iface xenbr0 inet static   –> ブリッジインタフェースの作成.
      address 172.21.33.22
      netmask 255.255.255.0
      network 172.21.33.0
      broadcast 172.21.33.255
      gateway 172.21.33.1
      dns-nameservers 172.21.33.16
      bridge_ports em1      –> em1にこのインタフェース(xenbr0)を加える.
      iface em1 inet manual   –> この意味は不明.これは,xenbr0を実行する物理的なインタフェースがem1で,そこにはIPはふらないのでこの設定が必要.

    • 定義した変更を反映
      • $sudo ifdown em1
      • sudo ifup xenbr0
      • sudo ifup em1
    • ifconfigなどでxenbr0が作成され,IPが付いているかを確認する

4. 論理ボリュームの作成

    • 論理ボリュームブループ(vgs)に論理ボリューム(lv)を作成する.まず,論理ボリュームグループを確認する
      • $sudo vgs

                                      Screen Shot 2015-05-15 at 09.17.49

                                      この例ではxen-vgという論理ボリュームグループが確認できる

    • 論理ボリュームをlv_vm_ubuntuという名前で作成する
      • $sudo lvcreate -L 30G -n lv_vm_ubuntu /dev/xen-vg
    • 作成された論理ボリュームを確認する
      • $sudo lvs

Screen Shot 2015-05-15 at 09.25.43

                                     この例では,lv_vm_ubuntuという名前で30G確保されていることがわかる.

5. ゲストのインストール

    • domUにインストールするイメージを取得する
      • $sudo mkdir -p /var/lib/xen/images/ubuntu-netboot/trusty14LTS
      • $cd /var/lib/xen/images/ubuntu-netboot/trusty14LTS
      • $wget http://ftp.riken.jp/Linux/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/xen/vmlinuz
      • $wget http://ftp.riken.jp/Linux/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/xen/initrd.gz
    • 設定ファイルの準備.Xenでは,インストールイメージの指定,CPUの数,メモリ量などを設定ファイルに記述し,xlコマンドを使ってインストールや起動を行う.以下は,ゲスト名dom0, 仮想cpu2, メモリ1024MBの設定を行う例.設定ファイルはubun1.cfg
      • $cd /etc/xen
      • $sudo cp xlexample.pvlinux ubud1.cfg
      • $vi ubud1.cfg

# Guest name
name = “dom1″  –> ゲストのホスト名

# Kernel image to boot
kernel = “/var/lib/xen/images/ubuntu-netboot/trusty14LTS/vmlinuz” –>ダウンロードしたイメージの場所

# Ramdisk (optional)
ramdisk = “/var/lib/xen/images/ubuntu-netboot/trusty14LTS/initrd.gz” –> ダウンロードしたイメージの場所
#bootloader = “/usr/lib/xen-4.4/bin/pygrub”                      –> 作成したイメージから起動する場合にはコメントを外す

# Kernel command line options
extra = “root=/dev/xvda1″   –> 意味不明

# Initial memory allocation (MB)
memory = 1024                      –> メモリサイズ

# Maximum memory (MB)
# If this is greater than `memory’ then the slack will start ballooned
# (this assumes guest kernel support for ballooning)
#maxmem = 512

# Number of VCPUS
vcpus = 2                                 –> CPUの数

# Network devices
# A list of ‘vifspec’ entries as described in
# docs/misc/xl-network-configuration.markdown
vif = [ 'bridge=xenbr0' ]       –> ゲストが利用する仮想インタフェースの名前.
disk = [ '/dev/xen-vg/lv_vm_ubuntu,raw,xvda,rw' ]  –> ディスクイメージの設定.xen-vmとlv_vm_ubuntuを指定

    •  ゲストをインストールするときにはkernel, ramdiskを指定し,インストールして作成したイメージから起動するときにはbootloaderのコメントを外し,kernel, ramdiskをコメントアウトする
    • インストールの実行.編集した設定ファイルを指定してゲストを起動する.今回はインストールになる.
      • sudo xl create -c /etc/xen/ubud1.cfg
      • インストールの途中,インターフェースの指定では,ホストと同一ネットワークを指定し,IPアドレスは変更する.
    • インストールが終わると再起動されるが,そのままホストのコンソールに戻される.動いているかどうか確認するには以下のコマンドを実行
      • xl list
      • これでDomain-0だけでなく,dom1(指定した名前)のゲストが見えるはず

6. ゲストの起動と確認

    • ゲストを落とす
      • $sudo xl shutdown ubud1
    • ゲストをインストールしたイメージから起動する
      • 前述したように,設定ファイルのbootloaderのコメントを外し,kernel, ramdiskをコメントアウトする
      • $sudo xl create -c /etc/xen/ubud1.cfg
    • ゲストにリモートからログイン
      • ホストにログインし,ゲストのIPを指定してsshなどを行ってみる.
      • $ssh 172.21.33.22
      • ログインできていたら成功

7.  2台目以降の仮想マシン

これから仮想マシンを増やすときには,論理ボリュームを作成,設定ファイルの作成し,xl createで作ればよい.ブリッジインタフェースは使いまわすこと!

8. domUをバックアップして再利用

//スナップショットを取る(-s)
lvcreate -L 5G -s -n ‘pracb1_2′ /dev/xen-vg/prac1_2

//イメージを作る
dd if=/dev/xen-vg/pracb1_2 of=/home/hiroaki/snapshot.img bs=1k

//消す
lvremove /dev/xen-vg/pracb1_2

//論理ボリュームを作る
lvcreate -L 5G -n ‘pracb1_2′ /dev/xen-vg

//イメージから戻す
dd if=/home/hiroaki/snapshot.img of=/dev/xen-vg/pracb1_2 bs=1k

Ubuntu12.04でOpen vSwitchをインストール

Ubuntu12.04.4 LTSでOpen vSwitchをインストールし,設定した.

インストール

1. Ubuntu12.04を普通にインストール

2. apt-get updateでアップデート

3. 以下のコマンドで必要なパッケージをインストール

# apt-get install -y git linux-source kernel-package \

 devscripts debhelper libtool autoconf automake \

 libssl-dev python-all python-qt4 python-twisted-conch

4. http://openvswitch.org/releases/から,openvswitch-2.1.2.tar.gzをダウンロード

5. tar -xzvf openvswitch-2.1.2で展開

6. linuxカーネルモジュールを作成するため,以下のオプションを付けてconfigure

>./configure –with-linux=/lib/modules/uname -r/build

>make

>make install

7. コンパイルしたディレクトリから,以下のモジュールができていることを確認

>ls -la ./datapath/linux/openvswitch.ko

8. モジュールをインストール

# make module_install

“Can’t read private key”とか言われるが気にしない.

9. lsmodでopenvswitchがインストールされているかどうか確認

#lsmod | grep open

設定

動かすためには,データベースを作成し,serverを起動する必要があるので,まずはそれをやる.

1. データベースの作成

# mkdir -p /usr/local/etc/openvswitch

# ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema

この実行は,コンパイルしたディレクトリで行うこと.vswitch.ovsschemaというのがDBのスキーマなので,それを指定しないといけない

2. DBにアクセスするためのサーバの起動.やたら長いオプションをつけて起動しなければいけない(INSTALLに書いてあるのをそのままやればいい).

# ovsdb-server –remote=punix:/usr/local/var/run/openvswitch/db.sock \
–remote=db:Open_vSwitch,manager_options \
–private-key=db:SSL,private_key \
–certificate=db:SSL,certificate \
–bootstrap-ca-cert=db:SSL,ca_cert \
–pidfile –detach

3. データベースの初期化.これは1度やればいいらしい

# ovs-vsctl –no-wait init

4. メインサーバを起動

# ovs-vswitchd –pidfile –detach

これで起動したはず.

ネットワークの設定

いまいちOpen vSwitchの概念がわからなかったが,やっと分かった.FreeBSDでVlanを作るときの概念に似ている.

まず,仮想インタフェースを作り,その仮想インタフェースに物理的なインタフェースをアサインする.そして,その仮想インタフェースがbridgeだったり,vlanだったり色々設定できるようになっているらしい.とりあえず,SDNのHelloWorld的なブリッジインタフェースを作ってみる.

今回は,3つの物理的なインタフェースを全て1つのブリッジインタフェースにアサインする.これは以下のコマンドで行う.

1. ブリッジインタフェースの作成

# ovs-vsctl add-br br0

これでbr0という仮想インタフェースができる.ifconfigで確認できる

# ifconfig br0
br0       Link encap:Ethernet  HWaddr fe:b2:9d:a2:84:45
BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

2. 物理インタフェースを仮想インタフェースにアサインする.

# ovs-vsctl add-port br0 eth0

# ovs-vsctl add-port br0 eth1

# ovs-vsctl add-port br0 eth2

3. 確認する

# ovs-vsctl show
a54365a7-c6a5-43b0-b920-bf56e53f37f5
Bridge “br0″
Port “eth1″
Interface “eth1″
Port “eth2″
Interface “eth2″
Port “br0″
Interface “br0″
type: internal
Port “eth0″
Interface “eth0″

なお,この設定でこのホスト自身にIPを振る場合,仮想インタフェースに対して振らないといけない.

#dhclient br0

要注意

接続実験

以下のような環境で接続実験をしたところ,Mac1からMac2にpingが送信できた.かつ,Mac1もMac2もルータを通じて外部ネットワークに接続できた.つまり,Open vSwitchはブリッジで動作していることがわかる.

Screen Shot 2014-06-06 at 21.03.41

補足

上の構成だと,br0とeth1にも192.168.1.xが振られるため,スイッチ自身は外部ネットワークにつながらなかった.よって,物理的なインタフェース(eth0~eth2)にDHCPを使うのをやめたらつながった.インタフェースの設定でinternalのような設定にしたけれど,どうやったか忘れた.