根文件系统订制
1、创建一个全新的根文件系统
你可以用mkinitrd来创建,这儿介绍另外一种方法,用dd命令:
#mkdir-p/mnt/initrd创建一个设备点,用于临时挂载根文件系统。
#cd/tmp在tmp下创建根文件系统
#ddif=/dev/zeroof=/tmp/initrdbs=512count=40960创建一个名为initrd的根文件
系统linux内核定制,系统每位块的大小为
512字节,共40960块。
#mke2fs-F-m0initrd低格根文件系统,其中-F表示强制执行;
-m0表示不为系统预留空间。
#mount-oloop/tmp/initrd/mnt/initrd挂载根文件系统,记住这儿要使用
-oloop选项,否则挂载会失败。
#cd/mnt/initrd
2、创建基本的目录结构
#mkdirdevprocetcetc/rc.dsbinbinlibmnttmpvarusr
#chmod755devetcetc/rc.dsbinbinlibmnttmpvarusr
#chmod555proc
3、添加设备
你可以使用mknod创建,也可以从现有的系统中拷贝过来,拷贝的时侯一定要注意,最好使用-dfR,这样有两个益处:1、拷贝路径下的所有文件linux内核定制,假如有文件夹linux deepin,则嵌套拷贝整个文件夹下的内容;2、保持文件(设备)的属性不变。
这儿采用mknod创建的方法,以下设备是必须的console、kmem、mem、null、ram0、tty等。
构建通常终端机设备
#mknodttyc50
#mkdirconsolec51
#chmod666ttyconsole
构建VGADisplay虚拟终端机设备
#mknodtty1c40
#chmod666tty0
构建RAMdisk设备
#mknodram0b10
#chmod600ram0
构建null设备
#mknodnullc13
#chmod666null
4、创建配置文件
到这儿我们就有了一个初步的大型根文件系统,并且还须要配置一些有关的shellscript来建立它。
在etc下创建最基本的配置文件fstab、inittab、rc.d/rc.sysinit,其中每位配置文件中起码应当包含以下
对应的内容:
fstab应包括:
/proc/procprocdefaults00
inittab应包括:
::sysinit:/etc/rc.d/rc.sysinit
::sysinit:/bin/sh(注意,这儿假如用getty或minigetty取代sh,这么shell都会等待用户登入,
而不会直接步入shell。)
rc.d/rc.sysinit应包括:
/bin/mountCa
5、添加bin、sbin、usr/bin、usr/sbin下的可执行文件
系统起码应当包含工具sh,ls,cp,mv,init。我们可以将/bin/sbin/usr/bin/usr/sbin
下的对应工具拷贝过来,拷贝的时侯采用cpCdfR。系统中的可执行文件通常都比较大linux模拟,
在显存或c盘空间紧张的情况下不适宜,我们可以用BusyBox来解决这个问题。BusyBox包含了
七十多种Linux上标准的工具程序,仅须要几百kc盘空间,在嵌入式系统上常用到它。下载了
BusyBox的源代码包后可以根据如下的步骤操作:
DOSTATIC=true
之后更改BusyBox中的init.c,设定系统要执行的第一个程序为:/etc/rc.d/rc.sysinit
#defineINIT_SRCIPT”/etc/rc.d/rc.sysinit”
开始编译BusyBox
#make
#makeinstall
到这一步我们就得到了可执行命令busybox
将busybox复制到/mnt/initrd/bin目录下
#cpbusybox/mnt/initrd/bin
之后创建常用命令的link,具体的工作原理请参阅busybox的官方说明。
我们可以使用./busybox--help来查看busybox中都有什么工具。常用的工具及busybox
的用法如下:
#ln-sbusyboxls
#ln-sbusyboxcp
#ln-sbusyboxmount
#ln-sbusyboxumount
#ln-sbusyboxmore
#ln-sbusyboxps
#ln-sbusyboxsh
如今我们就有了所需的常用命令。
6、添加库到lib下
该目录中包含有你的启动盘启动过程中所须要的共享函数库,倘若缺乏必须的函数库,
系统会停止启动或出现一大堆错误信息,所以一定要注意。
几乎所有的程序都须要libc库,列一下目录/lib中的libc:
ls-l/lib/libc*
-rwxr-xr-x1rootroot4016683Apr1618:48libc-2.1.1.so*
lrwxrwxrwx1rootroot13Apr1012:25libc.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下
cpCdfR/lib/modules/x.y.z/mnt/initrd/lib/modules
8、打包
#cd/tmp
#umount/mnt/initrd
#gzip-9initrd
最终形成的文件initrd.gz就是压缩过的根文件系统
9、修改早已存在的根文件系统
#gunzipinitrd.zip
#mount-oloop/tmp/initrd/mnt/initrd
#用户更改根文件系统
#umount/mnt/initrd
#gzip-9initrd