`
lovecontry
  • 浏览: 1036900 次
文章分类
社区版块
存档分类
最新评论

嵌入式根文件系统制作

 
阅读更多

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics