免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 896 | 回复: 0
打印 上一主题 下一主题

Linux内核裁减及根文件系统定制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-15 15:20 |只看该作者 |倒序浏览

根文件系统定制
1、 创建一个全新的根文件系统
你可以用mkinitrd来创建,这里介绍另外一种方式,用dd命令:
# mkdir -p /mnt/initrd 创建一个设备点,用于临时挂载根文件系统。
# cd /tmp 在tmp下创建根文件系统
  # dd if=/dev/zero of=/tmp/initrd bs=512 count=40960 创建一个名为initrd的根文件
系统,系统每个块的大小为
512字节,共40960块。
   # mke2fs -F -m 0 initrd 格式化根文件系统,其中-F表示强制执行;
-m 0表示不为系统预留空间。
   # mount -o loop /tmp/initrd /mnt/initrd 挂载根文件系统,记住这里要使用
-o loop选项,否则挂载会失败。
# cd /mnt/initrd
2、 创建基本的目录结构
# mkdir dev proc etc etc/rc.d sbin bin lib mnt tmp var usr
# chmod 755 dev etc etc/rc.d sbin bin lib mnt tmp var usr
# chmod 555 proc
3、 添加设备
你可以使用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


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/18327/showart_112977.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP