编辑
2025-08-03
记录知识
0
请注意,本文编写于 39 天前,最后修改于 38 天前,其中某些信息可能已经过时。

目录

具体问题
snap
内核配置
修改内核
安装依赖
安装交叉编译工具链
下载内核源码
编译内核
修改配置
编译模块
参考链接
总结

之前通过sdkmanager已经可以烧录内核并启动了,但是进入系统中后发现,浏览器chromium和firefox都不可用。本文以此实际问题作为引子,介绍一下nano的内核编译工作。同时,本文章提供了解决jetson系列无法使用浏览器的解决办法

具体问题

我的主板当前烧录的是JetPack 6.2.1,其系统是基于ubuntu2204的,所以第一步我的想法是安装chromium和firefox,如下

apt install chromium firefox

但是,安装完成之后并不像其他发行版本一样,能够直接运行。其解决方案如下

snap

默认的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

安装交叉编译工具链

打开如下网址

https://developer.nvidia.com/embedded/jetson-linux-r3644

在tool栏找到bootlin toolchain gcc 并下载aarch64--glibc--stable-2022.08-1.tar.bz2,如下

image.png

下载到本地之后,解压并设置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版本号,从如下网址查看

https://docs.nvidia.com/jetson/archives/

我们找到对应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,如下图

image.png

选择自己想要的分支即可。

这里下载内核源码需要点时间,等内核下载完毕之后,执行如下编译构建

编译内核

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的内核,目前看下来整体配置用起来挺舒服,开发方式都是很通用的内容。