应用部署指南
1. 初始化闪存与设置环境变量
在使用NAND闪存的设备上,向目标设备写入数据前,需要对闪存进行初始化,检查坏块并将相关数据存储在坏块表中。可以使用以下命令:
# dynenv set 40000
# saveenv
这些命令会提示操作者按回车键,可使用 expect 工具实现自动按键。接着,使用以下命令进一步初始化:
UBOOT # nand scrub
UBOOT # nand createbbt
设置用于IP连接通信的环境变量,服务器IP地址用于通过TFTP下载文件:
UBOOT # setenv serverip 10.0.0.2
UBOOT # setenv ipaddr 10.0.0.1
2. 下载内核并写入闪存
使用以下命令将内核下载到内存地址 0x32000000 ,然后写入闪存:
UBOOT # tftp 32000000 zImage
UBOOT # nand write.e 32000000 kernel 23400
若开发板有单独的根文件系统,也可按相同方式下载并写入闪存。最后,更改启动参数,使开发板重启时加载并运行烧录到闪存的内核,从而运行应用程序:
UBOOT # setenv bootcmd 'nboot.e kernel; bootm'
UBOOT # setenv bootdelay 0
UBOOT # saveenv
UBOOT # reset
可以将这些命令放入 CONFIG_BOOTCOMMAND 变量,使开发板首次上电启动时自动对闪存进行编程。但部分命令需按回车键确认,可使用 expect 工具实现自动化。
3. expect 工具介绍
当开发板的引导加载程序不支持脚本编写,或在初始化开发板时需要进行更复杂的操作时, expect 是不错的选择。 expect 是TCL语言的扩展,可让系统等待特定字符串出现,然后做出响应。
3.1 安装 expect
在基于 dpkg 的系统上,使用以下命令安装:
$ apt-get install expect
若使用RPM,可使用以下命令:
$ yum install expect
安装过程中,包管理器会自动安装所需的依赖项,可能会同时安装TCL。
3.2 在Windows上使用 expect
可从 http://downloads.activestate.com/ActiveTcl/Windows 下载 expect 的原生Windows版本,无需安装其他软件即可使用。
3.3 使用 expect
expect 可与使用串口通信的引导加载程序配合使用。以下是一个使用RedBoot引导加载程序的示例:
set port /dev/ttyS0
set baud 115200
set timeout 60
set spawned [spawn -open [open $port w+]]
stty $baud < $port
#!/usr/bin/expect -f
expect {
"RedBoot> " {
send "load -r -b 0xd1000000 zImage.redboot\n”
timeout exp_continue
}
}
expect {
"RedBoot> " {
send "fis write -b 0xd1000000 -l 0x1000 -e 0xd1000000 kernel\n"
expect { ”continue (y/n)? “ send “y” }
timeout exp_continue
}
}
expect 脚本的一般格式是一系列 expect 命令,每个命令等待特定文本出现后发送响应数据。等待的文本可以是常量或正则表达式,匹配成功后执行相应代码块中的命令。 timeout exp_continue 可使 expect 在超时无匹配时继续执行下一个命令。
4. 引导加载程序的安全风险与解决方案
包含闪存编程和文件系统维护功能的引导加载程序可能存在安全风险,尤其是在启动过程中使用串口的引导加载程序,可能会被黑客攻击。为避免这些风险,可使用两个引导加载程序:
- 全功能引导加载程序 :用于通过网络或USB设备下载内核和根文件系统并烧录到闪存,但不用于生产环境,会消耗资源并存在安全风险。
- 低功能引导加载程序 :作为生产代码,旨在快速启动设备,占用较少时间和内存,可移除用户界面软件。
以下是使用全功能引导加载程序加载并编程低功能引导加载程序的示例:
# setenv serverip 10.0.0.1
# tftp 3000000 uboot.bin
# go 30000000
在生产过程中,可按以下步骤操作:
1. 通过JTAG端口将全功能引导加载程序加载到内存。
2. 使用全功能引导加载程序获取低功能引导加载程序、根文件系统和内核。
3. 重置生产启动参数。
4. 更改参数和配置,使开发板准备好启动部署系统。
部分设备使用编程熔丝增加安全性,编程完成后熔断熔丝,使设备无法再进行写入操作。
5. 部署根文件系统的考虑因素
在部署根文件系统时,需要考虑以下因素:
| 考虑因素 | 说明 |
| — | — |
| 默认账户和文件所有权 | 若文件系统支持存储文件权限信息,需确保相关账户存在,并将文件分配给相应用户。部分文件系统允许设置默认用户ID和组ID,或更改所有文件的所有权为root。 |
| 首次启动要求 | 某些应用程序需要在开发板首次启动时运行特定程序,之后不再需要。具有首次启动要求的设备需具备检测是否已启动过一次的能力。 |
| 必须创建的挂载点 | 开发板的根文件系统至少包含 proc 、 sys 和 tmp 文件系统。对于只读文件系统,需在创建根文件系统镜像前创建这些目录。 |
| 将应用程序放入根文件系统 | 应用程序构建完成后,需复制到根文件系统中,并确保所有必要的库文件也被复制。若应用程序需要设置环境变量,可将相关信息放入启动脚本中。 |
6. 应用文件和库的标准
Linux系统有文件系统层次结构(FSH)标准,规定了文件和目录的命名和位置。遵循该标准,应用程序和其他非系统应用应放在 /opt 目录下的公司特定目录中,可变数据存储在 /var/opt/<provider> ,配置数据存储在 /etc/opt/<provider> 。对于允许用户或合作伙伴安装任意软件包的嵌入式设备,遵循FSH标准可减少部署问题。
7. 小型根文件系统的处理
对于小型系统,可适当打破FSH标准以节省空间。例如,将所有可执行文件、库文件和配置文件存储在一个文件系统中。以下是一个假设应用程序 datasampler 的目录结构示例:
/home/app
datasampler
libsampler.so
pointercal
ts.conf
datasampler.conf
启动该程序的脚本如下:
#!/bin/sh
# configure the pointer calibration
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_TSEVENTTYPE=INPUT
export TSLIB_CONFFILE=/home/app/ts.conf
export TSLIB_CALIBFILE=/home/app/pointercal
# point the library loader to this directory for the shared library
export LD_LIBRARY_PATH=/home/app
# start X
Xfbdev
# start your application
./datasampler
这种方式可将程序部署与核心Linux操作系统分离,节省根文件系统空间,且可将该分区挂载为读写文件系统,方便应用程序存储配置数据。
mermaid流程图
graph LR
A[初始化闪存] --> B[设置环境变量]
B --> C[下载内核并写入闪存]
C --> D[更改启动参数]
D --> E[选择引导加载程序]
E --> F{全功能引导加载程序}
F --> G[生产过程操作]
G --> H[部署根文件系统]
H --> I{遵循FSH标准}
I --> J[正常部署]
I --> K[小型系统特殊处理]
以上内容详细介绍了应用程序部署的各个环节,包括闪存初始化、环境变量设置、内核下载与写入、引导加载程序的选择与使用、根文件系统的部署等,并针对不同情况提供了具体的操作方法和示例。希望对开发者在应用部署过程中有所帮助。
应用部署指南(续)
8. 替代 expect 的工具
如果你不想使用 TCL 语言,或者需要进行更复杂的编程工作,有几种替代 expect 的工具可供选择:
- Python 工具 :
- pexpect :可访问 http://www.noah.org/wiki/Pexpect 了解详情,它是一个用于实现类似 expect 自动化功能的 Python 工具。
- expectpy :可在 http://sf.net/projects/expectpy 找到相关信息,同样能提供类似 expect 的自动化能力。
- Perl 工具 :可使用 CPAN 上的 expect 模块,它提供了与基于 TCL 的 expect 工具相同的基本功能。
9. 部署流程总结
为了更清晰地展示应用部署的整个流程,下面将其关键步骤总结如下:
1. 闪存初始化与环境设置
- 使用 dynenv set 40000 和 saveenv 初始化闪存,检查坏块并存储相关数据。
- 执行 nand scrub 和 nand createbbt 进一步初始化。
- 设置服务器 IP 和本地 IP 地址,如 setenv serverip 10.0.0.2 和 setenv ipaddr 10.0.0.1 。
2. 内核下载与写入
- 使用 tftp 32000000 zImage 下载内核到指定内存地址。
- 用 nand write.e 32000000 kernel 23400 将内核写入闪存。
3. 启动参数配置
- 设置启动命令 setenv bootcmd 'nboot.e kernel; bootm' 。
- 设置启动延迟为 0,即 setenv bootdelay 0 。
- 保存环境变量 saveenv 并重启设备 reset 。
4. 引导加载程序选择与使用
- 根据安全需求选择全功能或低功能引导加载程序。
- 若使用全功能引导加载程序,按步骤进行生产操作。
5. 根文件系统部署
- 考虑默认账户、首次启动要求、挂载点和应用程序放置等因素。
- 遵循 FSH 标准或根据小型系统特点进行特殊处理。
6. 自动化工具选择
- 可使用 expect 或其替代工具实现部署过程的自动化。
10. 不同文件系统的特点对比
在部署根文件系统时,不同的文件系统有各自的特点,以下是一些常见文件系统的对比:
| 文件系统 | 支持文件所有权 | 读写特性 | 适用场景 |
| — | — | — | — |
| JFFS2 | 支持设置默认用户 ID 和组 ID | 可读写 | 适合需要频繁写入的嵌入式设备 |
| YAFFS2 | 支持设置默认用户 ID 和组 ID | 可读写 | 常用于 NAND 闪存设备 |
| ext2/3 | 支持设置默认用户 ID 和组 ID | 可读写 | 通用的 Linux 文件系统,应用广泛 |
| 只读文件系统 | 通常仅 root 可拥有文件 | 只读 | 对安全性要求高,数据不易更改的场景 |
11. 小型系统特殊处理的优势分析
小型系统采用特殊处理方式,如将所有相关文件存储在一个目录下,具有以下优势:
- 部署分离 :将应用程序部署与核心 Linux 操作系统分离,便于开发和维护。例如,开发过程中对应用程序的修改不会影响到操作系统的其他部分。
- 节省空间 :避免创建额外的目录,减少根文件系统的空间占用。在资源有限的小型设备上,这一点尤为重要。
- 读写便利 :可将该分区挂载为读写文件系统,且不会带来较大的启动时间开销。应用程序可以方便地存储配置数据,如 tslib 指针校准程序的结果可以直接存储在该目录下。
12. 安全措施总结
为确保应用部署的安全性,可采取以下措施:
- 双引导加载程序 :使用全功能引导加载程序进行开发和生产编程,然后替换为低功能引导加载程序用于实际运行,减少安全风险。
- 编程熔丝 :部分设备在编程完成后熔断熔丝,防止设备被再次写入,增加物理层面的安全性。
- 遵循标准 :在部署根文件系统时,遵循 FSH 标准,特别是对于允许安装任意软件包的设备,可减少部署问题和潜在的安全漏洞。
mermaid 流程图(详细部署流程)
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B(闪存初始化):::process
B --> C(设置环境变量):::process
C --> D(下载内核):::process
D --> E(写入内核到闪存):::process
E --> F(更改启动参数):::process
F --> G{选择引导加载程序}:::decision
G --> H[全功能引导加载程序]:::process
G --> I[低功能引导加载程序]:::process
H --> J(生产过程操作):::process
J --> K(部署根文件系统):::process
I --> K
K --> L{是否遵循 FSH 标准}:::decision
L --> M[遵循标准正常部署]:::process
L --> N[小型系统特殊处理]:::process
M --> O([结束]):::startend
N --> O
综上所述,应用部署是一个复杂的过程,涉及多个环节和技术点。从闪存初始化到根文件系统部署,每一步都需要仔细考虑和操作。通过合理选择引导加载程序、文件系统,以及使用合适的自动化工具,可以提高部署效率和安全性。同时,针对不同类型的系统,如小型系统,可以采用特殊的处理方式,以满足其资源有限的特点。希望这些内容能为开发者在应用部署过程中提供全面的指导和帮助。
超级会员免费看

被折叠的 条评论
为什么被折叠?



