今回は、MPSoCのPS部を活用して、Linuxの仮想化の実装であるXenを動かしてみましょう。MPSoCは、Arm Cortex-A53クアッド コアで複数のOSを動作させられる高いパフォーマンスなので、仮想マシン(VM)を動かすことができます。
Xenとは
Xenは現在、Linux Foundationのプロジェクトとしてメンテナンスされています(公式サイト)。歴史なども詳しく知りたい人はWikipediaも参照してみてください。
MPSoCでの実装についてはXilinxのWikiにも詳細が掲載されています。
Xenをビルドしましょう
Xenを含むrootfsを作成する
下記のコマンドでrootfsにXenのユーティリティを組込みます。選択するパッケージはスクリーンショットを参考にしてください。
$ petalinux-config -c rootfs
Linuxカーネルを設定する
下記のコマンドでカーネルの設定を行います。Xen上でゲストのLinuxカーネルを起動しやすいようにカーネルとrootfsを分離したイメージを生成します。具体的な設定はスクリーン ショットを参考にしてください。
$ petalinux-config
Xen用のデバイスツリーを設定する
下記のようにxen-overlayの記述を追記します。
$ cat project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi /include/ "system-conf.dtsi" /include/ "xen-overlay.dtsi" / { };
$ cat project-spec/meta-user/recipes-bsp/device-tree/device-tree.bbappend FILESEXTRAPATHS_prepend := "${THISDIR}/files:" SRC_URI += "file://system-user.dtsi" SRC_URI += "file://xen-overlay.dtsi"
Linuxカーネルをビルドする
$ petalinux-build
ビルドが完了したら、下記のファイルをSDカードの第一FATパーティションにコピーします。
- BOOT.BIN
- Image
- rootfs.cpio.gz.u-boot
- system.dtb
- xen.ub
XenをMPSoCのボードで実行してみましょう!
u-bootのカウント ダウンが表示されたらEnterを入力するとプロンプトが表示されます。下記のオプションでDom0 (ホストOS)のLinuxをブートさせます。
ZynqMP> mmc dev $sdbootdev &&&& mmcinfo; load mmc $sdbootdev:$partid 1000000 system.dtb &&&& load mmc $sdbootdev:$partid 0x80000 Image; fdt addr 1000000; load mmc $sdbootdev:$partid 1030000 xen.ub; load mmc $sdbootdev:$partid 2000000 rootfs.cpio.gz.u-boot; bootm 1030000 2000000 1000000
Linuxにログイン後、下記のコマンドでDomU (ゲストOS)のLinuxをブートさせます。
Dom0のコンソールに戻るには、Ctrl + ] を入力します。
# xl create -c /etc/xen/example-simple.cfg
まとめ
Xenを活用することでレガシーなソフトウェア資産をOSごと仮想的に動作させたり、セキュアなアプリケーションを別空間で動作させたりできます。みなさんもXenで遊んでみてください!
使用するハードウェア
そして、MPSoCのLinuxサポートが必要なときは...