Linux内核裁减及根文件系统定制(二)

二、根文件系统定制

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创建的方式,以下设备是必须的consolekmemmemnullram0tty等。

建立一般终端机设备

# mknod tty c 5 0

# mkdir console c 5 1

# chmod 666 tty console

建立 VGA Display 虚拟终端机设备

# mknod tty 1 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下创建最基本的配置文件fstabinittabrc.d/rc.sysinit,其中每个配置文件中至少应该包含以下对应的内容:

fstab应包括:

/proc  /proc  proc  defaults 0 0

inittab应包括:

::sysinit:/etc/rc.d/rc.sysinit

::sysinit:/bin/sh(注意,这里如果用gettyminigetty代替sh,那么shell就会等待用户登录,而不会直接进入shell)

rc.d/rc.sysinit应包括:

/bin/mount  –a

5 添加binsbinusr/binusr/sbin下的可执行文件

系统至少应该包含工具sh, ls, cp, mvinit。我们可以将/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

到这一步我们就得到了可执行命令busyboxbusybox 复制到/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*

rwxrxrx 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.66表示版本号,它指向的文件才是你真正需要的。

查看/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 (0x 4002c 000)

/lib/ldlinux.so.2 => /lib/ldlinux.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

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值