嵌入式linux驱动sunshengquan.blog.chinaunix.net
UP-NETARM2410
全部博文(244)
文件系统(3)
eclipse(0)
Linux设备驱动程(12)
块设备(1)
博创UP-NET2410-S(3)
linux2.6.22.3(1)
linux-2.6.22移植(4)
linux-2.6(2)
linux-2.6.14移植(2)
2013年(1)
2012年(16)
2011年(132)
2010年(3)
2009年(12)
2008年(80)
laoyouji
yanding7
cynthia
浪花小雨
Bsolar
ssffzz1
大雄ctu
sunwj052
yh2002
张氏拉都
分类: LINUX
2008-09-09 23:51:59
Linux内核裁减及根文件系统定制(之二)--------根文件系统定制
你可以使用mknod创建,也可以从现有的系统中拷贝过来,拷贝的时候一定要注意,最好使用-dfR,这样有两个好处:1、拷贝路径下的所有文件,如果有文件夹,则嵌套拷贝整个文件夹下的内容;2、保持文件(设备)的属性不变。
这里采用mknod创建的方式,以下设备是必须的console、kmem、mem、null、ram0、tty等。 建立一般终端机设备 # mknod tty c 5 0 # mkdir console c 5 1 # chmod 666 tty console 建立 VGA Display 虚拟终端机设备 # mknod tty1 c 4 0 # chmod 666 tty0 建立 RAM disk 设备 # mknod ram0 b 1 0 # chmod 600 ram0 建立 null 设备 # mknod null c 1 3 # chmod 666 null 4、 创建配置文件 到这里我们就有了一个初步的小型根文件系统,但是还需要配置一些有关的 shell script来完善它。 在etc下创建最基本的配置文件fstab、inittab、rc.d/rc.sysinit,其中每个配置文件中至少应该包含以下 对应的内容: fstab应包括: /proc /proc proc defaults 0 0 inittab应包括: ::sysinit:/etc/rc.d/rc.sysinit ::sysinit:/bin/sh (注意,这里如果用getty或minigetty代替sh,那么shell就会等待用户登录, 而不会直接进入shell。) rc.d/rc.sysinit应包括: /bin/mount –a 5、 添加bin、sbin、usr/bin、usr/sbin下的可执行文件 系统至少应该包含工具sh, ls, cp, mv,init。我们可以将/bin /sbin /usr/bin /usr/sbin 下的对应工具拷贝过来,拷贝的时候采用cp –dfR。系统中的可执行文件一般都比较大, 在内存或磁盘空间紧张的情况下不适合,我们可以用BusyBox来解决这个问题。BusyBox 包含了 七十多种 Linux 上标准的工具程序,仅需要几百 k 磁盘空间,在嵌入式系统上常用到它。下载了 BusyBox的源代码包后可以按照如下的步骤操作: DOSTATIC=true 然后修改 BusyBox 中的 init.c,设定系统要执行的第一个程序为: /etc/rc.d/rc.sysinit #define INIT_SRCIPT "/etc/rc.d/rc.sysinit" 开始编译BusyBox #make #make install 到这一步我们就得到了可执行命令busybox 将busybox 复制到/mnt/initrd/bin目录下 # cp busybox /mnt/initrd/bin 然后创建常用命令的link,具体的工作原理请参阅busybox的官方说明。 我们可以使用 ./busybox --help 来查看busybox中都有哪些工具。常用的工具及busybox 的用法如下: # ln -s busybox ls # ln -s busybox cp # ln -s busybox mount # ln -s busybox umount # ln -s busybox more # ln -s busybox ps # ln -s busybox sh 现在我们就有了所需的常用命令。 6、 添加库到lib下 该目录中包含有你的启动盘启动过程中所需要的共享函数库,如果缺少必须的函数库, 系统会停止启动或出现一大堆错误信息,所以一定要注意。 几乎所有的程序都需要libc库,列一下目录/lib中的libc: ls -l /lib/libc* -rwxr-xr-x 1 root root 4016683 Apr 16 18:48 libc-2.1.1.so* lrwxrwxrwx 1 root root 13 Apr 10 12:25 libc.so.6 -> libc-2.1.1.so* libc.so.6的6表示版本号,它指向的文件才是你真正需要的。 查看/bin /sbin /usr/bin /sur/sbin下每一个程序使用的函数库,用命令ldd, 如: ldd /sbin/mke2fs libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000) libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000) libuuid.so.1 => /lib/libuuid.so.1 (0x40028000) libc.so.6 => /lib/libc.so.6 (0x4002c000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 输出右边的库都是必须的,有的可能是链接文件。 在/lib目录下你还必须有函数库装载器,这个装载器或是ld.so (对 a.out 库) 或是 ld-linux.so (对 ELF 库)。新版本的ldd一般会告诉你所需库的装载器。 7、 加载模块 如果你有一个模块化的内核,你还得考虑需要加载的模块,它们都位于/lib/modules 下 cp –dfR /lib/modules/x.y.z /mnt/initrd/lib/modules 8、 打包 # cd /tmp # umount /mnt/initrd # gzip -9 initrd 最终产生的文件initrd.gz就是压缩过的根文件系统 9、 修改已经存在的根文件系统 # gunzip initrd.zip # mount -o loop /tmp/initrd /mnt/initrd # 用户修改根文件系统 # umount /mnt/initrd # gzip -9 initrd
上一篇:Linux内核裁减及根文件系统定制(之一)--------Linux内核裁减
下一篇:今天使用crosstool制作了arm-linux交叉编译工具链
登录 注册