根文件系统订制

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来建立它。

linux内核设计与实现知乎_linux内核定制_内核定制透视

在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

linux内核设计与实现知乎_linux内核定制_内核定制透视

之后更改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)

linux内核设计与实现知乎_内核定制透视_linux内核定制

/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

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复