Linux内核安装、裁剪图文教程

合集下载

内核配置与裁剪

内核配置与裁剪

内核配置与裁剪1. Linux内核配置内核配置的方法很多,make config、make xconfig、make menuconfig、make oldconfig 等等,它们的功能都是一样的。

这里用的是make menuconfig。

过去基于2.x的内核为用户提供了四种基本的内核设置编辑器:✧. config 服务于内核设置的一个冗长的命令行界面;✧. oldconfig 一个文本模式的界面,主要包含一个已有设置文件,对用户所发现的内核资源中的设置变量进行排序;✧. menuconfig 一个基于光标控制库的终端导向编辑器,可提供文本模式的图形用户界面;✧. xconfig 一个图形内核设置编辑器,需要安装X-Window系统。

前三种编辑器在设置2.6内核时仍可使用,在运行“make xconfig”后,原有的界面被两个新的图形设置编辑器所代替。

这需要具体的图形库和X-Window系统的支持。

另外,用户还可以通过“make defconfig”命令,利用所有内核设置变量的缺省值自动建立一个内核设置文件。

下面具体介绍Linux内核配置选项:. 代码成熟度选项Code maturity level options --->[*] Prompt for development and/or incomplete code/drivers[*] Select only drivers expected to compile cleanly在内核中包含了一些不成熟的代码和功能,如果我们想使用这些功能,想打开相关的配置选项,就必需打开这一选项。

. 通用设置选项General setup --->() Local version - append to kernel release[*] Automatically append version information to the version string[*] Support for paging of anonymous memory (swap)[*] System V IPC[*] POSIX Message Queues[*] BSD Process Accounting[*] BSD Process Accounting version 3 file format[*] Sysctl support[ ] Auditing support[*] Support for hot-pluggable devices[*] Kernel Userspace Events[*] Kernel .config support[*] Enable access to .config through /proc/config.gz() Initramfs source file(s)[*] Configure standard kernel features (for small systems) ---> --- Configure standard kernel features (for small systems) [ ] Load all symbols for debugging/kksymoops[ ] Do an extra kallsyms pass[ ] Enable support for prinlk[ ] BUG()support[ ] Enable full-sinzed data structures for core[*] Enable futex support[*] Enable eventpoll support[*] Optimize for size[*] Use full shmem filesystem(0) Function alignment(0) Label alignment(0) Loop alignment(0) Jump alignmentLocal version - append to kernel release:这里填入的是64字符以内的字符串,在这里填上的字符串可以用uname -a命令看到。

Linux内核裁剪移植——内核的主要组成部分

Linux内核裁剪移植——内核的主要组成部分
关部分。 硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关部分为内存管理硬件提供了虚拟
接口。 虚拟文件系统隐藏了不同类型硬件的具体细节,为所有的硬件设备提供了一个标准的接口,
VFS提供了十多种不同类型的文件系统。
Linux内核裁剪移植——内核的主要组成部分 5
网络接口提供了对各种网络标准的存取和各种网络硬件的支持。 进程通信部分用于支持进程间各种不同的通信机制。 进程调度处于核心位置,内核的其他子系统都要依赖它,因为每个子系统都存在进程挂起或恢
Linux内核裁剪移植 ——内核的主要组成部分
Linux内核裁剪移植——内核的主要组成部分 2
内核,即操作系统。它为底层的可编程部件提供服务,为上层应用程序提供执行环境。 内核裁剪就是对这些功能进行裁剪,选取满足特定平台和需求的功能。不同的硬件平台对内核
要求也不同,因此从一个平台到另一个平台需要对内核进行重新配置和编译。 操作系统从一个平台过渡到另一个平台称为移植。 Linux是一款平台适应性且容易裁剪的操作系统,因此Linux在嵌入式系统得到了广泛的应用。
Linux内核裁剪移植——内核的主要组成部分 3
Linux内核主要的5个部分:进程调度、内存管理、虚拟文件系统、网络接口、进程通信。在系 统移植的时候,它们是内核的基本元素。
Linux内核裁剪移植——内核的主要组成部分 4
进程调度部分负责控制进程对CPU的访问。 内存管理允许多个进程安全地共享主内存区域。内存管理从逻核的主要组成部分 7
虚拟文件系统与网络接口之间的关系: ➢ 虚拟文件系统通过依赖网络接口支持网络文件系统(NFS) ➢ 也通过依赖内存管理支持RAMDISK设备。
内存管理与虚拟文件系统之间的关系: ➢ 内存管理利用虚拟文件系统支持交换 ➢ 交换进程定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。 ➢ 当一个进程存取的内存映射被换出时,内存管理将会向文件系统发出请求,同时,挂起当 前正在运行的进程。

RedHat LINUX安装全步骤(附图)

RedHat LINUX安装全步骤(附图)

LINUX软件安装步骤1.在Vmware 中创建一个Linux 的虚拟机版本是Red Hat Linux ,其中硬盘最少要有2GB 的空间(建议分4GB 其他硬盘,网卡的配置和Windows 虚拟机一样即可)。

2.把Vmware 的光驱制定到对应的镜像文件上,我们这里是linux iso 文件中的第一张盘。

3.启动虚拟机,由光盘进入。

在这个界面中输入linux text 后回车才能进入文本安装界面。

4.提示检测介质。

因为我们使用的是镜像文件,所以可以直接单击Skip 如果使用的是光盘最好还是检测一下比较好。

(在LINUX 文本模式中基本都是使用键盘进行操作,鼠标也支持但是不像在Windos 中那样好用。

用户可以通过Tab键和方向键来切换选项,空格和回车来确定)如果上面选择的是Skip就会直接跳到第8步。

5.开始检测。

如果是使用的光盘CD 需要先插入CD 后在Test 因为我们使用的是镜像文件所以就可以直接Test6.检测完毕。

选择OK7.提示是否检测其他的盘。

如果你为了保险起见可以继续检测,但是时间可能会长一些。

8.选择语言安装过程,在这里选择英语。

(如果选择的不是英语的话,在以后的一些提示显示中会出现乱码看不懂)9.选择键盘类型,在这里选择us 即可。

10.选择鼠标类型,在Linux 这类操作系统中,经常用到三键鼠标,因此,除了选择鼠标类型外,一般还选中下面的“Emulate 3 Buttons?”,这样同时点击鼠标左右键,代表点击中键。

11.选择安装类型。

在这里我们选择第4个Custom(定制)。

12.准备分区。

在这里选择Autopartition 。

13.这里会让用户选择如何处理硬盘上的原始分区。

因为我们是新建的所以选那个都无所谓,但是如果在已经安装好Windows 的系统上进行安装,一般选择第三项。

意思就是使用硬盘当中没有使用的空间来创建相应的分区。

在下面会让用户选择。

要安装到那个硬盘中,在这里只有一个硬盘sda ,所以直接选择即可。

Linu系统裁减指南redkliang完整版

Linu系统裁减指南redkliang完整版

L i n u系统裁减指南r e d k l i a n gHEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】《Linux 系统裁减指南 (LiPS)》目录1 引言编写目的说明Linux系统裁减的过程及解决的主要技术问题。

本文档的编写是为了说明Li PS的详细设计过程,也可以作为构造一个小型化Linux系统的指南。

本文档内容的组织如下所述:这一部分是引言,第2部分是对项目软、硬件环境和需求的总体描述,第3部分说明了裁减LINUX的相关基本概念。

后面几个部分是具体实现方法的详细说明,4~6分别详细描述了创建内核、创建根文件系统和引导系统的方法。

最后的内容可以看作附录,其中7说明了一般Linux系统安装光盘的创建方法,8列出了相关的配置文件和源代码。

背景华中科技大学计算机存储系统国家专业实验室,NAS项目(——)。

定义O boot loader: 引导器O kernel: 内核O root filesystem: 根文件系统O USB: 通用串行总线参考资料[1] DIY:自己动手做一个迷你 Linux 系统. IBM developerWorks 中国网站.httcn/linux/embed/diy/[2] Linux From Scratch.[3] Linux启动过程综述.i=15750[4] The Linux Bootdisk HOWTO (中译版).[5] Using the initial RAM disk (initrd). /usr/src/Documentation/. (译文:d-boot/cdboot_refer/)[6] Quickmouse于发表于白云黄鹤BBS (Linux讨论区的帖子“裁减Linux”。

[7] Filesystem Hierarchy Standard. .[8] LINUX ALLOCATED DEVICES. /usr/src/Documentation/. 或者最新的列表在[9] Karim Yaghmour. Building Embedded Linux Systems. O'Reilly, April 200 3.[10] Alessandro Rubini. Take Command: Init.cs/init/ , November 1998.[11] 深入 Linux PAM 体系结构. IBM developerWorks 中国网站.2 总体描述硬件环境开发主机:Intel 845芯片组主板,P4赛扬 CPU,256M内存,60G IDE硬盘,RTL8139网卡。

linux系统如何安装软件 (详细文字教程)

linux系统如何安装软件 (详细文字教程)

linux系统如何安装软件 (详细文字教程)在Linux中安装软件时,我们经常要考虑到这样几个个问题:(1).怎样安装软件;(2).软件安装在什么地方;(3).如何卸载删除不要的软件......下面,我们就一起来认识一下这些方面的问题。

一.认识Linux应用软件安装包通常Linux应用软件的安装包有三种:1) tar包,如software-1.2.3-1.tar.gz。

它是使用UNIX系统的打包工具tar打包的。

2) rpm包,如software-1.2.3-1.i386.rpm。

它是Redhat Linux提供的一种包封装格式。

(现在用的全称叫RPM Package Manager,以前叫Redhat Package Manager)3) dpkg包,如software-1.2.3-1.deb。

它是Debain Linux提供的一种包封装格式。

而且,大多数Linux应用软件包的命名也有一定的规律,它遵循:名称-版本-修正版-类型例如:1) software-1.2.3-1.tar.gz 意味着:软件名称:software版本号:1.2.3修正版本:1类型:tar.gz,说明是一个tar包。

