目录
本次教程使用的是S5FS6818开发板;
在虚拟机中配置好tftp和nfs后,才可进行本教程操作;
tftp的文件夹中,需要包含至少三个文件:根文件系统镜像ramdisk.img;ubootpak.bin;内核镜像uImage;
tftp命令:
1. sudo service tftpd-hpa start 启动TFTP服务
2. sudo service tftpd-hpa restart 重启TFTP服务
nfs的文件夹中至少包含“根文件系统rootfs”文件夹;
nfs命令:
1. sudo service nfs-kernel-server start 启动nfs服务
2. sudo service nfs-kernel-server restart 重启nfs服务
部署uboot
1. 将uboot的脚本烧写到uboot上;
a. 将sd卡启动盘的制作工具“sdtool”拷贝到虚拟机中新建的“toolchain”目录下;
b. 解压后进入sdtool目录下,并使用读卡器将sd卡连接到电脑,在windows下格式化sd卡;
c. sdtool中的文件一般是
i. xxxx-sdmmc.sh:烧写uboot到sd卡的脚本
ii. ubootpak,bin:uboot的可执行文件
d. 烧写ubootpak,bin到sd卡中
e. 在虚拟机中执行“sudo ./xxxx-sdmmc.sh /dev/sdb ubootpak.bin”
f. 打印如下信息,表示部署成功
“688+1 records in
689+0 records out
352768 bytes (353 kB) copied, 0.00914641 s, 38.6 MB/s
^_^ The image is fused successfully”
g. 测试sd卡是否制作成功
将sd卡插入开发板,设置开发板的拨码开关为sd卡启动
h. 开发板重新上电,进入FS6818#界面显示sd卡启动成功
2. 将uboot放到flash(EMMC)中;
a. 前提是sd卡中已经烧录了一个uboot;
b. 通过sd卡方式启动进入uboot,进入FS6818#界面;
c. 拷贝ubootpak.bin到tftpboot目录下;
d. 将ubootpak.bin使用tftp命令烧写到内存中;(需要连接网线,在开发板上运行)
tftp 0x41000000 ubootpak.bin
0x41000000只是内存的一个地址,换成0x42000000也一样
e. 执行命令将ubootpak.bin下载到开发板的flash中;
update_mmc 2 2ndboot 0x41000000 0x200 0x78000
update_mmc <dev no> <type> <mem> <addr> <length>
<dev no>:flash设备编号 EMMC:2
<type>:类型 2ndboot --- type : 2ndboot | boot | raw | part
<mem>:uboot在内存中的起始地址,以字节为单位
<addr>:flash的起始地址:以块为单位
<length>:往flash中下载多少块空间
打印以下内容表示成功
"head boot dev = 2
update mmc.2 type 2ndboot = 0x200(0x1) ~ 0x78000(0x3c0): Done"
开发阶段系统部署
1. 将内核镜像uImage放到虚拟机的tftpboot目录下;
2. 使用tftpboot命令将uImage下载到开发板的指定地址(如0x43000000)
tftp 0x43000000 uImage
3. 设置uboot的自动参数bootargs; 因为启动linux内核时,uboot会将bootargs后的参数传递给内核,内核根据这些参数来设置ip等信息; 通过‘pri’命令可以在“超级终端”查看bootargs的参数;
bootargs=root=/dev/nfs nfsroot=192.168.2.97:/home/ben/nfs/rootfs rw
console=ttySAC0,115200 init=/linuxrc ip=192.168.2.100
使用“setenv bootargs=root=……”可以修改bootargs的参数;
参数:
a. root=/dev/nfs:根文件系统类型
b. nfsroot=192.168.2.97:/home/ben/nfs/rootfs:根文件系统的ip和路径
c. rw:根文件系统的可读可写的权限;
d. console=ttySAC0,115200:使用串口0实现内核和PC的数据交互;
e. init=/linuxrc:启动内核后,运行一号进程;
f. ip=192.168.2.100:开发板的ip地址
4. 修改完bootargs的参数后,使用 ‘saveenv’ 保存修改;
5. 使用bootm命令启动内核;
bootm 0x43000000
6. 设置uboot为自启动,即需要设置bootcmd--环境变量,也就是将第3,第5步用一句话执行;
bootcmd=tftp 0x43000000 uImage;bootm 0x43000000
7. 然后给开发板重新上电,倒计时时不要进行任何操作,等待加载完之后,出现与终端类似的界面后,则部署成功;
产品发布阶段系统部署
了解一些命令
1. 通过uboot命令‘mmc’来查看当前硬盘的详细信息;
mmc info
2. 通过命令 ‘mmc read’ 可以向硬盘中写内容,通过命令 ‘mmc write’ 可以读取硬盘的内容到内存中;
mmc read addr blk# cnt
1.addr:对应着内存的地址
2.blk#:要读取的硬盘的起始地址
3.cnt:要读取的数据大小
含义:在mmc的blk*512地址处,读取cnt大小的数据到内存的addr地址中
mmc write addr blk# cnt
1.addr:对应着内存的地址
2.blk#:要写入的硬盘的起始地址
3.cnt:要写入的数据大小
含义:把在内存中起始地址为addr处的内容写到硬盘中,以blk#*512为起始块,
写入cnt块大小的数据,
mmc erase blk# cnt
1.blk#:mmc设备的起始块号
2.cnt:要擦除的mmc设备块的个数
含义:将mmc的起始块号为blk#,共cnt块大小的数据,进行擦除。
擦除的时间,受cnt块的个数有影响,
部署流程
1. 使用tftpboot命令将uImage下载到内存指定地址;
tftp 0x41000000 uImage
通过下载完自动输出的信息中的“Byte transferred = ”可以得知下载内容的大小,除以512后转化为十六进制可得需要写入多少块;
2. 将内存中下载的内核镜像搬移到mmc中;
mmc write 0x41000000 0x800 0x4000
3. 使用tftpboot命令将ramdisk.img下载到内存指定地址;
tftp 0x41000000 ramdisk.img
4. 将内存中的根文件系统镜像搬移到硬盘中;
mmc write 0x41000000 0x20800 0x20800
5. 设置bootcmd参数,从硬盘中启动系统;
setenv bootcmd mmc read 0x41000000 0x800 0x4000\;
mmc read 0x42000000 0x20800 0x20800\;bootm 0x41000000 0x42000000
6. 设置自启动参数;
setenv bootargs root=/dev/ram rw initrd=0x42000040,0x1000000
rootfstype=ext4 init=/linuxrc console=ttySAC0,115200
root=/dev/ram:从ram(内存)中挂载根文件系统
initrd=0x42000040 0x1000000 :
根文件系统的入口地址,省略前边64字节头
根文件系统的大小0x1000000
rootfstype=ext4:根文件系统的类型
7. 使用 ‘saveenv’保存修改;
8. 重新上电,此时开发板可以不连接网线,倒计时时不要进行任何操作,等待加载完之后,出现与终端类似的界面后,则部署成功;
开发板挂载时一直循环挂载的解决方法
解决方法:
- 重启nfs;
- 还原nfs中的rootfs,也就是重新解压rootfs;