嵌入式 Linux 网络启动方案

完整流程解析

第一步:设置启动命令(bootcmd)

bash 复制代码
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000

命令拆解

这个命令做了三件事:

步骤 命令 作用 目标地址
1 tftp 80800000 zImage 从 TFTP 服务器下载内核镜像 内存 0x80800000
2 tftp 83000000 imx6ull-alientek-emmc.dtb 从 TFTP 服务器下载设备树 内存 0x83000000
3 bootz 80800000 - 83000000 启动内核 使用上面的地址

存储位置

bash 复制代码
saveenv  # 保存到 MMC(eMMC/SD卡)的 U-Boot 环境变量分区

以后每次开机,U-Boot 会自动执行 bootcmd 里的命令,不需要每次都手动输入。

第二步:设置启动参数(bootargs)

bash 复制代码
setenv bootargs 'console=ttymxc0,115200 rw nfsroot=192.168.1.66:/home/zzk/linux/nfs/rootfs ip=192.168.1.50:192.168.1.66:192.168.1.1:255.255.255.0::eth0:off
参数 含义
console ttymxc0,115200 串口控制台,波特率 115200
rw - 根文件系统读写挂载
nfsroot 192.168.1.66:/home/zzk/linux/nfs/rootfs NFS 服务器路径
ip 192.168.1.50:192.168.1.66:192.168.1.1:255.255.255.0::eth0:off 网络配置

IP 配置详解

bash 复制代码
开发板IP : 服务器IP : 网关 : 子网掩码 : 主机名 : 网卡 : DHCP关闭
192.168.1.50 : 192.168.1.66 : 192.168.1.1 : 255.255.255.0 : (空) : eth0 : off

存储位置

bash 复制代码
saveenv  # 同样保存到 MMC

内核启动时会读取这些参数,根据参数配置网络和挂载根文件系统。

完整的启动流程(从上电到 Linux)

bash 复制代码
┌─────────────────────────────────────────────────────────────────────┐
│  1. 开发板上电                                                     
│     ↓                                                             
│  2. 执行固化在芯片内的 BootROM                                     
│     ↓                                                             
│  3. BootROM 加载 MMC 中的 U-Boot                                   
│     ↓                                                             
│  4. U-Boot 启动,读取环境变量                                      
│     ↓                                                             
│  5. 执行 bootcmd(刚刚设置的命令)                                
│     ├─── tftp 80800000 zImage           ← 从电脑下载内核         
│     ├─── tftp 83000000 imx6ull-alientek-emmc.dtb  ← 下载设备树   
│     └─── bootz 80800000 - 83000000      ← 启动内核               
│     ↓                                                             
│  6. Linux 内核开始启动                                             
│     ↓                                                            
│  7. 内核读取 bootargs(启动参数)                                 
│     ↓                                                             
│  8. 根据 bootargs 配置网络:                                       
│     - 开发板 IP: 192.168.1.50                                     
│     - 网关: 192.168.1.1                                           
│     - 子网掩码: 255.255.255.0                                     
│     ↓                                                             
│  9. 通过 NFS 连接服务器 192.168.1.66                              
│     ↓                                                             
│  10. 挂载服务器目录: /home/zzk/linux/nfs/rootfs                   
│     作为根文件系统 "/"                                             
│     ↓                                                             
│  11. 执行 /sbin/init                                               
│     ↓                                                             
│  12. 🎉 进入 Linux 系统!                                         
└─────────────────────────────────────────────────────────────────────┘
bash 复制代码
┌─────────────────────────────────────────────────────────────────┐
│                     你的电脑 (192.168.1.66)                     
│  ┌──────────────────────────────────────────────────────────┐  
│  │  TFTP 服务器 (tftpd-hpa)                                
│  │  ├── /tftpboot/zImage           ← 内核文件               
│  │  └── /tftpboot/imx6ull-alientek-emmc.dtb ← 设备树      
│  │                                                         
│  │  NFS 服务器 (nfs-kernel-server)                        
│  │  └── /home/zzk/linux/nfs/rootfs ← 完整的根文件系统     
│  │      ├── /bin, /sbin, /etc, /lib...                   
│  │      ├── /dev, /proc, /sys...                          
│  │      └── 所有系统文件和程序                           
│  └──────────────────────────────────────────────────────────┘  
└──────────────────────────┬──────────────────────────────────────┘
                           │
                           │ 以太网 (交换机/直连)
                           │