2) sfotware-1.2.3-1.i386.rpm软件名称:software版本号:1.2.3修正版本:1可用平台:i386,适用于Intel 80x86平台。

类型:rpm,说明是一个rpm包。

注:由于rpm格式的通常是已编译的程序,所以需指明平台。

在后面会详细说明。

而software-1.2.3-1.deb就不用再说了吧!大家自己练习一下。

二、了解包里的内容:一个Linux应用程序的软件包中可以包含两种不同的内容:1) 一种就是可执行文件,也就是解开包后就可以直接运行的。

在Windows中所有的软件包都是这种类型。

安装完这个程序后,你就可以使用,但你看不到源程序。

而且下载时要注意这个软件是否是你所使用的平台,否则将无法正常安装。

linux内核的裁剪与移植

linux内核的裁剪与移植

1,获得源码,解压,进入解压后的目录;命令;2,修改makefile;为了能让此目录被执行所以在顶级目录的makefile中同时也进行修改;3,得到.config文件;命令;编译内核时对.config文件的依赖比较大,我们需要一个自己的.config文件,又因为我们的板子和smdk2410的很像,仅需将smdk2410的.config 文件复制到顶级目录即可不用修改;4;修改nandflash 分区;此系统启动时从nandflash 中启动而我们的板子不是的所以对其进行必要的修改;5,添加网卡驱动;arch/arm/mach-s3c2410/mach-smdk2410.c开发板上已经配置要的相应的网卡,并且内核中也有相应的实现代码我们只需做一下简单的修改;6添加yaffz文件系统支持将yaffz 源码包考到和linux-2.6.24 同一级目录下解压;在给内核打上补丁;命令是;7、配置和编译内核到现在,一个简单的内核就准备好了,我们还需要做一些配置,然后编译,内核才能正常使用。

在内核源代码的根目录下运行make menuconfig命令,进入配置界面:8,用u-boot启动内核;编译U-Boot时在源代码的tools目录下会生成一个mkimage可执行文件,用这个工具可以对前面编译内核时生成的zImage进行处理,以供U-Boot启动。

cd linux-2.6.24.4/arch/arm/bootcp /up-Star2410/kernel/linux-2.6.24.4/mkimage . 获取mkimage工具./mkimage -A arm -T kernel -C none -O linux -a 0x30008000 -e 0x30008040 -d zImage -n 'Linux-2.6.24' uImage9,最后把生成的uimage 放到主机tftp同目录下,启动开发板;用u-boot的tftp命令下载到sdram;。

VMwareWorkstation安装(Linux内核)银河麒麟图文教程

VMwareWorkstation安装(Linux内核)银河麒麟图文教程

VMwareWorkstation安装(Linux内核)银河麒麟图⽂教程本⽂为⼤家分享了VMware Workstation安装银河麒麟,供⼤家参考,具体内容如下
1.下载软件:VMware Workstation Kylin-x86_64.iso(Linux内核)银河麒麟系统镜像包。

2.安装完成VMware Workstation并运⾏。

3.创建新的虚拟机。

4.选中“典型”,下⼀步。

5.安装程序光盘映像⽂件(浏览——⽂件存放路径),下⼀步。

6.虚拟机中安装操作系统选择Linux,下⼀步。

7.输⼊虚拟机名称,下⼀步。

8.默认操作,下⼀步。

9.点击“完成”。

10. 点击“开启此虚拟机”。

11.启动界⾯如下图:
12.选择“安装银河麒麟操作系统”,回车。

13.安装过程如下图:
14.经过稍长时间等待,银河麒麟系统安装完成,系统界⾯如下图:图1:
图2:
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

第4章 Linux内核裁剪与移植 Linux系统移植(第2版) 教学课件

第4章  Linux内核裁剪与移植 Linux系统移植(第2版) 教学课件
第4章 Linux内核裁剪与移植
4.1 Linux内核结构 4.2 内核配置选项 4.3 内核裁剪及编译 4.4 内 核 升 级
4.1.2 内核源码目录介绍
Linux内核代码以源码树的形式存放,如 果在安装系统的时候已经安装了源码树, 其源码树就在/usr/src/linux下。
1.arch目录
禁用随机heap(heap堆是一个应用层的概念,即堆对CPU是不可见的,它 的实现方式有多种,可以由OS实现,也可以由运行库实现,也可以在一个 栈中来实现一个堆)
Choose SLAB allocator Profiling support Kprobes
选择内存分配管理器,建议选择 支持系统评测,建议不选 探测工具,开发人员可以选择,建议不选
5.init目录
init子目录包含核心的初始化代码(注意, 不是系统的引导代码)。它包含两个文件 main.c和version.c,这是研究核心如何工 作的一个非常好的起点。
6.ipc目录
ipc子目录包含核心进程间的通信代码。 Linux下进程间通信机制主要包括管道、 信号、消息队列、共享内存、信号量、套 接口。
Physical 选择XIP后,内核存放的物理地址
Kexec system call
Kexec系统调用
4.2.4 网络协议支持相关选项
菜单选项(Networking Support)的子菜 单中包含一些网络协议支持的选项。
选项名 Networking options Amateur Radio support
arch子目录包括了所有和体系结构相关的 核心代码。它的每一个子目录都代表一种 支持的体系结构,例如arm子目录是关于 ARM平台下各种芯片兼容的代码。

学习嵌入式之Linux内核裁剪的具体过程和方法-精品文档

学习嵌入式之Linux内核裁剪的具体过程和方法-精品文档


千锋3G嵌入式移动互联网技术研发培训中心


Loadable module support ---> 可引导模块支持 建议作为模块 加入内核 [] Enable loadable module support 这个选项可以让你的内核支 持模块,模块是什么呢?模块是一小段代码,编译后可在系统内核运行 时动态的加入内核,从而为内核增加一些特性或是对某种硬件进行支持。 一般一些不常用到的驱动或特性可以编译为模块以减少内核的体积。在 运行时可以使用modprobe命令来加载它到内核中去(在不需要时还可以 移除它)。一些特性是否编译为模块的原则是,不常使用的,特别是在系 统启动时不需要的驱动可以将其编译为模块,如果是一些在系统启动时 就要用到的驱动比如说文件系统,系统总线的支持就不要编为模块了, 否在无法启动系统。 []Automatic kernel module loading 一般情况下,如果我们的内 核在某些任务中要使用一些被编译为模块的驱动或特性时,我们要先使 用modprobe命令来加载它,内核才能使用。不过,如果你选择了这个 选项,在内核需要一些模块时它可以自动调用modprobe命令来加载需 要的模块,这是个很棒的特性,当然要选Y喽。

千锋3G嵌入式移动互联网技术研发培训中心



Power management options (ACPI, APM) --> 电源管理选项 [ ] Power Management Debug Support 电源管 理的调试信息支持,如果不是要调试内核有关电源管理 部份,请不要选择这项。 ACPI Support ---〉高级电源接口配置支持,如 果BIOS支持,建议选上这项 []Button 这个选项用于注册基于电源按钮的事件, 比如power, sleep等,当你按下按钮时事件将发生,一 个守护程序将读取/proc/acpi/event,并执行用户在 这些事件上定义的动作比如让系统关机。可以不选择, 根据自己的需求。

Linux操作系统安装ppt课件

Linux操作系统安装ppt课件

防火墙配置
「WWW ()」
协议被 Apache〔以及其它万维网服务器〕用来进行
网页服务。如果你打算向公众开放你的万维网服务器,请
启用该选项。
「邮件 (SMTP)」 如果你需要允许远程主机直接连接到你的机器来发送
邮件,启用该选项。如果你想从你的 ISP 服务器中收取 POP3 或 IMAP 邮件,或者你使用的是 fetchmail 之类的 工具,不要启用该选项。 「FTP」 FTP 协议是用于在网络机器间传输文件的协议。如果 你打算使你的 FTP 服务器可被公开利用,启用该选项。 你需要安装 vsftpd 软件包才能利用该选项。
「编辑」:用来修改目前在「分区」部分中选定 分区的属性。选择「编辑」打开一个对话框。部 分或全部字段可被编辑,这要依据分区信息是否 已被写入磁盘而定。
「删除」:用来删除目前在「当前磁盘分区」部 分中突出显示的分区。你会被要求确认对任何分 区的删除。
Disk Druid 的按钮
「重设」:用来把 Disk Druid 恢复到它最初的状态。如 果你「重设」分区,你所做的所有改变将会丢失。
Redhat 9.0磁盘分区方案
最简单的分区方案 / 分区〔建议大小:5G) SWAP分区〔建议大小:物理内存的2倍) 较安全的分区方案 SWAP分区:用于实现虚拟内存〔建议大小:物理内存的2倍) /分区:存放系统命令和用户数据等〔建议大小:1GB) /boot分区:存放与Linux启动相关的程序〔建议大小:
文件,或者用户对目录结构进行了错误的操作,文件系统 的其他部分仍然会是安全的
挂载点
Windows: 驱动器:\文件夹...\文件 LINUX 只有一个文件树,整个文件系统是以一个树
根“/”为起点的,所有的文件和外部设备都 以文件的形式挂结在这个文件树上,包括硬 盘,软盘,光驱,调制解调器等 使用硬件要挂载和卸载

Linux内核裁剪与编译

