背景
Jetson TX1のキャリアボードとして、Connect Tech Inc.(CTI)のOrbitty Carrierを使用している。 connecttech.com
ROSでマップ生成(rtabmap)をしたいのだがTX1だと4GBしかメモリがないのでメモリ不足で満足な動作ができない。暫定の回避策として(寿命的にすべきでないが)USBメモリにスワップを作ってメモリ不足を解消したいのだが、どうやらキャリアボード付属のLinuxカーネルではスワップ(CONFIG_SWAP)が無効になっていた。(フラッシュメモリの寿命対策かもしれない)
キャリアボードのBSPにはカーネルイメージしか含まれていないので、CTIのサポートにメールで連絡したところ、BSPのカーネルソースを提供して頂けた! ので、それを使ってカーネルをビルドした。
ツールチェーン(クロスコンパイラ)の入手
CTI-BSPのバージョンと同じJetPackのTegra 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_DIR
:CTI-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
を押して戻る。
項目を選択してスペースキーを押して[*]
の状態にする(カーネルイメージに組み込まれる)。
<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
スワップが有効化された!
起動時に自動的にスワップが有効になるように/etc/fstab
に上記UUID
を追記する。
$ vi /etc/fstab # 以下を追記 UUID=3be61ae7-a487-4f9e-8872-a1b2925f673a none swap sw 0 0
以上で完了。