然后就是飞凌的OK6410,他们使用的也是三星提供的U-Boot,不支持UBI。所以想出另外的方式来烧写。他们的烧写使用了自己的 SD卡烧写工具:SD_Writer,首先烧写了一个mmc.bin和一个zImage-sd的文件到SD卡中,前者mmc.bin其实就是用于SD卡启动的,后者zImage-sd是一个内核文件。我们首先来看看mmc.bin做了哪些事情,从SD卡启动,进入U-Boot的下载模式,使用printenv打印环境变量,可得:
SMDK6410 # printenv
bootargs=rootdelay=0 console=ttySAC0,115200
bootcmd=nand erase
庆燃 fatload mmc 0:1 0x50008000 u-boot.binnand write.uboot 0x50008000 0 0x100000
fatload mmc 0:1 0x50008000 zImagenand write.e 0x50008000 0x100000 0x500000
movi read kernel 0x50008000bootm 0x50008000
从上面得bootcmd可以知道做的事情分四步:
1、擦除整个NAND Flash;
2、从SD卡中将u-boot.bin文件下载到内存中,然后烧写到NAND Flash上;
3、从SD卡中将zImage下载到内存中,然后烧写到NAND Flash上;
4、从SD卡读取内核(不是上一步烧写的zImage,而是之前使用SD卡烧写工具烧写的册差禅zImage-sd)到内存,然后启动这个内核。而启动参数就是上面的bootargs所显示。
进入这个内核之后,就会进入下面这个命令行,
可能有人会觉得之前烧写了U-Boot和zImage-sd到SD卡上,并没有烧写文件系统,那这个内核怎么启动呢?这里我们看一下命令提示符前面“initramfs”这几个字符就明白了。
所有的2.6版本linux内核都有一个特殊的文件系统rootfs,是内核启动的初始始根文件系统,initramfs的文件会复制到rootfs。如 果把initramfs比作种子,那么rootfs就是它生长的土壤。大部分linux系统正常运行后都会安装另外的文件系统,然后忽略rootfs。
这下大家就知道了吧,但是由于飞凌没提供的源文件,所以不知道yjsx这个程序具体是啥,只能通过看烧写的过程知道了,这里我就不贴了。主要做的工作就是把拷贝到SD卡中的文件系统烧写到NAND Flash上,注意,这里他们烧写的是yaffs格式,而不是ubi,我猜想他们仅仅是为了方便用户使用SD卡烧写(毕竟友善之臂的烧写方式确实非常好),而不是使用ubi文件系统。
这里再来说一些Real6410和TQ6410,他们做法类似,Real6410是在NAND分区的时候分了两个文件系统区,一个是cramfs,一个是真正用到的文件系统区。先启动内核进入cramfs文件系统,将NAND格式化为UBI格式的,再进行烧写。同样,TQ6410也是先挂载NFS文件系统州尘,将NAND格式化UBI,然后进行烧写。
不过貌似TQ6410V2已经支持了UBI烧写,这个还没看。
1、系统裁剪要求:有GRUB引导系统,并且使用init脚本实现网卡驱动的装载,以及IP地址的配置,添加tserver服务,并在系统启动时启动此服务并显示。
2、 *** 作环境的目标
(1)在virtual box中 *** 作,系统为Centos6.5
(2)基于宿主机(Host)制作一个简单可启动的Linux
3、流程概括
(1)为虚拟机添加一块新硬盘,并为其分区,安装GRUB
(2)粗猛复制内核文件(vmllinuz)和initrd文件至新硬盘中。
(3)移植bash,网络相关命令ifconfig、ip、ping命令,文件列表命令ls,服务管理命令chkconfig,模块装载渣凳伏卸载命令insmod、rmmod,挂载卸载命令mount、umount,文件查看命令cat至目标主机(Target)的/文件系统中。
(4)为grub提供配置文件。
(5)为目标主机配置/sbin/init文件启动网络服务和其他服务。 (6)将目标主机的硬盘装载在其他虚拟机上。
4、添加新硬盘并分区、格式化和挂载
(1)在虚拟机上添加一块1G的硬盘,名为TinyLinux。
裁剪过程 :
(1)内核文件为宿主机中的/boot/vmlinuz-VERSION
(2)initrd文件为宿主机的/boot/initramfs-VERSION.img
根文件系统一般包含的目录: etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,root
(1)移植的时候需要把命令的可执行文件以及所依赖的库文件复制,命令才能被执行。 (2)可执行文件位于/bin目录下,库文件在/lib目录 或者/lib64目录下。
(3)用which COMMAND 命令可查看命令的执行文件在哪个位置 用 lddwhich COMMAND 命令可查看命令所依赖的库文件在哪个位置。
(4)用一个脚本实现将命令的如携可执行文件以及其所依赖的库文件复制到目标主机根文件系统中
执行脚本,复制命令:
字段解释:
default =# :指定默认启动的内核或者OS(Operating System)
timeout=# :等待用户选择要启动的内核或OS的时长,单位为秒。
splashimage=/path/to/splashimage_file :指定使用的背景图片
hiddenmenu:隐藏菜单
tittle
先umount 分区,在关闭虚拟机centos6
启动Tinylinux,若有grub引导并出现如下界面,并且命令正确,证明TinyLinux小系统能成功运行。
这个时候,我们TinyLinux系统只能执行简单的命令,也没有网络,文件系统也没有挂载。接下来,我们复制网卡,挂载文件系统。
先把TinyLinux系统关机,启动centos6
网卡模块所在路径: /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
创建/mnt/sysroot/lib/modules目录
复制网卡模块至/mnt/sysroot/lib/modules目录下
编辑/mnt/sysroot/sbin/init文件
编辑/mnt/boot/grub/grub.conf文件,将init指定为sbin目录下的init
卸载硬盘FS,并关机
如果目标主机启动时候显示绿色OK字样,证明网卡模块已经被装载。
我们继续检查一下,ip , 文件系统
手工挂载一下
ip设置,如下
此时,ctrl+c按键并不能中断ping命令,因为该小系统并没有配置ctrl+c热键。 建议使用以下命令限定ping次数和时间检测:
至此,centos6系统裁剪已经完成。
在initramfs后面输入 fsck.ext4 -y /哗唤dev/sda2 让它自己修复一下,其中“/dev/乱仔凯sda2”是提示的错误戚粗盘符,修复后,输入reboot,让其正常启动。
我的Ubuntu 15.10就是这么弄好的
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)