Linux内核裁剪实例

合集下载

linux内核裁剪

linux内核裁剪

《Linux操作系统》实验报告
实验序号:实验项目名称:内核裁减
1 在虚拟机上裁减系统内核
1)检查编译器的版本
进入系统内核源代码目录查看
删除过时的目标文件
使用X图形来运行系统内核,此方法采用图形窗口按钮进行人机交换
配置完成后,保存并退出:
2)编译新内核
A.执行make dep 命令
B.执行make clean 命令
运行以上两条命令没有出现错误,则执行命令make bzImage,生成一个全新内核
查看产生的bzImage文件
运行命令make modules
运行命令make modules_install
3)使用新内核启动系统
备份正在使用的系统内核
因为要用GRUB配置文件启动,必需修改grub.conf文件
重新启动。

linux实验四内核裁减和编译实验报告

linux实验四内核裁减和编译实验报告

实验四内核裁减和编译一、实验目的1.了解和掌握内核源代码的目录结构;2.了解内核系统配置方式,了解Makefile和config.in脚本文件的作用;3.了解内核各项内容;4.熟悉make命令的使用。

二、实验环境预装redhat9.0(内核版本2.4.x)的PC机一台,XScale嵌入式实验箱一台(已构建嵌入式linux系统),以太网线一根,交叉编译工具链。

三、实验步骤①察看和了解Linux内核的目录及内容;②察看和了解Linux内核的Makefile文件及作用;③察看和了解Linux内核的config.in文件及作用;④使用menuconfig或xconfig察看内核编译选项及作用;⑤开关某些编译选项,自己裁剪一个Linux内核;A.[root @localhost ~]# cd XSBASE/xsbase/Kernel/2.4.18-rmk-pxal-XSBASE[root @localhost 2.4.18-rmk-pxal-XSBASE]# make menuconfigB.设置开发板上的鼠标不能操作。

进入Input Core device,然后敲空格键,取消屏幕上的鼠标操作。

退出时并保存。

C.[root @localhost 2.4.18-rmk-pxal-XSBASE]# make dep[root @localhost 2.4.18-rmk-pxal-XSBASE]# make zImage[root @localhost 2.4.18-rmk-pxal-XSBASE]# cd arch/arm/boot/[root @localhost 2.4.18-rmk-pxal-XSBASE]# cp zImage /tftpD.启动mini终端。

XSBase255> boot[root @XSBASE /root]$ tfp 192.168.0.77ftp>cd /ftp>get /tftp/zImageE.这个时候在重启板子一下,板子就不能执行触摸屏上的鼠标操作了。

linux cut分割数据的方法df -h -回复

linux cut分割数据的方法df -h -回复

linux cut分割数据的方法df -h -回复Linux中的cut命令是一种非常有用的工具,可以用来分割文本文件或者数据流。

它可以根据指定的字段或者字符位置来切割数据,提取我们所需的信息。

本文将详细介绍cut命令的使用方法,并通过实例演示如何使用cut命令来进行数据分割。

首先,我们需要了解cut命令的基本语法和用法。

其基本语法如下:cut [选项] [文件]选项表示我们要使用的一些参数,文件表示我们要处理的数据源文件。

cut命令的一些常用选项包括:- `-c, characters=LIST`:根据字符位置来切割数据。

- `-f, fields=LIST`:根据字段位置来切割数据。

字段是以分隔符分隔的数据。

- `-d, delimiter=DELIM`:指定字段分隔符,默认为制表符。

- `-s, only-delimited`:只保留包含字段分隔符的行。

我们首先来看一个简单的使用案例。

假设我们有一个名为data.txt的文本文件,包含了一些学生的信息,每行的字段之间是以逗号分隔的。

我们想要提取每行的第二个字段,可以使用以下命令:cut -d ',' -f 2 data.txt上述命令中,`-d ','`表示以逗号作为分隔符,`-f 2`表示提取第二个字段,`data.txt`表示要处理的文件。