Linux内核裁剪与编译
建立编译环境
创建一个用于编译的内核目录,并配置相应的环境变量。
内核配置与选择
配置内核
01
使用make menuconfig或其他配置工具进行内核配置,选择所
需的特性和功能。
定制内核
02
根据实际需求,禁用不必要的模块和功能,以减小内核体积。
配置参数
03
在编译过程中,根据需要设置编译参数,如优化级别、编译器
选项等。
编译过程与注意事项
执行编译
在配置完成后,执行make命令开始 编译内核。
等待编译完成
编译过程可能需要较长时间,取决于 系统性能和内核大小。
注意事项
在编译过程中,注意观察日志信息, 以便及时发现和解决问题。
内核安装
编译完成后,按照系统要求进行内核 安装和引导配置。
04
内核编译优化
编译优化简介
-O3
在`-O2`的基础上,进一步开启更多的编译器优化选项。
-Os
以最小化代码大小为目标进行优化,适用于嵌入式系统等资源受限的环境。
-fPIC
生成位置无关代码,便于动态链接。
编译优化实践
根据目标硬件平台和性能 需求,选择合适的编译选 项。
关注内核代码质量,避免 过度优化导致代码可读性 和维护性下降。
优化内核
针对特定需求进行内核优化,如调整调度 策略、优化内存管理等,以提高系统的性 能和响应速度。
定制内核
根据需求分析结果,定制内核的功能和参 数,如禁用不必要的模块、开启特定功能 等。
案例三:使用第三方工具进行内核裁剪与编译
总结词
选择合适的第三方 工具
配置工具链
导入内核源码
自动裁剪与编译
使用第三方工具进行内 核裁剪与编译,可以借 助第三方工具的自动化 和智能化功能,提高内 核裁剪与编译的效率和 准确性。

Linux内核裁剪步骤详述(主要是里面有模块裁剪说明)

Linux内核裁剪步骤详述(主要是里面有模块裁剪说明)

Linux内核裁剪步骤详述内核功能:能够完成系统的基本功能,上网,收发邮件等,支持xwindows图形界面。

在menuconfig中配置:详细介绍内核配置选项及删改情况第一部分:全部删除Code maturity level options ---> 代码成熟等级选项[]Prompt for development and/or incomplete code/drivers 默认情况下是选择的,这将会在设置界面中显示还在开发或者还没有完成的代码与驱动.不选。

第二部分:除以下选项,其它全部删除General setup—〉System V IPC (IPC:Inter Process Communication)是组系统调用及函数库,它能让程序彼此间同步进行交换信息。

某些程序以及DOS模拟环境都需要它。

为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。

有些程序只有在选Y的情况下才能运行,所以不用考虑,这里一定要选。

第三部分:除以下选项,其它全部删除Loadable module support ---> 可引导模块支持建议作为模块加入内核[] Enable loadable module support 这个选项可以让你的内核支持模块,模块是什么呢?模块是一小段代码,编译后可在系统内核运行时动态的加入内核,从而为内核增加一些特性或是对某种硬件进行支持。

一般一些不常用到的驱动或特性可以编译为模块以减少内核的体积。

在运行时可以使用modprobe命令来加载它到内核中去(在不需要时还可以移除它)。

一些特性是否编译为模块的原则是,不常使用的,特别是在系统启动时不需要的驱动可以将其编译为模块,如果是一些在系统启动时就要用到的驱动比如说文件系统,系统总线的支持就不要编为模块了,否在无法启动系统。

[]Automatic kernel module loading 一般情况下,如果我们的内核在某些任务中要使用一些被编译为模块的驱动或特性时,我们要先使用modprobe命令来加载它,内核才能使用。

linux ko裁剪方法

linux ko裁剪方法

linux ko裁剪方法摘要:1.Linux KO 裁剪方法的概念和背景2.Linux KO 裁剪方法的具体步骤3.Linux KO 裁剪方法的优点和适用场景4.Linux KO 裁剪方法的注意事项和潜在问题正文:1.Linux KO 裁剪方法的概念和背景Linux KO(Kernel Organization)是指Linux 内核组织,负责维护和发展Linux 内核。

Linux KO 裁剪方法是指在内核中裁剪掉不需要的代码和模块,以减小内核体积,提高系统性能和稳定性。

这种方法广泛应用于嵌入式系统、实时操作系统和高性能服务器等领域。

2.Linux KO 裁剪方法的具体步骤(1)熟悉内核结构:了解Linux 内核的基本组成,包括进程管理、内存管理、文件系统、设备驱动等模块。

(2)选择合适的内核版本:根据实际需求选择合适的Linux 内核版本,如需要长时间支持的稳定版,或者最新功能和性能的开发版。

(3)配置内核:通过make menuconfig 或者make config 等工具,选择需要的内核选项和模块,去掉不需要的代码和模块。

(4)编译内核:根据配置文件编译内核,生成新的内核镜像文件。

(5)更新系统:将新的内核镜像文件烧写到目标设备,并更新系统配置。

3.Linux KO 裁剪方法的优点和适用场景优点:(1)减小内核体积,降低系统复杂度,提高系统性能和稳定性。

(2)节省存储空间和运行时内存,降低系统资源消耗。

(3)简化系统维护,减少潜在的安全隐患。

适用场景:(1)嵌入式系统:由于嵌入式系统资源有限,需要针对性地裁剪内核,提高系统性能。

(2)实时操作系统:对系统响应时间和实时性能有严格要求的场景,可以通过裁剪内核达到优化目的。

(3)高性能服务器:高性能服务器对系统性能和稳定性要求高,通过裁剪内核可以提高系统性能。

4.Linux KO 裁剪方法的注意事项和潜在问题注意事项:(1)熟悉内核结构,避免误操作导致系统崩溃。

linux内核编译与裁剪

linux内核编译与裁剪

Linux内核编译内幕详解内核,是一个操作系统的核心。

它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/l inux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。

全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。

而Linux的内核则是这些特点的最直接的代表。

想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工作的。

通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。

其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内核。

在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。

再次,我们可以对内核进行修改,以符合自己的需要。

这意味着什么?没错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要的功能。

在Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了。

内核版本号由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。

Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。

一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(d evelopment tree)。

一些新特性、实验性改进等都将首先在开发树中进行。

如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。

基于ARM的嵌入式linux内核的裁剪与移植

基于ARM的嵌入式linux内核的裁剪与移植

基于ARM的嵌入式linux内核的裁剪与移植前言嵌入式系统一直是计算机行业中的领域之一。

在许多应用程序中,嵌入式系统越来越流行。

嵌入式系统通常使用嵌入式芯片,如ARM芯片,并且它们通常运行Linux内核。

Linux内核是一个开放源代码的操作系统内核。

在嵌入式领域,Linux 内核可以被用于实现各种应用程序。

本文将重点介绍如何基于ARM平台的嵌入式Linux内核进行裁剪和移植。

ARM平台ARM处理器是一种RISC(Reduced Instruction Set Computer)处理器。

这种类型的处理器可用于嵌入式系统开发,因为它具有较低的功耗和高效的性能。

ARM处理器有许多版本,其中包括ARMv6和ARMv7。

ARMv6通常用于嵌入式系统,而ARMv7则用于智能手机和平板电脑等高端设备。

Linux内核的裁剪在嵌入式系统中,Linux内核需要进行裁剪,以适应嵌入式设备的需求。

与桌面计算机相比,嵌入式系统拥有更少的资源,包括RAM、闪存和存储空间。

因此,在将Linux内核移植到嵌入式系统之前,必须将内核进行裁剪。

在裁剪内核之前,您必须确定哪些内核模块是必需的。

一些模块可以从内核中移除,以减少内核的大小。

通常,将不必要的模块和其他功能从内核中移除可以使内核变得更小并具有更好的性能。

另外,裁剪内核时应确保其他组件与内核兼容。

例如,在新内核中可能需要更改驱动程序或实用程序以适应修改后的内核。

裁剪内核可能是一项比较困难的工作,需要深刻了解Linux内核的各个方面,以确保正确地裁剪内核。

移植Linux内核到ARM移植内核是将Linux内核适应新硬件的过程。

在开始移植内核之前,您必须了解嵌入式设备的硬件架构以及所需的内核组件。

移植Linux内核到ARM可以分为以下步骤:1.选择合适的ARM平台和处理器并确定所需的内核选项。

2.下载最新的内核源代码。

3.配置内核选项,并使其适应新硬件。

4.使用交叉编译器编译内核。

linux内核裁剪及编译步骤

linux内核裁剪及编译步骤

linux内核裁剪及编译步骤Linux内核裁剪及编译步骤Linux操作系统的内核是其最重要和核心的组成部分。

用户可以根据自己的需要对内核进行裁剪以减少内核代码的大小,以及支持特定的硬件和功能。

Linux内核的裁剪和编译步骤相对来说比较复杂,需要一定的技术和安装环境的支持。

下面将介绍Linux内核裁剪及编译的具体步骤,以供参考。

一、准备工作在开始进行Linux内核的裁剪及编译之前,需要进行一些准备工作。

首先,需要安装Linux操作系统的开发环境。

其次,需要下载Linux内核的源代码,可以从Linux 的官方网站或者其他开源社区下载。

二、配置内核选项安装好开发环境和下载好源代码之后,就可以开始进行内核的裁剪和编译了。

首先需要进行内核选项的配置。

可以使用make menuconfig命令进入配置界面。

在这个界面中,用户可以对内核进行不同程度的裁剪,包括去掉多余的硬件支持和功能选项。

在配置选项中,用户需要选择一些基本的配置选项,包括文件系统类型、设备驱动、协议栈、安全选项、虚拟化等。

用户可以根据自己的需要,进行选项的选择和配置。

三、编译内核在完成了内核的配置之后,下一步就是进行内核的编译。

可以使用make命令进行编译。

编译过程中需要耗费一定的时间和资源,因此建议在空闲时刻进行编译。

如果出现编译错误,需要根据错误提示进行排查和解决。

编译错误很可能是由配置选项不当造成的,因此要仔细检查配置选项。

四、安装内核编译完成后,就可以安装内核。

可以使用make install命令进行安装。

安装完成后,可以重启系统,以使新的内核生效。

在重启时,需要手动选择新的内核,可以选择自己编译的内核或者系统默认的内核。

五、总结对于不同的用户,对内核的需求和选择是不同的。

因此,在对内核进行裁剪时,需要根据自己的需求进行适当的选择,以提高系统性能和稳定性。

