Jetson で WireGuard を使う(要カーネルビルド)
はじめに
Jetson を外出先からいじりたい場合は、VPN が欲しい時があると思います。Jetson Linux はデフォルトで WireGuard モジュールが無効になっているので、カーネルビルドをしてインストールします。本記事ではホストコンピュータを使わずに全工程を Jetson 上で行います。
基本的には公式ドキュメントに従えばよいのですが、若干情報が足りていないので補足を含めて書いていきます。なお、Jetson Linux のバージョンによって手順が異なるので、ドキュメントの参照先には気をつけてください。
カーネルの準備
なにはともあれ、バックアップを取ります。
$ sudo cp /boot/Image /boot/Image.default
もし以降の作業に失敗して起動しなくなった時は、Ubuntu Server for ARM などをUSBストレージからブートして書き戻します。OS が NVMe SSD にインストールしてある場合は、eMMC から起動して操作すればよいです。ちなみに Jetson の UEFI shell は ext4 のファイル操作ができません。
Jetson Linux のソースコードをダウンロードして解凍します。ダウンロード元はこちらの Driver Package (BSP) Sources
です。
$ wget https://developer.nvidia.com/downloads/embedded/l4t/r36_release_v4.3/sources/public_sources.tbz2
$ tar xf public_sources.tbz2
$ cd Linux_for_Tegra/source
$ tar xf kernel_src.tbz2
$ tar xf kernel_oot_modules_src.tbz2
$ tar xf nvidia_kernel_display_driver_source.tbz2
現状のカーネルコンフィグをコピーして、必要な設定を追加します。
$ zcat /proc/config.gz > kernel/kernel-jammy-src/arch/arm64/configs/defconfig
+ CONFIG_WIREGUARD=y
+ CONFIG_IP_ADVANCED_ROUTER=y
+ CONFIG_IP_MULTIPLE_TABLES=y
コンパイルに必要なパッケージをインストールします。nvidia-jetpack
はインストール済みの前提です。検証時は nftables がうまく動かず、強制的に iptables に切り替えるために nftables をアンインストールしました。
$ sudo apt install libssl-dev
$ sudo apt remove nftables
いよいよコンパイルです。10分以上かかります。
$ make -C kernel
$ export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src
$ make modules
インストール
カスタムカーネルをインストールします。
$ sudo -E make install -C kernel
$ sudo -E make modules_install
$ sudo nv-update-initrd
$ sudo reboot
ようやく WireGuard をインストールします。
$ sudo apt -y install wireguard
無事に使える
/etc/wireguard/wg0.conf
を編集したら、WireGuard を有効にします。
$ sudo systemctl enable --now wg-quick@wg0
これで Jetson で WireGuard を使えるようになりました。
Discussion