命令执行后,将输出所需的第二个字段。

除了提取字段信息外,我们还可以使用cut命令提取指定字符位置的数据。

假设我们有一个名为data.txt的文本文件,其中包含了一些学生的成绩信息,每行的前5个字符表示学号,我们想要提取每行的前5个字符,可以使用以下命令:cut -c 1-5 data.txt上述命令中,`-c 1-5`表示提取第1到5个字符,`data.txt`表示要处理的文件。

命令执行后,将输出所需的前5个字符。

在有些情况下,我们可能需要从数据中提取不连续的字段或字符位置。

使用cut命令在Linux中快速剪切和提取文本

使用cut命令在Linux中快速剪切和提取文本

使用cut命令在Linux中快速剪切和提取文本在Linux操作系统中,有许多命令可以帮助我们操作和处理文本文件。

其中一个非常实用的命令是cut命令。

cut命令可以帮助我们快速剪切和提取文本中指定的字段或列,非常适合处理大型数据文件或日志文件。

本文将介绍cut命令的基本用法和一些常见的应用示例。

1. 基本的cut命令用法cut命令的基本用法非常简单,格式如下:```shellcut [选项] 文件名```其中,选项可以是以下几种:- `-c`:指定需要剪切的字符范围或字符位置- `-f`:指定需要剪切的字段范围或字段位置- `-d`:指定字段的分隔符,默认为制表符(tab)例如,我们有一个名为file.txt的文本文件,内容如下:```shellapple orange banana```如果我们要提取这行文本中的第一个字符,可以使用以下命令:```shellcut -c 1 file.txt```运行结果:```shella```类似地,如果我们要提取第二个字符到第四个字符,可以使用以下命令:```shellcut -c 2-4 file.txt```运行结果:```shellppl```2. 使用cut命令提取指定字段在实际的文本处理中,我们常常需要提取文本中的某些字段。

cut 命令可以帮助我们快速实现这一需求。

假设我们有一个名为data.txt的数据文件,内容如下:```shellTom,18,MaleJessica,22,FemaleAlex,15,Male```这是一个以逗号分隔的数据文件,每行都包含姓名、年龄和性别等字段。

如果我们只想提取其中的姓名字段,可以使用以下命令:```shellcut -d ',' -f 1 data.txt```运行结果:```shellTomJessicaAlex```在这个命令中,我们使用了`-d ','`选项来指定逗号为字段的分隔符,`-f 1`表示提取第一个字段。

linux ko裁剪方法

linux ko裁剪方法

linux ko裁剪方法【原创实用版2篇】目录(篇1)1.Linux KO 裁剪方法的背景和意义2.Linux KO 裁剪方法的具体步骤3.Linux KO 裁剪方法的优点和局限性4.结论正文(篇1)1.Linux KO 裁剪方法的背景和意义Linux KO(Kernel Organization)是指 Linux 内核组织,负责维护Linux 内核的开发和发布。

Linux KO 裁剪方法是指在内核开发过程中,对不需要的代码进行裁剪,以减小内核的大小,提高系统的性能和稳定性。

这对于嵌入式系统、实时操作系统等对系统资源有限制的场景具有重要意义。

2.Linux KO 裁剪方法的具体步骤(1)熟悉内核结构:在进行裁剪之前,需要对 Linux 内核的结构有一定的了解。

Linux 内核主要分为核心(kernel)、驱动(driver)、系统调用(system call)、模块(module)等部分。

(2)确定裁剪目标:根据系统的需求,确定需要裁剪的功能模块。

例如,对于嵌入式系统,可能不需要支持所有网络协议,因此可以裁剪掉不需要的网络驱动。

(3)查找并删除相关代码:在确定裁剪目标后,查找相应的代码并在内核源码中进行删除。

这一步需要对内核代码有一定了解,以避免误删其他功能模块的代码。

