好长时间没有写有关嵌入式的文章了,最近想移植QT,看了一些介绍 知道QT移植需要动态库才可以,但以前做的根文件系统是静态链接的 这就给做QT带来了问题, 所以一狠信 在网上图书馆找了些动态制作根文件系统的文章来看 弄了好久终于成功了
一起分享一下吧
这里先介绍一个很强的大哥的博客:http://blog.chinaunix.net/u1/34474
好了 现在我们看看一般我们暗转的Linux的目录结构:
bin dev home lost+found misc net proc sbin server sys tmp var
boot etc lib media mnt opt root selinux srv tftpboot usr
bin:主要是用来存放相关命令
sbin:用来存放跟用户的命令
lib:用来存放相关库
tmp:存放临时文件
dev;设备文件
etc:相关配置文件启
usr:存放命令及需要的相关信息
proc、sys:是内核导出文件
以上是一些主要目录
好了 现在我们创建如下目录
先创建根目录rootfs
cd rootfs 在其中建立如下目录
bin sbin usr lib dev mnt opt root etc home proc tmp
在usr先建立sbin lib bin 在lib下建立 modules目录
cd ./dev
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
可以用我这边编出来的Shell文件 一次性把它全部弄好
#! /bin/sh
echo "creatint rootfs dir......"
mkdir rootfs
cd rootfs
echo "making dir : bin dev etc lib proc sbin sys usr"
mkdir bin dev etc lib proc sbin sys usr #必备的8个目录
mkdir usr/bin usr/lib usr/sbin lib/modules
cd ./dev/
mknod -m 600 console c 5 1
mknod -m 666 null c 1 3
echo "making dir : mnt tmp var"
cd ../
mkdir mnt tmp var
chmod 1777 tmp
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/log var/run var/tmp
chmod 1777 var/tmp
echo "making dir : home root boot"
mkdir home root boot
echo "done"
然后etc目录下 因为基本内容都不变的所以可以之间拷贝这边一个文件:
http://qun.qq.com/air/#43813442/share etc
进入你的内核目录编译模块
make modules ARCH=arm CROSS_COMPILE=arm-linux-
加载模块:
make modules_install ARCH=arm INSTALL_MOD_PATH=/XXX/rootfs
好了最基本的完成了
然后就是重头戏 配置busybox
首先从http://www.busybox.net/下载一个最新的busybox
到Linux下解压后在其目录中执行make distclean(进行一次彻底的清理)
然后执行make menuconfig
出现配置选项:
进入busybox setting选项
1.在其中的build options 下选择:
主要是让busybox使用共享库
且确定交叉编译工具:arm-linux-
2.在install option下选择:
主要使它加载的时候不加载大元操作系统的usr目录下
busybox installton prefix 是确定你安装的根文件路径
Busybox Library Tuning 下
至于裁剪 我就先不介绍了;主要就是
主要就是这边的有关命令不要的可以裁剪掉
make ARCH=arm CROSS_COMPILE=arm-linux-编译
编译过后在其中你会看到一个busybox可执行文件
然后运行make install
就把一些命令加到 你的根目录下 sbin bin usr/bin usr/sbin
现在你用nfs 挂载你的根文件系统发现启动不了 为什么呢?
这是因为没有加载所需要的库 把所需的库文件加到根目录的lib下 还有个问题库在哪里呢?
这个问题困惑了我半天 因为找错了库文件我弄了三天才把它弄好
原理库文件在你所装的交叉编译工具里边,, 这里边有几个lib库 又是哪个呢 这个问题大家自己尝试
对了复制的时候要注意动态的copy(当然可以直接拷贝lib目录了) 然后到你的根目录的lib下看到如下
ld-2.8.so libcidn.so.1 libm-2.8.so libnss_dns.so.2 libnss_nis.so.2 libSegFault.so
ld-linux.so.3 libcrypt-2.8.so libmemusage.so libnss_files-2.8.so libpcprofile.so libthread_db-1.0.so
libanl-2.8.so libcrypt.so.1 libm.so.6 libnss_files.so.2 libpthread-2.8.so libthread_db.so.1
libanl.so.1 libc.so.6 libnsl-2.8.so libnss_hesiod-2.8.so libpthread.so.0 libutil-2.8.so
libBrokenLocale-2.8.so libdl-2.8.so libnsl.so.1 libnss_hesiod.so.2 libresolv-2.8.so libutil.so.1
libBrokenLocale.so.1 libdl.so.2 libnss_compat-2.8.so libnss_nis-2.8.so libresolv.so.2 libz.a
libc-2.8.so libgcc_s.so libnss_compat.so.2 libnss_nisplus-2.8.so librt-2.8.so modules
libcidn-2.8.so libgcc_s.so.1 libnss_dns-2.8.so libnss_nisplus.so.2 librt.so.1
你用ls -l查看看到有些库很大 有20M多
[root@localhost lib]# file /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/libc-2.8.so
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/libc-2.8.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, not stripped
用file查看可知你的库 not stripped 就是没有经过一些脚本处理的意思
这里可以用 arm-linux-strip *.so 进行处理后 你再查看 发现它迅速瘦身到1M多点 符合嵌入式的基本要求了
[root@localhost lib]# file libc-2.8.so
libc-2.8.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, stripped
好了 这里制作完成了然后试着nfs挂载文件看看能不能行 不行的话看给处的错误在哪里,然后慢慢解决错误,注意多查阅资料 多baidu goole