同时,在进行内核的编译时,也需要仔细检查配置选项和随时记录日志以便排除可能出现的问题。

linux内核裁剪基本步骤

linux内核裁剪基本步骤

linux内核裁剪基本步骤嘿,朋友们!今天咱就来聊聊 Linux 内核裁剪那些事儿。

你想想看啊,Linux 内核就像是一个超级大的宝库,里面啥都有,但咱有时候并不需要那么多东西呀,这时候就需要来一场“瘦身行动”啦!那怎么开始呢?首先,你得清楚自己到底要干啥。

就好比你要去旅行,你得知道自己想去哪儿,带啥东西,对吧?得明确自己的系统需要哪些功能,哪些是多余的。

这可不是随随便便就能决定的哦,得好好琢磨琢磨。

然后呢,就是了解内核的各种配置选项啦。

这就像你去超市买东西,得知道每个货架上都有啥呀。

这里面的门道可不少呢,什么驱动啊、模块啊,都得搞清楚。

可别小瞧了这些配置选项,它们就像是一个个小开关,决定着哪些功能会被启用,哪些会被关掉。

接下来,就是动手裁剪啦!这可真是个精细活儿,就跟雕刻大师在雕琢一件艺术品似的。

小心翼翼地去掉那些不需要的部分,留下精华。

这过程可得有耐心,不能着急,不然一不小心剪错了可就麻烦啦。

再之后,就是编译啦!把裁剪好的内核重新编译一下,让它变成适合你的那个独一无二的版本。

这就好比给你的系统穿上了一件量身定制的衣服,合身又舒适。

裁剪的过程中,你可能会遇到各种各样的问题。

哎呀,这就跟你走路会遇到小石子一样正常。

别慌,冷静下来慢慢解决。

也许会花费你一些时间和精力,但当你看到裁剪后的内核完美运行的时候,那种成就感,简直无与伦比!你说这是不是很有趣呢?就像给自己的电脑来了一次大改造。

而且通过裁剪内核,还能让系统运行得更高效、更稳定呢!总之呢,Linux 内核裁剪可不是一件简单的事儿,但也绝对不是什么难到登天的事儿。

只要你有耐心、有决心,再加上一点点技巧,肯定能把它搞定。

还等什么呢?赶紧去试试吧,让你的系统变得更加强大、更加适合你!。

Linux系统裁剪、自定义内核、busybox系统定制

Linux系统裁剪、自定义内核、busybox系统定制

