CentOS7 + SPDKでiSCSI target構築
CentOS7上でSPDKをビルドして、iSCSI targetを構築しました。
なお、CentOS7はDL360上で稼働させた場合と、Windows版VMWareWorkstation12上で稼働させた場合の両方で構築することができました。
1.環境
1-1.DL360
筐体 : ProLiant DL360p Gen8 System ROM : P71 01/22/2018 CPU : Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz OS : CentOS7.5(1804) Kernel : 3.10.0-862.el7.x86_64 Installed Environment Groups : Minimal Install SPDK : v18.07-pre DPDK : v18.02.0
1-2.VMWare
筐体 : 自作PC CPU : Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz VMWare : VMware(R) Workstation 12 Pro 12.5.9 build-7535481 OS : CentOS7.5(1804) Kernel : 3.10.0-862.el7.x86_64 Installed Environment Groups : Minimal Install SPDK : v18.07-pre DPDK : v18.02.0
WinおよびVMWare環境は以下の画像で確認してもらった方が良いかもしれません。
Win環境
VMWare環境
HugePageを使うためメモリは多めで。
SPDKはDPDKのPMDを使うためCPUのコア数も多めで。
さらに、
Intel VT-x/EPT またはAMD-V-RVIを仮想化
CPUパフォーマンスカウンタを仮想化
にもチェックを入れました。
50GBのOS用とは別に200GBのiSCSI Target用のHDDを追加しています。
1-3.全体の流れ
事前準備
SPDKのビルド
SPDKのiscsi.conf設定
2.事前準備
2-1.セキュリティ設定の無効化
firewalldとSELinuxを無効化します。
systemctl disable firewalld vi /etc/selinux/config で開いて SELINUX=disabled にして保存。
3.SPDKのビルド
spdkはdpdkと違い至れり尽くせりでpkgdep.shを実行することにより、spdkのビルドに必要なパッケージなどを自動でインストールし依存関係を解消してくれます。
3-1.gitインストールからspdkのビルドまで
少々乱暴ですが、以下を流し込んでしまって問題ありません。
yum -y install git && \ cd /usr/src && \ git clone https://github.com/spdk/spdk && \ cd spdk && \ git submodule update --init && \ scripts/pkgdep.sh && \ ./configure && \ make
gitインストール
/usr/srcにcd
spdkのソースをgitから取得
/usr/src/spdkにcd*2
アップデート
必要なパッケージのインストール
makeファイル生成
ビルド
ちなみに、make前に
./configure --help
とすると、追加オプションを表示できます。
例えば、
./configure --with-rdma
とすることで、RDMAにも対応してくれるようです。
3-2.unittest.shの実行
ビルドが完了したら、最後に各モジュールのテストを実施してみてください。
./test/unit/unittest.sh 出力結果省略 ===================== All unit tests passed ===================== WARN: lcov not installed or SPDK built without coverage! WARN: neither valgrind nor ASAN is enabled!
多数の出力結果が表示されますが、最後に「All unit tests passed」と表示されればOKです。
Warringが2件表示されてますが、気にせず先に進んでください。
4.spdkのiscsi.confファイル設定
4-1.設定ファイルの作成
# cd /usr/src/spdk/app/iscsi_tgt # vi iscsi.conf [global] ReactorMask 0x1 LogFacility "local7" [iSCSI] NodeBase "iqn.2016-06.io.spdk" AuthFile /usr/local/etc/spdk/auth.conf MinConnectionsPerCore 1 MinConnectionIdleInterval 5000 Timeout 30 DiscoveryAuthMethod Auto DefaultTime2Wait 2 DefaultTime2Retain 60 ImmediateData Yes ErrorRecoveryLevel 0 [Rpc] #AIO(Asynchronous I/O)が生成されなかったためRPCを有効化しています。 Enable Yes Listen 127.0.0.1 [AIO] AIO /dev/sdb AIO0 512 #追加した200GBのHDDを指定しています。 [PortalGroup1] Portal DA1 192.168.11.208:3260 #自身のIPアドレス or 0.0.0.0:3260でも大丈夫です。 [InitiatorGroup1] InitiatorName ANY Netmask 192.168.11.0/24 #アクセス許可するNWアドレスを指定します。 [TargetNode1] TargetName disk1 TargetAlias "Data Disk1" Mapping PortalGroup1 InitiatorGroup1 AuthMethod Auto AuthGroup AuthGroup1 UseDigest Auto LUN0 AIO0 #AIO0をLUN0としてTargetNodeを起動します。 QueueDepth 128
4-2.Targetプログラムの実行
ファイルの保存が完了したら、先ほどcdした /usr/src/spdk/app/iscsi_tgt のパス上で以下を実行。
./iscsi_tgt -c iscsi.conf 以下、出力結果。 # ./iscsi_tgt -c iscsi.conf Starting SPDK v18.07-pre / DPDK 18.02.0 initialization... [ DPDK EAL parameters: iscsi -c 0x1 --file-prefix=spdk_pid22562 ] EAL: Detected 4 lcore(s) EAL: Multi-process socket /var/run/.spdk_pid22562_unix EAL: Probing VFIO support... app.c: 521:spdk_app_start: *NOTICE*: Total cores available: 1 reactor.c: 669:spdk_reactors_init: *NOTICE*: Occupied cpu socket mask is 0x1 reactor.c: 453:_spdk_reactor_run: *NOTICE*: Reactor started on core 0 on socket 0
iscsi_tgtのデフォルト動作ではフォアグラウンドで稼働してしまうため、上記出力でプロンプトが停止したように見えますが、iSCSI targetは正常に起動できています。
ちなみに、上記はVMWareの場合で、DL360の場合は EAL: NUMA socket 0~ といった表示が複数行出力されますが、iSCSI targetは正常に起動できています。*3
バックグラウンドで動作させたい場合には、-bを付けてください。
./iscsi_tgt -b -c iscsi.conf
4-3.Initiatorからのアクセス
Initiatorのインストール
yum -y install iscsi-initiator-utils
Discovery実施
# iscsiadm -m discovery -t sendtargets -p 192.168.11.208 192.168.11.208:3260,1 iqn.2016-06.io.spdk:disk1
Discovery時のTarget側出力*4
conn.c: 324:spdk_iscsi_conn_construct: *NOTICE*: Launching connection on acceptor thread iscsi.c:2090:spdk_iscsi_op_login_notify_session_info: *NOTICE*: Login(discovery) from iqn.1994-05.com.redhat:a2f790913987 (192.168.11.209) on (192.168.11.208:3260,1), ISID=23d000000, TSIH=1, CID=0, HeaderDigest=off, DataDigest=off conn.c: 741:spdk_iscsi_conn_read_data: *ERROR*: spdk_sock_recv() failed, errno 104: Connection reset by peer conn.c: 456:spdk_iscsi_remove_conn: *NOTICE*: Terminating connections(tsih 1): 0
ログイン実施
# iscsiadm -m node --login Logging in to [iface: default, target: iqn.2016-06.io.spdk:disk1, portal: 192.168.11.208,3260] (multiple) Login to [iface: default, target: iqn.2016-06.io.spdk:disk1, portal: 192.168.11.208,3260] successful.
ログイン時のTarget側出力
conn.c: 324:spdk_iscsi_conn_construct: *NOTICE*: Launching connection on acceptor thread iscsi.c:2078:spdk_iscsi_op_login_notify_session_info: *NOTICE*: Login from iqn.1994-05.com.redhat:a2f790913987 (192.168.11.209) on iqn.2016-06.io.spdk:disk1 tgt_node1 (192.168.11.208:3260,1), ISID=23d000003, TSIH=2, CID=0, HeaderDigest=off, DataDigest=off
Session確認
# iscsiadm -m session tcp: [1] 192.168.11.208:3260,1 iqn.2016-06.io.spdk:disk1 (non-flash)
bdevとして認識されていることを確認
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
tqsda1 8:1 0 1G 0 part /boot
mqsda2 8:2 0 49G 0 part
tqcentos-root 253:0 0 47G 0 lvm /
mqcentos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 200G 0 disk
sr0 11:0 1 1024M 0 rom
ログアウト
# iscsiadm -m node --logout Logging out of session [sid: 1, target: iqn.2016-06.io.spdk:disk1, portal: 192.168.11.208,3260] Logout of [sid: 1, target: iqn.2016-06.io.spdk:disk1, portal: 192.168.11.208,3260] successful.
ログアウト時のTarget側出力
iscsi.c:2601:spdk_iscsi_op_logout: *NOTICE*: Logout from iqn.1994-05.com.redhat:a2f790913987 (192.168.11.209) on iqn.2016-06.io.spdk:disk1 tgt_node1 (192.168.11.208:3260,1), ISID=23d000003, TSIH=2, CID=0, HeaderDigest=off, DataDigest=off conn.c: 456:spdk_iscsi_remove_conn: *NOTICE*: Terminating connections(tsih 2): 0
あとは、通常のiSCSI Targetと同様に動作しますので、Initiator側でmkfsするなり、fioで速度測定するなりご自由にどうぞ。
以上です。
5.最後に
以下のサイトを参考にさせて頂きました。
SPDK: Getting Started
https://www.starwindsoftware.com/blog/intel-spdk-nvme-of-target-performance-tuning-part-2-preparing-testing-environment
CentOS7下编译安装SPDK iSCSI Target - 程序园
SPDKに関する日本語サイトが皆無に等しいのは覚悟の上だったのですが、英語サイトでも出力結果などの詳細解説を記載したサイトが無かったため、ちょっとしんどかったです。3番目の中国サイトがとても助かりました。ありがとうございます。
DPDKに引き続き、取り急ぎSPDKを動作させるところまでは何とかできました。これをベースにNVMe-oFなどにも挑戦したいなと思っています。RoCEv2などにも興味があるのですが、こちらは現在情報収集中です。私は元々ネットワークエンジニアなので、近い将来、主記憶装置も補助記憶装置もすべてがネットワーク上で抽象化orプール化されていくことをイメージしながら、その(大容量)トラフィックをどのように捌いて制御しようか?なんてことを考えつつ、最適なネットワーク設計を模索し続けています。
*1:この後にmakeした際、以下のエラーでコンパイルが停止するため追記しました。/usr/src/spdk/lib/iscsi/md5.h:40:25: fatal error: openssl/md5.h: No such file or directory
*2:このパスがspdkの基点になります。今回紹介した内容以外にも開発用の色々なツールが含まれていますので、興味があればディレクトリを漁ってみるのもいいかもしれません。
*3:このとき、Minimal Installだと、netstatが叩けなかったため、ss -naptで確認したところ、TCP3260のポートが開いていないように見える事象を確認しました。しかし、正常起動している可能性が高いので、試しにinitiator側からDiscoveryしてみてください。私はこの事象で1週間悩み続けました、幻を見ていたのかもしれませんが。。。
*4:エラーが出ていますが気にせず先に進めてください
CentOS7 + pktgen with DPDKでパケットジェネレータ作成
CentOS7上に3台の仮想マシン(CentOS)を稼働させつつDPDKとpktgenをインストールして10Gワイヤーレートが出るパケットジェネレータを作成しました。
1.環境
1-1.母体(ホストOS)
筐体 : ProLiant DL360p Gen8 System ROM : P71 01/22/2018 CPU : Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz NIC : Intel X520-SR2(82599ES) OS : CentOS7.4(1708) Kernel : kernel-3.10.0-693.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools
1-2.仮想マシン(ゲストOS)
筐体 : 下記参照 System ROM : 下記参照 CPU : 下記参照 NIC : Intel X520-SR2(82599ES) OS : CentOS7.4(1708) Kernel : kernel-3.10.0-693.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools , Development Tools
筐体、System ROMはホストOSにインストールされているqemu-kvmをそのまま使用。
yum updateやupgradeは未実施。
CPUはNestedKVMを有効化しているため、ホストOSと同一 。
ゲストOSはDPDKやpktgenのビルドが必須なため、Development Toolsを加えています。
1-3.全体の流れ
ホストOSでNestedKVM, SR-IOV, VFIOの設定
ゲストOSでHugePage & IOMMU, VFIOの設定
ゲストOSでDPDKのインストール, igb_uioの設定
ゲストOSでpktgenのインストール
ゲストOS×3台使った負荷試験
2.ホストOSの設定
2-1.NestedKVMの設定
ゲストOS3台の名前はc741, c742, c743とします。
ファイルを新規作成 vi /etc/modprobe.d/kvm-nested.conf 以下を追記して保存。 options kvm_intel nested=1 再読み込み modprobe -r kvm_intel modprobe kvm_intel ゲストOS作成後、以下のようにvirshにて設定 virsh edit c741 <cpu mode='custom' match='exact'> の行を <cpu mode='host-passthrough'> に変更して保存。
2-2.SR-IOVの設定*1
grubにiommuの設定追加
vi /etc/default/grub GRUB_CMDLINE_LINUX=の行末に追加 intel_iommu=on iommu=pt pci=realloc 保存後、grubに反映 grub2-mkconfig -o /etc/grub2.cfg
起動時にVFが作成されるようrc.localの設定
vi /etc/rc.local 最下行に追加 echo 4 > /sys/class/net/ens1f0/device/sriov_numvfs echo 4 > /sys/class/net/ens1f1/device/sriov_numvfs sleep 1 ip link set ens1f0 vf 0 mac 00:11:22:33:44:50 ip link set ens1f0 vf 1 mac 00:11:22:33:44:51 ip link set ens1f0 vf 2 mac 00:11:22:33:44:52 ip link set ens1f0 vf 3 mac 00:11:22:33:44:53 ip link set ens1f1 vf 0 mac 00:11:22:33:44:60 ip link set ens1f1 vf 1 mac 00:11:22:33:44:61 ip link set ens1f1 vf 2 mac 00:11:22:33:44:62 ip link set ens1f1 vf 3 mac 00:11:22:33:44:63 sleep 1 ip link set ens1f0 vf 0 spoofchk off ip link set ens1f0 vf 1 spoofchk off ip link set ens1f0 vf 2 spoofchk off ip link set ens1f0 vf 3 spoofchk off ip link set ens1f1 vf 0 spoofchk off ip link set ens1f1 vf 1 spoofchk off ip link set ens1f1 vf 2 spoofchk off ip link set ens1f1 vf 3 spoofchk off exit 0 保存後、実行権限を付与 chmod +x /etc/rc.d/rc.local
VFがホストOSに読み込まれないよう設定
vi /lib/modprobe.d/dist-blacklist.conf 最下行に追加 # ixgbevf driver blacklist ixgbevf
2-3.VFIOの設定*2
ファイルを新規作成 vi /etc/modprobe.d/vfio_pci.conf 以下を追記して保存 options vfio_pci ids=8086:10ed こちらも追記 echo 'vfio_pci' > /etc/modules-load.d/vfio_pci.conf 一旦再起動 reboot
8086:10edはlspciで表示されるVFのBus,Slot,Function番号(筐体ごとに異なる)から、lspci -n -s 0008:10.2のようにコマンドを入力することでPCIデバイスのベンダID(8086)とデバイスID(10ed)を確認し、ベンダID(8086)とデバイスID(10ed)をVFIO-PCI driverに登録します。
3.ゲストOSの設定
ゲストOSの設定の前にVirt-Managerなどで仮想マシンを作成してください。
その際、CPUは4コア、Memは8GB以上が理想です。また、管理用IP以外にPCI Host Deviceとして、VFを2つ追加してください。
VF追加は、こんな感じのイメージです。*3
3-1.HugePageとIOMMUの設定
vi /etc/default/grub GRUB_CMDLINE_LINUX=行の最後に以下を追記。 default_hugepagesz=1G hugepagesz=1G hugepages=8 intel_iommu=on iommu=pt grub2-mkconfig -o /boot/grub2/grub.cfg
4.DPDKのインストール
4-1.ソースのDLとビルド
ソースをDLします。 cd /usr/src wget http://fast.dpdk.org/rel/dpdk-17.11.1.tar.gz tar zxvf dpdk-17.11.1.tar.gz cd dpdk-stable-17.11.1 展開したディレクトリでビルドを実施 make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr/local EXTRA_CFLAGS="-O3"
5.pktgenのインストール
5-1.ソースのDLとビルド
ソースをDLします。 cd /usr/src wget http://www.dpdk.org/browse/apps/pktgen-dpdk/snapshot/pktgen-3.5.0.tar.gz tar zxvf pktgen-3.5.0.tar.gz 一旦パスを通す export RTE_SDK=/usr/src/dpdk-stable-17.11.1 export RTE_TARGET=x86_64-native-linuxapp-gcc 展開したディレクトリでビルドを実施 cd pktgen-3.5.0 make
6.負荷試験
6-1.DPDKにバインド
SR-IOVでパススルーされたVFをゲストOSのKernelからDPDK管理下におくためにバインドします。
dpdk-devbind --status Network devices using DPDK-compatible driver ============================================Network devices using kernel driver =================================== 0000:00:07.0 '82599 Ethernet Controller Virtual Function' if=ins2f0 drv=ixgbevf unused=igb_uio,vfio-pci 0000:00:08.0 '82599 Ethernet Controller Virtual Function' if=ins2f1 drv=ixgbevf unused=igb_uio,vfio-pci ~略~ dpdk-devbind -b igb_uio 0000:00:07.0 0000:00:08.0 dpdk-devbind --status
上記バインドを実施することにより、ゲストOS上のカーネルドライバで動作していたVFがDPDKドライバで動作するようになります。バインド後、ゲストOS上でip link showなどを実施しても、ゲストOS上からVFが認識されなくなります(DPDK管理下におかれます)。
6-2.pktgenの起動
ビルドしたディレクトリに移動*4 cd /usr/src/pktgen-3.5.0 移動後のディレクトリ上で、pktgenの起動 app/x86_64-native-linuxapp-gcc/pktgen -- -m "1.0,2.1"
6-3.pktgenで負荷試験実行
pktgenが起動すると以下のような画面となります。
プロンプトが Pktgen:/>となるので、 start all と入力
これを3台のゲストOSで同時に実施し、
行 Pkts /s Max/Tx
列 TotalRate
のフィールドが5Mppsくらいになると、
ワイヤーレート(14.8Mpps)が出てそうな雰囲気になります。
実際にやるとこんな感じです。
1台あたり5Mpps超えてるのがかなり怪しいですが・・・
ホストOS単体では思うようにワイヤーレートが出なかったので、この辺りはもう少しチューニングが必要だと考えています。
以上です。
7.最後に
以下のサイトを参考にさせて頂きました。
みらくるブログ — サイバートラスト株式会社
Getting Started with Pktgen — Pktgen 3.2.4 documentation
私自身もまだまだ勉強不足なため、不要な設定が入っている気がしています。具体的にはホストOSでSR-IOVしているため、ホストOS上のVFIO設定は不要なのでは?といったところです。ホストとゲスト、ユーザ空間とカーネル空間のどこで必要とされている設定なのか?など、一度整理してみないとダメだなと考えています。
*1:詳細は過去記事を参照してください。CentOS7でSR-IOV設定 - Metonymical Deflection
*2:詳細は過去記事を参照してください。CentOS7でvThunderのセットアップ - Metonymical Deflection
*3:画像はX540のものですが、X520でも同様です。
*4:cdした/usr/src/pktgen-3.5.0のディレクトリ上からでないとpktgenが起動しませんでした。make時のパスの通し方がダメな気がしています。要調査
CentOS7でvThunderのセットアップ
CentOS7でA10 vThunderのセットアップを実施したため、その手順を記載しておきます。
vthはisoファイルからインストールができるので、c1kvと同様、直観的にインストールできると思います。
以下のサイトで必要事項を入力するとisoやDocがDL可能です。
Get a Trial VThunder Appliance
vthの足回りとしては、virtioとSR-IOVの両方で構成可能ですが、今回はSR-IOVの構成で記載します。
また、インストールした後から諸々変更できるので助かります。
但し、公式Docにはインストール時に設定せよと記載されていますが。。
1.環境
筐体 : ProLiant DL360e Gen8 System ROM : P73 01/22/2018 NIC : Intel X540-AT2 OS : CentOS7.4(1708) Kernel : kernel-3.10.0-693.21.1.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools
2.vThunderのインストール
公式Docを読む限り、virt-managerによるGUIでのインストール方法のみとなるようです。
IPMIなどが無ければ、tigervncなどを起動させておきましょう。*1
2-1.事前準備
SR-IOVの設定方法は過去の記事を参照ください。
ここではSR-IOVの設定後、VFIOについて記載します。
公式Docを読む限り、vthではVFIO-PCI Driverを設定せよと記載があります。VFIOとは、IOMMUベースのデバイスに依存しないドライバで、IOMMUに保護された環境で、ユーザ空間への直接デバイスアクセスが可能になるそうです。
以下のRedHatのスライドに説明が記載されています。
https://www.linux-kvm.org/images/b/b4/2012-forum-VFIO.pdf
以下に設定方法を記載します。
[root@ ~]# lspci |grep 540 08:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01) 08:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01) 08:10.0 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01) 08:10.1 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01) 08:10.2 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01) 08:10.3 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01) [root@ ~]# lspci -n -s 08:10.0 08:10.0 0200: 8086:1515 (rev 01) [root@ ~]# modprobe vfio_pci [root@ ~]# echo 8086 1515 > /sys/bus/pci/drivers/vfio-pci/new_id
lspciでVFのBus,Slot,Function番号を表示させる
lspci -n -s でPCIデバイスのベンダID(8086)とデバイスID(1515)を確認
ベンダID(8086)とデバイスID(1515)をVFIO-PCI driverに登録
[root@ ~]# ls -Fal /dev/vfio/ total 0 drwxr-xr-x 2 root root 140 Apr 29 12:51 ./ drwxr-xr-x 21 root root 3460 Apr 29 09:28 ../ crw------- 1 root root 241, 0 Apr 29 12:51 56 crw------- 1 root root 241, 1 Apr 29 12:51 57 crw------- 1 root root 241, 2 Apr 29 12:51 58 crw------- 1 root root 241, 3 Apr 29 12:51 59 crw-rw-rw- 1 root root 10, 196 Apr 29 09:27 vfio
/dev/vfio/配下に56~59として登録されていることが確認できます。
余談ですが、0~55はどうなっているのか?を確認したい場合には、以下のようにdmesでgrepをかけてください。ここでは0~5まで表示させましたが、実際は55までズラッと表示されます。
[root@ ~]# dmesg |grep iommu [ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-693.21.1.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt pci=realloc [ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-3.10.0-693.21.1.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt pci=realloc [ 1.270002] iommu: Adding device 0000:00:00.0 to group 0 [ 1.270038] iommu: Adding device 0000:00:01.0 to group 1 [ 1.270071] iommu: Adding device 0000:00:01.1 to group 2 [ 1.270099] iommu: Adding device 0000:00:03.0 to group 3 [ 1.270129] iommu: Adding device 0000:00:03.1 to group 4 [ 1.270165] iommu: Adding device 0000:00:03.2 to group 5
2-2.virt-managerによるインストール
まずはisoファイルを/var/lib/libvirt/images/直下にコピー
cp ACOS_vThunder_4_1_1-P5_20.iso /var/lib/libvirt/images/
File>New Virtual Machineを選択
Local install mediaを選択して、Forwardをクリック
前項でコピーしたACOS_vThunder_4_1_1-P5_20.isoを選択して、Choose Volumeをクリック
下図の通りであることを確認して、Forwardをクリック
下図の通りであることを確認して、Forwardをクリック
最低3GBで起動しますが、ACOSver4.x系は4GB必要です。
CPUsは1で起動します
下図の通りであることを確認して、Forwardをクリック
公式Docを読む限り16GBでOKみたいです。
Nameに任意の名前を入力
Customize configuration before installにチェック(必須)
Network selectionは任意のインターフェースを選択(mgt用なので後で変更可)
Device modelにe1000を選択(必須)*2
Applyをクリック
SR-IOVのVFを追加していきます。
画面左下のAdd Hardwareをクリック
PCI Host Deviceを選択
任意のVirtualFunctionを選択
Finishをクリック
Begin Installationをクリックするとisoファイルから起動が開始されます。
以下の画面で一旦停止しますので、ユーザ名/パスワードとYesSと入力するとインストールが進みます。
- 1行目:install
- 2行目:password
- 最終行:YesS
その後、自動的に再起動して以下の画面でしばらく待たされます。
起動が完了すると、以下の画面が表示されますので、ユーザ名/パスワードを入力するとログインできます。
ログイン後のenableパスワードは無いため、そのままEnterでOKです。
- 1行目:admin
- 2行目:a10
2-3.諸注意
私が検証した結果、上記ログイン画面にて、admin/a10を何度入力しても同じ画面に戻ってしまう事象を確認しました。
この場合の対処方法は、一旦仮想マシンをForce offなどで停止してから再度起動し、改めてユーザ名/パスワードを入力してみてください。
3.起動後の確認
3-1.telnet接続方法
Virtual Console(VGA)出力で頑張るのはしんどいので、mgtにtelnetアクセスできるようにします。ほぼほぼCiscoライクに設定できます。
vThunder(NOLICENSE)#conf t vThunder(config)(NOLICENSE)#enable-management service telnet vThunder(config-enable-management telnet)(NOLICENSE)#management vThunder(NOLICENSE)#show interfaces brief Port Link Dupl Speed Trunk Vlan MAC IP Address IPs Name ------------------------------------------------------------------------------------ mgmt Up Full 1000 N/A N/A 5254.0005.45bf 192.168.122.87/24 1 1 Disb None None None 1 5254.009d.9f90 0.0.0.0/0 0 2 Disb None None None 1 5254.00ac.2319 0.0.0.0/0 0 3 Disb None None None 1 1236.991c.1e03 0.0.0.0/0 0 4 Disb None None None 1 1236.991c.1e04 0.0.0.0/0 0 5 Disb None None None 1 1236.991c.1e05 0.0.0.0/0 0
configモードに移動
telnetサービスを有効化
telnetサービスへのアクセスインターフェースをmgtに設定
mgtインターフェースのIPを確認
上記設定およびIP確認後、mgtインターフェースにtelnet接続が可能となります。ちなみに、KVMのDefaultNAT(virbr0)が192.168.122.1/24を持っているハズなので、上記IP(192.168.122.87→DHCPで動的アサイン)にそのままtelnet可能です。
ホストOS上でifconfigにて確認してみてください。
3-2.SR-IOV NICの確認
mgt以外の各インターフェースをenable化(Ciscoでいうno shut)すると、以下のようにLinkUpします。
vThunder(NOLICENSE)#show interfaces brief Port Link Dupl Speed Trunk Vlan MAC IP Address IPs Name ------------------------------------------------------------------------------------ mgmt Up Full 1000 N/A N/A 5254.0005.45bf 192.168.122.87/24 1 1 Up Full 10000 None 1 5254.009d.9f90 0.0.0.0/0 0 2 Up Full 10000 None 1 5254.00ac.2319 0.0.0.0/0 0 3 Up Full 10000 None 1 1236.991c.1e03 0.0.0.0/0 0 4 Up Full 10000 None 1 1236.991c.1e04 0.0.0.0/0 0 5 Up Full 10000 None 1 1236.991c.1e05 0.0.0.0/0 0 vThunder(NOLICENSE)#
5254から始まるMACアドレスはvirtioで設定したNICで、1236から始まるMACアドレスはSR-IOVで設定したNICです。但し、SR-IOV NICのMACアドレスをどこで生成しているのか?が掴めていないので、継続調査したいと思っています。
以上です。
4.最後に
VFIOについて少し記載しましたが、他の仮想ルータなどには無いのかな?と確認したところ、vMXをインストールする際に生成されるvfconfig-generated.shでは、VFIOではないもののpci-stub(パススルー)の設定が入っているようです。
[root@ images]# cat vmx/build/vmx01/xml/vfconfig-generated.sh #Handling interface ens1f0 ifconfig ens1f0 up sleep 2 ifconfig ens1f0 promisc ifconfig ens1f0 allmulti ifconfig ens1f0 mtu 9198 echo 8086 1515 > /sys/bus/pci/drivers/pci-stub/new_id sleep 2 echo 0000:08:10.0 > /sys/bus/pci/devices/0000:08:10.0/driver/unbind echo 0000:08:10.0 >> /sys/bus/pci/drivers/pci-stub/bind ip link set ens1f0 vf 0 spoofchk off ip link set ens1f0 vf 0 rate 10000 ip link set ens1f0 vf 0 mac 02:06:0A:0E:FF:E3 bridge link set dev ens1f0 hwmode vepa
こういった点におけるJuniperの作り込みレベルの高さは流石だなと思いますし、とても好感が持てます。
上記コマンドが一体何をやっているのか?なぜその設定が必要なのか?ということを調べていると、すごく勉強になります。
CentOS7でCSR1000vのセットアップ
CentOS7でCisco CSR1000vのセットアップを実施したため、その手順を記載しておきます。
c1kvはisoファイルからインストール or runファイルからインタラクティブインストールができるので、vMXやn9kvよりはさらに敷居が下がると思います。
以下の公式Docに沿って記載したいと思います。
Cisco CSR 1000v Series Cloud Services Router Software Configuration Guide - Installing the Cisco CSR 1000v in KVM Environments [Cisco Cloud Services Router 1000V Series] - Cisco
また、c1kvの足回りとしては、virtioとSR-IOVの両方で構成可能です。
また、インストールした後から諸々変更できるので助かります。
1.環境
筐体 : ProLiant DL360e Gen8 System ROM : P73 01/22/2018 NIC : Intel X540-AT2 OS : CentOS7.4(1708) Kernel : kernel-3.10.0-693.21.1.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools
2.CSR1000vのインストール
公式Docを読む限り、isoファイルの場合とrunファイルの場合が記載されていますが、今回はvirt-managerによるGUIでのインストール方法をご紹介します。
IPMIなどが無ければ、tigervncなどを起動させておきましょう。*1
まずはisoファイルを/var/lib/libvirt/images/直下にコピー
cp csr1000v-universalk9.16.08.01a.iso /var/lib/libvirt/images/
2-1.virt-managerによるインストール
File>New Virtual Machineを選択
Local install mediaを選択して、Forwardをクリック
前項でコピーしたcsr1000v-universalk9.16.08.01a.isoを選択して、Choose Volumeをクリック
下図の通りであることを確認して、Forwardをクリック
下図の通りであることを確認して、Forwardをクリック
最低4GBで起動します。
CPUsは1で起動します
下図の通りであることを確認して、Forwardをクリック
公式Docを読む限り8GBでOKみたいです。
Nameに任意の名前を入力
Customize configuration before installにチェック(必須)
Network selectionは任意のインターフェースを選択(mgt用なので後で変更可)
Device modelにvirtioを選択(必須)*2
Applyをクリック
c1kvではインストール時およびインストール後にConsole出力をVirtualかSerialかで設定や変更が可能ですが、ここではひとまずSerialからConsole出力できるように設定しておきます。
画面左下のAdd Hardwareをクリック
Serialを選択
Device TypeにTCPを選択
Hostに0.0.0.0を入力*3
Portに8888など任意のポート番号を入力
ModeにServer mode(bind)を選択
Use Telnetにチェック
Finishをクリック
c1kvでは現在のタイミングおよびインストール後にもNICの追加が可能ですが、ここではひとまずSR-IOVのVFを追加しておきます。
画面左下のAdd Hardwareをクリック
PCI Host Deviceを選択
任意のVirtualFunctionを選択*4
Finishをクリック
Begin Installationをクリックすると、以下の画面でConsole出力方法を選択できます。
VirtualとSerialが選択できますが、ここではSerialを選択して進めます。
ちなみに、Virtualを選択した場合、この画面のままインストールが進みます。
Serialを選択すると、以下の画面で止まったように見えるため、後はホストOS上からtelnetすることになります。
2-2.SerialConsoleの出力画面
ホストOS上からTelnetします。
telnet localhost 8889 でも接続可能です。
[root@ ~]# telnet 192.168.12.130 8889
Trying 192.168.12.130...
Connected to 192.168.12.130.
Escape character is '^]'.
%IOSXEBOOT-4-WAIT_FOR_DEVICES: (local/local): Partition "/dev/bootflash1" missing at 20180429013632 Continuing to initialization
%IOSXEBOOT-4-PART_INVALID: (local/local): /dev/bootflash has an invalid partition table that must be repaired.
%IOSXEBOOT-4-PART_REPAIR: (local/local): The system will repair /dev/bootflash now.
この後、自動的にインストールが開始され、一旦c1kvが再起動されます。
再起動と共にtelnetセッションが切断されるため、再度telnet接続します。
%IOSXEBOOT-4-BOOT_SRC: (rp/0): CD-ROM Boot %IOSXEBOOT-4-BOOT_CDROM: (rp/0): Using Serial console %IOSXEBOOT-4-BOOT_CDROM: (rp/0): Installing GRUB to /dev/bootflash %IOSXEBOOT-4-BOOT_CDROM: (rp/0): Copying image to /boot %IOSXEBOOT-4-BOOT_CDROM: (rp/0): Copying image to /bootflash %IOSXEBOOT-4-BOOT_CDROM: (rp/0): Creating /boot/grub/menu.lst %IOSXEBOOT-4-BOOT_CDROM: (rp/0): Ejecting CD-ROM tray %IOSXEBOOT-4-BOOT_CDROM: (rp/0): CD-ROM Installation finished %IOSXEBOOT-4-BOOT_CDROM: (rp/0): Rebooting from HD Connection closed by foreign host. [root@ ~]# telnet 192.168.12.130 8890 Trying 192.168.12.130... Connected to 192.168.12.130. Escape character is '^]'. The highlighted entry will be booted automatically in 3 seconds. The highlighted entry will be booted automatically in 2 seconds. The highlighted entry will be booted automatically in 1 seconds. Booting 'CSR1000v - packages.conf' root (hd0,0) Filesystem type is ext2fs, partition type 0x83 kernel /packages.conf rw quiet root=/dev/ram console= max_loop=64 HARDWARE=virt ual SR_BOOT=bootflash:packages.conf Calculating SHA-1 hash...done SHA-1 hash: calculated ef2043b5:caad0265:2a268887:a7004ba8:fcfe6506 expected ef2043b5:caad0265:2a268887:a7004ba8:fcfe6506 package header rev 3 structure detected Calculating SHA-1 hash...done SHA-1 hash: calculated e674e45a:1da6da5e:2e3d73a7:7cf8b076:631b84d8 expected e674e45a:1da6da5e:2e3d73a7:7cf8b076:631b84d8 Package type:0x7531, flags:0x0 [Linux-bzImage, setup=0x3c00, size=0x4c5e00] [isord @ 0x7e032000, 0x1fbded6 bytes] %IOSXEBOOT-4-BOOT_SRC: (rp/0): Checking grub versions 1.0 vs 1.0 %IOSXEBOOT-4-BOOT_SRC: (rp/0): No need for bootloader upgrade.
上記の「%IOSXEBOOT-4-BOOT~」が出力されて、そこそこの時間待たされた後、以下の画面が出力されます。
Restricted Rights Legend Use, duplication, or disclosure by the Government is subject to restrictions as set forth in subparagraph (c) of the Commercial Computer Software - Restricted Rights clause at FAR sec. 52.227-19 and subparagraph (c) (1) (ii) of the Rights in Technical Data and Computer Software clause at DFARS sec. 252.227-7013. Cisco Systems, Inc. 170 West Tasman Drive San Jose, California 95134-1706 Cisco IOS Software [Fuji], Virtual XE Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 16.8.1a, RELEASE SOFTWARE (fc1) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2018 by Cisco Systems, Inc. Compiled Tue 03-Apr-18 18:43 by mcpre PLEASE READ THE FOLLOWING TERMS CAREFULLY. INSTALLING THE LICENSE OR LICENSE KEY PROVIDED FOR ANY CISCO SOFTWARE PRODUCT, PRODUCT FEATURE, AND/OR SUBSEQUENTLY PROVIDED SOFTWARE FEATURES (COLLECTIVELY, THE "SOFTWARE"), AND/OR USING SUCH SOFTWARE CONSTITUTES YOUR FULL ACCEPTANCE OF THE FOLLOWING TERMS. YOU MUST NOT PROCEED FURTHER IF YOU ARE NOT WILLING TO BE BOUND BY ALL THE TERMS SET FORTH HEREIN. Your use of the Software is subject to the Cisco End User License Agreement (EULA) and any relevant supplemental terms (SEULA) found at http://www.cisco.com/c/en/us/about/legal/cloud-and-software/software-terms.html. You hereby acknowledge and agree that certain Software and/or features are licensed for a particular term, that the license to such Software and/or features is valid only for the applicable term and that such Software and/or features may be shut down or otherwise terminated by Cisco after expiration of the applicable license term (e.g., 90-day trial period). Cisco reserves the right to terminate any such Software feature electronically or by any other means available. While Cisco may provide alerts, it is your sole responsibility to monitor your usage of any such term Software feature to ensure that your systems and networks are prepared for a shutdown of the Software feature. % Failed to initialize nvram cisco CSR1000V (VXE) processor (revision VXE) with 2186344K/3075K bytes of memory. Processor board ID 9MJXF16X1D5 1 Gigabit Ethernet interface 32768K bytes of non-volatile configuration memory. 3985000K bytes of physical memory. 20357119K bytes of virtual hard disk at bootflash:. 0K bytes of WebUI ODM Files at webui:. %INIT: waited 0 seconds for NVRAM to be available PARSER-ERROR: (3) unexpected stale csb (0) Press RETURN to get started!
Telnet接続したSerialConsoleに出力されるBootLogを貼り付けておきます。
c1kvのBootLog
3.c1kvへのログインとその他諸々
3-1.n9kvへのログイン
c1kvへのログインはパスワード無しでログイン可能ですので、あとは通常のCiscoIOSライクに扱ってください。
3-2.tftp config取得サービスの停止
起動直後に以下の出力でちょいちょい止まる場合がありますが、
%Error opening tftp://192.168.122.1/Router-confg (Timed out) %Error opening tftp://192.168.122.1/Router-confg (Timed out)
以下のコマンドで停止することが可能です。
Router#conf t Router(config)#no service config
3-3.Console出力の変更方法
Console出力ですが、以下のコマンドでSerial or Virtualの変更が可能です。
autoがどのような挙動になるかは未検証なので実際にやってみてください。
Router(config)#platform console ? auto Autodetect console (Serial,VGA) for IOS output serial Use Serial console for IOS output virtual Use VM (VGA) console for IOS output
3-4.SR-IOVの確認
インストール時にアサインした2つ目以降のNICはSR-IOVのVFを指定しましたが、正常に認識されているかはshow interfacesで確認可能です。
Router#sh int g2 GigabitEthernet2 is administratively down, line protocol is down Hardware is CSR vNIC, address is 0011.2233.4455 (bia 0011.2233.4455) MTU 1500 bytes, BW 1000000 Kbit/sec, DLY 10 usec, reliability 255/255, txload 1/255, rxload 1/255 Encapsulation ARPA, loopback not set Keepalive set (10 sec) Full Duplex, 1000Mbps, link type is auto, media type is Virtual output flow-control is unsupported, input flow-control is unsupported ARP type: ARPA, ARP Timeout 04:00:00 Last input never, output never, output hang never Last clearing of "show interface" counters never Input queue: 0/375/0/0 (size/max/drops/flushes); Total output drops: 0 Queueing strategy: fifo Output queue: 0/40 (size/max)
ポイントはホストOS上のip link showで表示されるVFのMACアドレスと同一か?という点です。
[root@ ~]# ip link show 1: lo:mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eno1: mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000 link/ether ac:16:2d:bb:9e:c0 brd ff:ff:ff:ff:ff:ff 3: eno2: mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000 link/ether ac:16:2d:bb:9e:c1 brd ff:ff:ff:ff:ff:ff 4: ens1f0: mtu 9198 qdisc mq state UP mode DEFAULT qlen 1000 link/ether a0:36:9f:3e:6d:68 brd ff:ff:ff:ff:ff:ff vf 0 MAC 00:11:22:33:44:55, spoof checking off, link-state auto, trust off, query_rss off vf 1 MAC 00:11:22:33:44:56, spoof checking off, link-state auto, trust off, query_rss off 5: eno3: mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000 link/ether ac:16:2d:bb:9e:c2 brd ff:ff:ff:ff:ff:ff 6: eno4: mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000 link/ether ac:16:2d:bb:9e:c3 brd ff:ff:ff:ff:ff:ff 7: ens1f1: mtu 9198 qdisc mq state UP mode DEFAULT qlen 1000 link/ether a0:36:9f:3e:6d:6a brd ff:ff:ff:ff:ff:ff vf 0 MAC 00:11:22:33:44:57, spoof checking off, link-state auto, trust off, query_rss off vf 1 MAC 00:11:22:33:44:58, spoof checking off, link-state auto, trust off, query_rss off
以上です。
4.最後に
仮想マシンのインストールはいくつかのパターンがあるので、実際にインストールしてみて&壊してを繰り返していくうちにフィーリングがわかってくると思います。ただ、一度も成功したことがないと、今の状態は正常なのか?といった判断がつかないと思うので、何度か試してみることをお勧めします。
CentOS7でNexus9000vのセットアップ
CentOS7でCisco Nexus9000vのセットアップを実施したため、その手順を記載しておきます。
n9kvはqcow2ファイルをデプロイできるので、vMXよりは敷居が下がると思います。
以下の公式Docに沿って記載したいところですが、qemu直叩き方法しか記載がないため、直観的にはあまり役に立たないかもしれません。
Cisco Nexus 9000v Guide - Cisco Nexus 9000v [Cisco Nexus 9000 Series Switches] - Cisco
また、n9kvはBIOSではなくUEFIによる起動となるため、その準備をしっかり書きたいと思います。
さらに、ライセンス上、検証用途やコマンド確認用途に制限されているためなのか?足回りとしては、virtio(正確にはe1000)でのみ構成可能です。SR-IOVのVF直掴みはできませんでした。
1.環境
筐体 : ProLiant DL360e Gen8 System ROM : P73 01/22/2018 NIC : Intel X540-AT2 OS : CentOS7.4(1708) Kernel : kernel-3.10.0-693.21.1.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools
2.UEFIの準備
以下のサイトを参考にさせて頂きました。
CentOS 7 : KVM : UEFI で起動する : Server World
2-1.リポジトリの作成
[root@ ~]# vi /etc/yum.repos.d/kraxel.repo [qemu-firmware-jenkins] name=firmware for qemu, built by jenkins, fresh from git repos baseurl=https://www.kraxel.org/repos/jenkins/ enabled=0 gpgcheck=0
2-2.OVMF(Open Virtual Machine Firmware)のインストールと確認
yum --enablerepo=qemu-firmware-jenkins -y install OVMF [root@ ~]# ls -Fal /usr/share/OVMF/ total 6624 drwxr-xr-x 2 root root 75 Apr 24 09:32 ./ drwxr-xr-x. 263 root root 8192 Apr 24 09:32 ../ -rw-r--r-- 1 root root 3653632 Aug 4 2017 OVMF_CODE.secboot.fd -rw-r--r-- 1 root root 540672 Aug 4 2017 OVMF_VARS.fd -rw-r--r-- 1 root root 2576384 Aug 4 2017 UefiShell.iso
2-3.qemu.confファイルの編集
vi /etc/libvirt/qemu.conf
で開いて、
682行目に以下を追記。もしくはコメントアウトでも可能。
nvram = [
"/usr/share/OVMF/OVMF_CODE.secboot.fd:/usr/share/OVMF/OVMF_VARS.fd"
]
[root@ ~]# vi /etc/libvirt/qemu.conf ~・~中略~・~ # Location of master nvram file # # When a domain is configured to use UEFI instead of standard # BIOS it may use a separate storage for UEFI variables. If # that's the case libvirt creates the variable store per domain # using this master file as image. Each UEFI firmware can, # however, have different variables store. Therefore the nvram is # a list of strings when a single item is in form of: # ${PATH_TO_UEFI_FW}:${PATH_TO_UEFI_VARS}. # Later, when libvirt creates per domain variable store, this list is # searched for the master image. The UEFI firmware can be called # differently for different guest architectures. For instance, it's OVMF # for x86_64 and i686, but it's AAVMF for aarch64. The libvirt default # follows this scheme. #nvram = [ ←ここをコメントアウトしても可能 # "/usr/share/OVMF/OVMF_CODE.fd:/usr/share/OVMF/OVMF_VARS.fd", # "/usr/share/OVMF/OVMF_CODE.secboot.fd:/usr/share/OVMF/OVMF_VARS.fd", ←ここをコメントアウトして「,」を削除でも可能 # "/usr/share/AAVMF/AAVMF_CODE.fd:/usr/share/AAVMF/AAVMF_VARS.fd" #] ←ここをコメントアウトしても可能 nvram = [ "/usr/share/OVMF/OVMF_CODE.secboot.fd:/usr/share/OVMF/OVMF_VARS.fd" ] # The backend to use for handling stdout/stderr output from # QEMU processes.
2-4.一旦、libvirtdのリスタート
systemctl restart libvirtd
で、リスタート
[root@ ~]# systemctl status libvirtd ● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2018-04-24 09:34:28 JST; 6s ago Docs: man:libvirtd(8) http://libvirt.org Main PID: 3616 (libvirtd) CGroup: /system.slice/libvirtd.service tq1879 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/... tq1880 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/... mq3616 /usr/sbin/libvirtd Apr 24 09:34:28 c74x645 systemd[1]: Starting Virtualization daemon... Apr 24 09:34:28 c74x645 systemd[1]: Started Virtualization daemon. Apr 24 09:34:28 c74x645 dnsmasq[1879]: read /etc/hosts - 2 addresses Apr 24 09:34:28 c74x645 dnsmasq[1879]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses Apr 24 09:34:28 c74x645 dnsmasq-dhcp[1879]: read /var/lib/libvirt/dnsmasq/default.hostsfile
2-5.qemu-kvmのアップデート
yum -y install centos-release-qemu-ev sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/CentOS-QEMU-EV.repo
yumでcentos-release-qemu-evをインストール
通常時はrelease-qemu-evを使用しないよう無効化に設定
[root@ ~]# /usr/libexec/qemu-kvm -version QEMU emulator version 1.5.3 (qemu-kvm-1.5.3-141.el7_4.6), Copyright (c) 2003-2008 Fabrice Bellard yum --enablerepo=centos-qemu-ev -y install qemu-kvm-ev systemctl restart libvirtd [root@ ~]# /usr/libexec/qemu-kvm -version QEMU emulator version 2.9.0(qemu-kvm-ev-2.9.0-16.el7_4.13.1) Copyright (c) 2003-2017 Fabrice Bellard and the QEMU Project developers
qemu-kvmのアップデート前のVer確認
qemu-kvmのアップデート(qemu-kvm-evのインストール)
libvirtdのリスタート
qemu-kvmのアップデート後のVer確認
◆補足
以下のコマンドを打った時
yum --enablerepo=centos-qemu-ev -y install qemu-kvm-ev
以下のエラーでqemu-kvm-evがインストールできなかったときの対処法
failure: repodata/repomd.xml from centos-qemu-ev: [Errno 256] No more mirrors to try. http://mirror.centos.org/altarch/7/virt/x86_64/kvm-common/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found
以下のようにbaseurlを変更してください。*1
[root@c75x645 vm]# vi /etc/yum.repos.d/CentOS-QEMU-EV.repo # CentOS-QEMU-EV.repo # # Please see http://wiki.centos.org/SpecialInterestGroup/Virtualization for more # information [centos-qemu-ev] name=CentOS-$releasever - QEMU EV #baseurl=http://mirror.centos.org/$contentdir/$releasever/virt/$basearch/kvm-common/ ←この行をコメントアウト baseurl=http://mirror.centos.org/centos-7/7/virt/x86_64/kvm-common/ ←追記 gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Virtualization [centos-qemu-ev-test] name=CentOS-$releasever - QEMU EV Testing baseurl=http://buildlogs.centos.org/centos/$releasever/virt/$basearch/kvm-common/ gpgcheck=0 enabled=0
これでUEFIによる起動の準備が整いました。
3.Nexus9000vのインストール
公式Docを読む限り、qemu直叩きしてね、と記載があります。
試しにGNS3で起動させた際の ps -auxから引っ張ってきました。
(視認性を良くするため改行してますが、実際は1行になってます)
/usr/bin/qemu-system-x86_64 -name CiscoNX-OSv9000nxosv-final.7.0.3.I7.3-1 -m 8096M -smp cpus=2 -enable-kvm -machine smm=off -boot order=c -bios /opt/gns3/images/QEMU/OVMF-20160813.fd -device ahci,id=ahci0,bus=pci.0 -drive file=/opt/gns3/projects/0d26cd09-1bdb-4be5-8587-28e02306ae72/project-files/qemu/47ac28d1-4e7e-4433-8722-ba7b1feacb2f/hda_disk.qcow2,if=none,id=drive-sata-disk0,index=0,media=disk -device ide-drive,drive=drive-sata-disk0,bus=ahci0.0,id=drive-sata-disk0 -uuid 47ac28d1-4e7e-4433-8722-ba7b1feacb2f -serial telnet:127.0.0.1:5001,server,nowait -monitor tcp:127.0.0.1:46521,server,nowait -net none -device e1000,mac=52:ae:72:cb:2f:00,netdev=gns3-0 -netdev socket,id=gns3-0,udp=127.0.0.1:10001,localaddr=127.0.0.1:10000 -device e1000,mac=52:ae:72:cb:2f:01,netdev=gns3-1 -netdev socket,id=gns3-1,udp=127.0.0.1:10003,localaddr=127.0.0.1:10002 -device e1000,mac=52:ae:72:cb:2f:02,netdev=gns3-2 -netdev socket,id=gns3-2,udp=127.0.0.1:10005,localaddr=127.0.0.1:10004 -nographic
これを毎回打つのは辛いので、virt-managerによるGUIでのインストール方法をご紹介します。
IPMIなどが無ければ、tigervncなどを起動させておきましょう。*2
そこで、まずはqcow2ファイルを/var/lib/libvirt/images/直下にコピー
cp nxosv-final.7.0.3.I7.3.qcow2 /var/lib/libvirt/images/ cd /var/lib/libvirt/images/ cp nxosv-final.7.0.3.I7.3.qcow2 n9kv01.qcow2
cd後、qcow2ファイルをコピー。失敗したときにやり直しが可能なので。
3-1.virt-managerによるインストール
File>New Virtual Machineを選択
Import existing disk imageを選択して、Forwardをクリック
前項でコピーしたn9kv01.qcow2を選択して、Choose Volumeをクリック
下図の通りであることを確認して、Forwardをクリック
下図の通りであることを確認して、Forwardをクリック
エラー出まくりですが4GBでも起動します。
CPUsは1でも起動します
Nameに任意の名前を入力
Customize configuration before installにチェック(必須)
Network selectionは任意のインターフェースを選択(mgt用なので後で変更可)
FirmwareはUEFI x86_64: を選択(必須)
ChipsetはQ35を選択(必須)
Applyをクリック
Disk busにSATAを選択(必須)
Applyをクリック
Device modelにe1000を選択(必須)*3
Applyをクリック
本項は、n9kvの仕様上、virt-manager上にConsole画面が表示されないため*4、ホストOSからlocalhostに対してtelnet接続をすることによりConsole画面を呼び出すため必須設定となります。
画面左下のAdd Hardwareをクリック
Serialを選択
Device TypeにTCPを選択
Hostに0.0.0.0を入力*5
Portに8888など任意のポート番号を入力
ModeにServer mode(bind)を選択
Use Telnetにチェック
Finishをクリック
Begin Installationをクリックすると、以下のUEFIにて起動され、n9kv01.qcow2の読み込みが開始されます。
下画面が表示されたあたりで、以降はTelnet接続したSerialConsoleへの出力オンリーとなります。
3-2.初期起動時のConsole出力画面
Telnet接続したSerialConsoleに出力されるBootLogを貼り付けておきます。
n9kvのBootLog
4.n9kvへのログインと必須設定
4-1.n9kvへのログイン
以下のように、skipした後、公式Doc記載の通り、admin/パスワード無しで進みます。
Abort Power On Auto Provisioning [yes - continue with normal setup, skip - bypass password and basic configuration, no - continue with Power On Auto Provisioning] (yes/skip/no)[no]: skip !!! NOTE: You have selected skip option. POAP will be aborted and password configuration will be skipped !!! Disabling POAP....... Disabling POAP 2018 Apr 28 08:37:37 switch %$ VDC-1 %$ %POAP-2-POAP_INFO: [9DPJ22T32GT-52:54:00:87:D2:95] - USB Initializing Success 2018 Apr 28 08:37:37 switch %$ VDC-1 %$ %POAP-2-POAP_INFO: [9DPJ22T32GT-52:54:00:87:D2:95] - USB disk not detected 2018 Apr 28 08:37:37 switch %$ VDC-1 %$ last message repeated 1 time 2018 Apr 28 08:37:37 switch %$ VDC-1 %$ %POAP-2-POAP_DHCP_DISCOVER_START: [9DPJ22T32GT-52:54:00:87:D2:95] - POAP DHCP Discover phase started 2018 Apr 28 08:38:17 switch %$ VDC-1 %$ %ACLQOS-SLOT1-2-ACLQOS_FAILED: ACLQOS failure: TCAM region is not configured for feature QoS class IPv4 direction ingress. Please configure TCAM region Ingress COPP [copp] and retry the command. Error: There was an error executing atleast one of the command Please verify the following log for the command execution errors. 2018 Apr 28 08:38:20 switch %$ VDC-1 %$ %PLATFORM-2-MEMORY_ALERT_RECOVERED: Memory Status Alert : CRITICAL ALERT RECOVERED TCAM region is not configured. Please configure TCAM region and retry the command 2018 Apr 28 08:38:21 switch %$ VDC-1 %$ %PLATFORM-2-MEMORY_ALERT: Memory Status Alert : SEVERE. Usage 84% of Available Memory User Access Verification login: admin Password: パスワード無しでそのままEnter Cisco NX-OS Software Copyright (c) 2002-2018, Cisco Systems, Inc. All rights reserved. Nexus 9000v software ("Nexus 9000v Software") and related documentation, files or other reference materials ("Documentation") are the proprietary property and confidential information of Cisco Systems, Inc. ("Cisco") and are protected, without limitation, pursuant to United States and International copyright and trademark laws in the applicable jurisdiction which provide civil and criminal penalties for copying or distribution without Cisco's authorization. Any use or disclosure, in whole or in part, of the Nexus 9000v Software or Documentation to any third party for any purposes is expressly prohibited except as otherwise authorized by Cisco in writing. The copyrights to certain works contained herein are owned by other third parties and are used and distributed under license. Some parts of this software may be covered under the GNU Public License or the GNU Lesser General Public License. A copy of each such license is available at http://www.gnu.org/licenses/gpl.html and http://www.gnu.org/licenses/lgpl.html *************************************************************************** * Nexus 9000v is strictly limited to use for evaluation, demonstration * * and NX-OS education. Any use or disclosure, in whole or in part of * * the Nexus 9000v Software or Documentation to any third party for any * * purposes is expressly prohibited except as otherwise authorized by * * Cisco in writing. * *************************************************************************** switch#
4-2.ログイン後の必須設定
以下のように、起動OSの設定とadminユーザのパスワード設定を行い保存します。
switch(config)# dir bootflash: 4096 Apr 28 08:15:27 2018 .rpmstore/ 4096 Apr 28 08:15:52 2018 .swtam/ 13176 Apr 28 08:19:09 2018 20180428_081706_poap_30180_init.log 30602 Apr 28 08:29:41 2018 20180428_082540_poap_30281_init.log 15451 Apr 28 08:38:03 2018 20180428_083554_poap_30312_init.log 962771456 Feb 12 19:25:05 2018 nxos.7.0.3.I7.3.bin 0 Apr 28 08:21:37 2018 platform-sdk.cmd 4096 Apr 28 08:17:03 2018 scripts/ 4096 Apr 28 08:15:57 2018 virtual-instance/ Usage for bootflash://sup-local 1242206208 bytes used 2295013376 bytes free 3537219584 bytes total switch(config)# boot nxos bootflash:/nxos.7.0.3.I7.3.bin Performing image verification and compatibility check, please wait.... switch(config)# username admin password cisco WARNING: it is based on a dictionary word WARNING: Configuration accepted because password strength check is disabled switch(config)# copy running-config startup-config [########################################] 100% Copy complete, now saving to disk (please wait)... Copy complete. switch#
4-3.上記設定の保存が上手くいってなかった場合の対処
起動OSとパスワード設定の保存がうまくいってなかった場合、reloadや次回起動時には「loader>」のプロンプトで止まります。
その場合、以下の通り、dirで.binファイルの名前を確認した後、bootコマンドで手動起動させてください。
Loader Version 5.01.0 Entering interactive mode loader > dir Setting listing for bootflash: Number of devices detected by BIOS is 1 Number of devices detected by BIOS is 1 Number of devices detected by BIOS is 1 Going to print files for device bootflash: 1 .rpmstore nxos.7.0.3.I7.3.bin Number of devices detected by BIOS is 1 Number of devices detected by BIOS is 1 Number of devices detected by BIOS is 1 Clearing listing for bootflash: loader > boot nxos.7.0.3.I7.3.bin Booting nxos.7.0.3.I7.3.bin Trying diskboot dev_str: bootflash: partition_str: 3 filename_str /nxos.7.0.3.I7.3.bin command = root (hd0,3) Filesystem type is ext2fs, partition type 0x83 Formed cmdline console=ttyS0,115200n8nn loader_ver="5.01.0" quiet debug Formed cmdline console=ttyS0,115200n8nn loader_ver="5.01.0" quiet debug ksimg=nxos.7.0.3.I7.3.bin card_index=21099 dummy_sprom swiotlb=48000 Booting kickstart image: bootflash::3:/nxos.7.0.3.I7.3.bin.... Number of devices detected by BIOS is 1 NBI header magic: 1b031336, len: 54, location: 94400000 (bx=0, ds=9440), exec addr: 92800000 16 16
5.インターフェースの追加
上記までのインストール方法だとmgt用インターフェースしかないため、足回り用インターフェースを追加しますので、一旦n9kvをforce offするなどして停止させてください。
5-1.インターフェース追加設定
Add Hardwareを選択
Networkを選択
Network sourceから任意のbrインターフェースを選択
Device modelからe1000を選択
Finishをクリック
下図の通り、とりあえず2~3個のインターフェースを追加します。
5-2.インターフェース追加後の確認
インターフェース追加前後のshow int statusを確認してみます。
インターフェース追加前
switch# sh int status -------------------------------------------------------------------------------- Port Name Status Vlan Duplex Speed Type -------------------------------------------------------------------------------- mgmt0 -- connected routed full 1000 -- -------------------------------------------------------------------------------- Port Name Status Vlan Duplex Speed Type -------------------------------------------------------------------------------- Eth1/1 -- notconnec 1 auto auto 10g Eth1/2 -- notconnec 1 auto auto 10g Eth1/3 -- notconnec 1 auto auto 10g Eth1/4 -- notconnec 1 auto auto 10g Eth1/5 -- notconnec 1 auto auto 10g Eth1/6 -- notconnec 1 auto auto 10g Eth1/7 -- notconnec 1 auto auto 10g Eth1/8 -- notconnec 1 auto auto 10g Eth1/9 -- notconnec 1 auto auto 10g Eth1/10 -- notconnec 1 auto auto 10g
インターフェース追加後
switch# sh int status -------------------------------------------------------------------------------- Port Name Status Vlan Duplex Speed Type -------------------------------------------------------------------------------- mgmt0 -- connected routed full 1000 -- -------------------------------------------------------------------------------- Port Name Status Vlan Duplex Speed Type -------------------------------------------------------------------------------- Eth1/1 -- connected 1 full auto 10g Eth1/2 -- connected 1 full auto 10g Eth1/3 -- notconnec 1 auto auto 10g Eth1/4 -- notconnec 1 auto auto 10g Eth1/5 -- notconnec 1 auto auto 10g Eth1/6 -- notconnec 1 auto auto 10g Eth1/7 -- notconnec 1 auto auto 10g Eth1/8 -- notconnec 1 auto auto 10g Eth1/9 -- notconnec 1 auto auto 10g Eth1/10 -- notconnec 1 auto auto 10g
6.最後に
6-1.足回りに関する考察
n9kvのPCI Host DeviceからSR-IOVのVFを直接指定した場合、show int statusでは認識されませんでした。このため、インターフェースを増やしていくには、もう少し検証が必要かなと考えています。
パッと思いつくのは、
- ixgbevfをmodprobeしてホストOS上でVFとして認識させる
- brインターフェースを作成しUpLinkとしてVFを指定する
- NIC追加時のNetwork sourceに作成したbrインターフェースを指定する
といった方法です。
しかし、この方法だとixgbevfをmodprobeしなければならないため、VFを直掴みさせたい子(仮想マシン)とn9kvを共存させることができないなぁ・・・と考えており、ちょっと悩んでいます。
ただ、単なる思い付きですが、ネストしたKVM上にn9kvを展開するって方法はアリかもしれません。
:第1階層 :第2階層 物理SW-ホストOS:NestedKVM:Nexus9000v :vMX :CSR1000v :vThunder
- 第1階層ではixgbevfをmodprobeせず、全員VFを直掴みさせる
- 第2階層ではNestedKVMでbrを作成し、それを掴ませる
aws ec2 modify-instance-attribute --instance-id instance_id --sriov-net-support simple
ってな感じで、ネスト上でVFをさらにパススルーさせてるっぽい。
って考えると、ネスト上でパススルーさせなくても、brインターフェースを掴ませるくらいなら、できるかもしれないので、ダメ元でやってみる価値はありそう?
*1:URL直書きなため少々ダサい方法ですが、$basearch=x86_64のディレクトリが別なPathに移動しているようなので。
*2:VNCサーバのインストール方法について、ここではあえて触れません、あしからず。
*3:これをvirtioにすると、そもそもn9kvが起動せず「loader>」のプロンプトになります。また、後で追加するインターフェースも全てe1000で統一してください
*4:.binファイルの読み込み途中で画面が止まります。
*5:ホストOS自身に設定されたIPであれば127.0.0.1でも192.168~でも可。0.0.0.0は自身のどのIPからでも要求を受け付けるために設定しています。
CentOS7でvMXのセットアップ
CentOS7でJuniper vMXのセットアップを実施したため、その手順を記載しておきます。
vMXはCiscoやA10と異なり、qcow2ファイルをVirt-InstallやVirt-Managerでデプロイするのではなく、インストール用のvmx.shを使います。
これが中々くせ者で、少しでも環境が違うと、エラーを吐いてインストールが停止してしまうため、環境構築や事前準備をしっかりやっておかないといけません。
なので、基本的には公式Docに沿って記載しつつも、その辺りのポイントをなるべく細かく書きたいと思います。
https://www.juniper.net/documentation/en_US/vmx17.2/information-products/pathway-pages/getting-started/getting-started.pdf
また、VFPの足回りとして、virtioとSR-IOVの2パターンで構成可能ですが、それぞれ特有の箇所には注釈を入れていきますので、特に注釈の無い箇所は2パターンとも共通項目だと考えてください。
1.環境
筐体 : ProLiant DL360e Gen8, DL360p Gen8 System ROM : P73 01/22/2018, P71 01/22/2018 NIC : Intel X540-AT2, X520-SR2(82599ES) OS : CentOS7.2(1511) Kernel : kernel-3.10.0-327.22.2.el7.x86_64 Installed Environment Groups : Server with GUI Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools
2.環境構築
2-1.各種アップデート
yum -y groupinstall "virtualization-host-environment" yum -y install "http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm" yum -y install centos-release-scl yum -y install python27-python-pip python27-python-devel numactl-libs libpciaccess-devel parted-devel yajl-devel libxml2-devel glib2-devel libnl-devel libxslt-devel libyaml-devel numactl-devel redhat-lsb kmod-ixgbe libvirt-daemon-kvm numactl telnet net-tools yum -y install gcc yum -y install "ftp://ftp.riken.jp/Linux/cern/centos/7/updates/x86_64/Packages/kernel-3.10.0-327.22.2.el7.x86_64.rpm" yum -y install "ftp://ftp.riken.jp/Linux/cern/centos/7/updates/x86_64/Packages/kernel-devel-3.10.0-327.22.2.el7.x86_64.rpm"
解かる方には説明不要かと思いますが、上から5行目までが公式Docに記載の通り、下の2行はSystem Requirementに合わせるべくKernelのVersionを指定しています。
yum -y install kernel kernel-develとかやってしまうと最新版をDLしてしまうので。
また2行目は公式Docだとelrepo-release-7.0-2.el7.elrepo.noarch.rpmですが、既に存在しないファイルなため、上記の通りにしています。
kernel-develを入れている時点で気付かれている方がいると思いますが、vmx.shを動作させた(vMXのインストールの)際にixgbeやi40eドライバのコンパイルが走ります。
rpm -qa | grep kernel* ls -Fal /usr/src/kernels/ ls -Fal /lib/modules/3.10.0-327.22.2.el7.x86_64/build/
一通り完了したら上記コマンドで確認しておきましょう。
2-2.SR-IOV周りの事前設定
vi /etc/default/grub
で開いて、
GRUB_CMDLINE_LINUX=の行末に以下を追記。
intel_iommu=on iommu=pt pci=realloc
[root@ ~]# vi /etc/default/grub "/etc/default/grub" 7L, 279CGRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt pci=realloc" GRUB_DISABLE_RECOVERY="true"
その後、以下を実施。
grub2-mkconfig -o /etc/grub2.cfg grubby --update-kernel=ALL grub2-editenv list shutdown -r now
grub2の設定反映
kernel-3.10.0-327.22.2での起動設定
kernel-3.10.0-327.22.2での起動確認
一旦、reboot
3.事前準備
vmx.shがインストール時にPyYAML libraryを使うための準備となります。
公式Docだと3行くらいしか記載されてないですが、pipでyamlをインストールする際にしくじったため、RedHatのサイトを見ながら肉付けをしています。わからない人はこの順番でコマンド投入してください。
以下は公式Doc通り。この後すぐにpip install netifaces pyyamlするとしくじるので、
PATH=/opt/rh/python27/root/usr/bin:$PATH export PATH
以下のコマンドを実行。
scl enable python27 bash source scl_source enable python27
新規ファイルを作成し、再起動後も有効化させる。
[root@ ~]# vi /etc/profile.d/enablepython27.sh #!/bin/bash source scl_source enable python27
正しい環境変数を設定し、
export LD_LIBRARY_PATH=/opt/rh/python27/root/usr/lib64 env | grep -i LD_LIBRARY_PATH
pipをアップグレード後、netifacesとpyyamlをインストール。
pip install --upgrade pip pip install netifaces pyyaml
以下は公式Doc通りです。
ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-system-x86_64 chattr +i /etc/resolv.conf ls -Fal /etc/libvirt/qemu.conf
リンクを張る
NetworkMangerを無効化したくない場合の対処
qemu.confのオーナー&グループがrootであることの確認
4.各種ファイル準備と注意点
tgzファイルを以下のパスに格納して作業します。
/var/lib/libvirt/images
cd /var/lib/libvirt/images/ tar zxvf vmx-bundle-17.2R1.13.tgz cd vmx
作業パスへ移動
tgzファイルの展開
展開したディレクトリへ移動
この後、全部で2箇所いじった後、confファイルを作成していきます。
さらに、confファイル作成後の注意点を4-5以降に記載していますが、個人的にはここが一番大事かなと思っています。
4-1.envファイルの修正
以下の修正は、vmx.shの実行中にWarringを出さないようにするための対処。
vi env/centos_sriov.env
で開いて、以下の行を
PARAMS_grub_file='/boot/grub/grub.cfg'
以下のように修正。
PARAMS_grub_file='/boot/grub2/grub.cfg'
[root@vmx]# vi env/centos_sriov.env "env/centos_sriov.env" 37L, 843C#!/bin/sh # # Set environment as detected # CHECK_ENV=1 # # Centos checks to be enabled # CHECK_GRUB=1 CHECK_pkg=1 CHECK_kernel_ver=1 CHECK_qemu_ver=1 CHECK_libvirt_ver=1 CHECK_virsh=1 CHECK_ixgbe=1 CHECK_i40e=1 # # Define values for Centos # PARAMS_pkg_list='qemu-kvm libvirt-client bridge-utils python libyaml-devel numactl numactl-devel parted-devel libpciaaccess-devel yajl-devel libxml2-devel glib2-devel libnl-devel' PARAMS_pkg_cmd='yum list installed' PARAMS_grub_file='/boot/grub2/grub.cfg' PARAMS_grub_user_file='/etc/default/grub' PARAMS_kernel_ver='3.10.0-327' # or greater PARAMS_kernel_delimiter='-generic' PARAMS_qemu_ver='1.5.3' # or greater PARAMS_qemu_bin='qemu-system-x86_64' PARAMS_libvirt_ver='1.2.17' # or greater PARAMS_libvirt_bin='libvirtd' PARAMS_libvirt_service='libvirtd' PARAMS_num_hugepages_per_numa_node=8192
4-2.ヘッダファイルの修正(SR-IOVのみ)
以下の修正は、vmx.shの実行中、i40eドライバのコンパイルを停止させないための対処。
vi drivers/i40e-1.3.46/src/i40e/kcompat.h
で開いて、以下の行を検索
#define NDO_DFLT_BRIDGE_GETLINK_HAS_BRFLAGS
上記の行の直下に以下を追記。
#define NDO_BRIDGE_GETLINK_HAS_FILTER_MASK_PARAM
[root@vmx]# vi drivers/i40e-1.3.46/src/i40e/kcompat.h ~・~中略~・~ /* RHEL 7.2 backported napi_alloc_skb and friends */ static inline struct sk_buff *__kc_napi_alloc_skb(struct napi_struct *napi, unsigned int length) {return netdev_alloc_skb_ip_align(napi->dev, length); } #define napi_alloc_skb(napi,len) __kc_napi_alloc_skb(napi,len) #define __napi_alloc_skb(napi,len,mask) __kc_napi_alloc_skb(napi,len) #endif /* SKB_ALLOC_NAPI */ #define HAVE_CONFIG_PM_RUNTIME #if (RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(6,7)) && \(RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(7,0))) #define HAVE_RXFH_HASHFUNC #endif /* 6.7 < RHEL < 7.0 */ #if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,1)) #define HAVE_RXFH_HASHFUNC #define NDO_DFLT_BRIDGE_GETLINK_HAS_BRFLAGS #define NDO_BRIDGE_GETLINK_HAS_FILTER_MASK_PARAM #endif /* RHEL > 7.1 */ #ifndef napi_schedule_irqoff #define napi_schedule_irqoff napi_schedule #endif #ifndef READ_ONCE #define READ_ONCE(_x) ACCESS_ONCE(_x) #endif #if RHEL_RELEASE_CODE && (RHEL_RELEASE_CODE > RHEL_RELEASE_VERSION(7,2)) #define HAVE_NDO_FDB_ADD_VID #endif
!注意!
上記の方法は、vmx.shを最後まで走らせるため(i40eドライバのコンパイルを完了させるためだけ)の措置なので、商用でX710使うぜッ!っていう方は、必ずJTACに確認しましょう。
4-3.confファイル作成:SR-IOVの場合
以下にサンプルconfファイルを記載しておきます。
ポイントは、#vPFE VM parametersの項で、device-type : sriov と記載している点です。
[root@vmx]# vi config/vmx01.conf ############################################################## # # vmx.conf # Config file for vmx on the hypervisor. # Uses YAML syntax. # Leave a space after ":" to specify the parameter value. # ############################################################## #Configuration on the host side - management interface, VM images etc. HOST: identifier : vmx01 # Maximum 6 characters host-management-interface : eno1 routing-engine-image : "/var/lib/libvirt/images/vmx/images/junos-vmx-x86-64-17.2R1.13.qcow2" routing-engine-hdd : "/var/lib/libvirt/images/vmx/images/vmxhdd.img" forwarding-engine-image : "/var/lib/libvirt/images/vmx/images/vFPC-20170523.img" #External bridge configuration BRIDGES: - type : external name : br-ext # Max 10 characters #vRE VM parameters CONTROL_PLANE: vcpus : 1 memory-mb : 4096 console_port: 8603 interfaces : - type : static ipaddr : 192.168.11.217 macaddr : "0A:00:DD:C0:DE:03" #vPFE VM parameters FORWARDING_PLANE: vcpus : 3 memory-mb : 12288 console_port: 8604 device-type : sriov interfaces : - type : static ipaddr : 192.168.11.218 macaddr : "0A:00:DD:C0:DE:13" #Interfaces JUNOS_DEVICES: - interface : ge-0/0/0 port-speed-mbps : 10000 nic : ens1f0 mtu : 9198 virtual-function : 0 mac-address : "02:06:0A:0E:FF:E3" description : "ge-0/0/0 con to ens1f0vf0" - interface : ge-0/0/1 port-speed-mbps : 10000 nic : ens1f1 mtu : 9198 virtual-function : 0 mac-address : "02:06:0A:0E:FF:F3" description : "ge-0/0/1 con to ens1f0vf1"
4-4.confファイル作成:virtioの場合
以下にサンプルconfファイルを記載しておきます。
ポイントは、#vPFE VM parametersの項で、device-type : virtio と記載している点です。
また、ge-0/0/0やge-0/0/1におけるホストOS側インターフェースとのバインドは、後から変更できるため、インストール時はこのままでOKです。
[root@vmx]# vi config/vmx02.conf ############################################################## # # vmx.conf # Config file for vmx on the hypervisor. # Uses YAML syntax. # Leave a space after ":" to specify the parameter value. # ############################################################## #Configuration on the host side - management interface, VM images etc. HOST: identifier : vmx02 # Maximum 6 characters host-management-interface : eno1 routing-engine-image : "/var/lib/libvirt/images/vmx/images/junos-vmx-x86-64-17.2R1.13.qcow2" routing-engine-hdd : "/var/lib/libvirt/images/vmx/images/vmxhdd.img" forwarding-engine-image : "/var/lib/libvirt/images/vmx/images/vFPC-20170523.img" #External bridge configuration BRIDGES: - type : external name : br-ext # Max 10 characters #vRE VM parameters CONTROL_PLANE: vcpus : 1 memory-mb : 1024 console_port: 8601 interfaces : - type : static ipaddr : 192.168.11.215 macaddr : "0A:00:DD:C0:DE:01" #vPFE VM parameters FORWARDING_PLANE: memory-mb : 4096 vcpus : 3 console_port: 8602 device-type : virtio interfaces : - type : static ipaddr : 192.168.11.216 macaddr : "0A:00:DD:C0:DE:11" #Interfaces JUNOS_DEVICES: - interface : ge-0/0/0 mac-address : "02:06:0A:0E:FF:E1" description : "ge-0/0/0 interface" - interface : ge-0/0/1 mac-address : "02:06:0A:0E:FF:F1" description : "ge-0/0/1 interface"
4-5.注意点その1
virtioおよびSR-IOVに共通することで、host-management-interface : eno1と記載している点についてです。
私のホストOS環境上では、以下のようなインターフェース設定となっています。(RXやTXの行は不要なので削除しています)
[root@ vmx]# ifconfig eno1: flags=4163mtu 1500 inet 192.168.11.161 netmask 255.255.255.0 broadcast 192.168.11.255 inet6 fe80::ae16:2dff:febb:9ec0 prefixlen 64 scopeid 0x20 ether ac:16:2d:bb:9e:c0 txqueuelen 1000 (Ethernet) eno2: flags=4163 mtu 1500 inet 192.168.12.130 netmask 255.255.255.0 broadcast 192.168.12.255 inet6 fe80::ae16:2dff:febb:9ec1 prefixlen 64 scopeid 0x20 ether ac:16:2d:bb:9e:c1 txqueuelen 1000 (Ethernet) ens1f0: flags=4163 mtu 1500 ether a0:36:9f:3e:6d:68 txqueuelen 1000 (Ethernet) ens1f1: flags=4163 mtu 1500 ether a0:36:9f:3e:6d:6a txqueuelen 1000 (Ethernet)
上記の設定理由として、host-management-interface : eno1の項に書くインターフェースの要件を記載します。
(ここでは例として、eno1とします)
- eno1はDefaultGatewayが設定されていること。
- eno1は物理インターフェースであること。
- eno1以外のインターフェースにeno1と同一SubnetのIPを設定していないこと。
上記要件を満たさないと、いずれもvmx.shが途中で止まります。
検証した結果、
- ダミーのDefaultGatewayIPでもOKですが、DefaultGatewayIPが2つ以上設定されてるとNG
- eno1の代わりにbrインターフェースを指定したらvmx.shが途中で停止(bondは未検証ですが、イケるっぽい?です)
- eno2にeno1と同一SubnetのIPを設定してもvmx.shが途中で停止
vmx.shが停止するたびに、sshセッションが切れてしまい、IPMI(iLO)経由でホストOSのIP設定をやり直すことになります。
(IPMI無し環境であれば、D-Sub9ピン or KVM(キーボード・ビデオ・マウス)経由で頑張る?)
また、vMXは起動するたびにvmx.shを実行するのですが、毎回以下のようなインターフェース設定へと変更してくれます。
[root@ vmx]# ifconfig br-ext: flags=4163mtu 1500 inet 192.168.11.161 netmask 255.255.255.0 broadcast 192.168.11.255 ether 52:54:00:9f:a0:77 txqueuelen 0 (Ethernet) br-int-vmx01: flags=4163 mtu 1500 ether 52:54:00:27:d7:53 txqueuelen 0 (Ethernet) eno1: flags=4163 mtu 1500 inet6 fe80::ae16:2dff:febb:9ec0 prefixlen 64 scopeid 0x20 ether ac:16:2d:bb:9e:c0 txqueuelen 1000 (Ethernet) eno2: flags=4163 mtu 1500 inet 192.168.12.130 netmask 255.255.255.0 broadcast 192.168.12.255 inet6 fe80::ae16:2dff:febb:9ec1 prefixlen 64 scopeid 0x20 ether ac:16:2d:bb:9e:c1 txqueuelen 1000 (Ethernet) ens1f0: flags=4163 mtu 1500 ether a0:36:9f:3e:6d:68 txqueuelen 1000 (Ethernet) ens1f1: flags=4163 mtu 1500 ether a0:36:9f:3e:6d:6a txqueuelen 1000 (Ethernet) vcp-ext-vmx01: flags=4163 mtu 1500 inet6 fe80::fc00:ddff:fec0:de01 prefixlen 64 scopeid 0x20 ether fe:00:dd:c0:de:01 txqueuelen 500 (Ethernet) vcp-int-vmx01: flags=4163 mtu 1500 inet6 fe80::fc54:ff:fe2e:402b prefixlen 64 scopeid 0x20 ether fe:54:00:2e:40:2b txqueuelen 500 (Ethernet) vfp-ext-vmx01: flags=4163 mtu 1500 inet6 fe80::fc00:ddff:fec0:de11 prefixlen 64 scopeid 0x20 ether fe:00:dd:c0:de:11 txqueuelen 500 (Ethernet) vfp-int-vmx01: flags=4163 mtu 1500 inet6 fe80::fc54:ff:fe28:65a2 prefixlen 64 scopeid 0x20 ether fe:54:00:28:65:a2 txqueuelen 500 (Ethernet)
ここで怖いなと思ったことは、
- eno1がbr-extにバインド
- eno1のIPがbr-extに再アサイン
という動作がvmx.sh上で行われることです。
また、vMXを停止させると、br-extらが削除され元の状態に戻ります。
なので、私は先に記載したようなインターフェース設定で、vmx.shを走らせています。
ちなみに、eno1とeno2は同一VLANとし、sshクライアントPC側では192.168.12.0/24のIPをセカンダリとして設定しています。
4-6.注意点その2
SR-IOVの場合、#Interfacesの項で1PF1VFとしている点です。
本来のsriovであれば1つのPFに複数のVFが作成可能なため、
#Interfaces JUNOS_DEVICES: - interface : ge-0/0/0 port-speed-mbps : 10000 nic : ens1f0 mtu : 9198 virtual-function : 0 mac-address : "02:06:0A:0E:FF:E3" description : "ge-0/0/0 con to ens1f0vf0" - interface : ge-0/0/1 port-speed-mbps : 10000 nic : ens1f0 mtu : 9198 virtual-function : 1 mac-address : "02:06:0A:0E:FF:F3" description : "ge-0/0/1 con to ens1f0vf1"
としてもいいはずですが、vmx.shがエラーを吐いて止まります。
vMXのVer17系は1筐体に複数VMをサポートしていないためと思われます。
Ver18以降では1筐体に複数VMをサポートしていないとの記載が削除されているため、たぶん大丈夫なのでは?と考えています。
5.インストール
以下のコマンドでインストールします。
./vmx.sh -lvf --install --cfg config/vmx01.conf
virtioの場合は、confファイル名(vmx02.conf)を変えればOKです。
-lvfはDebug用なので一発でインストールできるようになったら外して構いませんが、最初はどこでvmx.shが停止するのかわからないので付けていて損はないと思います。
出力例は長いので以下のリンクにtxtファイルを貼り付けました。
SR-IOVの場合
virtioの場合
vmx.shが正常に終了すると、virshからでも確認できるようになります。
[root@c72x642 vmx]# virhsh list
Id Name State
----------------------------------------------------
1 vcp-vmx01 running
2 vfp-vmx01 running
3 vcp-vmx02 running
4 vfp-vmx02 running
vcpやvfpへの接続は、以下のようにvmx.shで実施可能です。
[root@ vmx]# .vmx./vmx.sh --console vfp vmx02 Login Console Port For vfp-vmx02 - 8602 Press Ctrl-] to exit anytime Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Wind River Linux 6.0.0.13 vfp-vmx02 console vfp-vmx02 login: telnet> close Connection closed.
6.インターフェースのバインド設定:virtioの場合
SR-IOVの場合はインストール時にホストOSのインターフェースとバインドさせますが、
virtioの場合はインストール後、vMX起動中のままでも変更可能です。
そこで、まずはホストOS上にbrインターフェースを準備します。
ここでは例として、ens1f0にbr300とbr301を作成します。
nmcli connection add type bridge autoconnect yes con-name br300 ifname br300 nmcli connection modify br300 bridge.stp no nmcli connection modify br300 ipv4.method manual ipv4.address 192.168.30.130/24 nmcli connection up br300 nmcli connection add type vlan autoconnect yes con-name ens1f0.300 ifname ens1f0.300 dev ens1f0 id 300 nmcli connection modify ens1f0.300 connection.master br300 connection.slave-type bridge nmcli connection up ens1f0.300 nmcli connection add type bridge autoconnect yes con-name br301 ifname br301 nmcli connection modify br301 bridge.stp no nmcli connection modify br301 ipv4.method manual ipv4.address 192.168.31.130/24 nmcli connection up br301 nmcli connection add type vlan autoconnect yes con-name ens1f0.301 ifname ens1f0.301 dev ens1f0 id 301 nmcli connection modify ens1f0.301 connection.master br301 connection.slave-type bridge nmcli connection up ens1f0.301
次にbindファイルを作成します。
[root@ vmx]# vi config/bind01.conf ############################################################## # vmx-junos-dev.conf # - Config file for junos device bindings. # - Uses YAML syntax. # - Leave a space after ":" to specify the parameter value. # - For physical NIC, set the 'type' as 'host_dev' # - For junos devices, set the 'type' as 'junos_dev' and # set the mandatory parameter 'vm-name' to the name of # the vPFE where the device exists # - For bridge devices, set the 'type' as 'bridge_dev' ############################################################## interfaces : - link_name : vmx_link1 mtu : 1500 endpoint_1 : - type : junos_dev vm_name : vmx02 dev_name : ge-0/0/0 endpoint_2 : - type : bridge_dev dev_name : br300 - link_name : vmx_link2 mtu : 1500 endpoint_1 : - type : junos_dev vm_name : vmx02 dev_name : ge-0/0/1 endpoint_2 : - type : bridge_dev dev_name : br301
endpoint_1がvMX側のインターフェースで、endpoint_2がホストOS側のインターフェースとなります。
endpoint_2のtypeには、 host_dev, junos_devなども付けられます。
作成が終わったら、以下のコマンドでバインドさせます。
[root@ vmx]# ./vmx.sh --bind-dev --cfg config/bind01.conf Checking package ethtool..........................[OK] Bind Bridge port br300(ge-0.0.0-vmx02)............[OK] Bind Bridge port br301(ge-0.0.1-vmx02)............[OK]
今回はens1f0(X540やX520)にbr&vlanインターフェースを作成しましたが、これだとvMX側でVLANインターフェースを作りたい場合に困るので、ens1f0にVFを複数作成し、typeにhost_devを指定してバインドさせるのもアリだなと考えています。
7.最後に
vMXのインストールには本当に手こずりました。オンプレのこういう面が敬遠されがちなのでしょうか。。。
ただ、その一方でクラウドとの接続にはオンプレ環境が必要となる場面も出てくるため、バイモーダルITを念頭に、どっちも良いとこ取りができるようにしていこうと思っています。
また、仮想マシンのインストールにshを使い、しかもその中でドライバのコンパイルまで走らせるとは・・・という感じです。
大変よく作り込まれているなと思う反面、ドライバのヘッダファイル修正をしないとコンパイルが通らないという点については、もう少し作り込んで欲しいとも思います。
さらに、ルータを仮想化した旨みが失われないよう、他社の仮想マシンと共存させた場合のことも、考慮しないとダメな感じがしています。
というのも、Red Hat Virtualization 4.1からは、SR-IOVのVFにアタッチされた仮想マシンのライブマイグレーションが正式サポートされたので、可用性やメンテナンス性も加味した柔軟なネットワーク設計が重要になってくると考えているからです。
CentOS7でSR-IOV設定
CentOS7でSR-IOV設定を行ったため、その手順を記載しておきます。
1.環境
筐体:ProLiant DL360e Gen8
System ROM:P73 08/02/2014
NIC:Intel X540-AT2 ※1
OS:CentOS7.4
Installed Environment Groups:サーバー (GUI 使用) (graphical-server-environment) ※2
※1
X540-T2として販売されているもので、HP純正ではなくAmazonで購入したOEM提供のものです。
※2
最小限のインストール (minimal)の場合、lspciの追加インストールなどが必要なので、graphical-server-environmentを使用しています。
※3
BIOS上でSR-IOVを有効化する方法はHPガイドを参照してください。なお、私はBIOSでSR-IOVを有効化した後、OSをインストールしています。しかし、OSインストール後に、BIOS上でSR-IOVを有効化しても可能だ、という記事を見つけましたが、真相は確かめていません。
2.物理状態の確認
(1)PCIeのSlot1にX540を挿入していること。
HPガイドの14ページ目にARI(Alternative Routing ID Interpretation)機能がサポートしていないSlot番号が記載されています。ARI機能をサポートしていないPCIeのSlotにX540などSR-IOV対応NICを挿入しても、SR-IOVが有効化できない場合があるため事前に確認しておきましょう。
(2)X540のリンクが10Gbpsでリンクアップしていること。
UTPなので1Gbpsでもリンクアップした状態にすることは可能ですが、SR-IOVの有効化を行うと1Gbpsではダメだというメッセージがdmesgに表示されます。
RJ45の10Gスイッチがすぐに用意できない場合
X540-AT2は10Gポートが2ポートあるため、ループバック接続(X540-AT2の1ポート目と2ポート目をUTPで直結)にて対応しました。
3.NIC状態の確認
(1)NICが認識されていること。
# lspci |grep Eth 02:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 02:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 02:00.2 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 02:00.3 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 08:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01) 08:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01)
(2)10000Mb/s(10Gbps)でリンクアップしていること。
# ethtool ens1f0 Settings for ens1f0: Supported ports: [ TP ] Supported link modes: 100baseT/Full 1000baseT/Full 10000baseT/Full Supported pause frame use: Symmetric Supports auto-negotiation: Yes Advertised link modes: 100baseT/Full 1000baseT/Full 10000baseT/Full Advertised pause frame use: Symmetric Advertised auto-negotiation: Yes Speed: 10000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 0 Transceiver: external Auto-negotiation: on MDI-X: Unknown Supports Wake-on: d Wake-on: d Current message level: 0x00000007 (7) drv probe link Link detected: yes
4.iommuの有効化
SR-IOVを有効化する準備として、iommuを有効にします。
vi /etc/default/grub
以下のようにGRUB_CMDLINE_LINUX=行の最後に、intel_iommu=on iommu=ptを追加
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt"
以下のコマンドでgrub2.cfgに反映
grub2-mkconfig -o /etc/grub2.cfg
出力例
# grub2-mkconfig -o /etc/grub2.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-0b4fb8fdbcf94115af972373627c94dc Found initrd image: /boot/initramfs-0-rescue-0b4fb8fdbcf94115af972373627c94dc.img done
5.SR-IOVの有効化設定
起動時にVFがPCIデバイスとして認識されるように設定します。
vi /etc/rc.local
最終行に以下の内容を追加
echo 2 > /sys/class/net/ens1f0/device/sriov_numvfs echo 1 > /sys/class/net/ens1f1/device/sriov_numvfs exit 0
上記について補足
ens1f0はX540のインターフェース名なので、ご自身の環境に合わせて変更してください。
X540-AT2は2ポートあるため、1ポート目がens1f0、2ポート目がens1f1となります。
上記設定の場合、ens1f0にVFを2ポート、ens1f1にVFを1ポートとする設定となります。
私の環境でmodprobeを行ったところ、以下の結果となってしまったため、上記の設定を行いました。
# modprobe ixgbe max_vfs=2,1 modprobe: ERROR: could not insert 'ixgbe': Invalid argument
但し、RedhatのDocを読む限り、上記設定はよろしくないそうなので、別な方法を模索しています。
理由は、systemctlになってからOS起動時に各種サービスなどが並列で実行されるらしく、rc.localも例外ではないそうなので、X540のドライバが読み込まれる前にrc.localが実行されると予期せぬエラーを引き起こす可能性があるため、だそうです。
6.rc.localに実行権限を付与
Defaultでは実行権限がないため、起動時に実行されるよう権限を付与します。
chmod +x /etc/rc.d/rc.local
7.ここで一旦再起動
reboot
もしくは
shutdown -r now
8.再びNIC状態の確認
Virtual Functionが追加表示されていればOK
★の付いてる行がVF(Virtual Function)
# lspci |grep Eth 02:00.0 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 02:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 02:00.2 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 02:00.3 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01) 08:00.0 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01) 08:00.1 Ethernet controller: Intel Corporation Ethernet Controller 10-Gigabit X540-AT2 (rev 01) 08:10.0 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01) ★1 08:10.1 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01) ★2 08:10.2 Ethernet controller: Intel Corporation X540 Ethernet Controller Virtual Function (rev 01) ★3
上記出力だけだと、どのVFが、どのPCIバス、スロット、ファンクション番号に紐づいているかがわからないため、★の横に数字を記載しています。
また後述するMACアドレス固定の項も併せて参照してください。
上記について補足
再起動後にVFが作成されなかった場合、dmesg上に以下のエラーが出力されている可能性があります。
kernel: igb 0000:02:00.1: not enough MMIO resources for SR-IOV
このときの対処方法
vi /etc/default/grub
以下のようにGRUB_CMDLINE_LINUX=行の最後に、pci=reallocを追加して再起動。
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt pci=realloc"
本来、BIOSがVF用リソース割り当てを行うそうなのですが、BIOSとNICの組み合わせによって、うまくいかない場合があるそうです。このため上記設定を行うことによりカーネルがVF用リソース割り当てを行えるようになるそうです。
9.modprobeのblacklistへの追加
ixgbevfを外すことによりホストOS上でVFがNICとして認識されるのを防ぎます。
但し、ホストOS上ではPCIデバイスとして認識しているため、ゲストOSにアタッチすることは可能です。
vi /lib/modprobe.d/dist-blacklist.conf
最終行に以下の内容を追加
# ixgbevf driver blacklist ixgbevf
10.VFのMACアドレス固定設定
上記9.の設定を実施するとVFのMACアドレスはオール0(00:00:00:00:00:00)となります。
このため、任意の被らないMACアドレスを指定します。
vi /etc/rc.d/rc.local
最終行に以下の内容を追加
ip link set ens1f0 vf 0 mac 00:11:22:33:44:55 ip link set ens1f0 vf 1 mac 00:11:22:33:44:56 ip link set ens1f1 vf 0 mac 00:11:22:33:44:57
上述した通り、VFとPCIバス番号などの紐付きがわからないため、
以下に紐づきがわかるよう★の横に記載しておきます。
ip link set ens1f0 vf 0 mac 00:11:22:33:44:55 ★1 08:10.0
ip link set ens1f0 vf 1 mac 00:11:22:33:44:56 ★3 08:10.2
ip link set ens1f1 vf 0 mac 00:11:22:33:44:57 ★2 08:10.1
今のところ、これを把握するには、VFをゲストOSにアタッチ後、ゲストOS上にてip link showなどでMACアドレスを確認する以外、方法はないのかな?と悩んでいます。
最後に
SR-IOV設定のHow toサイトは色々見て回ったのですが、H/WとOSの環境情報が詳細に記載されているサイトが少なかったため、環境をしっかりと記載してみました。一度でも成功すれば、どうってことない事だったりするものですが、一度も成功したことが無いときは、何が原因なのか?切り分けがつかない場合があるため、環境情報も大切だなと実感しています。