Jetson Orin Nano存储扩容实战:利用NBD将/home迁移至reComputer 1. 项目概述与核心需求解析最近在折腾我的 Jetson Orin Nano Developer Kit这玩意儿性能是真不错但那个自带的 eMMC 存储空间用起来实在是捉襟见肘。特别是/home目录装几个开发环境、下点数据集分分钟就告急了。相信很多玩 Orin Nano 的朋友都遇到过这个痛点。为了解决这个问题我决定把整个/home目录迁移到一块外挂的 reComputer 上。reComputer 本质上是一台基于 ARM 架构的迷你主机性能稳定功耗低非常适合作为 Orin Nano 的扩展存储和计算节点。这个操作不仅仅是简单的文件拷贝它涉及到系统引导、用户权限、服务依赖等一系列底层配置的调整搞好了能一劳永逸地解决存储焦虑搞不好可能连系统都进不去。今天我就把这次迁移的完整过程、踩过的坑以及最终稳定的方案详细分享给大家。2. 迁移方案设计与底层原理2.1 为什么选择 reComputer 作为目标存储首先得明确我们不是简单地在 Orin Nano 上挂载一块移动硬盘。reComputer 是一台独立的设备拥有自己的处理器、内存和操作系统。我选择它主要基于以下几点考量性能与稳定性通过千兆以太网或更高速的接口如 USB 3.0 网络共享连接其读写速度远高于普通的网络挂载NFS/SMB并且 reComputer 的系统相对轻量且稳定适合7x24小时运行作为“存储服务器”非常可靠。灵活性reComputer 本身也是一台计算机。这意味着除了存储我还可以在上面运行一些后台服务、数据库或者作为分布式计算的一个节点减轻 Orin Nano 本地的计算压力。迁移/home后Orin Nano 的 eMMC 可以专注于运行核心系统和实时性要求高的任务。数据安全与独立性即使 Orin Nano 的主系统崩溃需要重刷/home分区中的数据在 reComputer 上依然是独立且完整的不会受到影响。这相当于做了一个物理上的数据分离备份。成本与功耗相比为 Orin Nano 寻找复杂的内置存储扩容方案如更换 SSD 模块并非所有版本支持利用现有的 reComputer 是成本更低、更通用的解决方案。reComputer 的功耗通常也只有几瓦非常节能。2.2 核心迁移思路网络块设备NBD与系统符号链接直接通过网络文件系统如 NFS挂载/home是最容易想到的方案但它在实际使用中会遇到很多问题对网络波动敏感、某些应用程序特别是使用文件锁的数据库、或依赖.Xauthority等文件的图形程序在 NFS 上可能行为异常、用户身份映射麻烦等。因此我采用了更接近“本地磁盘”体验的方案网络块设备Network Block Device, NBD。其原理是在 reComputer 上将一个物理分区或镜像文件通过 NBD 服务器导出为一个“虚拟的块设备”。然后在 Orin Nano 上使用 NBD 客户端将这个网络块设备映射为一个本地的设备节点如/dev/nbd0。接下来就可以像对待一块新插入的硬盘一样对这个/dev/nbd0进行分区、格式化并最终挂载到 Orin Nano 的/home目录。为了让系统在启动时自动完成这一切我们需要修改 Orin Nano 的/etc/fstab文件并配置 systemd 服务来确保在挂载/home之前先建立好 NBD 连接。整个逻辑链条如下reComputer 物理存储 - 导出为 NBD 服务 - Orin Nano 连接为 /dev/nbd0 - 格式化为 ext4 - 挂载到 /home为了无缝迁移原有数据我会先在 Orin Nano 本地将旧/home的数据打包在挂载好新的网络home分区后再解压回去。最后通过修改/etc/passwd中用户的 home 目录指向虽然挂载后路径不变但确保万无一失并检查关键服务的依赖完成整个切换。3. 迁移前准备与环境配置3.1 硬件与网络准备reComputer 准备确保 reComputer 已安装一个轻量级 Linux 系统如 Ubuntu Server 22.04 或 Debian 11。我使用的是 Ubuntu Server。为 reComputer 连接一块足够容量的 SSD 或硬盘。我将一块 512GB 的 SSD 通过 USB 3.0 连接到 reComputer并在系统内识别为/dev/sda。为 reComputer 设置静态 IP 地址例如192.168.1.100。这至关重要因为 Orin Nano 需要稳定地连接到它。# 在 reComputer 上编辑网络配置以 netplan 为例 sudo nano /etc/netplan/01-netcfg.yaml # 配置示例 network: version: 2 ethernet: eth0: dhcp4: no addresses: [192.168.1.100/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 1.1.1.1] sudo netplan applyJetson Orin Nano 准备确保 Orin Nano 与 reComputer 在同一局域网内并能互相 ping 通。为 Orin Nano 也设置一个静态 IP例如192.168.1.50方便管理。最重要的一步备份你当前/home目录下所有重要数据可以使用tar或rsync备份到外部 U 盘或另一台机器。这是一个不可逆的操作备份是生命线。3.2 软件包安装配置 NBD 服务器与客户端在 reComputer 上安装并配置 NBD 服务器sudo apt update sudo apt install nbd-server -y编辑 NBD 服务器的配置文件sudo nano /etc/nbd-server/config在文件末尾添加以下内容意思是把本地的/dev/sda1分区请根据你的实际磁盘分区情况修改通过 NBD 协议导出监听所有网络接口的 10809 端口。[generic] [home-export] exportname /dev/sda1 readonly false multifile false copyonwrite false注意这里我直接导出了整个分区/dev/sda1。你也可以导出一个镜像文件如home.img灵活性更高但性能可能略有损耗。确保/dev/sda1是你打算用于 home 数据的分区且没有重要数据因为后续会在 Orin Nano 上格式化。重启 NBD 服务并设置开机自启sudo systemctl restart nbd-server sudo systemctl enable nbd-server使用sudo systemctl status nbd-server检查服务是否正常运行。在 Jetson Orin Nano 上安装 NBD 客户端sudo apt update sudo apt install nbd-client -y测试连接看是否能从 reComputer 获取到块设备sudo nbd-client 192.168.1.100 10809 /dev/nbd0如果成功你会看到连接信息。此时可以运行lsblk命令应该能看到/dev/nbd0这个设备。测试完毕后断开连接sudo nbd-client -d /dev/nbd04. 数据迁移与系统配置实战4.1 在 Orin Nano 上连接并格式化网络块设备现在开始核心操作。我们将编写一个脚本和系统服务让这一切在启动时自动完成。创建连接和挂载脚本 在 Orin Nano 上创建/usr/local/bin/mount-remote-home.shsudo nano /usr/local/bin/mount-remote-home.sh脚本内容如下#!/bin/bash # 连接到 reComputer 的 NBD 服务器 /usr/sbin/nbd-client 192.168.1.100 10809 /dev/nbd0 # 等待设备就绪 sleep 2 # 检查设备是否存在 if [ -b /dev/nbd0 ]; then # 检查文件系统如果不是 ext4 则格式化首次运行 sudo fsck -y /dev/nbd0 || sudo mkfs.ext4 /dev/nbd0 # 挂载到 /home mount /dev/nbd0 /home echo Remote /home mounted successfully. else echo Failed to connect NBD device. exit 1 fi给脚本添加执行权限sudo chmod x /usr/local/bin/mount-remote-home.sh创建 Systemd 服务单元 我们需要一个服务在系统启动早期、在本地/home被挂载之前执行上面的脚本。 创建服务文件/etc/systemd/system/remote-home.servicesudo nano /etc/systemd/system/remote-home.service内容如下[Unit] DescriptionMount remote home directory via NBD Beforelocal-fs.target Requiresnetwork-online.target Afternetwork-online.target nbd-client.service Wantsnetwork-online.target [Service] Typeoneshot ExecStart/usr/local/bin/mount-remote-home.sh RemainAfterExityes StandardOutputjournal [Install] WantedBymulti-user.targetBeforelocal-fs.target是关键它确保这个挂载动作在系统挂载本地文件系统包括原本的/home之前发生。禁用原 home 的自动挂载并迁移数据 首先我们需要阻止系统启动时挂载原本 eMMC 上的/home分区。找出你当前/home分区对应的设备标识符df -h /home假设输出显示/dev/mmcblk0p1挂载在/home。备份当前的/etc/fstab文件sudo cp /etc/fstab /etc/fstab.backup编辑/etc/fstab找到关于/home的那一行在行首添加#注释掉它。例如# UUIDxxxx-xxxx /home ext4 defaults 0 2现在重启 Orin Nano 进入单用户模式或恢复模式。这是最安全的方式因为此时没有用户登录使用/home。你可以通过串口控制台或修改内核启动参数进入。在单用户模式下系统应该还没有挂载/home。此时手动执行一次我们的脚本挂载远程 home/usr/local/bin/mount-remote-home.sh挂载成功后现在/home指向的是 reComputer 上的空分区。接下来将之前备份的旧 home 数据解压回来。假设你的备份文件是/mnt/backup/home_backup.tar.gzcd / sudo tar -xzvf /mnt/backup/home_backup.tar.gz或者使用rsync从备份目录同步sudo rsync -avz /mnt/backup/home/ /home/非常重要的一步修复文件所有权。因为是在sudo下操作文件可能变成了 root 所有。cd /home sudo chown -R your_username:your_username /home/your_username # 对每个用户目录执行类似操作4.2 配置系统服务与权限修复启用远程 home 服务并测试 数据恢复后启用我们创建的系统服务sudo systemctl daemon-reload sudo systemctl enable remote-home.service现在可以尝试重启 Orin Nano 到正常的多用户模式。观察启动日志看remote-home.service是否成功运行sudo journalctl -u remote-home.service -b如果看到 “Remote /home mounted successfully.” 的信息并且你能正常登录桌面或终端ls /home能看到你的用户目录那么恭喜核心迁移已经成功处理用户和应用程序的潜在问题用户 Shell 配置检查/etc/passwd文件确保你的用户 home 目录指向仍然是/home/your_username。由于我们是整体挂载这里通常不需要修改。图形界面登录对于使用 GDM、LightDM 等显示管理器的桌面环境迁移通常透明。但如果遇到登录循环问题可能需要检查~/.Xauthority和~/.ICEauthority文件的权限确保它们属于当前用户且权限为 600。chmod 600 ~/.Xauthority ~/.ICEauthoritySSH 密钥~/.ssh/目录及其下的authorized_keys文件权限必须严格。~/.ssh目录权限应为 700authorized_keys文件权限应为 600。Docker 或容器运行时如果你使用 Docker并且将数据目录/var/lib/docker放在/home下需要确保 Docker 服务在remote-home.service之后启动。可以修改 Docker 的 systemd 单元文件添加Afterremote-home.service。数据库服务如 MySQL、PostgreSQL 如果数据目录在/home下同样需要调整服务启动顺序确保先挂载 home。5. 性能调优与稳定性加固5.1 网络与 NBD 参数优化默认的 NBD 配置可能不是最优的。我们可以通过调整参数来提升性能。在 Orin Nano (客户端) 优化 修改/usr/local/bin/mount-remote-home.sh脚本中的nbd-client命令增加一些参数/usr/sbin/nbd-client -N home-export -b 4096 -p 192.168.1.100 10809 /dev/nbd0-N home-export指定导出名称与服务器配置对应。-b 4096设置块大小4096字节通常能提升大文件读写效率。考虑使用-t选项指定超时时间但默认值通常够用。在 reComputer (服务器端) 优化 编辑/etc/nbd-server/config可以为导出块设备设置更大的max_connections和调整工作模式但通常单客户端连接默认即可。更关键的是网络本身使用 USB 网络共享如果 reComputer 通过 USB 连接到 Orin Nano可以配置 USB Ethernet (RNDIS/CDC Ethernet)这能提供比 WiFi 更稳定、低延迟的连接。使用有线千兆以太网这是最推荐的方式确保交换机和网线都支持千兆。在 reComputer 上可以尝试使用hdparm测试 SSD 的实际读写速度确保存储不是瓶颈。5.2 增加故障恢复与监控机制网络存储最怕的是网络中断。我们需要增加一些韧性。心跳检测与自动重连 可以增强mount-remote-home.sh脚本加入简单的连通性检测。或者更优雅的方式是使用systemd的自动重启机制。修改remote-home.service的[Service]部分[Service] Typesimple Restarton-failure RestartSec10 ExecStart/usr/local/bin/mount-remote-home.sh RemainAfterExityes这样如果挂载失败服务会在10秒后尝试重启。但注意对于已经成功挂载后网络断开的情况systemd可能无法感知。这就需要更复杂的 inotify 或定时的mount命令检查。创建本地回退机制 在 eMMC 上保留一个最小的/home骨架目录包含必要的配置文件。如果检测到网络 home 无法挂载可以自动降级挂载本地回退目录。这需要更复杂的脚本逻辑但对于要求高可用的场景是必要的。一个简单的思路是在mount-remote-home.sh中如果 NBD 连接或挂载失败则尝试挂载一个本地的备用目录到/home。日志与监控 确保remote-home.service的日志被正确记录到journalctl。可以定期检查sudo journalctl -u remote-home.service --since -1h也可以将关键事件如挂载失败通过logger命令发送到 syslog进而配置邮件或即时消息告警。6. 常见问题排查与解决方案实录在实际操作中我遇到了不少问题这里把典型问题和解决方法列出来方便大家快速排查。问题现象可能原因排查步骤与解决方案启动时卡住无法进入系统1.remote-home.service执行超时或失败。2. 网络未就绪服务无限等待。1. 进入恢复模式检查/var/log/syslog或journalctl -u remote-home.service查看错误信息。2. 在服务文件中增加TimeoutStartSec30s并确保Afternetwork-online.target。使用systemd-networkd-wait-online.service可能更可靠。登录后提示“无法创建目录”或“权限被拒绝”新挂载的/home分区下用户目录所有权错误。在单用户模式下使用chown和chmod递归修正用户目录的所有权和权限。确保~/.bashrc,~/.profile等文件可读。图形界面登录后瞬间闪退回登录界面用户 home 目录下的 X11 授权文件权限问题。在文本终端登录CtrlAltF3检查~/.Xauthority和~/.ICEauthority文件是否存在及其权限。删除它们下次登录会重建或修正权限为600。应用程序如 Docker, MySQL启动失败相关服务在remote-home.service之前启动找不到数据目录。使用systemctl edit docker.service为依赖服务添加Afterremote-home.service和Requiresremote-home.service。然后重启该服务。文件操作速度慢延迟高1. 网络带宽不足或波动。2. NBD 块大小设置不合理。3. reComputer 磁盘性能瓶颈。1. 使用iperf3测试 Orin Nano 和 reComputer 之间的网络带宽和延迟。2. 尝试调整nbd-client的-b参数如 1024, 4096, 8192。3. 在 reComputer 上用hdparm -Tt /dev/sda1测试磁盘缓存和缓冲读写速度。nbd-client连接被拒绝1. reComputer 防火墙阻止了 10809 端口。2. NBD 服务器未运行或配置错误。1. 在 reComputer 上运行sudo ufw allow 10809或相应iptables命令。2. 在 reComputer 上检查sudo systemctl status nbd-server和 sudo netstat -tlnp挂载后df -h显示容量远小于预期可能使用了分区表内的单个分区如/dev/sda1而非整个磁盘/dev/sda。在 reComputer 上使用lsblk确认导出的是整个磁盘还是单个分区。如果导出的是分区则容量以该分区为准。如果需要更大空间可以导出整个磁盘并在 Orin Nano 上重新分区。一个我踩过的大坑最初我尝试在fstab里直接用nbd://协议挂载但发现系统启动时nbd内核模块的加载和网络服务的初始化顺序很难协调经常导致挂载失败。最终放弃fstab方案转而使用systemd服务单元通过Beforelocal-fs.target和依赖network-online.target来精确控制执行顺序可靠性大大提升。这告诉我对于这种依赖网络资源的挂载systemd的显式依赖管理比fstab的隐式顺序更可控。7. 进阶应用与扩展思路成功将/home迁移到 reComputer 后这块网络存储的潜力远不止于此。在 reComputer 上部署家庭自动化服务既然 reComputer 24小时运行完全可以把它变成一个家庭服务器。安装 Docker然后部署像 Home Assistant 这样的智能家居中心。这样你的 Orin Nano 可以专注于机器人、AI 推理等重负载任务而家庭自动化这种常驻服务则放在 reComputer 上互不干扰。通过 Docker 部署也避免了污染你的“home”存储环境。作为分布式存储或计算节点如果你有多台 Jetson 设备可以将 reComputer 上的存储通过 NFS 或 Samba 共享给其他设备作为公共数据集仓库或模型仓库。甚至可以利用 reComputer 的 CPU 进行一些预处理工作构成一个简单的异构计算集群。实现定时备份与快照由于数据集中在了 reComputer备份策略可以变得更简单高效。可以在 reComputer 上设置定时任务使用rsync或borgbackup将整个/home分区实际上是它自己的/dev/sda1备份到另一块外接硬盘或者利用 LVM 创建快照。探索其他网络块设备方案NBD 是内核原生支持简单稳定。如果你需要更高级的功能如加密、压缩、多路径可以研究一下iSCSI。iSCSI 在企业级存储中应用广泛客户端配置稍复杂但功能性和生态系统更成熟。对于追求极致性能的场景甚至可以尝试NVMe over Fabrics (NVMe-oF)但这需要硬件和驱动支持。整个迁移过程从最初的存储空间焦虑到中间的方案选型和排错再到最后的稳定运行和扩展思考是一次非常充实的系统级实践。它不仅仅是一个“数据搬家”的操作更是对 Linux 系统启动流程、存储管理、网络服务和故障恢复的一次深度理解。现在我的 Orin Nano 轻装上阵而所有的项目数据、开发环境都在 reComputer 上安然无恙两者通过网络紧密协作这种感觉非常踏实。如果你也受限于嵌入式设备的存储不妨试试这个方案它带来的灵活性和可扩展性绝对值得你花时间去折腾。