原创 为AM335x移植Linux内核主线代码(44)Filesystem

2015-3-10 09:37 1670 21 21 分类: MCU/ 嵌入式 文集: Linux Kernel的DTS

http://www.cnblogs.com/hicjiajia/archive/2012/07/10/2582642.html
http://www.tldp.org/HOWTO/Bootdisk-HOWTO/x21.html
http://www.linux-pages.com/2011/03/cannot-execute-etc-init-d-rcs/
http://blog.sina.com.cn/s/blog_6fe0d70d01010mod.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Step 1: 编译busybox:
从官方网站下载busybox-1.23.1.tar.bz2,并解压:
[maria@localhost maria_forlinx]$ mkdir busybox-1.23.1-v1
[maria@localhost maria_forlinx]$ tar xvf busybox-1.23.1.tar.bz2 -C busybox-1.23.1-v1/
[maria@localhost maria_forlinx]$ cd busybox-1.23.1-v1/
[maria@localhost busybox-1.23.1-v1]$ cd busybox-1.23.1/
[maria@localhost busybox-1.23.1]$ make CROSS_COMPILE=/opt/gcc-linaro-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- menuconfig
[maria@localhost busybox-1.23.1]$ make CROSS_COMPILE=/opt/gcc-linaro-arm-linux-gnueabihf/bin/arm-linux-gnueabihf- all install

通过menuconfig可以修改编译选项,使用静态链接的编译方式(由于make报错,因此去掉inetd工具);
这里使用动态链接的话,在INIT阶段无法执行任何程序,目前还不知道原因;
编译完成之后在此目录下会生成_install目录。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Step 2:创建系统文件目录,复制库文件、设备文件,以及init.sysvint:
[maria@localhost _install]$ mkdir dev etc media mnt lib tmp proc var sys root home
[maria@localhost _install]$ cp /opt/gcc-linaro-arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib/arm-linux-gnueabi/* lib/ -rvf
[maria@localhost _install]$ cp ../../rootfs/lib/libext2fs.so.2* lib/
[maria@localhost _install]$ cp ../../rootfs/lib/libcom_err.so.2* lib/
[maria@localhost _install]$ cp ../../rootfs/lib/libblkid.so.1* lib/
[maria@localhost _install]$ cp ../../rootfs/lib/libcrypto.so.1.0.0* lib/
[maria@localhost _install]$ cp ../../rootfs/lib/libe2p.so.2* lib/
[maria@localhost _install]$ cp ../../rootfs/lib/libncursesw.so.5* lib/
[maria@localhost _install]$ cp ../../rootfs/lib/libss.so.2* lib/
[maria@localhost _install]$ cp ../../rootfs/lib/libtinfo.so.5* lib/
[maria@localhost _install]$ cp ../../rootfs/lib/libusb-* lib/
[maria@localhost _install]$ cp ../../rootfs/lib/libuuid.so.1* lib/
[maria@localhost _install]$ cp ../../rootfs/dev/ . -r
[maria@localhost _install]$ cp ../../rootfs/sbin/init.sysvinit sbin/

这里拷贝lib是因为,之前编译busybox采用了动态方法(使用ldd可查看库依赖);
暂时借用Forlinx的dev文件;

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Step 3:将_install里面的内容,放置到SD卡的rootfs分区:
修改SD的boot分区的uEnv.txt文件,如下:
bootargs=console=ttyO0,115200n8 root=/dev/mmcblk0p2 init=/sbin/init.sysvinit mem=256M rootwait
bootcmd=mmc rescan; fatload mmc 0 0x82000000 uImage; fatload mmc 0 0x83000000 maria-am335x.dtb; bootm 0x82000000 - 0x83000000
uenvcmd=boot

注意这里的root和init的值。
root是根文件系统所在的存储区,init是Kernel调用的第一个用户空间的程序;所有的进程都将由init程序展开。由于busybox自带的init程序不支持runlevel,因此使用sysvinit,在Kernel Command Line里指定即可。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Step 4: 编辑/etc目录:
[root@localhost etc]# ls -al
total 68
drwxr-xr-x. 12 root root 4096 Mar  9 14:17 .
drwxr-xr-x. 15 root root 4096 Mar  9 13:08 ..
drwxr-xr-x.  2 root root 4096 Mar  9 13:11 default
-rw-r--r--.  1 root root  288 Mar  9 13:20 fstab
-rw-r--r--.  1 root root  478 Mar  9 11:49 group
drwxr-xr-x.  2 root root 4096 Mar  9 14:04 init.d
-rw-r--r--.  1 root root  366 Mar  9 14:12 inittab
-rw-r--r--.  1 root root  762 Mar  9 11:49 passwd
drwxr-xr-x.  2 root root 4096 Mar  9 14:13 rc0.d
drwxr-xr-x.  2 root root 4096 Mar  9 14:13 rc1.d
drwxr-xr-x.  2 root root 4096 Mar  9 14:13 rc2.d
drwxr-xr-x.  2 root root 4096 Mar  9 14:13 rc3.d
drwxr-xr-x.  2 root root 4096 Mar  9 14:13 rc4.d
drwxr-xr-x.  2 root root 4096 Mar  9 14:13 rc5.d
drwxr-xr-x.  2 root root 4096 Mar  9 14:13 rc6.d
drwxr-xr-x.  2 root root 4096 Mar  9 14:13 rcS.d
-r--------.  1 root root  506 Mar  9 14:17 shadow

default目录下存放了rcS文件,里面是基础的配置;
rc*.d目录下暂时为空;
init.d目录下是很关键的rcS和rc文件,它是系统的启动脚本;
fstab文件是存储区列表;
group、passwd、shadow是用户登录相关的文件;
inittab被init.sysvinit读取,从而决定进入哪个runlevel。

然后就可以启动的打印信息就会多了这些:
[    3.326147] Freeing unused kernel memory: 340K (c084f000 - c08a4000)
INIT: version 2.88 booting
INIT: Entering runlevel: 3

MARIA login: root
login[52]: root login on 'ttyO0'
~ # ls /etc/
default  group    inittab  rc0.d    rc2.d    rc4.d    rc6.d    shadow
fstab    init.d   passwd   rc1.d    rc3.d    rc5.d    rcS.d
~ #
~ # cd /tmp/
/tmp # ./hello
Hello, world!

另外,刚做好的文件系统是Read-only file system,只能读取不能写,因此还需要进行下面的操作:
/proc # cat mounts
rootfs / rootfs rw 0 0
/dev/root / ext3 ro,relatime,errors=continue,barrier=1,data=ordered 0 0
devtmpfs /dev devtmpfs rw,relatime,size=112644k,nr_inodes=28161,mode=755 0 0
proc /proc proc rw,relatime 0 0
/proc # mount -o remount,rw /dev/root

现在就可以在任何目录下创建文件啦~~~
/home # mkdir 123
/home # ls
123

至此为止,文件系统就算是移植成功。
剩下的最后一节内容,是QT图形界面的移植。
 

文章评论0条评论)

登录后参与讨论
我要评论
0
21
关闭 站长推荐上一条 /2 下一条