(4)重新编译内核:完成代码裁剪后,重新编译内核,生成新的内核镜像文件。

(5)测试和调试:将新的内核镜像文件刷入目标系统,进行功能测试和性能测试。

如果发现问题,需要进行调试和修复。

3.Linux KO 裁剪方法的优点和局限性优点:通过 Linux KO 裁剪方法,可以减小内核的大小,降低系统资源的占用,提高系统的性能和稳定性。

此外,裁剪后的内核更加精简,便于维护和升级。

局限性:Linux KO 裁剪方法需要对内核代码有一定了解,对于新手来说,学习成本较高。

同时,裁剪过程中可能出现误删代码、编译失败等问题,需要具备一定的调试能力。

此外,裁剪后的内核可能会导致某些功能的缺失,需要根据实际需求进行权衡。

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;。

学习嵌入式之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中cut命令的使用

Linux中cut命令的使用
-d, --delimiter=DELIM:指定字段分隔符。
-s, --only-delimited:仅显示包含分隔符的行。
--complement:显示未被切割的部分。
下面是一些示例用法:
1.切割文件的指定
这将提取文件file.txt中每行的第1到第5个字符。
2.按字段切割文件:
复制代码
cut-f2,4-d ',' file.csv
这将按逗号作为分隔符,提取文件file.csv中的第2和第4个字段。
3.显示未被切割的部分:
复制代码
cut -f2--complement-d','file.csv
这将提取文件file.csv中除第2个字段外的所有字段。
这只是cut命令的一些基本用法示例,你可以通过查看man cut命令来获取更多详细的使用说明和选项。
在Linux中,cut命令用于从文件或标准输入中提取文本的指定部分。它可以按列、字符或字段进行切割。
cut命令的基本语法如下:
复制代码
cutOPTION... [FILE]...
常用的选项包括:
-c, --characters=LIST:按字符位置切割。
-f, --fields=LIST:按字段切割。

Linux内核裁剪与编译

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

一、嵌入式Linux内核裁剪与系统构建实验

一、嵌入式Linux内核裁剪与系统构建实验

嵌入式Linux内核裁剪与系统构建实验一、实验目的1、了解linux内核裁减过程,掌握内核的编译方法及在开发板下如何运行一个内核。

2、学会基于busybox的根文件系统的制作。

3、熟悉开发板及uboot的使用。

二、实验条件✓IBM-PC兼容机✓Redhat9.0或其他兼容的Linux操作系统✓OMAP3730开发板三、实验原理1、linux内核裁减编译://见教材6.3.2 (第一版p126-p130,第二版p143-p147)2、基于busybox根文件系统制作:见教材6.3.3 (第一版p131-p136,第二版p148-p154)3、Uboot使用:参照附录一4、内核裁剪编译参考步骤:参照附录二5、根文件系统制作参考步骤:参照附录三6、在开发板OMAP3730下运行内核参考步骤:参照附录四7、OMAP3730开发板:四、实验内容与实验步骤1、内核裁减编译。

2、基于busybox,制作根文件系统。

3、在开发板上运行自己裁减过的内核和文件系统。

备注:本实验默认在ubuntu下进行,在其他版本的linux中操作基本类似。

实验中用到的软件包均可在xmu_omap3730_lib1.tar.gz中找到。

输入命令$ tar zxvf xmu_omap3730_lib1.tar.gz。

注:这里的$,包括下文的#均表示一种系统用户权限,前者表示普通用户,后者表示超级用户;在ubuntu下可在命令前追加sudo命令来使用超级用户权限,在fedora下可输入su命令后,按提示输入密码即可切换超级用户。

一般来说普通用户能做的超级用户均有权限做。

五、实验报告要求实验报告中要包含以下几个部分:1、实验目的2、实验条件3、实验原理4、实验步骤分析5、实验结果与总结实验步骤要详细,关键步骤要有截图,运行结果也要有截图。