Linux系统裁剪、⾃定义内核、busybox系统定制字体颜⾊:T_RED="\\033[1;31m" # bold+redT_GREEN="\\033[1;32m" # bold+greenT_YELLOW="\\033[1;33m" # bold+yellowT_BLUE="\\033[1;34m" # bold+blueT_CYAN="\\033[1;36m" # cyanT_BOLD="\\033[1;37m" # bold+whiteT_NORM="\\033[0;39m" # normal系统启动流程:POST-->BIOS(Boot Sequence)--> BootLoader(MBR)--> Kernel(initrd,initramfs)--> init (/etc/inittab)⾸先加电⾃检,加电⾃检是怎么完成的,计算机本⾝不会执⾏程序,由此先去载⼊⼀段程序,系统刚刚启动的时候,它能够实现将某个RAM中的程序映射到CPU可以寻址的地址空间中去,并且让CPU能够执⾏其中的指令,这些指令⽆法是完成系统检测,当检测完成以后,如果所有的硬件或基本硬件、核⼼硬件没有问题的话,接下来进⼊下⼀步根据BIOS当中所设定的系统启动流程去找那个对应设备上的MBR,根据引导次序去挨个逐个的去找那个对应的存储设备上的MBR,如果说MBR存在的话,则回去读取MBR中的bootloader,bootloader是⼀段程序,对于早些的设备来讲这个bootloader空间,或者MBR留给bootloader空间⼀共是512bytes,但是⽤于bootloader有446bytes,在bootloader当中配置了所要引导的操作系统的内核的位置,因此BIOS被载⼊内存以后,当它实现将控制权限转交给bootloader以后,那么bootloader就接收了整个系统的控制权限,⽽后根据⽤户的选择去读取相应操作系统的内核,将内核装载进内存当中合适的位置,解压缩,并完成内核初始化以后,接下来bootloader会将控制权限转交给内核,内核在初始化时主要完成硬件探测、装载驱动、这个驱动程序可能在内核当中,也可能在另外⼀个辅助⽂件当中initrd(RHEL 5 ramdisk、RHEL 6 ramfs),在RHEL 6中叫initramfs,这⾥⾯有内核所需要依赖到的额外的其他的设备驱动,尤其是根⽂件系统的驱动,接下来挂载根⽂件系统,当根⽂件系统挂载完成之后,接下来启动⽤户空间中的第⼀个进程叫init,这是内核初始化的基本任务,如果内核要完成初始化,它需要依赖于驱动程序,这些驱动程序如果没有被直接做在内核当中,那就需要到某个⽂件系统路径下去装载这个驱动程序,但是在真正根⽂件系统被挂载之前就出现⼀个难题,如果内核访问这个根⽂件系统那个设备,需要⽤到某个驱动程序的话,内核中没有,它就需要到⽂件系统当中找这个驱动程序,但是这个⽂件系统本⾝⼜没有挂载,所以要想访问⽂件系统得先找到驱动,要访问驱动得先找到⽂件系统,所以出现这样的难题,就是借助与initrd为内核提供访问真正的根⽂件系统所需要基本驱动程序,所以initrd是个辅助性的、过渡性的中间层,它能够实现将kernel和真正的根⽂件系统连接起来,所以当连接完成之后,它就没有意义了,当kernel初始化完成以后接下来执⾏init进程,⽽init本⾝的配置⽂件是/etc/inittab,在RHEL 6上不再是传统的init,⽽是upstart,⽽upstart的配置⽂件是/etc/inittab和/etc/init*.conf,upstart是个项⽬名称,这个程序为了兼容它依然较Init,也就意味着RHEL 6上的init不再是传统的init了,它是⼀个被称作较upstart的init程序,这个程序和传统的有着巨⼤的区别,⽽upstart本⾝它的配置⽂件/etc/inittab和/etc/init/*.conf⽂件,依然以RHEL 5来讲,init主要完成那些⼯作,这主要取决于inittab⽂件;RHEL 6:upstart(项⽬名称) --> init /etc/inittab /etc/init*.conf内核初始化: 硬件探测 装载驱动 挂载根⽂件系统(rootfs) 启⽤⽤户空间中的第⼀个进程init/etc/inittab: 设定默认运⾏级别 系统初始化(/etc/rc.d/rc.sysinit) 运⾏指定级别的服务脚本 /etc/rc.d/init.d/ /etc/rc.d/rc#.d rc0.d--rc6.d K* S* 00-99:运⾏次序 启动虚拟终端 启动图形终端/etc/rc.d/rc.sysinit: 系统初始化脚本 检测并以读写⽅式重新挂载根⽂件系统; 设定主机名; 检测并挂载/etc/fstab中的其它⽂件系统; 启动swap分区; 初始化外围硬件设备的驱动; 根据/etc/sysctl.conf设定内核参数; 激活udev和selinux; 激活LVM和RAID设备; 清理过期锁和PID⽂件; 装载键映射;/etc/inittabid:3:initdefault: (默认运⾏级别)si::sysinit:/etc/rc.d/rc.sysinit (系统初始化脚本)/etc/rc.d/rc.sysinitechoinsmodifconfig/bin/bashshutdown -r -hhalt 关机reboot 重启poweroff 关机init 0 关机init 6 重启1、关机和重启;2、主机名;3、运⾏对应服务脚本;4、启动终端;5、运⾏⽤户;6、定义单⽤户级别;7、装载⽹卡驱动,启⽤⽹络功能;8、提供⼀个web服务器;9、设定内核参数;busybox: ⼆进制程序,1M⼤⼩,能模拟数百个命令的使⽤;Kernel:RHEL5, RHEL6定制安装: ⾃动化安装 定制引导盘mount -n: 挂载时不更新/etc/mtab⽂件;cat /proc/mounts脚本编程知识点:1、变量中字符的长度:${#VARNAME}⼩Linux制作过程:在现有linux虚拟机增加⼀块20G的IDE硬盘,并对磁盘进⾏分区和创建⽂件系统,将创建的⽂件系统挂载到/mnt/boot和/mnt/sysroot⽬录;[root@localhost ~]# fdisk -l(查看系统上磁盘及分区情况)Disk /dev/hda: 21.4 GB, 21474836480 bytes15 heads, 63 sectors/track, 44384 cylindersUnits = cylinders of 945 * 512 = 483840 bytesDisk /dev/hda doesn't contain a valid partition tableDisk /dev/sda: 53.6 GB, 53687091200 bytes255 heads, 63 sectors/track, 6527 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System/dev/sda1 * 1 13 104391 83 Linux/dev/sda2 14 2624 20972857+ 83 Linux/dev/sda3 2625 2755 1052257+ 82 Linux swap / Solaris[root@localhost ~]# fdisk /dev/hda(管理磁盘分区,进⼊交互式模式)Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabelBuilding a new DOS disklabel. Changes will remain in memory only,until you decide to write them. After that, of course, the previouscontent won't be recoverable.The number of cylinders for this disk is set to 44384.There is nothing wrong with that, but this is larger than 1024,and could in certain setups cause problems with:1) software that runs at boot time (e.g., old versions of LILO)2) booting and partitioning software from other OSs(e.g., DOS FDISK, OS/2 FDISK)Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)Command (m for help): n(创建分区)Command actione extendedp primary partition (1-4)p(主分区)Partition number (1-4): 1(分区编号)First cylinder (1-44384, default 1):Using default value 1Last cylinder or +size or +sizeM or +sizeK (1-44384, default 44384): +20M(创建20M分区)Command (m for help): n(创建分区)Command actione extendedp primary partition (1-4)p(主分区)Partition number (1-4): 2(分区编号)First cylinder (43-44384, default 43):Using default value 43Last cylinder or +size or +sizeM or +sizeK (43-44384, default 44384): +512M(创建512M分区)Command (m for help): w(保存退出)The partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.[root@localhost ~]# partprobe /dev/hda(让内核重新扫描分区表)[root@localhost ~]# fdisk -l /dev/hda(查看/dev/hda分区情况)Disk /dev/hda: 21.4 GB, 21474836480 bytes15 heads, 63 sectors/track, 44384 cylindersUnits = cylinders of 945 * 512 = 483840 bytesDevice Boot Start End Blocks Id System/dev/hda1 1 42 19813+ 83 Linux/dev/hda2 43 1101 500377+ 83 Linux[root@localhost ~]# mke2fs -j /dev/hda1(将/dev/hda1创建为带⽇志的⽂件系统,即ext3⽂件系统)mke2fs 1.39 (29-May-2006)Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)4968 inodes, 19812 blocks990 blocks (5.00%) reserved for the super userFirst data block=1Maximum filesystem blocks=204472323 block groups8192 blocks per group, 8192 fragments per group1656 inodes per groupSuperblock backups stored on blocks:8193Writing inode tables: doneCreating journal (1024 blocks): doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 27 mounts or180 days, whichever comes first. Use tune2fs -c or -i to override.[root@localhost ~]# mke2fs -j /dev/hda2(将/dev/hda2创建为带⽇志的⽂件系统,即ext3⽂件系统)mke2fs 1.39 (29-May-2006)Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)125488 inodes, 500376 blocks25018 blocks (5.00%) reserved for the super userFirst data block=1Maximum filesystem blocks=6763315262 block groups8192 blocks per group, 8192 fragments per group2024 inodes per groupSuperblock backups stored on blocks:8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409Writing inode tables: doneCreating journal (8192 blocks): doneWriting superblocks and filesystem accounting information: doneThis filesystem will be automatically checked every 27 mounts or180 days, whichever comes first. Use tune2fs -c or -i to override.[root@localhost ~]# mkdir /mnt/{boot,sysroot}(创建/mnt/boot⽬录和/mnt/sysroot⽬录,花括号{}展开)[root@localhost ~]# mount /dev/hda1 /mnt/boot/(将/dev/hda1挂载到/mnt/boot/⽬录)[root@localhost ~]# mount /dev/hda2 /mnt/sysroot/(将/dev/hda2挂载到/mnt/boot/⽬录)[root@localhost ~]# mount(查看系统所有挂载的⽂件系统)/dev/sda2 on / type ext3 (rw)proc on /proc type proc (rw)sysfs on /sys type sysfs (rw)devpts on /dev/pts type devpts (rw,gid=5,mode=620)/dev/sda1 on /boot type ext3 (rw)tmpfs on /dev/shm type tmpfs (rw)none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)/dev/hda1 on /mnt/boot type ext3 (rw)/dev/hda2 on /mnt/sysroot type ext3 (rw)[root@localhost ~]# tree /mnt/(查看/mnt⽬录树)/mnt/|-- boot| `-- lost+found`-- sysroot`-- lost+found4 directories, 0 files提供内核:[root@localhost ~]# cp /boot/vmlinuz-2.6.18-308.el5 /mnt/boot/vmlinuz(复制vmlinuz-2.6.18-308.el5到/mnt/boot/⽬录叫vmlinuz)制作initrd⽂件:[root@localhost ~]# mkdir test(创建test⽬录)[root@localhost ~]# cd test/(切换到test⽬录)[root@localhost test]# zcat /boot/initrd-2.6.18-308.el5.img | cpio -id(不解压initrd⽂件查看内容将结果送给管道,通过cpio展开到当前⽬录)12218 blocks[root@localhost test]# ls(查看当前⽬录⽂件及⼦⽬录)bin dev etc init lib proc sbin sys sysroot[root@localhost test]# vim init(编辑init程序)mkrootdev -t ext3 -o defaults,ro /dev/hda2(以只读⽅式挂载根⽂件系统)#echo "Loading dm-mem-cache.ko module"#insmod /lib/dm-mem-cache.ko#echo "Loading dm-mod.ko module"#insmod /lib/dm-mod.ko#echo "Loading dm-log.ko module"#insmod /lib/dm-log.ko#echo "Loading dm-region_hash.ko module"#insmod /lib/dm-region_hash.ko#echo "Loading dm-message.ko module"#insmod /lib/dm-message.ko#echo "Loading dm-raid45.ko module"#insmod /lib/dm-raid45.ko#echo Waiting for driver initialization.#stabilized --hash --interval 1000 /proc/scsi/scsi(没有scsi盘,所以也注释掉)#resume LABEL=SWAP-sda3(注释掉交换分区):.,+20s@^@#@g(搜索当前⾏向下加20⾏,搜索所有⾏⾸的添加#号)提⽰:装载dm(Device Mapper逻辑卷设备)模块其实对我们都没有⽤,因为我们并没有把根⽂件系统做在⼀个所谓的逻辑卷上;[root@localhost test]# cd lib/(切换到lib⽬录)[root@localhost lib]# ls(查看当前⽬录⽂件及⼦⽬录)ahci.ko dm-mem-cache.ko dm-raid45.ko ext3.ko libata.ko mptspi.ko scsi_transport_spi.koata_piix.ko dm-message.ko dm-region_hash.ko firmware mptbase.ko ohci-hcd.ko sd_mod.kodm-log.ko dm-mod.ko ehci-hcd.ko jbd.ko mptscsih.ko scsi_mod.ko uhci-hcd.ko[root@localhost lib]# rm -f dm-*(强制删除dm开头的所有⽂件)[root@localhost lib]# lsahci.ko ehci-hcd.ko firmware libata.ko mptscsih.ko ohci-hcd.ko scsi_transport_spi.ko uhci-hcd.koata_piix.ko ext3.ko jbd.ko mptbase.ko mptspi.ko scsi_mod.ko sd_mod.ko[root@localhost test]# find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.gz(查找当前⽬录的所有⽂件,将结果通过管道送给cpio归档,-H指定备份时欲使⽤的⽂件格式,newc指cpio归档⽂件⽬录结构,把当前⽬录下每⼀个⽂件包括它的⼦⽬录整个映射路径统统给它按原有的路径格式进⾏保存,并且能够⽀持多于512200个⽂件,默认情况下cpio归档所⽀持的⽂件个数⾮常少,newc表⽰新规范的⽅式来进⾏归档,⽀持更多的⽂件数量,--quie表⽰静默模式,不输出信息,-o表⽰创建归档⽂件,将结果送给管道通过gzip进⾏压缩,-9指定压缩级别,保存⾄/mnt/boot/⽬录较initrd.gz)[root@localhost lib]# ls -lh /mnt/boot/(查看/mnt/boot⽬录⽂件详细信息,并进⾏单位换算)total 2.3M-rw-r--r-- 1 root root 374K Dec 2 02:48 initrd.gzdrwx------ 2 root root 12K Dec 2 02:14 lost+found-rw-r--r-- 1 root root 1.9M Dec 2 02:17 vmlinuz安装grub:[root@localhost ~]# grub-install --root-directory=/mnt/ /dev/hda(安装grub,根⽬录/mnt,设备/dev/hda)Probing devices to guess BIOS drives. This may take a long time.Installation finished. No error reported.This is the contents of the device map /mnt//boot/grub/device.map.Check if this is correct or not. If any of the lines is incorrect,fix it and re-run the script `grub-install'.(fd0) /dev/fd0(hd0) /dev/hda(hd1) /dev/sda[root@localhost ~]# ls /mnt/boot/(查看/mnt/boot⽬录⽂件及⼦⽬录)grub initrd.gz lost+found vmlinuz提⽰:检测/mnt/boot⽬录有没有刚安装的grub;提供grub配置⽂件:[root@localhost ~]# vim /mnt/boot/grub/grub.conf(编辑grub.conf配置⽂件)default=0timeout=3title Smoke Linux(2.6.18)root(hd0,0)kernel /vmlinuzinitrd /initrd.gz提供真正的根⽂件系统:[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# mkdir -pv etc/rc.d/init.d bin sbin proc sys dev lib root mnt media var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmp home opt boot(添加系统所需要的⽬录)mkdir: created directory `etc'mkdir: created directory `etc/rc.d'mkdir: created directory `etc/rc.d/init.d'mkdir: created directory `bin'mkdir: created directory `sbin'mkdir: created directory `proc'mkdir: created directory `sys'mkdir: created directory `dev'mkdir: created directory `lib'mkdir: created directory `root'mkdir: created directory `mnt'mkdir: created directory `media'mkdir: created directory `var'mkdir: created directory `var/log'mkdir: created directory `var/run'mkdir: created directory `var/lock'mkdir: created directory `var/lock/subsys'mkdir: created directory `var/tmp'mkdir: created directory `usr'mkdir: created directory `usr/bin'mkdir: created directory `usr/sbin'mkdir: created directory `usr/local'mkdir: created directory `tmp'mkdir: created directory `home'mkdir: created directory `opt'mkdir: created directory `boot'提⽰:etc/{rc.d/init.d} bin sbin proc sys dev是最核⼼的,var usr可以独⽴分区,未必是必须的,lib得有,tmp home可以单独分区,root不能单独分区,管理员家⽬录此时没有管理员的概念,所以不是核⼼的,usr可以单独分区,所以也不是核⼼的,mnt media不能分区,是挂载点,boot是在真正的根上挂载hda1的;[root@localhost sysroot]# ls(查看你当前⽬录⽂件及⼦⽬录)bin boot dev etc home lib lost+found media mnt opt proc root sbin sys tmp usr var创建配置⽂件:[root@localhost sysroot]# vim etc/inittab(编辑inittab⽂件)id:3:initdefault:(启动默认级别)si::sysinit:/etc/rc.d/rc.sysinit(初始化脚本)[root@localhost sysroot]# vim etc/rc.d/rc.sysinit(边界初始化脚本)#!/bin/bash#echo -e "\tWelcome to \033[34Smoke\033[0m Linux"(\t缩进⼀个TAB键)/bin/bash[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysinit(给rc.sysinit⽂件执⾏权限)通过脚本抑制命令和命令依赖的库⽂件:[root@localhost ~]# cat bincopy.sh(查看bincopy.sh脚本)#!/bin/bash#DEST=/mnt/sysrootlibcp() {LIBPATH=${1%/*}[ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH[ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished."}bincp() {CMDPATH=${1%/*}[ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH[ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATHfor LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`;dolibcp $LIBdone}read -p "Your command:" CMDuntil [ $CMD == 'q' ];do! which $CMD && echo "Wrong command" && read -p "Input againe" CMD && continueCOMMAND=`which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`bincp $COMMANDecho "copy $COMMAND finishd."read -p "Continue:" CMDdone[root@localhost ~]# ./bincopy.sh(执⾏移植命令和依赖的库⽂件脚本)Your command:init/sbin/initcopy lib /lib/libsepol.so.1 finished.copy lib /lib/libselinux.so.1 finished.copy lib /lib/libc.so.6 finished.copy lib /lib/libdl.so.2 finished.copy lib /lib/ld-linux.so.2 finished.copy /sbin/init finishd.Continue:bash/bin/bashcopy lib /lib/libtermcap.so.2 finished.copy /bin/bash finishd.Continue:ls/bin/lscopy lib /lib/librt.so.1 finished.copy lib /lib/libacl.so.1 finished.copy lib /lib/libpthread.so.0 finished.copy lib /lib/libattr.so.1 finished.copy /bin/ls finishd.Continue:q[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)测试通过切换根⽂件系统:[root@localhost ~]# chroot /mnt/sysroot/(切换根⽂件系统)bash-3.2# lsbin boot dev etc home lib lost+found media mnt opt proc rc.d root sbin sys tmp usr varbash-3.2# ls /etc/inittab rc.dbash-3.2# exitexit测试:将虚拟机挂起,将制作好的⼩Linux系统的IDE的硬盘添加到新创建的虚拟机系统;通过echo⼀段话保存到/tmp/a.txt⽂件⾥⾯,提⽰只读⽂件系统,所以根⽂件系统是只读的;切换到宿主机:[root@localhost ~]# ./bincopy.sh(当前⽬录执⾏bincopy.sh脚本,复制命令及命令依赖的库⽂件)Your command:touch/bin/touchcopy /bin/touch finishd.Continue:mkdir/bin/mkdircopy /bin/mkdir finishd.Continue:rm/bin/rmcopy /bin/rm finishd.Continue:mv/bin/mvcopy /bin/mv finishd.Continue:cp/bin/cpcopy /bin/cp finishd.Continue:cat/bin/catcopy /bin/cat finishd.Continue:mount/bin/mountcopy lib /lib/libblkid.so.1 finished.copy lib /lib/libuuid.so.1 finished.copy lib /lib/libdevmapper.so.1.02 finished.copy /bin/mount finishd.Continue:umount/bin/umountcopy /bin/umount finishd.Continue:vi/bin/vicopy /bin/vi finishd.Continue:vim/usr/bin/vimcopy lib /usr/lib/libncurses.so.5 finished.copy lib /usr/lib/libgpm.so.1 finished.copy lib /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so finished.copy lib /lib/libresolv.so.2 finished.copy lib /lib/libutil.so.1 finished.copy lib /lib/libm.so.6 finished.copy lib /lib/libnsl.so.1 finished.copy lib /lib/libcrypt.so.1 finished.copy /usr/bin/vim finishd.Continue:chmod/bin/chmodcopy /bin/chmod finishd.Continue:chown/bin/chowncopy /bin/chown finishd.Continue:ping/bin/pingcopy /bin/ping finishd.Continue:ifconfig/sbin/ifconfigcopy /sbin/ifconfig finishd.Continue:insmod/sbin/insmodcopy /sbin/insmod finishd.Continue:modprobe/sbin/modprobecopy /sbin/modprobe finishd.Continue:rmmod/sbin/rmmodcopy /sbin/rmmod finishd.Continue:route/sbin/routecopy /sbin/route finishd.Continue:halt/sbin/haltcopy /sbin/halt finishd.Continue:reboot/sbin/rebootcopy /sbin/reboot finishd.Continue:shutdown/sbin/shutdowncopy /sbin/shutdown finishd.Continue:hostname/bin/hostnamecopy /bin/hostname finishd.Continue:q[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)挂载宿主机,切换到⼩Linux系统:注意:启动⼩Linux系统完成之后,它没法⾃动完成将根⽂件系统重新挂载为可读写,所以应该编写rc.sysinit配置⽂件,让它可读写;挂载为可读写:mount -o remount,rw / :读写⽅式挂载根⽂件系统,-o指定额外的挂载选项,也即指定⽂件系统启⽤的属性,⼤部分选项都可以使⽤no option进⾏关闭此功能,如果指定多个功能属性,选项之间通过逗号隔开即可,remount重新挂载当前⽂件系统,把卸载和挂载⼀块来使⽤,先卸载再挂载,重新挂载可以不指定挂载点,rw读写挂载;提⽰:报错,/etc/mtab追踪当前系统挂载每⼀个⽂件系统,不带任何选项的mount命令所显⽰的内容被保存在/etc/mtab当中,以后挂载的每⼀个⽂件系统只要挂载都会保存到/etc/mtab当中,卸载⼀个⽂件系统,它会从/etc/matb当中删除,但是此时整个根都是只读的,所以挂载⽂件系统,不能将挂载的内容写⼊到/etc/mtab当中,那怎么办,mount 有个-n选项,在挂载的时候不更新/etc/mtab⽂件,mount -n: 挂载时不更新/etc/mtab⽂件;cat /proc/mounts:mounts⽂件也会显⽰当前系统上所挂载的所有⽂件系统;通过mount -n -o remount,rw /重新挂载根⽂件系统:不让报can't create locak file /etc/mtab~520: Read-only file system (use -n flag ride)错误;提⽰:⼜报错,读取不到/etc/fastab⽂件,说明重新挂载也会读取/etc/fstab⽂件,但是挂载已经完成了;提⽰:创建/tmp/a.txt⽂件成功,但是/tmp⽬录的权限应该是1777的;测试halt命令关机:提⽰:halt命令会⾃动完成切换到级别0,只是把当前进程关掉了,它没办法完成切断电源的,如何切断电源halt有个-p选项,在执⾏关机的时候,能够直接切断电源的;但是切断电源以后,它仍然⽆法把bash进程,halt命令是在bash进程中提⽰执⾏的,那就意味着halt是bash的⼦进程,所以使⽤halt命令只能关闭⼦进程⾃⾝,对⽗进程没有关系,如果让⽗进程⼀并关掉的话,有个命令叫exec查看exec命令帮助:提⽰:执⾏Exec⽂件,⽽且执⾏的时候是以当前bash直接替换为那个进程(简单来讲,默认情况下,我们所谓在bash命令下执⾏halt进程,它就在bash下执⾏⼀个⼦进程,⽽当我们使⽤exec的时候,不是这样的,当在命令提⽰符执⾏halt命令以后,halt进程⼀起来,这个⽗进程就没有了,它以⼦进程直接替换⽗进程的,⽽不是成为⽗进程的⼦进程,exec表⽰让启动的⼦进程直接替换原有的进程,⽽不是作为它的⼦进程来执⾏的,这样⼀来halt⼀结束,这样的bash也就结束了)exec halt -p:让exec命令启动halt命令⽽且直接替换原有的bash进程;提⽰:还是不⾏,事实上当指定halt命令它会切换到0级别下去了,根当前级别没有关系,所以还要执⾏对应级别下的操作才可以,那于是应该把halt命令放到对应级别下可执⾏⽂件⾥⾯,并且执⾏halt命令的时候,或者执⾏关机命令的时候,它能够⾃动去完成那个执⾏对应级别下的K*开头的脚本和S*开头的脚本,把S*开头的脚本都start起来,把K*开头的脚本都stop掉,所以还要修改它的执⾏流⾏,由此可见使⽤命令关机是关不掉的;切换到宿主机:给⼩Linux系统提供⼀个脚本:关机:[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# ls(查看当前⽬录⽂件及⼦⽬录)bin boot dev etc home lib lost+found media mnt opt proc root sbin sys tmp usr var[root@localhost sysroot]# vim etc/rc.d/rc.sysdone(编辑rc.sysdone脚本)#!/bin/bash#sync(当执⾏关键命令时候,如果此前写⼊⼀些内容进去,需要将这些内容从内存同步到磁盘上去)sleep 2(睡眠2秒)sync(再同步⼀次,确保所有的⽂件都同步完成)exec /sbin/halt -p(使⽤halt绝对路径,不使⽤绝对路径可能找不到,因为不登录,它可能没有path环境变量)[root@localhost sysroot]# chmod +x etc/rc.d/rc.sysdone(给rc.sysdone⽂件执⾏权限)[root@localhost sysroot]# cd(切换到根⽤户家⽬录)通过脚本移植sync和sleep命令:[root@localhost ~]# ./bincopy.sh(当前⽬录执⾏bincopy.sh脚本)Your command:sync/bin/synccopy /bin/sync finishd.Continue:sleep/bin/sleepcopy /bin/sleep finishd.Continue:q[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)[root@localhost ~]# sync(同步磁盘写⼊)提⽰:此时还没有做完整,还需要编辑etc/inittab⽂件[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# vim etc/inittab(编辑inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc.sysdone(运⾏在0级别的时候执⾏/etc/rc.d/rc.sysdone脚本)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)测试:挂起宿主机,切换到⼩Linux系统;使⽤init 0可以正常关机;重启:[root@localhost ~]# cd /mnt/sysroot/(切换到/mntsysroot⽬录)[root@localhost sysroot]# vim etc/inittab(编辑inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc.sysdonel6:6:wait:/etc/rc.d/rc.reboot(在6级别下执⾏rc.reboot脚本)[root@localhost sysroot]# vim etc/rc.d/rc.reboot(编辑rc.reboot脚本)#!/bin/bash#syncsleep 1syncexec /sbin/reboot[root@localhost sysroot]# chmod +x etc//rc.d/rc.reboot(给rc.reboot脚本执⾏权限)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)[root@localhost sysroot]# sync(同步磁盘写⼊)测试:挂起宿主机,切换到⼩Linux系统;使⽤init 6可以正常重启;提⽰:如果在此处修改⼩Linux系统,再回到宿主机可能会出现⽂件系统崩溃的,因为两个主机改⼀个磁盘,⽽且那个主机是挂起的,所以刚才改的内容,宿主机不知道;实现对应级别下的服务脚本实现关机和重启:[root@localhost ~]# cd /mnt/sysroot/(切换到/mnt/sysroot⽬录)[root@localhost sysroot]# vim etc/rc.d/init.d/halt(编辑halt脚本)#!/bin/bash#case $0 in ($0取得脚本路径名称,通过脚本名称来判断重启还是关机)*reboot)COMMAND=`/sbin/reboot ;;*halt)COMMAND=`/sbin/halt -p ;;*)echo "Only call this script by *reboot OR *halt;";;esaccase $1 instart);;stop);;*)echo "Usage: `basename $0` {start|stop}" (basename $0获取脚本名称);;esacexec $COMMAND[root@localhost sysroot]# chmod +x etc/rc.d/init.d/halt(给halt脚本执⾏权限)[root@localhost sysroot]# cd etc/rc.d/(切换到etc/rc.d⽬录)[root@localhost rc.d]# mkdri rc0.d rc6.d(创建rc0.d和rc6.d⽬录)[root@localhost rc.d]# cd rc0.d/(切换到rc0.d⽬录)[root@localhost rc0.d]# ln -sv ../init.d/halt S99halt(给../init.d/halt⽂件创建软连接叫S99halt,并显⽰创建过程,99代表最后关机)create symbolic link `S99halt' to `../init.d/halt'提⽰:S99halt,S代表start在相应级别下启动该脚本,,当执⾏S99halt,脚本取得halt选择关机[root@localhost rc0.d]# ll(查看当前⽬录⽂件及⼦⽬录)total 1lrwxrwxrwx 1 root root 14 Nov 22 04:07 S99halt -> ../init.d/halt[root@localhost rc0.d]# cd ../rc6.d/(切换到rc6.d⽬录)[root@localhost rc6.d]# ln -sv ../init.d/halt S99reboot(给../init.d/halt⽂件创建软连接叫S99reboot,并显⽰创建过程,99代表最后重启)create symbolic link `S99reboot' to `../init.d/halt'提⽰:S99reboot,S代表start在像应级别下启动该脚本,当执⾏S99reboot,脚本取得reboot选择重启;[root@localhost rc6.d]# cd ..(切换到上级⽬录)[root@localhost rc.d]# rm -f rc.reboot rc.sysdone(强制删除rc.reboot和rc.sysdone脚本)[root@localhost rc.d]# ls(查看当前⽬录⽂件及⼦⽬录)init.d rc0.d rc6.d rc.sysinit[root@localhost rc.d]# sync(同步磁盘写⼊)[root@localhost rc.d]# sync(同步磁盘写⼊)[root@localhost rc.d]# sync(同步磁盘写⼊)[root@localhost rc.d]# vim rc(编辑rc脚本)#!/bin/bash#RUNLEVEL=$1(接受⼀个参数,相当于运⾏级别)for I in /etc/rc.d/rc$RUNLEVEL.d/K*;do$I stopdonefor I in /etc/rc.d/rc$RUNLEVEL.d/S*;do$I startdone提⽰:当RUNLEVEL参数为0执⾏/etc/rc.d/rc0.d/K*所有脚本停⽌,执⾏/etc/rc.d/rc0.d/S*所有脚本启动,当RUNLEVEL参数为6执⾏/etc/rc.d/rc6.d/K*所有脚本停⽌,执⾏/etc/rc.d/rc6.d/S*所有脚本启动;[root@localhost rc.d]# chmod +x rc(给rc脚本执⾏权限)[root@localhost rc.d]# cd ..(切换到上级⽬录)[root@localhost etc]# vim inittab(编辑inittab脚本)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l6:6:wait:/etc/rc.d/rc 6[root@localhost etc]# sync(同步磁盘写⼊)[root@localhost etc]# sync(同步磁盘写⼊)[root@localhost etc]# sync(同步磁盘写⼊)测试:挂起宿主机,切换到⼩Linux系统;测试重启,可以正常重启;测试关机,可以正常关机;提⽰:由于没有K*开头的脚本所以提⽰报错;如何实现在对应级别下启动服务:[root@localhost sysroot]# vim etc/inittab(编辑etc/inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l6:6:wait:/etc/rc.d/rc 6l3:3:wait:/etc/rc.d/rc 3[root@localhost sysroot]# cd etc/rc.d/(切换到etc/rc.d⽬录)[root@localhost rc.d]# mkdir rc3.d(创建rc3.d⽬录)[root@localhost rc.d]# ls(查看当前⽬录⽂件及⼦⽬录)init.d rc rc0.d rc3.d rc6.d rc.sysinit[root@localhost rc.d]# vim init.d/tserver(编辑tserver脚本)#!/bin/bash#prog=`basename $0`(取得脚本路径的基名,也就是脚本名称)lockfile=/var/lock/subsys/$progstart() {echo "Starting $prog ..."touch $lockfile}stop () {echo "Stopping $prog ..."rm -f $lockfile}status() {if [ -f $lockfile ];thenecho "Running..."elseecho "Stopped..."fi}usage() {echo "Usage: $prog {start|stop|status|restart}"}case $1 instart)start ;;stop)stop ;;restart)stopstart;;status)status;;*)usageexit 1;;esac提⽰:如果tserver⽂件存在说明服务启动,不存在说明服务没启动,关闭服务删除tserver⽂件;[root@localhost rc.d]# chmod +x init.d/tserver(给tserver执⾏权限)[root@localhost rc.d]# init.d/tserver start(执⾏tserver脚本)Starting tserver ...[root@localhost rc.d]# ls /var/lock/subsys/tserver(查看/var/lock/subsys/tserver⽂件存在)/var/lock/subsys/tserver[root@localhost rc.d]# init.d/tserver stop(执⾏tserver脚本)Stopping tserver ...[root@localhost rc.d]# ls /var/lock/subsys/tserver(查看/var/lock/subsys/tserver⽂件不存在)ls: /var/lock/subsys/tserver: No such file or directory[root@localhost rc.d]# init.d/tserver status(执⾏tserver脚本)Stopped...[root@localhost rc.d]# init.d/tserver statuss(执⾏tserver脚本)Usage: tserver {start|stop|status|restart}将脚本做成chkconfig调⽤的脚本:[root@localhost rc.d]# vim init.d/tserver#!/bin/bash## chkconfig: 35 66 33 (chkconfig调⽤的服务脚本,35代表3和5级别启动,66代表启动优先次序,33代表关闭优先次序)# description: test service script (描述信息)prog=`basename $0`lockfile=/var/lock/subsys/$progstart() {}stop () {echo "Stopping $prog ..."rm -f $lockfile}status() {if [ -f $lockfile ];thenecho "Running..."elseecho "Stopped..."fi}usage() {echo "Usage: $prog {start|stop|status|restart}"}case $1 instart)start ;;stop)stop ;;restart)stopstart;;status)status;;*)usageexit 1;;esac让脚本在3级别启动起来:[root@localhost rc.d]# cd rc3.d/(切换到rc3.d⽬录)[root@localhost rc3.d]# ln -sv ../init.d/tserver S66tserver(创建软连接,并显⽰创建过程,创建为S66tserver)create symbolic link `S66tserver' to `../init.d/tserver'提⽰:S66tserver中的S代表启动,66代表启动优先次序,其中66要和服务脚本中chkconfig 35 66 33中的启动优先次序的数字要⼀样;[root@localhost rc3.d]# ll(查看当前⽬录⽂件及⼦⽬录详细信息)total 1lrwxrwxrwx 1 root root 17 Nov 22 05:08 S66tserver -> ../init.d/tserver[root@localhost rc3.d]# cd ..(切换到上层⽬录)[root@localhost rc.d]# cd rc0.d/(切换到rc0.d⽬录)[root@localhost rc0.d]# ln -sv ../init.d/tserver K33tserver(创建软连接,并显⽰创建过程,创建为K33tserver)create symbolic link `K33tserver' to `../init.d/tserver'提⽰:K33tserver中的K代表停⽌,33代表停⽌优先次序,其中33要和服务脚本中chkconfig 35 66 33中的停⽌优先次序的数字要⼀样;[root@localhost rc0.d]# cd ../rc6.d/(切换到上层⽬录下的rc6.d⽬录)[root@localhost rc6.d]# ln -sv ../init.d/tserver K33tserver(创建软连接,并显⽰创建过程,创建为K33tserver)create symbolic link `K33tserver' to `../init.d/tserver'提⽰:K33tserver中的K代表停⽌,33代表停⽌优先次序,其中33要和服务脚本中chkconfig 35 66 33中的停⽌优先次序的数字要⼀样;[root@localhost rc6.d]# ll(查看当前⽬录⽂件及⼦⽬录)total 2lrwxrwxrwx 1 root root 17 Nov 22 05:16 K33tserver -> ../init.d/tserverlrwxrwxrwx 1 root root 14 Nov 22 04:10 S99reboot -> ../init.d/halt[root@localhost rc6.d]# sync(同步磁盘写⼊)[root@localhost rc6.d]# sync(同步磁盘写⼊)[root@localhost rc6.d]# sync(同步磁盘写⼊)提⽰:此时3级别仍然没有⽤的;[root@localhost rc6.d]# cd ../../(切换到上层⽬录的上层⽬录)[root@localhost etc]# ls(查看当前⽬录⽂件及⼦⽬录)inittab rc.d[root@localhost etc]# vim inittab(编辑inittab⽂件)id:3:initdefault:si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l6:6:wait:/etc/rc.d/rc 6l3:3:wait:/etc/rc.d/rc 3提⽰:当执⾏到si的时候,会执⾏etc/rc.d/rc.sysinit脚本,这个脚本直接启动了/bin/bash,因此3级别的脚本不会执⾏,为什么0级别和6级别会执⾏,我们使⽤init切换过去⽽已,所以此时3级别不可能会随系统启动的,因为执⾏流程不到这⾥,到si::sysinit:/etc/rc.d/rc.sysinit已经完成系统启动了,因为在rc.sysinit脚本已经直接执⾏了/bin/bash了,那么RHEL 5的系统是如何启动的,为什么它会执⾏呢,它不是在/etc/rc.d/rc.sysinit登录的系统,⽽是在inittab⽂件⾥⾯还有⼏个tty终端,所以它们的执⾏流程是正常的,我们此时执⾏流程不正常,那该怎么办?[root@localhost etc]# man mingetty(查看mingetty的man帮助⽂档)[root@localhost etc]# cat /etc/inittab(查看inittab⽂件)## inittab This file describes how the INIT process should set up# the system in a certain run-level.## Author: Miquel van Smoorenburg, <miquels@># Modified for RHS Linux by Marc Ewing and Donnie Barnes## Default runlevel. The runlevels used by RHS are:# 0 - halt (Do NOT set initdefault to this)# 1 - Single user mode# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)# 3 - Full multiuser mode# 4 - unused# 5 - X11# 6 - reboot (Do NOT set initdefault to this)#id:3:initdefault:# System initialization.si::sysinit:/etc/rc.d/rc.sysinitl0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6# Trap CTRL-ALT-DELETEca::ctrlaltdel:/sbin/shutdown -t3 -r now# When our UPS tells us power has failed, assume we have a few minutes# of power left. Schedule a shutdown for 2 minutes from now.# This does, of course, assume you have powerd installed and your# UPS connected and working correctly.pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"# If power was restored before the shutdown kicked in, cancel it.pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"# Run gettys in standard runlevels1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty56:2345:respawn:/sbin/mingetty tty6# Run xdm in runlevel 5x:5:respawn:/etc/X11/prefdm -nodaemon提⽰:系统的/etc/inittab⽂件在不同级别下的脚本执⾏完成以后开始执⾏1:2345:respawn:/sbin/mingetty tty1-6:2345:respawn:/sbin/mingetty tty6(在2345级别下,都启动了6个终端),使⽤/sbin/mingetty命令启动的,所以当执⾏完si::sysinit:/etc/rc.d/rc.sysinit脚本以后,它会继续往下执⾏3级别下的l3:3:wait:/etc/rc.d/rc 3这个脚本的,⽽si::sysinit:/etc/rc.d/rc.sysinit脚本⾥⾯是没有启动/bin/bash的,我们让它启动了/bin/bash这是不合理的;[root@localhost etc]# vim inittab(编辑inittab⽂件)id:3:initdefault:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
Practice1 (4)
一编译过程 (4)
1 安装必要的软件 (4)
2 下载linux内核源文件 (4)
3 解压缩源文件 (5)
4 复制config文件 (6)
5 进行menucofig配置 (6)
6 menuconfig配置页面 (7)
7 对驱动设置进行简单配置 (8)
8 选择cpu类型 (8)
9 设置完成保存退出 (9)
10 开始编译内核 (9)
11 内核编译过程 (10)
12 内核编译过程(3小时后) (11)
13 内核编译成功 (12)
14 安装新内核 (12)
15 新内核安装过程 (13)
16 比较两个内核 (14)
17 重新启动系统 (14)
18 登录新内核 (15)
19 新内核登录成功 (15)
20 查看新内核版本号号 (16)
二、编译过程中遇到的问题 (16)
1 错误VFS:Unable to mount root (16)
2错误Driver ‘mdio-gpio’ (18)
Practice2 (20)
一、内核选项翻译及选择理由 (20)
1. General setup 常规设置 (20)
二、裁剪过程 (21)
1.进入设置界面 (21)
2. General setup页设置 (22)
3. Enable the block layer页设置 (23)
4. Processor type and features页设置 (24)
5. Power Management and ACPI options页设置 (28)
6. Bus options页设置 (29)
7. Executable file formats页设置 (30)
8. Networking options页设置 (31)
9. Device Drivers 页设置 (34)
10. Firmware Drivers页设置 (37)
11. File systems页设置 (38)
12. Kernel hacking页设置 (40)
13 CryptographicAPI页设置 (41)
14. 裁剪后内核运行截图 (42)
15. 内核大小9.6M (43)
感受和体会 (44)
Practice1
一编译过程
1 安装必要的软件
代码: $sudo apt-get install build-essential kernel-package libncurses5-dev
2 下载linux内核源文件
/下载2.6.38.8full版
3 解压缩源文件
代码:$ mkdir src && tar jfx linux-2.6.25.10.tar.bz2 -C src/
4 复制config文件
命令:cp /boot/config-`uname -r` ./.config
5 进行menucofig配置
代码:$sudo make menuconfig
6 menuconfig配置页面
7 对驱动设置进行简单配置
8 选择cpu类型
9 设置完成保存退出
10 开始编译内核
代码:$ sudo make-kpkg -initrd --initrd --append-to-version=bo100 kernel_image kernel-headers
11 内核编译过程
12 内核编译过程(3小时后)
13 内核编译成功
14 安装新内核
代码:$ sudo dpkg -i linux-image-2.6.38bo100
15 新内核安装过程
16 比较两个内核
17 重新启动系统
18 登录新内核
19 新内核登录成功
20 查看新内核版本号号
二、编译过程中遇到的问题
1 错误VFS:Unable to mount root
描述:内核安装成功后,启动内核出现如下图错误
原因:在执行内核安装的时候,initrd可能没有被安装出现以下错误
如图,新版本的initrd并没有安装成功,vmlinu有两份,而initrd只有一份。

