一般狀況下,想要客製化然後更新Jetson系統上的kernel、modules,除了手動將Image和modules複製到系統上,大概只能用BSP自帶的flash Tool重燒了。現在我們可以利用apt-get來安裝更新Jetson系統上的kernel以及modules。只要幾個指令就可以輕鬆完成更新。以下就介紹如何實現這個功能。
1. 搭建遠端的Debian Packages Repository
請參閱本部落格另一篇文章來搭建自己的apt server。
在conf/distributions檔案內新增以下部份。假設要更新的是r32.6.1的kernel。
Origin: apt repository
Label: apt repository
Codename: r32.6
Architectures: arm64
Components: main
Description: debian package repo
SignWith: <keyid>
Pull: r32.6
<keyid>記得要替換成你要用來簽章的key。
2. 建立kernel的deb檔
2.1 下載Linux_for_Tegra以及kernel的源始碼
可以去Nvidia
官網上下載L4T以及kernel的源始碼。本文皆以r32.6.1 Jetson NANO做範例。
如何編譯以及客製化kernel,不在本文的範疇之內。可以參考官網的文章 。或是之後我有空再寫一篇教學也可以XD。
2.2 打包deb檔
編譯好客製化的kernel後,我們需要將Image、dtb以及module打包成deb檔。 Nvidia已經有打包好的deb檔。我們要做的是將檔案更新進去。官方有提供現成的工具,位於 Linux_for_Tegra/tools/Debian/nvdebrepack.sh。完整的使用說明可以參考同目錄下的nvdebrepack.txt。
先刪除modules底下的build,不然之後安裝nvidia-l4t-kernel-headers會出錯。
$ rm /where/your/modules/lib/modules/4.9.253-tegra/build
更新kernel以及modules。nvidia-l4t-kernel_4.9.253-tegra-32.6.1-20210726122000_arm64.deb 可以在Linux_for_Tegra/kernel底下找到。
$ ./nvdebrepack.sh -v "custom0" -i /where/your/kernel/Image:/boot/Image -i /where/your/modules/lib/modules/4.9.253-tegra:/lib/modules/4.9.253-tegra -m "Update kernel image and modules." -n "frank <franklin@example.com>" nvidia-l4t-kernel_4.9.253-tegra-32.6.1-20210726122000_arm64.deb
出現error。
install: omitting directory '/where/your/modules/lib/modules/4.9.253-tegra'
因為modules是資料夾,nvdebrepack.sh無法將資料夾複製進deb檔中。需要修改nvdebrepack.sh。我的修改方法如下。如果有更好的修改方法歡迎留言分享!
--- a/Linux_for_Tegra/tools/Debian/nvdebrepack.sh
+++ b/Linux_for_Tegra/tools/Debian/nvdebrepack.sh
@@ -120,7 +120,14 @@ function inject_files()
usage "ERROR: No permission specified for ${dst/${REPACK_DIR}/}"
fi
fi
- install -Dv -m "${mode}" "${src}" "${dst}"
+
+ if [ -d $src ]
+ then
+ rm -rf ${dst}
+ rsync -arP "${src}/" "${dst}"
+ else
+ install -Dv -m "${mode}" "${src}" "${dst}"
+ fi
done
}
修改後重新執行,即可產生新的nvidia-l4t-kernel deb檔。
更新nvidia-l4t-kernel-dtbs和nvidia-l4t-kernel-headers deb檔。
$ ./nvdebrepack.sh -d nvidia-l4t-kernel=4.9.253-tegra-32.6.1-20210726122000+custom0 -i /where/your/dtb/custom.dtb:/boot/custom.dtb:662 -v "custom0" -n "frank <franklin@example.com>" nvidia-l4t-kernel-dtbs_4.9.253-tegra-32.6.1-20210726122000_arm64.deb
$ ./nvdebrepack.sh -d nvidia-l4t-kernel=4.9.253-tegra-32.6.1-20210726122000+custom0 -v "custom0" -n "frank <franklin@example.com>" nvidia-l4t-kernel-headers_4.9.253-tegra-32.6.1-20210726122000_arm64.deb
2.3 匯入deb檔
將nvidia-l4t-kernel、nvidia-l4t-kernel-dtbs和nvidia-l4t-kernel-headers三個deb檔複製到遠端的apt server中。執行以下命令將這三個deb檔匯入apt server中。
$ reprepro -Vb /server/directory includedeb r32.6 nvidia-l4t-kernel_4.9.253-tegra-32.6.1-20210726122000+custom0_arm64.deb nvidia-l4t-kernel-dtbs_4.9.253-tegra-32.6.1-20210726122000+custom0_arm64.deb nvidia-l4t-kernel-headers_4.9.253-tegra-32.6.1-20210726122000+custom0_arm64.deb
3. 更新 kernel
首先在Jetson NANO中的 /etc/apt/sources.list.d 底下新增一檔案update.list。內容為:
deb http://<server address> r32.6 main
然後匯入server的public key。
$ wget -O - http://<server address>/public.gpg.key | apt-key add -
輸入以下命令即可更新kernel。
$ sudo apt-get update
$ sudo apt-get install nvidia-l4t-kernel
如果之後還有需要更新kernel,只要將版本往上加即可!
$ ./nvdebrepack.sh -v "custom1" -i /where/your/kernel/Image:/boot/Image -i /where/your/modules/lib/modules/4.9.253-tegra:/lib/modules/4.9.253-tegra -m "Update kernel image and modules." -n "frank <franklin@example.com>" nvidia-l4t-kernel_4.9.253-tegra-32.6.1-20210726122000_arm64.deb
參考連結