内核配置要求列出选择的内核配置选项,并说明它的功能。

说明编译出来的内核文件uImage大小附录一u-boot命令简介:printenv 用来打印u-boot中正在使用的所有环境变量(包括未保存的),可不带参数setenv 用来设置一个环境变量,参数用空格隔开。

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:。

linux ftruncate 例子

linux ftruncate 例子

linux ftruncate 例子
ftruncate是一个在Linux 中用于调整文件大小的函数。

以下是一个简单的例子,展示如何使用ftruncate来改变一个文件的大小:
c
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
int main() {
int fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
if (fd == -1) {
perror("open");
return1;
}
// 写入一些数据以增大文件大小
const char* data = "Hello, World!";
write(fd, data, strlen(data));
// 将文件大小截断为 5 个字节
if (ftruncate(fd, 5) == -1) {
perror("ftruncate");
close(fd);
return1;
}
close(fd);
return0;
}
在这个例子中,我们首先打开一个文件(如果它不存在,则创建它)。

然后,我们写入一些数据以增大文件的大小。

最后,我们使用ftruncate将文件大小截断为 5 个字节。

如果ftruncate调用失败,我们会打印一个错误消息并退出程序。

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

Linux内核裁剪实例从零开始配置内核是不明智的,建议在某一个默认配置的基础上进行修改,以达到自己产品的实际需求。

裁剪和配置内核的基本原则:⏹基于某一个最接近的主板配置来修改;⏹必须的、能确定的选项选中;⏹不能确定的则不要改变原来配置;⏹可选可不选的,建议根据help信息决定或者不选;⏹一次改动不要太多,渐进式修改和验证;⏹注意及时备份配置文件,出现意外可以回退恢复。

下面给出一些常见功能的配置裁剪实例,很多功能与所采用的主板硬件相关,与其它不同主板的内核配置上不一定完全相同,但还是有一些参考意义。

1.1.1 GPIO子系统配置Linux 2.6以上内核引入了子系统,GPIO子系统将全部GPIO的操作接口都通过“/sys/class/gpio/”目录导出,非常方便用户使用。

输入下列命令,进入内核配置菜单:$ make ARCH=arm menuconfig在主菜单界面中选择“Device Drivers”:[*] Networking support --->Device Drivers --->File systems --->Kernel hacking --->进入“Device Drivers”界面,选择并进入“GPIO Support”:[*] SPI support --->PPS support --->PTP clock support-*- GPIO Support ---><*> PWM Support --->在“GPIO Support”中选中“/sys/cla ss/gpio…”:--- GPIO Support[*] /sys/class/gpio/... (sysfs interface)*** Memory mapped GPIO drivers: ***…配置后重新编译内核,使用新内核的系统即可通过“/sys/class/gpio/”访问系统的GPIO 了。

1.1.2 LED子系统配置Linux LED子系统提供了“/sys/class/leds/”的访问接口,启用LED子系统能很方便地操作系统的LED资源。

在“Device Drivers”配置界面,选中“LED Support”支持:<*> MMC/SD/SDIO card support ---><> Sony MemoryStick card support (EXPERIMENTAL) --->[*] LED Support --->[ ] Accessibility support --->进入“LED Support”子菜单,选中LED类支持和LED触发器支持,并根据需要设置触发器:--- LED Support[*] LED Class Support*** LED drivers ***...[*] LED Trigger support*** LED Triggers ***<*> LED Timer Trigger<*> LED Heartbeat Trigger<> LED backlight Trigger<*> LED GPIO Trigger<*> LED Default ON Trigger只要将系统的LED设备驱动添加到LED子系统中,即可通过“/sys/class/leds/”接口来进行访问。

1.1.3 串口配置串口是嵌入式Linux必不可少的外设,默认控制台通常就是串口,所以必须在内核中使能串口以及串口控制台支持。