因此启动时会找不到挂靠磁盘。

解决方案:
重新安装initrd
代码:sudo update-initramfs -c -k 2.6.38.8bo100
执行后:
再次重启,问题解决。

2错误Driver ‘mdio-gpio’
描述:内核安装成功后,启动内核出现如下图错误
原因:在执行内核安装的时候,grub配置文件并没有更新
解决方案:编辑/boot/grub/grub.cfg文件,添加initrd /initrd.img-2.6.39.4如图
执行之后,问题解决。

Practice2
一、内核选项翻译及选择理由
1. General setup 常规设置
1.1 Prompt for development and/or incomplete code/drivers
对开发中的或者未完成的代码和驱动进行提示
选择N
1.2 Local version – append to kernel release
本地版本附加内核发行版本
选择N
1.3 Automatically append version information to the version string
自动生成版本信息
选择N
1.4 Support for paging of anonymous memory
内存随机页面支持,可以提供更多的虚拟内存
选择N
1.5 System V IPC
中间过程连接,有些程序需要它才能运行
选择Y
1.6 BSD Process Accounting
BSD进程统计,对用户级别的程序非常有用
选择Y
1.7 BSD Process Accounting version 3 _le format
BSD 进程统计V3文件格式一种进程统计的格式
选择N
1.8 Export task/process statistics through netlink
通过网联接口输出工/进程的相关数据
选择N
1.9 Enable extended accounting over taskstats
允许通过任务状态进行扩展统计
选择N
1.10 Control Group support
组控制支持
选择N
1.11 Initial RAM _lesystem and RAM disk sup-port
初始RAM文件系统和RAM磁盘支持
选择Y
1.12 Kprobes
K探测器
选择N
因为要进行内核裁剪,我研究明白了几乎所有选项的意思,但由于时间原因,实在无法逐一写出并解释,准备假期的时候把这些东西全部写出了,整理成文档供后人使用。

