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条评论)
登录后参与讨论