在“Device Drivers”配置界面,选择“Character devices”:Input device support --->Character devices--->-*- I2C support --->进入“Character devices”配置菜单,选择“Serial drivers”:[*] /dev/kmem virtual device supportSerial drivers--->[ ] ARM JTAG DCC console进入“Serial drivers”,在配置界面进行串口控制器配置。

嵌入式Linux默认控制台是串口,所以还需使能串口控制台支持。

串口控制器与具体处理器相关,需要根据硬件进行选择,很多处理器移植代码会默认选中自身的串口驱动支持,例如EPC-28x,已经默认选中了“i.MXS Application serial port support”:<M> 8250/16550 and compatible serial support*** Non-8250 serial port support ***<*> i.MXS debug serial port support<*> i.MXS Application serial port support...1.1.4 USB Host驱动配置USB可以外接多种设备,不同设备的驱动配置也是不同的。

下面以常用的U盘、USB 鼠标键盘配置为例进行介绍。

1.使用U盘U盘在Linux系统下被认为是SCSI设备,所以必须在内核中选择支持SCSI。

在主菜单界面选择“Device Drivers”,进入设备驱动配置界面,选择“SCSI device support”:[*] Block devices --->[*] Misc devices --->SCSI device support ---><> Serial ATA and Parallel A TA drivers --->进入“SCSI device support”配置界面,进行如下配置:<> RAID Transport Class<*> SCSI device support<> SCSI target support[*] legacy /proc/scsi/ support*** SCSI support type (disk, tape, CD-ROM) ***<*> SCSI disk support<> SCSI tape support<> SCSI OnStream SC-x0 tape support然后在驱动中配置USB控制器。

进入“Device Drivers”,选中“USB support”:<> Sound card support --->[ ] HID Devices --->[*] USB support---><*> MMC/SD/SDIO card support --->进入“USB support”菜单,选中“Support for Host-side USB”,并根据处理器的控制器情况配置USB控制器。

下面是EPC-28x处理器USB控制器的配置:--- USB support<*> Support for Host-side USB[*] USB device filesystem (DEPRECA TED)[*] USB device class-devices (DEPRECA TED)[*] USB runtime power management (suspend/resume and wakeup)<*> EHCI HCD (USB 2.0) support[*] Support for Freescale controller[*] Support for Host1 port on Freescale controller[*] Support for DR host port on Freescale controller[*] Root Hub Transaction Translators使用U盘,必须使能USB大容量类支持,选中“USB Mass Storage support”:…<*> USB Mass Storage support[ ] USB Mass Storage verbose debug大多数情况下,U盘都在用FAT格式,为了能正常使用U盘,还需在内核中使能FAT 支持。

菜单路径和配置如下:File systems --->DOS/FAT/NT Filesystems ---><*> MSDOS fs support<*> VFA T (Windows-95) fs support(437) Default codepage for FAT(iso8859-1) Default iocharset for FAT<> NTFS file system support保存配置,重新编译内核,基于新内核的系统就能使用U盘了。

2.使用USB键盘和鼠标使用USB键盘或者鼠标,需要在内核中使能HID支持。

在“Device Drivers”菜单界面,选中“HID Devices”:<*> Sound card support --->[*] HID Devices--->[*] USB support ---><*> MMC/SD/SDIO card support --->进入“HID Devices”,选中“USB Human Interface Device (full HID) support”:--- HID Devices-*- Generic HID support[ ] /dev/hidraw raw HID device support*** USB Input Devices ***<*> USB Human Interface Device (full HID) support[ ] PID device support[ ] /dev/hiddev raw HID device supportSpecial HID drivers --->另外,还需使能Event支持。

在“Device Drivers”配置界面,选择“Input device support”:<> Telephony support --->Input device support--->Character devices --->-*- I2C support --->进入“Input device support”,选中“Event interface”:<> Joystick interface<*> Event interface<> Event debugging当然,还需要USB Host支持,参考前面“使用U盘”配置部分配置好USB控制器。

相关文档
最新文档