x86 机器上克隆内核源码并交叉编译 perf

文章目录

  • 一、查看系统环境
  • [二、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 命令,在此记录一下

bash 复制代码
sshpass -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;同时把正常打印和错误信息全部输出