嵌入式根文件系统制作

好长时间没有写有关嵌入式的文章了,最近想移植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

出现配置选项:嵌入式根文件系统制作_第1张图片

进入busybox setting选项

1.在其中的build options 下选择:

主要是让busybox使用共享库

且确定交叉编译工具:arm-linux-

2.在install option下选择:

主要使它加载的时候不加载大元操作系统的usr目录下

busybox installton prefix 是确定你安装的根文件路径

Busybox Library Tuning 下

嵌入式根文件系统制作_第2张图片

至于裁剪 我就先不介绍了;主要就是

主要就是这边的有关命令不要的可以裁剪掉

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

你可能感兴趣的:(linux,object,File,嵌入式,qt,library)