一、内核编译

1、准备工作

(1)整理出系统需要支持的硬件、文件系统类型以及网络协议等内容。

(2)建议用命令uname –r 查看一下系统的版本号,如果你的系统版本与将要编译的内核版本一致,建议将/lib/modules下的内容备份,否则将来的make modules_install 步骤产生的文件会覆盖这个路径下的内容。

(3)下载并解压linux内核,建议从http://www.kernel.org

/pub/linux/kernel/

下载内核,因为安装系统时所安装的源代码默认情况下支持很多设备,这样给内核裁减增加了难度。以下假设你已经下载了内核的为linux-x-y-

z.tar.gz。一般都将linux内核源代码放在/usr/src下,这里仍然遵守这个习惯,如果你的这个路径下已经存在这个版本的内核,建议将已有

的改个名称。

2、开始编译

(1)make mrproper

确保源代码目录下没有不正确的.o文件和文件依赖关系,执行该命令后,内核选项会回到默认的状态下。如果你是下载的内核源码,而且是第一次编译,就没有必要执行这一步操作

(2)make menuconfig

以文本菜单方式选择内核选项(与它功能相同的命令还有make config;make

xconfig;make

oldconfig),不同版本的内核,选项可能会有一些差异。这一步是内核编译的关键,根据需要支持的硬件、文件系统和协议等内容,选择不同的选项。配

置选项时,有三种选择方式,它们代表的含义如下:

Y-将该功能编译进内核

N-不添加功能

M-将该功能编译成模块,在需要时动态加载到内核

选择的原则是与内核关心紧密而且经常使用的部分功能代码直接编译到内核中;将与内核系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选。

我们使用空格键进行选取。根据选项的不同,按下空格键的结果也有所不同:选项后

有”―――>”符号的,进入下一级菜单;选项前有中括号的,则在空和"*"之间切换;选项前有尖括号的,在空、"*"和"M"之间切换;选项前有圆

括号的,需要在所提供的几个选项中选择一项,或者需要输入数值等符号。咦,什么?要我详细介绍具体该怎么选择这些选项?大汗!这可是个大问题,需要根据不

同的需求进行选择,比如需要支持USB键盘、鼠标或/和存储器,支持多CPU,支持网卡,串口,支持TCP协议,ext2文件系统,nfs文件系统等等。

后面我将就内核选项做详细的介绍。

(3)make dep

根据上一步所选择的选项,建立文件的依赖关系。

(4)make clean

清理一些不必要的文件,如果你在上次编译的基础上,删去了一些选项,建议你执行这一步操作,否则,就没有必要了。

(5)make bzImage

生成内核压缩文件。如果你确认你的内核在640K以下,你可以用make

zImage来代替 make

bzImage。这一步相当费时,你可以在命令后加上&,让其在后台执行,或者重定向到/dev/null中,这样你就什么也看不见屏幕上闪过不

停的字符啦。编译出的内核在 ./arch/i386/boot/ 下,文件名为bzImage

(6)copy "/usr/src/linux/arch/i386/boot/bzImage  /boot/vmlinuz-x.y.z

(7)make modules

编译可加载模块(即内核选项中选择为M的选项),编译时间跟M选项的数量有关。

(8)make modules_install

将编译好的modules拷贝到/lib/modules下,这就是为什么在“准备工作”的第三步提醒你备份的原因了。

(9)cp /usr/src/linux/System.map /boot/ System-x.y.z.map

3、修改启动配置文件

现在大多数使用的都是grub启动,需要修改/boot/grub/grub.conf,添加相应的启动信息,添加内容的最简单格式如下:

title 显示在启动菜单上的名称

root 根文件系统挂载分区

kernel 压缩过的内核文件名

initrd 根文件系统文件名

如:

title My new kernel

root (hd0,2)

kernel /boot/vmlinuz-x.y.z

initrd /boot/initrd-x.y.z.img

二、根文件系统定制

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