┌──────────────────────────┴──────────────────────────────────────┐
│                     开发板 (192.168.1.50)                       
│  ┌──────────────────────────────────────────────────────────┐  
│  │  U-Boot (在内存中运行)                                   
│  │  ├── 执行 bootcmd                                      
│  │  ├── TFTP 下载内核 → 0x80800000                       
│  │  └── TFTP 下载设备树 → 0x83000000                     
│  │                                                         
│  │  Linux 内核 (在 0x80800000 运行)                       
│  │  ├── 解析 bootargs                                    
│  │  ├── 配置 IP: 192.168.1.50                            
│  │  ├── NFS 挂载根文件系统                               
│  │  └── 启动完成!                                       
│  └──────────────────────────────────────────────────────────┘  
└─────────────────────────────────────────────────────────────────┘
bash 复制代码
DDR3 内存 (IMX6ULL 512MB DDR)
起始地址: 0x80000000
结束地址: 0x9FFFFFFF

┌─────────────────────────────────────────────────────────────┐
│ 0x80000000  ┌─────────────────────────────────────────┐   
│             │  U-Boot 自身占用 (前 8MB)              
│ 0x80800000  ├─────────────────────────────────────────┤   
│             │  zImage (内核镜像) ← TFTP 下载到这里   
│             │  大小约 5-10MB                          
│             ├─────────────────────────────────────────┤   
│             │  空闲区域                               
│ 0x83000000  ├─────────────────────────────────────────┤   
│             │  imx6ull-alientek-emmc.dtb (设备树)   
│             │  大小约 50-100KB                      
│             ├─────────────────────────────────────────┤  
│             │  空闲区域 (用于内核运行)                
│             │                                          
│ 0x9FFFFFFF  └─────────────────────────────────────────┘   
└─────────────────────────────────────────────────────────────┘

与本地启动的对比

项目 当前配置(NFS 网络启动) 本地启动(生产环境)
内核 TFTP 下载(电脑端) eMMC/SD 卡读取
设备树 TFTP 下载(电脑端) eMMC/SD 卡读取
根文件系统 NFS 挂载(电脑端) eMMC/SD 卡读取
网络依赖 ✅ 必须 ❌ 不需要
修改代码 直接改电脑文件,重启生效 需要重新烧录
开发效率 ⭐⭐⭐⭐⭐ 极高 ⭐⭐ 较低
适用场景 开发调试 产品量产

要成功启动,还需要配置电脑端

电脑端必须运行的服务:

c 复制代码
# 1. TFTP 服务(提供内核和设备树)
sudo systemctl start tftpd-hpa

# 2. NFS 服务(提供根文件系统)
sudo systemctl start nfs-kernel-server

# 3. 文件必须存在
ls /tftpboot/zImage
ls /tftpboot/imx6ull-alientek-emmc.dtb
ls /home/zzk/linux/nfs/rootfs/bin  # rootfs 必须完整

网络连接:

bash 开发板 (192.168.1.50) ←→ 电脑 (192.168.1.66)

  • 网线连接
  • 都在同一网段
  • 能互相 ping 通
bash 复制代码
# U-Boot 启动介质设置详解

## 一、核心答案

U-Boot 中**没有单独一个命令**专门设置启动介质,而是通过 **`bootcmd` 环境变量**来决定从哪里启动。

```bash
# 查看当前启动命令
printenv bootcmd

# 不同启动介质的 bootcmd 示例
# 从网络启动(TFTP)
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 dtb; bootz 80800000 - 83000000'

# 从 eMMC/SD 卡启动
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 dtb; bootz 80800000 - 83000000'

# 从 NAND Flash 启动
setenv bootcmd 'nand read 80800000 200000 500000; nand read 83000000 700000 100000; bootz 80800000 - 83000000'