这里只写到第一部分,内核裁剪很有意思,有时间的时候一定好好总结一下。

二、裁剪过程
1.进入设置界面
命令:make menuconfig
2. General setup页设置
3. Enable the block layer页设置
4. Processor type and features页设置
5. Power Management and ACPI options页设置
6. Bus options页设置
7. Executable file formats页设置
8. Networking options页设置
9. Device Drivers 页设置
10. Firmware Drivers页设置
11. File systems页设置
12. Kernel hacking页设置
13 CryptographicAPI页设置
14. 裁剪后内核运行截图
15. 内核大小9.6M
感受和体会
这次作业可以用旷日持久来形容,并不是因为自己拖着不做,而是确实需要很多的时间,由于使用的时虚拟机,编译一次完整版的内核需要5个小时左右,这是极大程度上对耐心的考验,不过虽然经历坎坷但最终还是完成了任务。

做这次作业最大的感受就是要谋定而后动,要对整个编译的内容、操作的过程有完整的考虑,想清楚,弄明白之后再去编译,否则一旦出了一些小错误,很可能导致5个小时过去了而一无所获。

这种5个小时的教训使得我们不得不每一步都谨小慎微,严谨治学。

这次作业对个人的研究能力也是一个极大的考验,因为编译基本都会出错,而出的错又千奇百怪,没有一个文档或是说明能囊括所有的错误,所以必须去自己搜集可能的原因,分析别人的资料,最终在不断的尝试过程中解决问题。

可以说作业是在不断地发现问题,解决问题过程中进行了,所有的操作都要在linux系统下进行,包括文件的安装、备份,所以做作业的同时对linux系统的认知和理解也更深入了一个层次。

相关文档
最新文档