はじめに
Windows10のバージョン2004からWSL2が使用可能になりました。Win10 proではなく、Win10 homeでも使用可能です。今までVirtualBoxを使ってWindows上に仮想環境を作成していましたが、WSLを使用すれば同様のことがWindowsだけで可能になるわけです。WSL2からはWindows自身がLinuxカーネルを持っていて仮想環境を提供してくれます。
ではさっそく、WSL2をインストールしてみましょう。
WSL2のインストール
①まず、PowerShellを管理者モードで立ち上げて以下を入力します。
> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
②次に[コントロールパネル] > [プログラム] > [プログラムと機能] > [Windowsの機能の有効化または無効化]を選択して、その中にある [Linux用Windowsサブシステム]にチェックを入れます。
③多分最初はLinux Kernelが入ってないので、これを以下からダウンロードします。
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
④PowerShellを管理者モードで立ち上げて以下を入力します。(①で立ち上げていたらそのままでいいです)
> wsl --set-default-version 2
⑤Microsoft StoreからLinuxのディストリビューションをダンロード・インストールします。今回はUbuntu18.04 LTSをインストールします。ストアアプリでUbuntuを検索すればすぐに出てきます。
※Ubuntuの最新は20.04 LTSですが、引き続き実施するYoctoのコンパイルで18.04を使いたかったのでこちらを選択しています。
⑥インストールが完了すると、スタートメニューにUbuntuのアイコンが出てきます。これをクリックすると仮想環境が走り出します。一番最初はユーザー名とパスワードを聞かれるので、これを入力すれば完了です。
VHDXファイルの移動
上記でディストリビューションをインストールすると、この仮想環境用のディスクイメージが作成されます。作成される場所は
デフォルトでは以下の通り。
C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx
インストール時に場所の変更はできません。サイズは可変で、仮想環境中でディスクを使用すると、このファイルがどんどん肥大化していきます。特に以下でYoctoのコンパイルなど実施した際は20GBを超えてきます。なのでC:\ドライブを圧迫しないために、別の場所にこのファイルを移動しておきたいと思います。
> wsl --export Ubuntu-18.04 ubuntu.tar
> wsl --unregister Ubuntu-18.04
> wsl --import Ubuntu-18.04 E:\wsl\Ubuntu\ ubuntu.tar
最初のコマンドでtarファイルにexportして、次のコマンドでWSL2からディストリビューションを削除し、最後のコマンドで再度ディストリビューションをインポートします。ちなみにtarファイルはPowerShellを立ち上げたカレンドディレクトリに作成されますので、作業が終わったら消して大丈夫です。
※PowerShellは管理者モードで立ち上げましたが、ひょっとすると通常のモードでも大丈夫かも知れません。管理者モードで立ち上げた場合、ファイルが管理者権限で作成されるので、エクスプローラの設定によってはtarファイルが見えないです。
以上でファイルが(上記のコマンド実施例の場合)E:\WSL\Ubuntu以下に生成されます。この状態でスタートメニューからUbuntuのアイコンをクリックすれば、この仮想環境用ファイルを使用してUbuntuが立ち上がります。ただし、これをやった直後はユーザーがrootになってしまいます。これでは不便なので、再度自分のログイン名に変更します。
> ubuntu1804 config --default-user <username>
<username>は一番最初にUbuntuを起動したときにプロンプトで入力したユーザー名です。ストアアプリでディストリビューションを選択した際、Ubuntuを選択した場合はubuntuが実行ファイルになります。またUbuntu20.04を選択した場合はubuntu2004が実行ファイルです。
対象プロセッサ/ボード
今回はプロセッサとしてNXP社製のi.MX6ULL、開発用ボードとして同社のi.MX6ULL EVKを使用したいと思います。(今回はとりあえずコンパイルできるところまでを目指します。)
Yoctoのインストール
NXP社製のi.MXシリーズは旧Freescale時代からYocto用のBSPパッケージが提供されていて、これをダウンロードして自前でボード用のLinuxディストリビューション一式をコンパイルします。
①作業するにあたり、必要なパッケージ類を予めインストールしておく必要があります。
> sudo apt-get install repo gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath \
socat cpio python python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git \
python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm
Ubuntu18.04では一番最初のrepoをapt-getでインストールできます。Ubuntu20.04ではできませんでした。その場合はcurlかなにか使って取ってくる必要があります。
②次に、gitの設定です。
> git config --global user.name "Your Name"
> git config --global user.email "Your Email"
③repoを使ってYoctoのレシピを取ってきます。
> mkdir yocto
> cd yocto
> repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-zeus -m imx-5.4.24-2.1.0.xml
> repo sync
作業用ディレクトリとしてyoctoを作成し、その下に移動してrepoコマンドを実行しています。
Build(bitbake)
これで準備が整ったので、いよいよコンパイルです!
> DISTRO=fsl-imx-fb MACHINE=imx6ull14x14evk source imx-setup-release.sh -b build
> time bitbake core-image-base
ディストリビューションとしてfsl-imx-fbを、マシン名としてimx6ull14x14evkを設定して、シェルスクリプトを実行します。これを実行すると、各実行バイナリにパスが通るみたいです。
コンパイルする場合はbitbakeコマンドを使用します。その前のtimeはbitbakeにかかった時間を表示するために付けておきます。プロジェクト名はcore-image-baseを指定しました。このプロジェクトはコンソールのみのイメージを生成し、対象デバイスのすべてのハードウェアを使用可能になります。core-image-minimalを指定した場合は、もっと小さいイメージが出来上がります。
で、ここまでやってなんですが、上記のプロジェクトをコンパイルすると、最後の方でERRORが出て止まります。
ERROR: nxp-wlan-sdk-git-r0 do_compile: oe_runmake failed
ERROR: nxp-wlan-sdk-git-r0 do_compile: Execution of '/home/furukawa/develop/yocto/imx6ullevk/build/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/nxp-wlan-sdk/git-r0/temp/run.do_compile.3825' failed with exit code 1:
make -C /lib/modules/4.19.104-microsoft-standard/build M=/home/furukawa/develop/yocto/imx6ullevk/build/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/nxp-wlan-sdk/git-r0/git/mxm_wifiex/wlan_src modules
make[1]: *** /lib/modules/4.19.104-microsoft-standard/build: No such file or directory. Stop.
Makefile:412: recipe for target 'default' failed
make: *** [default] Error 2
WARNING: exit code 1 from a shell command.
nxp-wlan-sdkパッケージのmake中に
/lib/modules/4.19.104-microsoft-standard/build
を参照するみたいなんですが、これがどうもダメみたいです。ネイティブなLinuxでコンパイルした場合はここは問題なく、/lib/modulesの下には4.19.104-genericと言うフォルダがありkました。microsoft-standardというのはWSL2のKernelのバージョン名についてるものらしいのですが…どうもこれが引っかかるみたい。回避方法として、今回は
yocto\sources\meta-imx\meta-sdk\recipes-connectivity\nxp-wlan-sdk\nxp-wlan-sdk_git.bb
の中に記述してあるdo_compile ()とdo_inistall ()の記述部分を全部コメントアウトしました。これで無事コンパイルが通りますが、4時間ぐらいかかります。イメージは
yocto\build\tmp\deploy\images\imx6ull14x14evk
以下にできてますので、これらをSDカードに書いてボードに挿せば、ブートして動作するハズ。
bitbake時のCPU負荷など
bitbakeはgitなどのサーバからソースコードを落としてきてコンパイルして…という一連の作業を実施してくれますので上記core-image-baseプロジェクトだと、3100程度の工程があります。make時はデフォルトで使っているCPUのコア数(Intel HTの場合は仮想コア数)だけ並列にmakeされるので、私の環境の場合は4並列でmakeが進みました。ちなみに今回は以下の環境で実施してます。
項目 | 種別/値 |
---|---|
CPU | Intel Core i5-3340M(2コア/4スレッド) 2.7~3.4GHz |
メモリ | 8GB |
OS | Windows 10 Home 64bit |
コンパイル時は、4つの(論理)CPUが95%前後で使用されて、少しだけ余裕を残してます。おそらくWindowsが動作するためだと思います。VirtualBoxで4コア全部を仮想環境側に振ると、100%使い切ります(結果、Windowsが動作できなくなって、途中で止まったりします)。ネイティブLinux環境では100%使い切りでも問題ないので、コンパイルは若干早い感じです。コンパイル時に効いてくるのはCPUのコア数とクロック。なので、最新のCPUと使うか、Intelの第4世代ぐらいだとCore i7 4770/4790あたりは欲しいところです(4コア/8スレッド)。
例えば論理4コアの場合、並列で8~9スレッドぐらいは動作させても問題ありません。コンパイルしてる間に別スレッドでネットからダウンロードしたりしてやれば、若干時間短縮になります。(論理コア数 x 2 + 1が目安と、どこかで読んだ気がする)。その場合、imx-setup-release.shを実施した直後、bitbakeを走らせる前に
yocto/build/conf/local.conf
に以下の行を追加すると、並列動作するスレッド数を増やすことが可能です。
BB_NUMBER_THREADS = '9'
PARALLEL_MAKE = '-j 9'
これでbitbakeを開始すると、9並列でコンパイルが始まります。