CTI Orbitty Carrier for JetsonTX1のカーネルビルド、およびスワップ有効化

背景

Jetson TX1のキャリアボードとして、Connect Tech Inc.(CTI)のOrbitty Carrierを使用している。 connecttech.com

ROSでマップ生成(rtabmap)をしたいのだがTX1だと4GBしかメモリがないのでメモリ不足で満足な動作ができない。暫定の回避策として(寿命的にすべきでないが)USBメモリスワップを作ってメモリ不足を解消したいのだが、どうやらキャリアボード付属のLinuxカーネルではスワップ(CONFIG_SWAP)が無効になっていた。(フラッシュメモリの寿命対策かもしれない)

キャリアボードのBSPにはカーネルイメージしか含まれていないので、CTIのサポートにメールで連絡したところ、BSPのカーネルソースを提供して頂けた! ので、それを使ってカーネルをビルドした。

ツールチェーン(クロスコンパイラ)の入手

CTI-BSPのバージョンと同じJetPackTegra Linux Driver Package Development Guideによると、L4TのツールチェーンはAARCH64 toolchainを使っているようなので、ダウンロードしておく。
以下のディレクトリに格納した。

$ cd ~/JetPack/64_TX1
$ tar -zxvf gcc-4.8.5-aarch64.tgz
$ mv install gcc-4.8.5-aarch64

環境変数の設定

ビルド用の環境変数を設定する。パスは環境依存なので適宜読み替える。

TEGRA_KERNEL_OUTカーネルビルド結果の出力先
L4T_ROOT_DIRCTI-L4Tのフォルダパス
CROSS_COMPILE:クロスコンパイラのプレフィックス
ARCHアーキテクチャ指定

export TEGRA_KERNEL_OUT=~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T/out
export L4T_ROOT_DIR=~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T
export CROSS_COMPILE=~/JetPack/64_TX1/gcc-4.8.5-aarch64/bin/aarch64-unknown-linux-gnu-
export ARCH=arm64

カーネルコンフィグの変更

CTIのBSPに使用されているカーネルコンフィグファイルはsources/kernel/kernel-4.4/arch/arm64/configs/tegra21_cti_defconfigにある。menuconfigで変更する前に、まずは以下のコマンドで.configファイルを作成する。

$ make ARCH=arm64 O=$TEGRA_KERNEL_OUT tegra21_cti_defconfig

$TEGRA_KERNEL_OUT.configファイルが生成されていればOK。(隠しファイルなのでnautilusでCtrl+Hで確認するか、ls -laで確認するとよし)

menuconfigでカーネル設定を変更する。cursesを使うのでインストールしておくこと。

$ sudo apt-get install libncurses5-dev
$ make ARCH=arm64 O=$TEGRA_KERNEL_OUT menuconfig

スワップの項目を探す。/キーを押した後、SWAPと入力する。 General setupの中のSupport for paging of anonymous memory (swap)という項目であることがわかる。Escを押して戻る。

f:id:otomon10:20190615140319p:plain

項目を選択してスペースキーを押して[*]の状態にする(カーネルイメージに組み込まれる)。

f:id:otomon10:20190615140536p:plain

<Save>を選択して終了する。
$TEGRA_KERNEL_OUT/.configファイルが更新される。

カーネルカーネルモジュールのビルド

CTIから提供されたカーネルソースのディレクトリに移動してビルドする。

$ ~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T/sources/kernel/kernel-4.4
$ mkdir -p $TEGRA_KERNEL_OUT
$ ./make_script.sh

ビルドされたカーネルイメージ、カーネルモジュールは以下に格納される。

$TEGRA_KERNEL_OUT/arch/arm64/boot/Image
$TEGRA_KERNEL_OUT/arch/arm64/boot/zImage
$L4T_ROOT_DIR/built_modules

カーネルイメージ、カーネルモジュールの差し替え

カーネルイメージとカーネルモジュールを差し替える。コピーにはJetson側でrsync -aを利用する、scpだとシンボリックリンクが、リンクではなく元のファイルをコピーしてしまうため。

$ cd ~

# カーネルイメージの差し替え
$ rsync -av ubuntu@192.168.0.15:~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T/out/arch/arm64/boot .
$ sudo cp -f ./boot/Image  /boot
$ sudo cp -f ./boot/zImage /boot
$ rm -rf ./boot

# カーネルモジュールの差し替え
$ rsync -av ubuntu@192.168.0.15:~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T/built_modules/lib .
$ sudo cp -rf ./lib /

# 再起動する
$ sudo reboot

以上でカーネルカーネルモジュールの差し替え完了。
* この後、起動に1分30秒程度かかるようになってしまった、要調査。

USBメモリスワップを作る

フォーマットしたUSBメモリをJetsonTXに接続しておく。以下のコマンドでスワップパーティションを作成する。

$ umount /dev/sda1
$ sudo mkswap /dev/sda1
mkswap: /dev/sda1: warning: wiping old vfat signature.
Setting up swapspace version 1, size = 7.5 GiB (8018456576 bytes)
no label, UUID=3be61ae7-a487-4f9e-8872-a1b2925f673a
$ sudo swapon /dev/sda1

スワップが有効化された!

f:id:otomon10:20190615152623p:plain

起動時に自動的にスワップが有効になるように/etc/fstabに上記UUIDを追記する。

$ vi /etc/fstab

# 以下を追記
UUID=3be61ae7-a487-4f9e-8872-a1b2925f673a none swap sw 0 0

以上で完了。

参考