BIG-IP LTM VEをVirtualBox上で稼動させる

# BIG-IP LTM VEをVirtualBox上で稼動させる

## モチベーション

- BIG-IP LTM VEはVirtualBox上での稼動をサポートしていない
    + [サポート仮想化基盤](https://www.f5.com/trial/big-ip-ltm-virtual-edition.php)
        1. VMware ESXi 5.1 and 5.5
        2. vCloud Director 5.1
- でも、とりあえず手元の環境で動かしたい

## 動作確認環境

|               |                   |
| :------------ | :---------------- |
| Host          | CentOS 6.5 x86_64 |
| 仮想化基盤    | VirtualBox 4.3.20 |
| BIG-IP LTM VE | v11.3.0 HF1      |

## BIG-IP LTM VE Trialのダウンロード

- ダウンロードにあたってユーザ登録が必要
- <https://www.f5.com/trial/big-ip-ltm-virtual-edition.php>からダウンロードする
    + 90-Days BIG-IP Trial かつ VMware ESXi用

![90-Days BIG-IP LTM Trial ](https://lh4.googleusercontent.com/-EN4F0dAYAME/VUDqZU8ZurI/AAAAAAAAAWY/UINs9UeuZjk/w882-h439-no/BIG-IP_LTM_VE-001_90-Days.png)
![Download BIG-IP LTM Trial](https://lh4.googleusercontent.com/-pB0jHCHBcbM/VUDqaMmhetI/AAAAAAAAAWY/-uGN4w0ZM3c/w879-h727-no/BIG-IP_LTM_VE-002_Download.png)

- ダウンロードしたら、ハッシュ値（md5）を比較して破損してないか確認する


## VirtualBoxにインポート

- VirtualBoxメニューバー[ファイル]->[仮想アプライアンスのインポート]

![仮想アプライアンスのインポート](https://lh6.googleusercontent.com/-7RFL4n8FH7Q/VUDqlHXX4_I/AAAAAAAAAWY/mH39LAFqpBI/w786-h588-no/BIG-IP_LTM_VE-003_import.png)

- 名前（仮想マシン名）、CPU、RAM（メモリ）はHost環境にあわせて適宜変更する

|      | 変更前 |      変更後       |
| :--- | :----- | :---------------- |
| 名前 | vm     | **BIG-IP_11.3.0** |
| CPU  | 1      | 1                 |
| RAM  | 2048MB | **1024MB**        |

![仮想アプライアンスの設定](https://lh6.googleusercontent.com/-7jNTk6PAxgc/VUDqbdo071I/AAAAAAAAAWY/8pVXl6TN63c/w786-h588-no/BIG-IP_LTM_VE-005_setting.png)

- ネットワークアダプターは以下のようにする
    + どのネットワークアダプターがHAやExternalなどかはマウスカーソルを合わせることで確認できる

|                                    |     |                           |
| :--------------------------------- | :-- | :------------------------ |
| ネットワークアダプター(HA)         | ■   | PCnet-FAST 3              |
| ネットワークアダプター(External)   | ■   | Intel PRO/1000 MT Desktop |
| ネットワークアダプター(Internal)   | ■   | Intel PRO/1000 MT Desktop |
| ネットワークアダプター(Management) | ■   | Intel PRO/1000 MT Desktop |

![ネットワークアダプターの設定](https://lh4.googleusercontent.com/-NsReO55jT-k/VUDqh9qOJaI/AAAAAAAAAWY/Xlits2PHz1E/w786-h588-no/BIG-IP_LTM_VE-014_setting.png)
![ネットワークアダプターの設定](https://lh4.googleusercontent.com/-jqPcY9k7fGg/VUDqfNzLCQI/AAAAAAAAAWY/H48Fld3x2bI/w786-h588-no/BIG-IP_LTM_VE-010.png)

## インポート後の設定

- ネットワークアダプターが以下となっていることを確認する

|                         |      |     |                    |                           |
| :---------------------- | :--- | :-- | :----------------- | :------------------------ |
| ネットワークアダプター1 | ■   | 1.1 | ブリッジアダプター | Intel PRO/1000 MT Desktop |
| ネットワークアダプター2 | ■   | 1.2 | 内部ネットワーク   | Intel PRO/1000 MT Desktop |
| ネットワークアダプター3 | ■   | 1.3 | ブリッジアダプター | Intel PRO/1000 MT Desktop |
| ネットワークアダプター4 | ■   | 1.4 | ブリッジアダプター | PCnet-FAST 3              |

- シリアルポートの有効化

![シリアルポートの有効化](https://lh4.googleusercontent.com/-pr_JMyR_wK4/VUDqnFka9hI/AAAAAAAAAWY/TBvA3bfLSC4/w654-h414-no/BIG-IP_LTM_VE-019_serial-port.png)

- I/O APICの無効化

![I/O APICの無効化](https://lh6.googleusercontent.com/-v941CsSDLHU/VUDqni68xlI/AAAAAAAAAWY/LeKuF2PWKBc/w786-h588-no/BIG-IP_LTM_VE-022_IO-APIC.png)

## BIG-IP LTM VE起動後の設定

- ログイン情報

|     | username | password |
| :-- | :------- | :------- |
| CLI | root     | default  |
| GUI | admin    | admin    |

- 注意点は以下2点
    + キーボード設定がUS
    + SSHアクセスの際はチャレンジレスポンス認証

### `localhost emerg logger: Re-starting chmand`への対処

- BIG-IP LTM VE起動後、1～3分ほど待つとログインプロンプトが表示される
- ただし、10秒ごとに`emerg logger: Re-starting chmand`が出力され続ける

![emerg logger: Re-starting chmand](https://lh5.googleusercontent.com/-ms33pHCJoW8/VUDqmXWUC2I/AAAAAAAAAWY/WqPQV0YQ07o/w736-h478-no/BIG-IP_LTM_VE-021_Re-starting-chmand.png)

- `/var/log/ltm`を確認すると`chmand`によって以下`err`および`crit`メッセージが出力されていることを確認できる
    + `chmand`がプラットフォームを正しく識別できなかったことが原因のようだ。

```text:/var/log/ltm
Apr 29 12:37:32 localhost notice chmand[4325]: 012a0005:5: Starting ChassisManager (chmand)
Apr 29 12:37:32 localhost info chmand[4325]: 012a0006:6: Found platform 'Unknown' in /PLATFORM
Apr 29 12:37:32 localhost err chmand[4325]: 012a0003:3: unexpected init failure : HalSvcs: platform name not found in HAL system types
Apr 29 12:37:32 localhost crit chmand[4325]: 012a0002:2: critical platform initialize failure. exiting...
Apr 29 12:37:32 localhost err chmand[4325]: 012a0003:3: Shutdown of LCD message pass handling failed: Unknown Type
Apr 29 12:37:42 localhost notice chmand[4325]: 012a0005:5: Stopping chmand
Apr 29 12:37:42 localhost notice chmand[5802]: 012a0005:5: Starting ChassisManager (chmand)
Apr 29 12:37:42 localhost info chmand[5802]: 012a0006:6: Found platform 'Unknown' in /PLATFORM
Apr 29 12:37:42 localhost err chmand[5802]: 012a0003:3: unexpected init failure : HalSvcs: platform name not found in HAL system types
Apr 29 12:37:42 localhost crit chmand[5802]: 012a0002:2: critical platform initialize failure. exiting...
Apr 29 12:37:42 localhost err chmand[5802]: 012a0003:3: Shutdown of LCD message pass handling failed: Unknown Type
```

- このままでは操作がしにくいので、メッセージを出力している`chmand`を停止する

```shell-session
# bigstart stop chmand
```

- `/bin/qp`を以下となるように編集する
    + `if [ -f /bin/halid ]; then`より上部を編集すればよい

```sh:/bin/qp
#!/bin/sh
#
# Script to query and return platform type (D44, D50, etc.)
#
# It uses the info saved in /PLATFORM if available; otherwise it
# simply calls halid & returns the appropriate field (writing /PLATFORM as well)!
if [ -f /PLATFORM ]; then
    grep platform= /PLATFORM | sed -e 's/platform=//'
    exit 0
fi

if [ -f /bin/halid ]; then
    /bin/halid > /tmp/platform_info &

    pid=$!
    cnt=$(expr 10)
    while [ $cnt -gt 0 ]; do
    if [ -n "$pid" ]; then
        kill -0 $pid > /dev/null 2>&1
        if [ $? -eq 1 -a -f /tmp/platform_info ]; then
        break
        fi
    else
        break
    fi
    cnt=$(expr $cnt - 1)
    # amazingly, /bin/sleep is off-by-one when run by 'throttle' which is what 
    # live install does, so give plenty of time here waiting for 
    # halid to finish. ( 'time throttle sleep 5' = 4.2s reliably)
    sleep 5
    done

    if [ $cnt -gt 0 -a -f /tmp/platform_info ]; then
    cnt=`grep -c system_id  /tmp/platform_info`
    if [ -n "$cnt" -a $cnt -eq 1 ]; then
        family=`grep system_family /tmp/platform_info | awk '{print $3}'`
        platform=`grep system_id /tmp/platform_info | awk '{print $3}'`
        host=`grep host_id /tmp/platform_info | awk '{print $3}'`
        systype=`grep system_type /tmp/platform_info | awk '{print $3}'`
        echo "platform=${platform}" > /PLATFORM
        echo "family=${family}" >> /PLATFORM
        if [ -n "$host" ]; then
            echo "host=${host}" >> /PLATFORM
        fi
        if [ -n "$systype" ]; then
            echo "systype=${systype}" >> /PLATFORM
        fi
        echo "${platform}"
        rm -f /tmp/platform_info
        exit 0
    fi
    else
    if [ -n "$pid" ]; then
        kill -9 $pid > /dev/null 2>&1
    fi
    rm -f /tmp/platform_info
    fi
fi
echo "platform=Unknown"  > /PLATFORM
echo "family=Unknown" >> /PLATFORM
echo "host=Unknown" >> /PLATFORM
echo "Unknown"
exit 1
```
```diff
--- /bin/qp.org 2014-03-24 14:41:46.000000000 -0700
+++ /bin/qp     2015-04-29 12:50:28.000000000 -0700
@@ -4,25 +4,11 @@
 #
 # It uses the info saved in /PLATFORM if available; otherwise it
 # simply calls halid & returns the appropriate field (writing /PLATFORM as well)!
-
-# Check whether the platform information is fully populated and valid.
-# Note the boot scripts populate platform but not family, systype, or host.
-populated=0
 if [ -f /PLATFORM ]; then
-    . /PLATFORM
-    if [ "${platform:-Unknown}" != "Unknown" -a \
-            "${family:-Unknown}" != "Unknown" -a \
-            "${systype:-Unknown}" != "Unknown" -a \
-            "${host:-Unknown}" != "Unknown" ]; then
-         populated=1
-    fi
-fi
-if [ $populated -ne 0 ]; then
-    echo "$platform"
+    grep platform= /PLATFORM | sed -e 's/platform=//'
     exit 0
 fi

-
 if [ -f /bin/halid ]; then
     /bin/halid > /tmp/platform_info &
```

- `/tmp/platform_info`を以下となるように編集する

```sh:/tmp/platform_info
Info:system_id         = Z99
Info:system_family     = 0x80000000
Info:system_type       = 0xb
Info:system_id         = Z99
Info:host_id           = Z99
Info:base_mac          = @leave this unchanged@
Info:mac_offset        = 0
```
```diff
--- /tmp/platform_info.org      2015-04-29 12:37:40.000000000 -0700
+++ /tmp/platform_info  2015-04-29 12:52:30.000000000 -0700
@@ -1,7 +1,7 @@
-Info:system_id         = unknown
+Info:system_id         = Z99
 Info:system_family     = 0x80000000
 Info:system_type       = 0xb
-Info:system_id         = unknown
-Info:host_id           = unknown
-Info:base_mac          = 08:00:F5:59:B9:00
+Info:system_id         = Z99
+Info:host_id           = Z99
+Info:base_mac          = @leave this unchanged@
 Info:mac_offset        = 0
```

- `/PLATFORM`を以下となるように編集する

```sh:/PLATFORM
platform=Z99
family=0x80000000
host=Z99
```

- 以上、設定変更後に再起動する

## 初期設定

- DHCPでManagement-IPが割り当てられるので、コンソール上で`ifconfig`コマンドで確認する
- Webブラウザのアドレスバーに`https://《Management-IP》/`を入力する
- あとはSetup UtilityにしたがってアクティベーションならびにManagement-IPに固定IPを割り当てる

## トラブルシュート

### `GRUB Loading Stage2..`が出力されて以降進まない

- ネットワークアダプターの設定が誤っている
- シリアルポートを有効化していない

![GRUB Loading Stage2..](https://lh5.googleusercontent.com/-L-XqceG9xDg/VUDqk6-7L_I/AAAAAAAAAWY/r8pZ6G0PVts/w736-h478-no/BIG-IP_LTM_VE-018_GRUB-Loading-Stage2.png)

### `MP-BIOS bug: 8254 timer not connected to IO-APIC`が出力される

![MP-BIOS bug: 8254 timer not connected to IO-APIC](https://lh5.googleusercontent.com/-M1U7KpcrDYE/VUDqoTRblpI/AAAAAAAAAWY/ySoqSV3ahcM/w736-h478-no/BIG-IP_LTM_VE-023_timer-not-connected-to-IO-APIC.png)

- I/O APICを無効化すれば解消される

![I/O APICの無効化](https://lh6.googleusercontent.com/-v941CsSDLHU/VUDqni68xlI/AAAAAAAAAWY/LeKuF2PWKBc/w786-h588-no/BIG-IP_LTM_VE-022_IO-APIC.png)

## 補足説明

- chmand
    + Provides chassis monitoring and configuration, as well as other related functions.
    + Cannot perform platform identification, send platform information to MCPD service, or start SCCP services.
- MCPD
    + Known as the Master Control Program, controls messaging and configuration.
    + Cannot manage traffic; cannot retrieve or update system status; users cannot reconfigure system; disables some of the other services.
- SCCP(switch card control processor)
    + The SCCP is a separate subsystem that controls the F5 switch hardware.

## 参考資料

1. [Running BIGIP-11.3.0.39 on Oracle VirtualBox under Mac OS 10.9.2](https://devcentral.f5.com/questions/running-bigip-113039-on-oracle-virtualbox-under-mac-os-1092)
2. [Setup F5 Big-IP with VirtualBox on OS X](https://ranxing.wordpress.com/2014/11/14/setup-f5-big-ip-with-virtualbox-on-os-x/#more-18)
3. [BIG-IP LTM VE Trialセットアップガイド](http://www.f5networks.co.jp/shared/pdf/BIG-IP_TB_setup_ve_trial.pdf)
4. [Understanding Core System Services](https://support.f5.com/kb/en-us/products/big-ip_ltm/manuals/product/tmos_management_guide_10_0_0/tmos_appendix_c_system_services.html?sr=44931413)
5. [SOL3454: Overview of the SCCP](https://support.f5.com/kb/en-us/solutions/public/3000/400/sol3454.html)