LC-X5 配置与 lzc-thor 使用
LC-X5 刷机后,可以使用 lzc-thor 完成系统初始化、MGBE 网络测试、VNC 配置和磁盘管理。
除查看帮助外,本文命令均建议使用 sudo 执行。先用下面的命令确认当前系统支持的命令:
sudo lzc-thor help命令速查
| 使用场景 | 命令 |
|---|---|
| 完成新设备的常规初始化 | sudo lzc-thor all |
| 单独安装 JetPack 和监控工具 | sudo lzc-thor packages |
| 修复克隆系统的机器和网卡身份 | sudo lzc-thor clone-identity |
| 安装 Docker 和 NVIDIA 容器运行时 | sudo lzc-thor docker |
安装独立的 docker-compose 命令 | sudo lzc-thor docker-compose |
| 关闭 Ubuntu 自动升级 | sudo lzc-thor disable-upgrades |
| 配置 MGBE 性能参数 | sudo lzc-thor mgbe |
| 配置或执行 MGBE 带宽测试 | sudo lzc-thor mgbe serve ...、sudo lzc-thor mgbe client ... |
| 配置时区、时间同步、最大频率和 Firefox | sudo lzc-thor startup |
安装并启动 lzc-ai-agent | sudo lzc-thor agent |
| 配置桌面 VNC | sudo lzc-thor vnc ... |
| 扩大当前系统盘上的根文件系统 | sudo lzc-thor resizefs |
| 建立只读 APP 恢复系统和 LVM 运行系统 | sudo lzc-thor provision ... |
| 把一块新 NVMe 整盘加入根文件系统 | sudo lzc-thor expand-lvm ... |
| 从 APP recovery 恢复出厂运行系统 | sudo lzc-thor factory-reset ... |
vnc、MGBE 测试、resizefs、provision、expand-lvm 和 factory-reset 不包含在 all 中,必须按需单独执行。
新设备快速初始化
使用默认用户
sudo lzc-thor all该命令按下面的顺序执行:
- 安装 JetPack、编译工具和 GPU 监控工具。
- 重新生成克隆系统的机器身份,并配置稳定且每台设备不同的以太网 MAC。
- 安装 Docker CE、Buildx、Compose 插件和 NVIDIA Container Toolkit。
- 安装独立的
/usr/bin/docker-compose。 - 关闭 Ubuntu 自动升级。
- 配置全部已发现 MGBE 接口的 threaded NAPI 和 IOMMU DMA-FQ,并运行
jetson_clocks。 - 配置时区、网络时间同步、开机运行
jetson_clocks和 Firefox。 - 安装并启动
lzc-ai-agent。
默认将 nvidia 用户加入 docker 组。完整初始化后建议重启设备,使机器身份、网卡身份和用户组等配置全部生效;重新登录后可以执行 docker ps 验证 Docker 权限。
指定 Docker 用户
如果系统的日常登录用户不是 nvidia,使用 --docker-user 指定用户:
sudo lzc-thor all --docker-user ubuntu也支持下面的等价写法:
sudo lzc-thor all --user ubuntu
sudo lzc-thor all ubuntulzc-thor-init-all 是 lzc-thor all 的等价入口:
sudo lzc-thor-init-all --docker-user ubuntu常规配置命令
help:查看命令帮助
sudo lzc-thor help
sudo lzc-thor --help查看带参数命令的详细用法时,将 --help 放在对应命令后:
sudo lzc-thor clone-identity --help
sudo lzc-thor mgbe serve --help
sudo lzc-thor provision --help
sudo lzc-thor expand-lvm --help
sudo lzc-thor factory-reset --helppackages:安装 Jetson 软件包
sudo lzc-thor packages该命令通过 apt 安装以下软件包:
nvidia-jetpack:Jetson 平台软件栈。build-essential:常用编译工具。nvitop、gpustat、nvtop:GPU 状态监控工具。
适用于只需要补装或修复这些软件包,而不想执行完整初始化的场景。该命令没有额外参数。
clone-identity:修复克隆设备身份
从同一个母盘克隆多台 LC-X5 后,设备可能带有相同的 /etc/machine-id、NetworkManager 密钥或有线网络身份,导致 DHCP 和局域网设备识别异常。
先预览将执行的操作:
sudo lzc-thor clone-identity --dry-run确认后执行修复,并在完成后重启:
sudo lzc-thor clone-identity
sudo reboot该命令会重新生成 /etc/machine-id,删除克隆带来的 NetworkManager 主机密钥,并将现有以太网连接配置为按设备生成稳定的本地管理 MAC。默认只重新加载 NetworkManager 配置,不会重启正在使用的网络连接。
如果正在本机控制台操作,并且可以接受网络立即中断,可以直接应用:
sudo lzc-thor clone-identity --apply-now
--apply-now会重启 NetworkManager,SSH 会话可能立即断开。通过 SSH 操作时,优先使用不带该参数的命令,然后重启设备。
可用参数:
| 参数 | 说明 |
|---|---|
--apply-now | 写入配置后立即重启 NetworkManager。 |
--no-machine-id | 不重新生成 /etc/machine-id。 |
--no-profile-update | 不修改现有 NetworkManager 连接配置。 |
--dry-run | 只显示计划,不修改系统。 |
维护已挂载但未启动的克隆系统时,可以使用 LZC_THOR_ROOT 指定其根目录。离线模式只修改该目录下的文件,不操作当前系统的 NetworkManager:
sudo LZC_THOR_ROOT=/mnt/thor-root lzc-thor clone-identitydocker:安装 Docker 和 NVIDIA 运行时
只安装 Docker,不修改任何用户组:
sudo lzc-thor docker同时允许指定用户不加 sudo 使用 Docker:
sudo lzc-thor docker --docker-user ubuntu--user ubuntu 和直接写 ubuntu 也是等价写法。该命令会:
- 配置 Docker 官方 apt 软件源。
- 安装 Docker CE、Docker CLI、containerd、Buildx 和 Compose 插件。
- 安装 NVIDIA Container Toolkit,并将 NVIDIA runtime 配置为 Docker 默认运行时。
- 启用并重启
docker.service。 - 在指定用户时,将该用户加入
docker组。
修改用户组后,已有登录会话通常需要退出并重新登录才能获得新权限。
docker-compose:安装独立 Compose 命令
sudo lzc-thor docker-compose
docker-compose version该命令从 Docker Compose 的 GitHub 最新 release 下载 Linux aarch64 二进制文件,校验 .sha256 后安装到 /usr/bin/docker-compose。它与 Docker 软件包提供的 docker compose 插件并存。
设备需要能够访问 GitHub。该命令总是获取执行时的最新版本,没有版本选择参数。
disable-upgrades:关闭自动升级
sudo lzc-thor disable-upgrades该命令关闭并屏蔽 apt 定时更新、unattended-upgrades 和 update-notifier 相关服务,同时卸载相关软件包。适用于需要固定 JetPack、内核和驱动环境的设备。
关闭自动升级后,系统不会自动安装安全更新;需要由管理员安排兼容性验证和手动更新。
startup:配置启动环境
sudo lzc-thor startup该命令会:
- 根据当前公网 IP 查询时区;查询失败时使用
Asia/Shanghai。 - 启用
systemd-timesyncd,并配置 Cloudflare、阿里云等 NTP 服务。 - 创建并启用
lzc-jetson-clocks.service,开机时锁定 Jetson 最大频率。 - 通过 Snap 安装 Firefox。
执行时需要访问时区查询服务、Ubuntu 软件源和 Snap 服务。该命令没有额外参数。
agent:安装算力舱代理
sudo lzc-thor agent
sudo systemctl status lzc-ai-agent.service该命令使用安装包内附带的 ARM64 客户端安装 lzc-ai-agent,然后启用并重启 lzc-ai-agent.service。适用于单独重装或修复算力舱代理。该命令没有额外参数。
MGBE 配置与带宽测试
mgbe:配置 MGBE 性能参数
sudo lzc-thor mgbe该命令自动发现名称类似 mgbe0_0 的全部物理 MGBE 接口,并执行以下配置:
- 开启 threaded NAPI。
- 运行
jetson_clocks。 - 将各接口所在的 IOMMU group 设置为
DMA-FQ。
该命令只负责性能参数,不分配测试 IP,也不启动 iperf3。它包含在 lzc-thor all 中。
MGBE 测试的工作方式
MGBE 测试需要两台设备:一台运行服务端命令,另一台运行客户端命令。测试前,两端都应执行:
sudo lzc-thor mgbe
sudo apt install -y iperf3测试辅助命令分为三个步骤:
serve config和client config分配各链路的静态 IP,将配置写入/etc/netplan/99-mgbe-test.yaml,并把链路分配保存到/var/lib/lzc-thor/mgbe-test。serve run从已保存的服务端配置启动iperf3;client run从已保存的客户端配置发起测试。- 两端执行
clean,停止测试进程并删除临时网络配置和状态。
config 与 run 必须在同一端按角色配套使用。修改 IP 或测试链路数后,需要重新执行对应的 config。
各测试命令的参数和用途如下:
| 命令 | 参数 | 用法 |
|---|---|---|
mgbe serve config | 必须提供 --base-ip IP;可选 --mode 3x|4x、--dry-run | 为服务端接口分配 IP、应用 netplan 并保存服务端状态。 |
mgbe serve run | 可选 --dry-run | 读取服务端状态,并为每条链路启动 8 个不同端口的 iperf3 服务。 |
mgbe client config | 必须提供 --server-base-ip IP 和 --local-suffix 1-254;可选 --mode 3x|4x、--dry-run | 根据服务端基准 IP 计算两端地址、应用客户端 netplan 并保存状态。 |
mgbe client run | 可选 --duration SEC、--parallel N、--udp、--dry-run | 检查每条链路是否可达,同时运行所有 iperf3 客户端并汇总发送端带宽。 |
mgbe clean | 可选 --dry-run | 停止已记录的服务进程,删除测试 netplan 和两端状态。 |
三链路测试示例
以下示例适用于 T4000 与 T5000 连接并使用 3 条 25GbE 链路的场景。
服务端执行:
sudo lzc-thor mgbe clean
sudo lzc-thor mgbe serve config --base-ip 192.168.100.10 --mode 3x
sudo lzc-thor mgbe serve run客户端执行:
sudo lzc-thor mgbe clean
sudo lzc-thor mgbe client config \
--server-base-ip 192.168.100.10 \
--local-suffix 20 \
--mode 3x
sudo lzc-thor mgbe client runIP 会按链路递增第三段:
| 链路 | 服务端 IP | 客户端 IP |
|---|---|---|
| 第 1 条 | 192.168.100.10 | 192.168.100.20 |
| 第 2 条 | 192.168.101.10 | 192.168.101.20 |
| 第 3 条 | 192.168.102.10 | 192.168.102.20 |
--local-suffix 是客户端 IP 的最后一段,范围为 1 到 254,并且不能与服务端 IP 的最后一段相同。
选择 3x、4x 或自动模式
--mode 只用于 serve config 和 client config:
| 写法 | 使用的接口 |
|---|---|
不写 --mode | auto 模式,使用全部自动发现的 MGBE 接口。 |
--mode 3x | 按接口名称排序后使用前 3 个接口。 |
--mode 4x | 按接口名称排序后使用前 4 个接口。 |
两端必须选择相同的模式。四链路测试示例:
# 服务端
sudo lzc-thor mgbe serve config --base-ip 192.168.100.10 --mode 4x
sudo lzc-thor mgbe serve run
# 客户端
sudo lzc-thor mgbe client config \
--server-base-ip 192.168.100.10 \
--local-suffix 20 \
--mode 4x
sudo lzc-thor mgbe client runrun 会读取 config 保存的模式,不接受 --mode。旧的 lzc-thor mgbe test 已被移除。
调整测试参数
客户端默认测试 10 秒,每个 iperf3 客户端进程使用 24 条并行流:
sudo lzc-thor mgbe client run --duration 30 --parallel 32使用 UDP 测试:
sudo lzc-thor mgbe client run --udp每条 MGBE 链路会使用 8 个 TOS 值启动 8 个客户端进程。因此 3x 模式会并发启动 24 个客户端进程,4x 模式会启动 32 个;--parallel 是每个进程内部的并行流数量,不是进程总数。
执行 run 时,工具会检查已保存接口的 MTU 9000、threaded NAPI、IOMMU DMA-FQ 和对应的 ODMDATA 25GbE 配置;无法确认 jetson_clocks 或 ODMDATA 时会给出警告。检查失败时,应先重新执行 sudo lzc-thor mgbe 并核对设备的链路模式,不要直接使用不完整的测试结果。
测试完成后会输出 Concurrent aggregate sender bandwidth。该数值只汇总同一个并发测试窗口内可解析的发送端结果,不应将多轮串行测试结果相加后当作链路带宽。
预览和清理测试配置
测试辅助命令支持 --dry-run,可以在不修改主机的情况下检查计划:
sudo lzc-thor mgbe serve config --base-ip 192.168.100.10 --mode 3x --dry-run
sudo lzc-thor mgbe client run --dry-run
sudo lzc-thor mgbe clean --dry-run正式测试结束后,在服务端和客户端都执行:
sudo lzc-thor mgbe cleanclean 会停止命令记录的 iperf3 服务端进程,删除 /etc/netplan/99-mgbe-test.yaml 和 /var/lib/lzc-thor/mgbe-test 下的状态,并重新应用网络配置。
VNC 配置
vnc 不包含在 all 中。为默认的 nvidia 桌面用户配置 VNC:
sudo lzc-thor vnc --password '<VNC密码>'为其他桌面用户配置:
sudo lzc-thor vnc --user ubuntu --password '<VNC密码>'也可以用环境变量传入用户和密码:
sudo LZC_THOR_VNC_USER=ubuntu \
LZC_THOR_VNC_PASSWORD='<VNC密码>' \
lzc-thor vnc| 参数或变量 | 说明 |
|---|---|
--user USER | 目标桌面用户;默认读取 LZC_THOR_VNC_USER,未设置时为 nvidia。 |
--password PASSWORD | 必填的 VNC 密码,也可以通过 LZC_THOR_VNC_PASSWORD 提供。 |
该命令按需安装 Vino、启用其桌面启动项并写入用户的 VNC 设置。完成后应重启设备。没有配置桌面自动登录时,通常需要目标用户先在本地登录图形桌面,VNC 才能连接。
存储命令
resizefs、provision、expand-lvm 和 factory-reset 会操作分区、文件系统、LVM 或启动配置。执行前应备份重要数据,并先确认设备名和当前根文件系统。
findmnt /
lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,PARTLABEL,MOUNTPOINTS
sudo pvs
sudo vgs
sudo lvsresizefs:使用当前系统盘的剩余空间
将较小的系统盘克隆到较大的磁盘后,可以执行:
sudo lzc-thor resizefs该命令根据当前 / 的布局自动选择处理方式:
- 普通 ext4 分区根目录:将该分区扩展到磁盘剩余空间,再在线扩展 ext4。
- 标准
aipod_vg/lv_root且只有一个分区型 PV:扩展 PV 所在分区和 PV,将 VG 的全部空闲空间分配给lv_root,再在线扩展 ext4。
该命令不支持多 PV、加密存储、整盘文件系统、非 ext4 根文件系统或非标准 LVM 布局。多盘 LVM 运行系统需要增加新磁盘时,应使用 expand-lvm,而不是 resizefs。
provision:建立 APP recovery 和 LVM runtime
provision 用于将带有 APP 和 DATA_PV 分区的 LC-X5 转换为以下布局:
APP:只读的出厂系统和恢复环境,同时保存 L4TLauncher 启动文件。aipod_vg/lv_root:日常使用的可写 ext4 根文件系统。
这是一个分两阶段执行、每阶段都会自动重启的流程。
第 1 阶段:在可写 APP 中准备
先检查当前状态和计划:
sudo lzc-thor provision status
sudo lzc-thor provision --dry-run确认无误后开始准备:
sudo lzc-thor provision --yes第 1 阶段会安装存储和 initramfs 工具、扩展 DATA_PV、检查 initrd 的 LVM 支持、写入受管理的启动项、将 APP 配置为只读,并把下次启动目标设为 LZC Thor APP recovery,然后重启。
第 2 阶段:在 APP recovery 中创建运行系统
设备重启进入 LZC Thor APP recovery 后登录,再执行:
sudo lzc-thor provision --maintenance --yes第 2 阶段会确认当前根目录确实是只读 APP,创建 aipod_vg/lv_root,以块级方式把 APP 克隆到逻辑卷,扩展 ext4、生成新的文件系统 UUID 和机器身份,最后切换到 LVM runtime 并重启。
进入运行系统后,可以检查:
sudo lzc-thor provision status
findmnt /
findmnt /factory正常情况下,/ 来自 /dev/aipod_vg/lv_root,APP 以只读方式挂载在 /factory。当前启动文件对应的软件包会被 hold,因此不支持在线更新内核、DTB 和 initrd。
provision会修改分区和启动配置。不要跳过--dry-run,也不要在不符合APP、DATA_PV布局的设备上强行执行。
expand-lvm:增加一块 NVMe 到根文件系统
该命令只适用于根目录已经是可写的 /dev/aipod_vg/lv_root,用于把一块完整 NVMe 磁盘加入根文件系统。
先根据容量、型号和序列号确认目标盘:
lsblk -d -o NAME,PATH,SIZE,MODEL,SERIAL对空盘先执行只读检查和预览:
sudo lzc-thor expand-lvm --disk /dev/nvme1n1 --dry-run确认目标正确后正式扩容:
sudo lzc-thor expand-lvm --disk /dev/nvme1n1空盘会被创建 GPT,并建立一个标记为 LZC_THOR_PV 的分区。随后命令会执行 pvcreate、vgextend、lvextend 和 resize2fs,在线扩大根文件系统。
如果磁盘上已有分区或文件系统,命令默认拒绝操作。明确确认其中数据可以全部删除后,使用:
# 交互式确认时,按提示完整输入目标磁盘路径
sudo lzc-thor expand-lvm --disk /dev/nvme1n1 --force-wipe
# 无人值守确认;会直接清空目标盘
sudo lzc-thor expand-lvm --disk /dev/nvme1n1 --force-wipe --yes| 参数 | 说明 |
|---|---|
--disk /dev/nvmeXnY | 必填;必须是完整 NVMe 设备,不能填写分区。 |
--dry-run | 执行运行环境和磁盘安全检查,并显示计划,不写磁盘。 |
--force-wipe | 授权清空非空目标盘;未带 --yes 时要求交互确认。 |
--yes | 只可与 --force-wipe 同时使用,跳过交互确认。 |
扩容后,每块成员盘都永久成为根文件系统的一部分。拔掉任意成员盘都可能导致系统无法启动。后续恢复出厂设置时,所有
DATA_PV和LZC_THOR_PV成员盘都会被清空并重建。
命令支持从已完成的 pvcreate、vgextend 或扩容步骤继续执行;已经完整加入并分配空间的磁盘再次执行时不会重复扩容。
factory-reset:恢复 LVM 运行系统
factory-reset 只能在手动选择的只读 LZC Thor APP recovery 中执行,不能在日常 LVM runtime 中执行。
重启设备,在 extlinux 菜单中手动选择
LZC Thor APP recovery。如果系统使用多块 LVM 成员盘,确认所有扩容盘都已连接。
进入 recovery 后先查看状态并预演:
bashsudo lzc-thor factory-reset status sudo lzc-thor factory-reset --dry-run确认后执行恢复:
bashsudo lzc-thor factory-reset --yes
该命令会检查当前系统是否从只读 APP 启动、LVM 拓扑是否符合预期、所有成员盘是否在线,以及每个 PV 是否支持 discard。随后会清空所有 DATA_PV 和 LZC_THOR_PV,按原总容量重建 aipod_vg/lv_root,从 APP 克隆全新的运行系统并重启。APP、APP 中的 /etc/fstab 和 extlinux 默认启动项保持不变。
factory-reset --yes会永久删除运行系统、Docker 数据、模型、应用和用户文件。--dry-run不会写磁盘,但仍会执行恢复环境、成员盘和 discard 能力检查。
常见问题
为什么执行 Docker 后仍提示权限不足?
用户加入 docker 组后,当前登录会话不会自动刷新组信息。退出 SSH 或桌面会话并重新登录,再执行:
docker ps为什么 mgbe serve run 或 client run 提示没有状态?
run 不接收 IP 和 --mode,只读取同一角色最近一次 config 保存的状态。先重新执行 serve config 或 client config,再执行对应的 run。
什么时候用 resizefs,什么时候用 expand-lvm?
- 原系统盘本身变大,想使用同一块盘尾部的剩余空间:使用
resizefs。 - 已经运行在
aipod_vg/lv_root,想把另一块完整 NVMe 加入根文件系统:使用expand-lvm。
如何只查看当前存储布局?
sudo lzc-thor provision statusprovision status 和 factory-reset status 都只输出当前根目录、/factory、/boot、块设备、LVM 和 extlinux 默认启动项,不修改系统。