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

时间:2021-05-20 19:20:49

二、根文件系统定制
    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 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下创建最基本的配置文件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 
磁盘空间,在嵌入式系统上常用到它。下载了
     B
usyBox
的源代码包后可以按照如下的步骤操作:
                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*
  -rwxrxrx 1 root root 4016683 Apr 16 18:48 libc2.1.1.so*
  lrwxrwxrwx 1 root root 13 Apr 10 12:25 libc.so.6 > libc2.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 (0x4002c000)
      /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