之前通过sdkmanager已经可以烧录内核并启动了,但是进入系统中后发现,浏览器chromium和firefox都不可用。本文以此实际问题作为引子,介绍一下nano的内核编译工作。同时,本文章提供了解决jetson系列无法使用浏览器的解决办法
我的主板当前烧录的是JetPack 6.2.1,其系统是基于ubuntu2204的,所以第一步我的想法是安装chromium和firefox,如下
apt install chromium firefox
但是,安装完成之后并不像其他发行版本一样,能够直接运行。其解决方案如下
默认的snap存在问题,需要如下修复
snap download snapd --revision=24724 sudo snap ack snapd_24724.assert sudo snap install snapd_24724.snap sudo sudo snap refresh --hold snapd
这里给出的方案是回退了snap的版本
对于此问题,需要打开两个配置,如下
CONFIG_SQUASHFS_XATTR=y CONFIG_SECURITY_APPARMOR=y
完成上述两个步骤之后,jetson系列的板子就能正常使用浏览器开发咯。 下面开始介绍本文的目标:如何定制修改一个orin内核
我们拿到了具体的问题,就是需要给内核添加两个配置。接下来介绍如何修改内核
apt install git build-essential bc flex bison libssl-dev zstd
打开如下网址
在tool栏找到bootlin toolchain gcc 并下载aarch64--glibc--stable-2022.08-1.tar.bz2
,如下
下载到本地之后,解压并设置path,如下
tar xvjf aarch64--glibc--stable-2022.08-1.tar.bz2 export CROSS_COMPILE=/home/kylin/nvidia/sdk/JetPack_6.2.1_Linux_JETSON_AGX_ORIN_TARGETS/toolchain/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-
在sdk目录有一个Linux_for_Tegra/source/source_sync.sh
脚本,其就是git clone代码,我们在运行之前,需要找到自己的release版本号,从如下网址查看
我们找到对应jetpack 6.2.1 版本的git branch 是jetson_36.4.4。
所以可以直接运行如下拉取内核代码
./source_sync.sh -k -t jetson_36.4.4
值得注意的是,这里每运行一次会给你新建一个当前时间戳的分支,所以建议只拉一次,后面每次同步的时候再运行即可。
如果上述方法找自己想要的分支不方便,那么直接从 git 仓库里面翻是最方便最直接的。稍微阅读一下source_sync.sh
可以发现如下
:kernel/kernel-jammy-src:nv-tegra.nvidia.com/3rdparty/canonical/linux-jammy.git:
根据此,可以推理出nvidia的git repo地址在如下
https://nv-tegra.nvidia.com/r/admin/repos/3rdparty/canonical/linux-jammy
我们寻找tags,如下图
选择自己想要的分支即可。
这里下载内核源码需要点时间,等内核下载完毕之后,执行如下编译构建
make -C kernel
如果需要安装到根文件系统中,则指定rootfs位置,make install即可,如下
export INSTALL_MOD_PATH=/home/kylin/nvidia/sdk/JetPack_6.2.1_Linux_JETSON_AGX_ORIN_TARGETS/Linux_for_Tegra/rootfs/ make install -C kernel cp kernel/kernel-jammy-src/arch/arm64/boot/Image \ /home/kylin/nvidia/sdk/JetPack_6.2.1_Linux_JETSON_AGX_ORIN_TARGETS/Linux_for_Tegra/kernel/Image
这里稍微观察一下安装的内容,可以发现其安装如下
# find ../../out/ -maxdepth 3 ../../out/ ../../out/boot ../../out/boot/Image ../../out/lib ../../out/lib/modules ../../out/lib/modules/5.15.148-tegra
这里了解linux发行版的就很熟悉了,安装了module和Image。这里更新的方式可以不用更新rootfs的方式了,直接复制文件覆盖即可。可以如下
scp kernel/kernel-jammy-src/arch/arm64/boot/Image root@192.168.55.1:/boot/
同理,更新ko也一样。
我的目的是增加
CONFIG_SQUASHFS_XATTR=y CONFIG_SECURITY_APPARMOR=y
nvidia的defconfig由如下变量指定
KERNEL_DEF_CONFIG="defconfig"
故直接修改
vim kernel/kernel-jammy-src/arch/arm64/configs/defconfig
修改完毕之后,编译,安装即可
make install -C kernel scp kernel/kernel-jammy-src/arch/arm64/boot/Image root@192.168.55.1:/boot/
重启,jetson nano上的浏览器可以正常启动了
编译模块的命令也是通用的,如下
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src make modules
安装如下
export INSTALL_MOD_PATH=/home/kylin/nvidia/sdk/JetPack_6.2.1_Linux_JETSON_AGX_ORIN_TARGETS/Linux_for_Tegra/rootfs/ make modules_install
安装完成之后,可以将其更新到initrd.img中。 如下运行
cd ../ && ./tools/l4t_update_initrd.sh
稍微翻阅一下代码,其实可以如下操作更方便
scp -r ../../out/* root@192.168.55.1:/ ssh root@192.168.55.1 nv-update-initrd
https://forums.developer.nvidia.com/t/chromium-other-browsers-not-working-after-flashing-or-updating-heres-why-and-quick-fix/338891 https://docs.nvidia.com/jetson/archives/r36.4.4/DeveloperGuide/SD/Kernel/KernelCustomization.html
这里初步的修改了jetson的内核,目前看下来整体配置用起来挺舒服,开发方式都是很通用的内容。