linux 文件系统覆盖目录,Linux内核裁减及根文件系统定制相关推荐

  1. linux mv覆盖目录,linux下利用grep和dd命令恢复被mv命令覆盖的文件内容

    查看原文,移步个人博客地址:http://shengfu.sinaapp.com/?p=683 事件起因 把之前基于linux c写的一个纯真ip查询的server代码优化.规整了下之后,想重命名一下 ...

  2. linux内核开文件系统,新手,Linux内核无法挂载根文件系统

    新手求助,Linux内核无法挂载根文件系统 一块开发板,厂商已经提供好了uboot,kernel,ramdisk文件系统跟安卓镜像 有:uboot.bin, zImage, ramdisk-uboot ...

  3. linux内核加载根文件系统,根文件系统 - Linux 内核引导选项简介

    [KNL] root=字符串 指定根文件系统的所在位置.通常这是一个必须明确设置的选项. "字符串"可以使用如下几种形式: XXxx 一个16进制数,其中"XX" ...

  4. s5pv210 linux内核移植,简单根文件系统制作 - S5PV210 Linux3.8.3内核移植_Linux编程_Linux公社-Linux系统门户网站...

    1.这里为什么选nfs文件系统呢? 在产品开发阶段,因为nfs根文件系统并不需要编译进内核,方便调试. 2.制作根文件系统需要用到BusyBox 解压进入busybox目录: root@linuxid ...

  5. linux 如何赋值目录,Linux文件系统之目录的建立

    一:前言 在用户空间中,建立目录所用的API为mkdir().它在内核中的系统调用入口是sys_mkdir().今天跟踪一下 函数来分析linux文件系统中目录的建立过程. 二:sys_mkdir() ...

  6. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  7. Linux内核移植和根文件系统制作(详细步骤精讲)

    第一章移植内核 1.1 Linux内核基础知识 1.1.1 Linux版本 1.1.2 什么是标准内核 1.1.3 Linux操作系统的分类 1.1.4 linux内核的选择 1.2 Linux内核启 ...

  8. 【linux kernel】linux内核如何挂载根文件系统

    文章目录 一.前世今生 二.kernel_init线程入口 三.重磅角色-prepare_namespace 一.前世今生 在kernel_init线程函数中会调用kernel_init_freeab ...

  9. linux dns chroot,将DNS走进chroot的根文件系统的目录

    chroot:将当前的目录作为程序运行的根目录,程序运行和访问的文件,执行的执行 都不能够超过当前的目录,所以对整个系统没有任何的影响. 场景说明:在进入到当前的根文件系统之后,无法解析域名,所以也就 ...

最新文章

  1. ABP理论学习之数据传输对象(DTO)
  2. 由于获得较好的处理机资源,因此将之前的数据整合到一起。
  3. mac os vmware 显卡驱动_【新机】华为Mate 40系列国行售价明天公布,饿了么可以买手机?| 干翻牙膏厂,AMD发布RX6000显卡...
  4. SAP Marketing Cloud功能简述(五) : 销售计划管理
  5. 【转】Microsoft Graph 概述
  6. vue.js能美化界面吗_vue将单页面改造成多页面应用的方法
  7. 用java实现学生管理系统
  8. m5310模组数据上传至onenet_基于Semtech SX1276RF1KAS SPI模组及ATMEGA328架构下之烟雾气体感测方案...
  9. Oracle P6培训系列:16为作业分配资源的预算数量
  10. Teambition产品分析报告
  11. 【CAN】CAN的比特率和波特率
  12. Unity实战篇:实现LOL英雄的移动方式。
  13. 暗6 雷电三接口突然失效解决办法
  14. Word中的字体大小(几号-几磅)
  15. tcl基本语法:中括号[ ]、大括号{ }、双引号“ ”
  16. ArduinoKeyboard库模拟键盘
  17. 多测师_Python(open 文件)
  18. 图解Java服务端Socket建立原理
  19. flac格式如何转换成mp3?
  20. myeclipse10激活注册码生成器代码

热门文章

  1. 浮层java_css保持浮层水平垂直居中的四种方法
  2. 最后两周!60万奖金AI攻防赛进入冲刺(附baseline代码及实操)
  3. 小场景带来大提升:“AI之眼”加持工厂品控流水线,质检质量提升80%
  4. WWW 2021有哪些值得读的图机器学习相关论文?
  5. 让预训练模型学习知识:使用多学习器增强知识建模能力
  6. 细粒度情感分析任务(ABSA)的最新进展
  7. 发布可伸缩超网SCARLET,小米AutoML团队NAS三部曲杀青
  8. POJ 3984 迷宫问题 BFS求最短路线+路径记录
  9. python如何绘制曲线图_python怎么画曲线图
  10. Servlet实现登录注册