文章目录
- 一、查看系统环境
- [二、x86 机器上安装交叉编译工具链](#二、x86 机器上安装交叉编译工具链)
- [三、获取内核源码(仅获取 tools 目录)](#三、获取内核源码(仅获取 tools 目录))
- [四、交叉编译 perf](#四、交叉编译 perf)
- [五、传输到 Jetson](#五、传输到 Jetson)
- [六、在 Jetson 上安装](#六、在 Jetson 上安装)
在给Jstson 下载github源码是出现无法访问的情况,考虑到自己x86机器上可以访问github,就打算学习一下交叉编译的流程(当然,先使用x86下载源码,然后拷到Jestson上编译也是可以的,具体参考 Nvidia Jetson产品NX安装Perf及基础使用)
一、查看系统环境
在Jetsson使用如下命令查看系统信息
bash
uname -r
5.15.148-tegra
lsb_release -d
Description: Ubuntu 22.04.5 LTS
uname -m
aarch64

整理当前所需系统信息如下
| 项目 | 要求 |
|---|---|
| x86 开发机系统 | Ubuntu 22.04(或 20.04) |
| 目标架构 | aarch64(Jetson Orin NX) |
| 目标内核版本 | 5.15.148-tegra |
| 网络 | x86 机器需能访问 kernel.org |
| 磁盘空间 | x86 机器约 500MB |
二、x86 机器上安装交叉编译工具链
bash
sudo apt-get update
sudo apt-get install -y \
gcc-aarch64-linux-gnu \
binutils-aarch64-linux-gnu \
libelf-dev \
libdw-dev \
libssl-dev \
libaudit-dev \
libslang2-dev \
python3-dev \
binutils-dev \
liblzma-dev \
pkg-config \
flex \
bison \
git
# 验证交叉编译器
aarch64-linux-gnu-gcc --version
# 期望: aarch64-linux-gnu-gcc (Ubuntu ...) x.x.x

三、获取内核源码(仅获取 tools 目录)
使用 sparse checkout 只拉取编译 perf 所需的目录,避免下载 180MB+ 的完整内核源码:
bash
mkdir -p ~/perf_cross_build && cd ~/perf_cross_build
# sparse clone:只获取元数据,不下载文件内容
git clone --depth=1 --branch v5.15.148 \
--filter=blob:none --sparse \
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git \
linux-src
cd linux-src
# 指定只检出这些目录(perf 编译所需的全部依赖)
git sparse-checkout set \
tools/perf \
tools/lib \
tools/include \
tools/arch \
tools/scripts \
tools/build
# 验证关键文件存在
ls tools/perf/Makefile
ls tools/build/Makefile.include
说明 :
tools/build目录是必须的,否则fixdep工具的 Makefile 找不到依赖会报错。
git clone 命令分析
- git clone:拉取远程仓库到本地文件夹
- --depth=1:浅克隆,只下载 v5.15.148 这个分支最新 1 个提交,抛弃所有历史 commit、旧版本代码;极大缩小仓库体积。
- --branch v5.15.148: 指定克隆、切换到内核标签 / 分支 v5.15.148。
- --filter=blob:none:核心稀疏过滤:不下载任何文件实体内容(blob 二进制对象),只拉取目录结构、提交元数据、文件名;文件本体后续按需再拉。
- --sparse: 开启稀疏检出模式:默认不检出仓库任何文件,需要手动指定要保留的文件夹。
- 远程地址:内核稳定版源码仓库
- 本地目录名:linux-src
git sparse-checkout set 命令分析
- git sparse-checkout set 路径列表:稀疏检出白名单,本地只保留列出的 6 个文件夹,其余所有内核目录自动隐藏、不下载。
- tools/perf:perf 工具主源码
- tools/lib:perf 依赖的通用工具库
- tools/include:头文件
- tools/arch:CPU 架构相关适配代码(x86/ARM aarch64 等)
- tools/scripts:编译构建脚本
- tools/build:构建编译辅助代码
四、交叉编译 perf
bash
cd ~/perf_cross_build/linux-src/tools/perf
# 关键参数说明:
# ARCH=arm64 目标架构
# CROSS_COMPILE=... 交叉编译器前缀
# NO_LIBTRACEEVENT=1 禁用 libtraceevent(减少依赖)
# NO_LIBPERL=1 禁用 Perl 支持
# NO_LIBPYTHON=1 禁用 Python 支持
# NO_NEWT=1 禁用 TUI 界面
# NO_GTK2=1 禁用 GTK2 界面
# NO_LIBBPF=1 禁用 BPF 支持(减少依赖)
make -j$(nproc) \
ARCH=arm64 \
CROSS_COMPILE=aarch64-linux-gnu- \
NO_LIBTRACEEVENT=1 \
NO_LIBPERL=1 \
NO_LIBPYTHON=1 \
NO_NEWT=1 \
NO_GTK2=1 \
NO_LIBBPF=1
出现如下日志输出,即编译成功标志:

可使用如下命令验证编译结果
bash
# 确认是 aarch64 ELF 二进制(不是脚本!)
file ~/perf_cross_build/linux-src/tools/perf/perf
# 期望输出:
# perf: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV),
# dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, ...
# 查看文件大小(正常约 10~15MB)
ls -lh ~/perf_cross_build/linux-src/tools/perf/perf

五、传输到 Jetson
bash
# 传输 perf 二进制
scp ~/perf_cross_build/linux-src/tools/perf/perf \
nvidia@<jetson-ip>:~/perf_aarch64
# 同时传输 FlameGraph 工具(如果 Jetson 无法访问 GitHub)
scp -r ~/FlameGraph nvidia@<jetson-ip>:~/FlameGraph
开源工具 - FlameGraph 下载参看 Nvidia Jetson产品NX安装Perf及基础使用
六、在 Jetson 上安装
bash
# SSH 进入 Jetson
ssh nvidia@<jetson-ip>
# 安装 perf 到系统路径
sudo mv ~/perf_aarch64 /usr/local/bin/perf
sudo chmod +x /usr/local/bin/perf
# 确保 PATH 优先(Ubuntu 的 /usr/bin/perf 脚本会被绕过)
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
# 验证
which perf # 期望: /usr/local/bin/perf
sudo perf --version # 期望: perf version 5.15.148.gXXXXXXXX

补充一点,新学了一下 sshpass 命令,在此记录一下
bashsshpass -p "nvidia" ssh -o StrictHostKeyChecking=no nvidia@172.31.9.61 "uname -r && uname -m && echo OK" 2>&1命令含义如下:
使用密码 nvidia 自动登录 172.31.9.61 的 nvidia 用户,不弹窗确认主机指纹;登录后查询远程主机内核版本、CPU 架构,全部执行完毕输出 OK;同时把正常打印和错误信息全部输出
