版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux内核裁剪培训第一页,共38页。整体过程1.需要准备的软件2.内核编译3.制作根文件系统4.创建Ramdisk5.编译Grub6.创建ISO第二页,共38页。1.需要准备的软件Grub,引导加载程序(BootLoader),我用的Grub版本是V0.93;BusyBox,目前有V1.00、V1.3.2、V1.10.4、V1.12.0、V1.14.1、V1.15.5等版本,我用的是V1.10.4;Linux内核,可以去网站上下载,我这里使用的是V2.6.31。根文件系统,包括根文件系统的架构,根文件系统的内容,根文件系统所采用的文件系统类型等等。第三页,共38页。2.内核编译2.1内核配置方式2.2内核配置选项2.3建立依赖关系2.4编译内核2.5建立并安装内核第四页,共38页。2.1内核配置方式在三种方式都可以进行内核配置(makeconfig或makeoldconfig、makemenuconfig和makexconfig)。makeconfig或makeoldconfig:这种方式不直观,而且容易出错,不建议使用。makemenuconfig:大多数据情况下使用这种方式,比较直观,建议使用这种方式。makexconfig:这是在XWindows图形界面下使用,也比较好用。不过它需要XWidnows的支持。第五页,共38页。2.2内核配置选项Linux内核配置选项很多,在这里就不一一介绍了,这里只说明我们需要用到的配置项,其它配置项使用缺省值即可。Eanbleloadablemodulesupport:该项必须选上,因为我们使用的是RAMDISK,其空间有限,所在,我们使用模块编译方式,当使用某个功能时,临时解压缩出来,使用完成后,再将其删除,这样可以节省磁盘空单。另外,象IDE这样的设备,在编译时不允许[*],只能以[M]方式编译。DeviceDrivers HIDDevices(HumanInterfacedevice) USBHumanInterfacedevice(fullHID)support:
我们要支持USB键盘和USB鼠标,所以这个选项目须[M]上。USBsupport EHCIHCD(USB2.0)support
支持USB设备(如:USB移动硬盘)。 OHCIHCDsupport
支持USB设备(如:USB移动硬盘)。 UHCIHCD(mostinterandVIA)support
支持USB键盘。 USBmassstoragesupport
我们要在系统运行期,动态MountUSB移动设备,该选项必须[M]上。 ATA/ATAPI/MFM/RLLsupport我们的ISO启动系统运行在PC机上,而大多数PC机使用的是IDE硬盘(一般服务器系统才使用SCSI硬盘设备),我们可以在启动系统中使用外部应用程序进行硬盘的操作。SCSIdevicesupport SCSIdevicesupport
在Linux系统中,USB移动磁盘被虚拟成SCSI设备,我们系统需要读到USB磁盘上的信息。所以该选项需要[M]上。 SCSIdisksupport SCSI磁盘设备支持,虽然我们系统中没有用到物理上的SCSI设备,但还是[M]上吧。 SCSIgenericsupport
通用的SCSI设备支持。第六页,共38页。2.3建立依赖关系这一步一个命令makedep就可以搞定。内核源码树中大多数文件都会与一些头文件有依赖关系,makedep期间会在内核源码树中每个子目录下面产生一个隐藏的.depend文件。此文件内包含子目录里面各文件所依赖的头文件清单。第七页,共38页。2.4编译内核makebzImageormakezImage。注意bzImage和在zImage都是经gzip算法压缩过的内核映像,所不同的是在zImage的大小无法超过500KB,而bzImage则没有这个限制,如果映象建立过程中有错误,一个就是你的内核配置不正确,还有一个可能就是需要makemrproper来消除上一次的编译记录,makemrproper之后内核源码相当于刚安装时候的状态。第八页,共38页。2.5建立并安装内核makemodules&makemodules_install。注意模块的默认安装位置是/lib/modules目录下,目录名即是你的内核版号,如果/lib/modules目录下有一个相同的内核版本号目录,如果很重要的话你最好把它备份,因为会被新的覆盖。至此内核以及相应的模块已经建立好了。第九页,共38页。3.制作根文件系统3.1根文件系统的基础结构3.2建立根文件系统3.3建立设备文件3.4制定应用程序3.5系统配置文件3.6初始化脚本第十页,共38页。3.1根文件系统的基础结构目录
内容bin必要的用户命令(二进制文件)boot引导加载程序使用的静态文件dev设备文件和其它特殊文件etc系统配置文件,包括启动文件home用户主目录lib必要的连接库,例如C连接库,内核模块mnt安装点,用于暂时安装文件系统opt附加的软件套件proc用来提供内核与进程信息的虚拟文件系统rootroot用户的主目录sbin必要的系统管理员命令(二进制文件)tmp暂时性的文件usr在第二层包括对大多数用户都有用的大量应用程序和文件(包括库文件)var监控程序和工具程序所存放的可变数据第十一页,共38页。3.2建立根文件系统(一)对于ISO启动盘上的linux来说,用户的权限问题并不复杂,我们只需要设置一个超级用户以及其它系统服务必要的帐户即可,由于相当于是单用户,因此home目录也可以不要,其它的目录在我看来都是必要的,下面我们开始建立根文件系统的基本结构。#cd/mnt/rootfs#mkdirbinsbindevetclibroottmpusrvarprocoptmnt#mkdirusr/{bin,sbin,lib,share}#mkdirvar/{lock,log,run,empty}第十二页,共38页。3.2建立根文件系统(二)一般二进制命令可以存放的目录包括bin,sbin,usr/bin,usr/sbin,它们有什么区别呢?二进制文件放在哪个目录,这与它在系统中所扮演的角色密切相关,如果这是普通用户和系统管理员必备的二进制文件(比如ls和mkdir等),就会放在bin目录下,如果只是系统管理员所具有的一些特权指令(普通用户使用这些指令有限制,如ifconfig),那么它应该放在sbin目录下,usr/bin目录下存放的是普通用户和管理员"不常用"的命令,而usr/sbin目录下是管理员"不常用"的命令。上面已经说过我们不需要区分普通用户和系统管理员(root),因此我们只需创建一个系统管理员帐号就可以了,但是这里为什么我们还要创建这四个目录呢?是因为我们用到busybox套件,下面说明安装定制应用程序的时候会讲到。下面我们把刚才建立的内核模块拷贝到lib目录下(注:以后我们所有的操作都是以/mnt/rootfs为根操作的)
#mkdirlib/modules#cp–dpR/lib/modules/2.4.20-8customlib/modules第十三页,共38页。3.3建立设备文件(一)依照unix的传统,在Linux系统中任何对象(包括设备)都可以视为文件,在Linux系统中所有的设备文件都放在dev目录下面,建立设备文件通常有两种方法,一个是直接把宿主机上面的拷贝过来(拷贝的时候需要加上dpR参数),另外一种方法就是自己手工用mknod创建(注意这两种方法都需要root权限)。
一般情况下我们都是使用第一种方法,但是这里面为了便于大家更深入的理解设备文件,我使用第二种方法来创建。首先来看如何使用mknod命令来创建特定的设备文件。
#cddev#mknod-m666nullc13
上面这条命令创建了null设备,-m参数指定所创建设备的基本权限,null是设备名称,c代表是字符设备,相应的块设备用b表示,1是主编号,3是次编号。第十四页,共38页。3.3建立设备文件(二)我们这里需要建立的dev条目如表格所示:文件名说明类型主编号次编号权限位mem物理内存存取字符设备11600console系统控制台字符设备51600urandom真随机数产生器字符设备18644nullnull(黑洞)设备字符设备13666zero以nullbyte(零值字节)为数据来源字符设备15666tty现行的tty设备字符设备50666tty0现行的虚拟控制台字符设备40600tty1第一个虚拟控制台字符设备41600ptyp0firstpseudo-ttymaster字符设备20666ttyp0firstBSDpseudo-ttyslave字符设备30666ram0第一块ram盘块设备10640hda主IDE硬盘(或者光盘)块设备30660hda1上述主盘的第一个分区块设备31660hdb从IDE硬盘(或者光盘)块设备364660hdb1上述从盘的第一个分区块设备365660sda第一块scsi盘的整个盘块设备80660sda1第一块scsi盘的第一个分区块设备81660sdb第二块scsi盘的整个盘块设备816660sdb1第二块scsi盘的第一个分区块设备816660fd0第一个软盘设备块设备20660第十五页,共38页。3.4制定应用程序这个是个大头,但是由于一般的发行版自带的应用程序都很庞大,而且应用程序依赖的动态链接库也大的出奇,所以就有人想出很多办法,其中busybox在这方面做的非常的好,目前busybox在嵌入式方面应用非常广泛,BusyBox真如其名,它把所有的应用程序集成在一个命令里面,目前BusyBox支持unix/linux命令集里面的大部分命令,包括基本的命令cp,cd,chmod,chown,date,cat,ar等,编辑工具vi,awk等,网络工具ifconfig,netstat,route,telnet,,,telnetd等,模块工具lsmod,insmod,rmmod,modprobe,压缩解压缩工具gzip,gunzip,tar,bzip,bunzip,zip,unzip等,查找工具find,grep,xargs,init工具init,poweroff,halt,reboot,帐号密码管理工具addgroup,delgroup,adduser,deluser,getty,login,shadow,进程相关工具free,kill,killall,top,ps等,其它的last,fdisk,dmesg,swapon,s等等都有,另外,BusyBox还提供几个shell,我们一般用ash,它和bash非常的相似。第十六页,共38页。3.4.1BusyBox配置首先到网上下载一个稳定的BusyBox版本,我用的版本是busybox-1.10.4,然后解压到工作目录下。busybox的配置方法和标准的linux内核的配置方法非常相似,我们只要切换到busybox的根目录下,使用makemenuconfig就会轻松定制出适合特定用途的一组应用程序。#makemenuconfig#make#makeinstall
注意busybox默认是安装到根目录下的_install文件文件夹。#cd_install#ls
你会发现bin目录下只有一个busybox二进制文件,其它的命令,bin,sbin以及usr/bin,usr/sbin目录下的都是指向busybox的链接文件。这么多命令一个应用程序就搞定了,我们看看busybox有多大:#du-kbin/busybox625第十七页,共38页。3.4.2安装BusyBox到根文件系统在busybox的根目录下编译好二进制程序之后运行:#makeinstallPREFIX=/mnt/roofsbusybox安装好之后,看看它依赖的动态链接库#lddbusyboxlibm.so.6=>/lib/tls/libm.so.6(0x40026000)libcrypt.so.1=>/lib/libcrypt.so.1(0x40048000)libc.so.6=>/lib/tls/libc.so.6(0x42000000)/lib/ld-linux.so.2=>/lib/ld-linux.so.2(0x40000000)
#cd/mnt/rootfs#cdlib#cp–dpR/lib/libc-2.3.2.so./#cp–dpR/lib/libc.so.6./#cp–dpR/lib/libm*./#cp–dpR/lib/libcrypt-2.3.2.so./#cp–dpR/lib/libcrypt.so.1./#mkdirtls#ln–slibc-2.3.2.sotls/libc.so.6#ln–slibm-2.3.2.sotls/libm.so.6第十八页,共38页。3.4.3BusyBox的初始化除了基本的命令之外,BusyBox还支持init功能,如同其它的init一样,busybox的init也是完成系统的初始化工作,关机前的工作等等,我们知道在Linux的内核被载入之后,机器就把控制权转交给内核,linux的内核启动之后,做了一些工作,然后找到根文件系统里面的init程序,并执行它,BusyBox的init进程会依次进行以下工作:(参考<<构建嵌入式LINUX系统>>p201)为init设置信号处理过程初始化控制台剖析/etc/inittab文件执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcS执行所有导致init暂停的inittab命令(动作类型:wait)执行所有仅执行一次的inittab(动作类型:once)
一旦完成以上工作,init进程便会循环执行以下进程:执行所有终止时必须重新启动的inittab命令(动作类型:once)执行所有终止时必须重新启动但启动前必须询问用户的inittab命令(动作类型:askfirst)第十九页,共38页。3.5系统配置文件3.5.1/etc/init.d/rcS文件3.5.2/etc/fstab文件3.5.3/etc/mtab文件3.5.4/etc/profile文件3.5.5/etc/ld.so.conf与/etc/ld.so.cache文件3.5.6/etc/passwd,/etc/shadow,/etc/group文件3.5.7/etc/services文件3.5.8/etc/nsswitch.conf文件3.5.9/etc/hosts,/etc/host.conf,/etc/resolv.conf文件3.5.10/etc/syslog.conf文件第二十页,共38页。3.5.1/etc/init.d/rcS文件配置文件一般放在/etc/目录下,init初始化命令行的文件是/etc/init.d/rcS,下面是我的rcS文件:#!/bin/sh/bin/mount-av/etc/init.d/rc.usb/etc/init.d/rc.idestart/bin/mount/dev/had/mnt/etc/init.d/rc.local#endmount-av挂载所有在/etc/fstab里面列出的文件系统;依次执行rc.usb(加载usb模块),rc.idestart(加载IDE驱动),rc.local(执行本地的一些服务)。第二十一页,共38页。3.5.2/etc/fstab文件上面使用mount命令的时候已经涉及到了fstab文件,下面是我的fstab文件:/dev/ram0 /
ext2 defaults 0 0Proc /
proc proc defaults
0 0关于fstab配置文件的语法可以manfstab第二十二页,共38页。3.5.3/etc/mtab文件这个文件里面的内容是动态变化的,当mount一个文件系统的时候,如果mount没有加上-n参数,那么安装信息就会写入mtab文件,df命令读取的就是这个文件。第二十三页,共38页。3.5.4/etc/profile文件这个文件是sh用的,当用户获得一个shell后,sh就会根据这个文件配置用户的登陆环境,下面是我的profile文件。echoecho-n"Processing/etc/profile..."
PATH=/bin:/sbin:/usr/bin:/usr/sbinexportPATHecho"Done"echo其中PATH环境变量指定当用户键入一个命令时,sh寻找这个命令的路径。其它的export命令,alias命令不用说了吧,busybox里面的ash和bash非常相似,因此只要熟悉bash就会不成问题。第二十四页,共38页。3.5.5/etc/ld.so.conf与/etc/ld.so.cache文件这两个文件是与lib库有关的,它们用来指定应用程序寻找lib库的路径。我的ld.so.conf文件内容如下:/lib/usr/lib/usr/local/lib
ld.so.cache里面的内容是由是ldconfig命令生成的,ldconfig根据ld.so.conf配置文件生成ld.so.cache里面的内容,应用程序读取的是ld.so.cache文件,因此如果变动了ld.so.conf文件,需要运行一次ldconfig才能是新的配置生效,另外如果新加了lib库文件,也需要ldconfig。第二十五页,共38页。3.5.6/etc/passwd,/etc/shadow,/etc/group文件group里面存放的是用户组的信息,我的group文件内容如下:root:x:0:root:passwd里面存放的是用户的信息,我的passwd文件内容如下:root:x:0:0:root:/root:/bin/shUser:/var/sshd:x:74:74:piviledge-separatedSSH:/var/empty/sshd:/sbin/nologin注意,group和passwd里面的每一行都不是多余的。shadow文件是pam认证用到的密码存放文件第二十六页,共38页。3.5.7/etc/services文件网络应用程序用到的标准服务端口映射表,我的services文件如下:tcpmux 1/tcptcpmux 1/udp 20/tcpftp 21/tcpssh 22/tcpssh 22/udptelnet 23/tcpnameserver 42/tcpnamesyslog 514/udpauth 113/tcpauthenticationtapident因为我需要开启sshd,syslogd服务,同时会使用ftp,ssh,telnet应用程序。所以就会加上上面的东西,但是注意并不是所有的网络应用程序都会依赖与services文件,比如telnet,但是也许telnetd需要。第二十七页,共38页。3.5.8/etc/nsswitch.conf文件这个文件的作用很大,没有它很多程序都不能正常运行,关于它的具体作用还是用mannsswitch.conf看看吧。我的nsswitch.conf文件内容如下:passwd:filesshadow:filesgroup:fileshosts:filesdnsethers:filesnetmasks:filesnetworks:filesprotocols:filesservices:filesnetgroup:filespublickey:filesautomount:filesaliases:files注意hosts这一行一定要加上dns,不然即使有resolv.conf文件,域名也不能解析,注意nsswitch.conf是对应一组lib库的,这里我们用了files,dns,因此需要拷贝相应的lib库到/lib目录下.#cd/mnt/rootfs#cp-dpR/lib/libnss_files*./lib#cp-dpR/lib/libnss_dns*./lib第二十八页,共38页。3.5.9/etc/hosts,/etc/host.conf,/etc/resolv.conf文件我的hosts文件内容如下,不用说也应该清楚什么意思了,不清楚的manhosts。localhost:localdomainlocalhost
host.conf和resolv.conf是域名解析的时候用到的配置文件,其中resolv.conf里面是域名服务器的ip地址,host.conf里面放的是主机的查找规则。不了解的还是manhost.conf和manresolv.conf。我的host.conf与resolv.conf文件内容分别如下:host.conf:orderhosts,bind
resolv.conf:nameserver31第二十九页,共38页。3.5.10/etc/syslog.conf文件syslogd服务程序读取的配置文件。我的文件内容如下:#Logallkernelmessagestotheconsole.#Loggingmuchelsecluttersupthescreen.#kern.*/dev/console#Loganything(exceptmail)oflevelinfoorhigher.#Don'tlogprivateauthenticationmessages!*.info;mail.none;authpriv.none;cron.none/var/log/messages
#Theauthprivrestrictedaccess.authpriv.*/var/log/secure
#Savebootmessagesalsotoboot.loglocal7.*/var/log/boot.log第三十页,共38页。3.6初始化脚本3.6.1/etc/init.d/rc.usb文件3.6.2/etc/init.d/rc.ide文件3.6.3/etc/init.d/rc.local文件第三十一页,共38页。3.6.1/etc/init.d/rc.usb文件(一)加载usb驱动模块,当然如果你的内核是静态编译进usb模块的,那就没有必要在这里多此一举了。以节省ramdisk的存储空间,所以还是需要内核识别u盘,等系统启动之后再把需要的东西从u盘拷贝到ram里面。rc.usb内容如下:
#!/bin/sh##Thisscriptistoinitilizeusbcontrollerand##Thedrivermoduleusb-storage##Touseusbunderlinuxthemodulecore,scsi_mod##andsd_modareneeded,inthis##systemtheyarecompliedinkernel#/sbin/usbisthesmallscripttostartorstopusbsupport/sbin/usbstart#scriptrc.usbend这个脚本里面用到了/sbin/usb这个程序,其实并不是一个真正的程序,它是我写的一个加载和卸载usb模块的shell脚本。/sbin/usb脚本内容如下:第三十二页,共38页。3.6.1/etc/init.d/rc.usb文件(二)#!/bin/sh##Asimplestartupscripttostartusbforlinux#
case"$1"in start) /sbin/modprobeusbcore /sbin/modprobeusbhid /sbin/modprobeehci_hcd /sbin/modprobeuhci_hcd /sbin/modprobeohci_hcd /sbin/modprobeusb-storage ;;
stop) /sbin/rmmodusbcore /sbin/rmmodusbhid /sbin/rmmodehci_hcd /sbin/rmmoduhci_hcd /sbin/rmmodohci_hcd /sbin/rmmodusb-storage ;; *) echo"Usage:$0{start|stop}" exit1 esac#script/sbin/usbend第三十三页,共38页。3.6.2/etc/init.d/rc.ide文件加载IDE硬盘设备脚本,在LinuxKernel2.6.31中,IDE是以模块的方式编译的(即:无法[*]),所以,必须外部加载后,才能驱动IDE硬盘设备。我的rc.ide脚本如下:
#!/bin/sh#Asimplestartupscripttostarti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第8课 保存资料教学设计小学信息技术人教版一 二年级起点二年级下册-人教版(一、二年级起点)
- 人教新目标 (Go for it) 版九年级全册Unit 5 What are the shirts made ofSection A第2课时教案设计
- 第1节 网站的创建教学设计初中信息技术河大版2012第二册-河大版2012
- 2026年小学数学应用题解题策略与解析及答案试题
- 嘉兴2025年嘉兴市卫生健康委员会直属单位招聘高层次人才(非卫技)(第一批)笔试历年参考题库附带答案详解(5卷)
- 第四节 粒子物理简介教学设计高中物理选择性必修第三册沪科版(2020·上海专用)
- 第10节 生活垃圾分类调查(一)-设计调查问卷与收集数据教学设计初中信息技术湘电子版2019七年级下册-湘电子版2019
- 2026年押题宝典县乡教师选调考试《教育学》题库带答案详解(能力提升)
- 2025年注册消防工程师之《消防安全技术实务》通关练习题和答案及参考答案详解(培优a卷)
- 2025年注册岩土工程师之《岩土基础知识》检测卷包附参考答案详解(基础题)
- 2025年人教版小学二年级下册奥林匹克数学竞赛测试考试题(附答案解析)
- 英语专四英语作文范文背诵模板50篇英语专业四级写作
- 公司二道门管理制度
- Ni-Mn-Sn-Ti记忆合金马氏体相变特性研究
- 《正方形的性质》教学课件
- 多孔结构固体储能材料的热传递
- 江左县农村综合性改革试点试验实施方案
- 工程经济学概论(第4版)课件 邵颖红 第9-11章 投资风险分析、资产更新分析、价值工程
- 土地房屋测绘项目 投标方案(技术方案)
- 开封大学单招职业技能测试参考试题库(含答案)
- 采购管理制度及流程采购管理制度及流程
评论
0/150
提交评论