一般狀況下,想要客製化然後更新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做範例。
 
選擇相對應的版本
 
 
下載Linux_for_Tegra和kernel Source Code
 

如何編譯以及客製化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
 
 
參考連結
 
 
 
arrow
arrow
    創作者介紹
    創作者 阿轟師 的頭像
    阿轟師

    阿轟師與他的快樂夥伴

    阿轟師 發表在 痞客邦 留言(0) 人氣()