Linux内核裁剪和定制方法
内核配置与裁剪
![内核配置与裁剪](https://img.taocdn.com/s3/m/cb093a015f0e7cd18425362b.png)
内核配置与裁剪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内核裁减](https://img.taocdn.com/s3/m/6485cf1ec281e53a5802ffdd.png)
Linux内核裁减及根文件系统定制目录:一、内核编译二、根文件系统定制三、内核选项说明一、内核编译1、准备工作(1)整理出系统需要支持的硬件、文件系统类型以及网络协议等内容。
(2)建议用命令uname –r 查看一下系统的版本号,如果你的系统版本与将要编译的内核版本一致,建议将/lib/modules下的内容备份,否则将来的make modules_install 步骤产生的文件会覆盖这个路径下的内容。
(3)下载并解压linux内核。
以下假设你已经下载了内核的为linux-x-y-z.tar.gz。
一般都将linux内核源代码放在/usr/src下,这里仍然遵守这个习惯,如果你的这个路径下已经存在这个版本的内核,建议将已有的改个名称。
2、开始编译(1)make mrproper确保源代码目录下没有不正确的.o文件和文件依赖关系,执行该命令后,内核选项会回到默认的状态下。
如果你是下载的内核源码,而且是第一次编译,就没有必要执行这一步操作(2)make menuconfig以文本菜单方式选择内核选项(与它功能相同的命令还有makeconfig;make xconfig;make oldconfig),不同版本的内核,选项可能会有一些差异。
{注:#make config(基于文本的最为传统的配置界面,不推荐使用)#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)#make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,那么就推荐你使用这个命令。
}这一步是内核编译的关键,根据需要支持的硬件、文件系统和协议等内容,选择不同的选项。
配置选项时,有三种选择方式,它们代表的含义如下:Y-将该功能编译进内核N-不添加功能M-将该功能编译成模块,在需要时动态加载到内核选择的原则:是与内核关心紧密而且经常使用的部分功能代码直接编译到内核中;将与内核系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选。
linux内核的裁剪与移植
![linux内核的裁剪与移植](https://img.taocdn.com/s3/m/2d3e48da5022aaea998f0f91.png)
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;。
LINUX内核裁减及根文件系统定制(之二)--------根文件系统定制
![LINUX内核裁减及根文件系统定制(之二)--------根文件系统定制](https://img.taocdn.com/s3/m/752aafc8aa00b52acfc7caf1.png)
# mknod ram0 b 1 0
# chmod 600 ram0
建立 null 设备
建立一般终端机设备
# 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 设备
2、 创建基本的目录结构 # cd /mnt/initrd
#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等。
Linux内核裁减及根文件系统定制(之二)--------根文件系统定制 二、根文件系统定制
1、 创建一个全新的根文件系统
你可以用mkinitrd来创建,这里介绍另外一种方式,用dd命令:
# mkdir -p /mnt/initrd 创建一个设备点,用于临时挂载根文件系统。
创建一个名为initrd的根文件 # cd /tmp 在tmp下创建根文件系统 # dd if=/dev/zero of=/tmp/initrd bs=512 count=40960
Linux内核安装、裁剪图文教程
![Linux内核安装、裁剪图文教程](https://img.taocdn.com/s3/m/5aebb3270066f5335a81213e.png)
目录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-dev2 下载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` ./.config5 进行menucofig配置代码:$sudo make menuconfig6 menuconfig配置页面7 对驱动设置进行简单配置8 选择cpu类型9 设置完成保存退出10 开始编译内核代码:$ sudo make-kpkg -initrd --initrd --append-to-version=bo100 kernel_image kernel-headers11 内核编译过程12 内核编译过程(3小时后)13 内核编译成功14 安装新内核代码:$ sudo dpkg -i linux-image-2.6.38bo10015 新内核安装过程16 比较两个内核17 重新启动系统18 登录新内核19 新内核登录成功20 查看新内核版本号号二、编译过程中遇到的问题1 错误VFS:Unable to mount root描述:内核安装成功后,启动内核出现如下图错误原因:在执行内核安装的时候,initrd可能没有被安装出现以下错误如图,新版本的initrd并没有安装成功,vmlinu有两份,而initrd只有一份。
第4章 Linux内核裁剪与移植 Linux系统移植(第2版) 教学课件
![第4章 Linux内核裁剪与移植 Linux系统移植(第2版) 教学课件](https://img.taocdn.com/s3/m/b9e85fd0ec3a87c24128c43f.png)
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平台下各种芯片兼容的代码。
8.Linux内核裁剪
![8.Linux内核裁剪](https://img.taocdn.com/s3/m/6c7401abd1f34693daef3e9e.png)
常用选项 options: 1.Code maturity level options:代码成 熟等级。 熟等级。
1.1.prompt for development and/or incomp lete code/drivers. 如果要试验现在仍处于实验阶段的功能, 如果要试验现在仍处于实验阶段的功能, 比如khttpd IPv6等 就必须把该项选择为Y khttpd、 比如khttpd、IPv6等,就必须把该项选择为Y 否则可以把它选择为N 了;否则可以把它选择为N。 默认情况下是选择的, 默认情况下是选择的,这将会在设置界面中显 示还在开发或者还没有完成的代码与驱动. 示还在开发或者还没有完成的代码与驱动.不 选。
setup:常规内核选项。 4.General setup:常规内核选项。
4.1. Networking support. 通常每个人都会选择“ support”, 通常每个人都会选择“Networking support”,因为 你通常需要它,比如Internel Internel。 Linux有很重的 有很重的Internet 你通常需要它,比如Internel。 Linux有很重的Internet 偏向, 偏向,而且它在没有联网的情况下无法充分发挥优 势。 另外,许多其他的操作也网络支持——即使它们看 另外,许多其他的操作也网络支持——即使它们看 —— 上去跟网络没多大关系。 上去跟网络没多大关系。 内核在没有网络支持选项的情 况下甚至无法编译。简而言之: 况下甚至无法编译。简而言之:一定要打开 support”选项 选项。 “Networking support”选项。 4.2. PCI support. 现在的所有系统都使用PCI总线, PCI总线 现在的所有系统都使用PCI总线,所以你应该选择相 关选项。 关选项。
linux2.6内核裁剪说明
![linux2.6内核裁剪说明](https://img.taocdn.com/s3/m/bd1fecd1ab00b52acfc789eb172ded630b1c98b6.png)
Linux内核裁剪与移植内核,即操作系统。
它为底层的可编程部件提供服务,为上层应用程序提供执行环境。
内核裁剪就是对这些功能进行裁剪,选取满足特定平台和需求的功能。
不同的硬件平台对内核要求也不同,因此从一个平台到另一个平台需要对内核进行重新配置和编译。
操作系统从一个平台过渡到另一个平台称为移植。
Linux是一款平台适应性且容易裁剪的操作系统,因此Linux在嵌入式系统得到了广泛的应用。
本章将详细讲解内核裁剪与移植的各项技术。
4.1 Linux内核结构Linux内核采用模块化设计,并且各个模块源码以文件目录的形式存放,在对内核的裁剪和编译时非常方便。
下面介绍内核的主要部分及其文件目录。
4.1.1 内核的主要组成部分在第1章中已经介绍了Linux内核主要的5个部分:进程调度、内存管理、虚拟文件系统、网络接口、进程通信。
在系统移植的时候,它们是内核的基本元素,这5个部分之间的关系,如图4.1所示。
图4.1 Linux内核子系统及其之间的关系进程调度部分负责控制进程对CPU的访问。
内存管理允许多个进程安全地共享主内存区域。
内存管理从逻辑上分为硬件无关部分和硬件相关部分。
硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关部分为内存管理硬件提供了虚拟接口。
虚拟文件系统隐藏了不同类型硬件的具体细节,为所有的硬件设备提供了一个标准的接口,VFS提供了十多种不同类型的文件系统。
网络接口提供了对各种网络标准的存取和各种网络硬件的支持。
进程通信部分用于支持进程间各种不同的通信机制。
进程调度处于核心位置,内核的其他子系统都要依赖它,因为每个子系统都存在进程挂起或恢复过程。
* 进程调度与内存管理之间的关系:这两个子系统为互相依赖关系。
在多道程序环境下,程序要运行必须为之创建进程,而创建进程首先就是要将程序和数据装入内存。
另外,内存管理子系统也存在进程的挂起和恢复过程。
* 进程间通信与内存管理之间的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,通过对共同的内存区域进行操作来达到通信的目的。
Linux内核裁剪与编译
![Linux内核裁剪与编译](https://img.taocdn.com/s3/m/98067828cbaedd3383c4bb4cf7ec4afe04a1b19a.png)
创建一个用于编译的内核目录,并配置相应的环境变量。
内核配置与选择
配置内核
01
使用make menuconfig或其他配置工具进行内核配置,选择所
需的特性和功能。
定制内核
02
根据实际需求,禁用不必要的模块和功能,以减小内核体积。
配置参数
03
在编译过程中,根据需要设置编译参数,如优化级别、编译器
选项等。
编译过程与注意事项
执行编译
在配置完成后,执行make命令开始 编译内核。
等待编译完成
编译过程可能需要较长时间,取决于 系统性能和内核大小。
注意事项
在编译过程中,注意观察日志信息, 以便及时发现和解决问题。
内核安装
编译完成后,按照系统要求进行内核 安装和引导配置。
04
内核编译优化
编译优化简介
-O3
在`-O2`的基础上,进一步开启更多的编译器优化选项。
-Os
以最小化代码大小为目标进行优化,适用于嵌入式系统等资源受限的环境。
-fPIC
生成位置无关代码,便于动态链接。
编译优化实践
根据目标硬件平台和性能 需求,选择合适的编译选 项。
关注内核代码质量,避免 过度优化导致代码可读性 和维护性下降。
优化内核
针对特定需求进行内核优化,如调整调度 策略、优化内存管理等,以提高系统的性 能和响应速度。
定制内核
根据需求分析结果,定制内核的功能和参 数,如禁用不必要的模块、开启特定功能 等。
案例三:使用第三方工具进行内核裁剪与编译
总结词
选择合适的第三方 工具
配置工具链
导入内核源码
自动裁剪与编译
使用第三方工具进行内 核裁剪与编译,可以借 助第三方工具的自动化 和智能化功能,提高内 核裁剪与编译的效率和 准确性。
嵌入式linux操作系统裁剪和定制研究
![嵌入式linux操作系统裁剪和定制研究](https://img.taocdn.com/s3/m/4cd4482ff011f18583d049649b6648d7c1c708d4.png)
嵌入式Linux操作系统裁剪和定制研究摘要嵌入式Linux的研究之所以成为当今操作系统研究的热点,是因为它的应用蕴含着巨大的商业价值。
嵌入式系统之间差别很大,掌上电脑(PDA)、机顶盒、手机、数码相机、数字电视、家用电器、工业控制设备,等等,都是典型的嵌入式应用。
和桌面操作系统相比,由于嵌入式应用环境之间的差别很大,难于开发出适应于各种嵌入式应用环境的通用嵌入式操作系统。
当前流行的各种嵌入式操作系统,仅仅在某些特定领域获得成功,其原因就在于此。
嵌入式Linux操作系统也存在这方面的问题。
因此,研究嵌入式操作系统的裁剪和定制技术就显得非常必要。
作者从致力于开发自己的嵌入式操作系统和商业应用的目的出发,进行了嵌入式Linux内核的裁剪与定制研究,力求创造出具有我国自主产权的操作系统。
而任何的裁减都是基于对内核的准确理解之上的,作者首先系统介绍了一个完整的Linux内核的总体结构并就其主要子系统,如初始化、中断处理子系统、进程调度进行了详细分析;然后从嵌入式Linux现代设计特点出发,提出了一种基于调用图的裁剪Linux方法并对各部分的具体裁减从实例出发进行了说明。
同时又从定制角度,讨论了内存管理子系统、文件予系统的优化和选择方法。
最后,文章针对DSP应用的特点,分析了如何将Linux内核加以裁剪、改造,使其适合DSP应用,形成通用的DSP操作系统。
移植后的Linux内核,大小可以控制在200K以下.减小了DSP平台上应用软件的开发难度,大大降低了DSP系统的开发成本。
设备驱动程序运行在核心态,是Linux内核重要组成部分。
它出现的闯题会直接影响嵌入式Linux的稳定,严重时会导致操作系统崩溃。
文章利用虚拟字符设备来最大限度地封装硬件设备驱动的具体细节和其特定信息模式,以降低嵌入式Linux应用系统程序开发调试的难度,增强系统的可配置性。
并总结了两种虚拟字符设备用以实际的嵌入式开发。
文章最后对嵌入式Linux系统开发尚需解决的问题提出了自己的看法。
Linux内核定制优化配置
![Linux内核定制优化配置](https://img.taocdn.com/s3/m/5f11a8dea6c30c2259019eee.png)
Linux内核定制优化配置五、Linux内核裁减(1)安装module-init-tools-3.0.tar.gz: # tar -zxvf module-init-tools-3.0.tar.gz # cd module-init-tools-3.0 # ./configure --prefix=/sbin # make# make install# ./generate-modprobe.conf /etc/modprobe.conf这个脚本程序会读取原配置文件modules.conf的内容,经过格式转化后,生成新的配置文件/etc/modprobe.conf。
不知道为什么,我用module-init-tools-3.1时make出错。
如果改用3.0的就没事了。
(2)安装modutils-2.4.25-8.9.i386.rpm: # rpm -Uvih modutils-2.4.25-8.9.i386.rpm对modutils进行升级。
-U, --upgrade=+ upgrade package(s)(3)安装新内核:将新内核copy到/usr/src下,#tar xzvf linux-2.6.38.4.tar.gz -----解压缩.II. 将名为linux的符号链接删掉,这是旧版本内核的符号链接. #ln -s linux-2.6.38.4 linux ------建立linux-2.6.38.4的符号链接linux.(4)设置内核. # cd /usr/src/linux# make mrproper -----删除不必要的文件和目录. #make menuconfig 生成一个.config文件Linux 内核的裁剪与编译看上去是个挺简单的过程。
只是对配置菜单的简单选择。
但是内核配置菜单本身结构庞大,内容复杂。
具体如何选择却难住了不少人。
因此熟悉与了解该菜单的各项具体含义就显得比较重要。
基于ARM的嵌入式linux内核的裁剪与移植
![基于ARM的嵌入式linux内核的裁剪与移植](https://img.taocdn.com/s3/m/963a57e66e1aff00bed5b9f3f90f76c661374c34.png)
基于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内核裁剪及编译步骤](https://img.taocdn.com/s3/m/c5f5f089f021dd36a32d7375a417866fb94ac056.png)
linux内核裁剪及编译步骤Linux内核裁剪及编译步骤Linux操作系统的内核是其最重要和核心的组成部分。
用户可以根据自己的需要对内核进行裁剪以减少内核代码的大小,以及支持特定的硬件和功能。
Linux内核的裁剪和编译步骤相对来说比较复杂,需要一定的技术和安装环境的支持。
下面将介绍Linux内核裁剪及编译的具体步骤,以供参考。
一、准备工作在开始进行Linux内核的裁剪及编译之前,需要进行一些准备工作。
首先,需要安装Linux操作系统的开发环境。
其次,需要下载Linux内核的源代码,可以从Linux 的官方网站或者其他开源社区下载。
二、配置内核选项安装好开发环境和下载好源代码之后,就可以开始进行内核的裁剪和编译了。
首先需要进行内核选项的配置。
可以使用make menuconfig命令进入配置界面。
在这个界面中,用户可以对内核进行不同程度的裁剪,包括去掉多余的硬件支持和功能选项。
在配置选项中,用户需要选择一些基本的配置选项,包括文件系统类型、设备驱动、协议栈、安全选项、虚拟化等。
用户可以根据自己的需要,进行选项的选择和配置。
三、编译内核在完成了内核的配置之后,下一步就是进行内核的编译。
可以使用make命令进行编译。
编译过程中需要耗费一定的时间和资源,因此建议在空闲时刻进行编译。
如果出现编译错误,需要根据错误提示进行排查和解决。
编译错误很可能是由配置选项不当造成的,因此要仔细检查配置选项。
四、安装内核编译完成后,就可以安装内核。
可以使用make install命令进行安装。
安装完成后,可以重启系统,以使新的内核生效。
在重启时,需要手动选择新的内核,可以选择自己编译的内核或者系统默认的内核。
五、总结对于不同的用户,对内核的需求和选择是不同的。
因此,在对内核进行裁剪时,需要根据自己的需求进行适当的选择,以提高系统性能和稳定性。
同时,在进行内核的编译时,也需要仔细检查配置选项和随时记录日志以便排除可能出现的问题。
嵌入式Linux内核裁剪和移植
![嵌入式Linux内核裁剪和移植](https://img.taocdn.com/s3/m/cfe51a12866fb84ae45c8d93.png)
嵌入式linux内核的裁剪和编译
具体配置菜单:(16/26)
• 15 、Plug and Play support 这是对PNP(即插即用)设备的支持.
IT Education & Training
26
嵌入式linux内核的裁剪和编译
12
嵌入式linux内核的裁剪和编译
具体配置菜单:(3/26)
• 3 、 system type 系统类型,主要是CPU 的类型。 S3C2410 的ARM 系列CPU
IT Education & Training
13
嵌入式linux内核的裁剪和编译
具体配置菜单:(4/26)
IT Education & Training
8
嵌入式linux内核的裁剪和编译
IT Education & Training
比如要对USB support进行选择,具体如下图所示: 直接编译进 内核 模块方式编 译进内核 不编译进内 核
9
嵌入式linux内核的裁剪和编译
IT Education & Training
第三步:键入make clean命令,删除已生成的模块和目标文 件,即在编译新内核之前清除干净环境; 第四步:键入make dep命令,编译变量依赖关系等; 第五步:键入make zImage 生成经压缩以后的内核映像文件 zImage ; 第六步:make modules ----编译模块; 第七步:make modules_install ----安装编译完成的模块; 注意:内核映像文件zImage存放在./arch/arm/boot/ 目录下
24
嵌入式linux内核的裁剪和编译
linux内核编译与裁剪
![linux内核编译与裁剪](https://img.taocdn.com/s3/m/d8242e29bd64783e09122b83.png)
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)。
一些新特性、实验性改进等都将首先在开发树中进行。
如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。
linux内核裁剪基本步骤
![linux内核裁剪基本步骤](https://img.taocdn.com/s3/m/5c46779a0342a8956bec0975f46527d3240ca69e.png)
linux内核裁剪基本步骤嘿,朋友们!今天咱就来聊聊 Linux 内核裁剪那些事儿。
你想想看啊,Linux 内核就像是一个超级大的宝库,里面啥都有,但咱有时候并不需要那么多东西呀,这时候就需要来一场“瘦身行动”啦!那怎么开始呢?首先,你得清楚自己到底要干啥。
就好比你要去旅行,你得知道自己想去哪儿,带啥东西,对吧?得明确自己的系统需要哪些功能,哪些是多余的。
这可不是随随便便就能决定的哦,得好好琢磨琢磨。
然后呢,就是了解内核的各种配置选项啦。
这就像你去超市买东西,得知道每个货架上都有啥呀。
这里面的门道可不少呢,什么驱动啊、模块啊,都得搞清楚。
可别小瞧了这些配置选项,它们就像是一个个小开关,决定着哪些功能会被启用,哪些会被关掉。
接下来,就是动手裁剪啦!这可真是个精细活儿,就跟雕刻大师在雕琢一件艺术品似的。
小心翼翼地去掉那些不需要的部分,留下精华。
这过程可得有耐心,不能着急,不然一不小心剪错了可就麻烦啦。
再之后,就是编译啦!把裁剪好的内核重新编译一下,让它变成适合你的那个独一无二的版本。
这就好比给你的系统穿上了一件量身定制的衣服,合身又舒适。
裁剪的过程中,你可能会遇到各种各样的问题。
哎呀,这就跟你走路会遇到小石子一样正常。
别慌,冷静下来慢慢解决。
也许会花费你一些时间和精力,但当你看到裁剪后的内核完美运行的时候,那种成就感,简直无与伦比!你说这是不是很有趣呢?就像给自己的电脑来了一次大改造。
而且通过裁剪内核,还能让系统运行得更高效、更稳定呢!总之呢,Linux 内核裁剪可不是一件简单的事儿,但也绝对不是什么难到登天的事儿。
只要你有耐心、有决心,再加上一点点技巧,肯定能把它搞定。
还等什么呢?赶紧去试试吧,让你的系统变得更加强大、更加适合你!。
Linux系统裁剪、自定义内核、busybox系统定制
![Linux系统裁剪、自定义内核、busybox系统定制](https://img.taocdn.com/s3/m/217e54c377a20029bd64783e0912a21615797f41.png)
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.2
Linux 源码阅读工具
俗话说“工欲善其事,必先利其器” ,面对几百兆的 Linux 内核代码,要阅读、查看或 者搜索其中的代码,大部分初次接触到 Linux 内核代码的开发人员,都有无从下手的感觉。 下面推荐几个源码阅读和索引工具,能为后续内核开发提供一些便利。 1.2.1 SourceInsight Source Insight 是 Windows 平台下一款流行度极高的源码阅读和编辑工具。不少 Linux 开发人员还是习惯于在 Windows 下进行源码编辑,甚至查看和编辑 Linux 内核源码,依然 在 Source Insight 中完成。 说明:Source Insight 是一款版权软件,需要自行解决版权问题。 安装 Source Insight 软件后,新建一个工程,取名并指定数据存放位置,如图 0.1 所示。
图 0.4 在 Source Insight 中阅读源码
1.2.2 Eclipse Eclipse 是一个跨平台 IDE,既能运行于 Windows 平台,也能在 Linux 下运行。不少习 惯于图形界面操作的开发人员,在 Linux 下则习惯于用 Eclipse 来查看和编辑 Linux 源码。 如果仅仅是在 Eclipse 中查看 Linux 内核源码,则可以不必事先安装交叉编译器,否则 则须事先安装好交叉编译器。 创建内核源码工程。点击 FileNewProject,开始创建工程,在工程创建界面选择创 建 C 工程,如图 0.5 所示。
图 0.8Vi/Vim 的函数列表侧栏
如果在本地桌面,用 Gvim 打开 C 文件,使用起来比较接近 IDE 集成环境。用鼠标双 击函数即可跳转到函数定义的地方,CTRL+鼠标右键即可回退到原来所在位置。更多实用 特性,还需要在实际操作中体验。 1.2.4 LXR LXR 是 Linux Cross Referencer 的缩写,是一个比较流行的 Linux 源码查看工具,当然 也不仅仅局限于查看 Linux 源码。LXR 的下载地址为:,参考该网站 的安装说明,很容易在本机搭建一个本地 LXR 用于源码查看。 如果不想搭建本地 LXR,可以直接浏览已经搭好的 LXR 网站,推荐两个网站:一个是 开源中国网站提供的 Linux 源码在线阅读 ,另一个是 网站,前者速度较快,但是提供的 Linux 内核版本较少,后者则 提供的版本较多。网站提供了源码阅读、关键字搜索和自由文本搜索功能。两者的网页快照 分别如图 0.9 和图 0.10 所示。
图 0.1 新建工程
点击 OK 按钮,进入工程设置界面,如图 0.2 所示。
图 0.2 工程设置
然后添加源码。浏览选中 Linux 内核源码文件夹后,点击“Add Tree”按钮,将内核源 码树的全部文件添加到工程中,如图 0.3 所示。
图 0.3 添加内核源码
添加完成,即可在 Source Insight 中进行源码阅读和编辑了,如图 0.4 所示。
Linux 内核裁剪和定制
1.1 Linux 内核开发简介
这里所说的“Linux 内核开发”仅仅是指嵌入式 Linux 产品开发中内核和驱动相关开发 工作,与 Linus 所领导的内核开发团队的内核开发有很大不同。 产品开发中对内核进行二次开发,需要开发人员具备如下一些基本技能和背景知识: 具备操作系统的基本知识,理解操作系统原理,最好了解 Linux 操作系统; 内核绝大部分都是 C 语言编写的,C 语言是必备技能; 内核是用 GNU C 编写的, 尽管符合 ISO C89 标准, 但还是使用了一些 GNU 扩展, 所以对 GNU C 的一些扩展也必须有所了解; 对 Linux 内核源码基本分布有大致了解; 产品级的内核开发通常还包括一些内核驱动工作, 对外设工作原理和驱动编写也必 须有一定的了解。
图 网页快照
图 网页快照
$ sudo apt-get install exuberant-ctags
3. 源码阅读和跟踪 进入准备查看的源码所在目录,首先生成 tags 文件:
$ ctags -R
执行时间长短取决于源码数量的多少, 执行完毕, 在当前目录下可看到一个 tags 文件。 源码越多,执行时间越长,产生的 tags 文件也越大。 注意:如果修改了源码,代码行号发生了变化,需要重新生成 tags 文件。 (1)查看函数等定义。用 Vi/Vim 打开一个 C 文件。若想知道某个函数、变量、结构 或者宏定义在什么地方定义,先将光标移动到函数(变量、结构或者宏定义)上,然后按 CTRL+]即可。查看后,按 CTRL+o 可回到原来所在位置。 (2) 查看文件函数列表。 打开 C 文件后, 在 Vi/Vim 的命令状态下输入:TlistToggle (Vi/Vim 的命令输入支持补全) , 在 Vi/Vim 左边就会出现函数列表侧栏, 如图 0.8 所示。 按 CTRL+ww (2 次 w) ,可在列表和代码查看区间切换。
图 0.5 创建 C 工程
点击 Next, 在 C Project 界面的 Project name 栏中填写工程名称, 去掉 “Use default location” 的勾, 点击 Browse 将 Location 设置为 Linux 内核源码目录, 如图 0.6 所示。 如果不在 Eclipse 中编译内核,则使用 Linux GCC 即可,否则请使用安装好的 Cross GCC。
图 0.6 导入 Linux 内核源码
然后点击 Finish, 完成 Linux 内核源码导入, 在 Eclipse 中即可进行代码阅读和编辑了, 如图 0.7 所示。图 0Βιβλιοθήκη 7 在 Eclipse 中浏览内核源码
在 Eclipse 中进行源码跟踪,只需选择函数、变量或者宏定义后按 F3 即可。更多的操作 可在 Navigate 中找到。 1.2.3 vim+ctags+cscope Vi/Vim 是一个文本编辑器,在 Vim 中能高效的实现代码编辑。但 Vim 的功能不仅仅是 一个文本编辑器,借助 ctags 和 cscope 的配合,Vim 能实现堪比图形 IDE 环境的源码编辑和 阅读功能,在某种程度上甚至比图形 IDE 更方便。 Vi/Vim 的安装不再介绍了。如果不是通过远程登录在远程服务器上工作,而是在本地 桌面系统操作,还可以用 gvim 启动 Vi 编辑器。 1. Taglist Taglist 是 Vim 的一个源码浏览插件,可从 网站获得。下载到压缩包 后,在本地解压,然后将解压得到目录中的 plugin 目录复制到~/.vim 目录。如果用户主目录 下没有.vim 目录,则建立一个这样的目录即可。 2. Ctags Ctags 是一个用于产生 tags 文件的软件,可以下载源码进行编译安装,在 Ubuntu 下, 可通过 apt-get 进行安装: