《Linux操作系统模块内核.ppt》由会员分享,可在线阅读,更多相关《Linux操作系统模块内核.ppt(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux操作系统模块内核 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望Acegene IT Co.Ltd.2内容提要内容提要1 软件安装与配置2 开机和关机3 系统服务4 内核管理5 模块管理6 核心参数Acegene IT Co.Ltd.31 软件安装与配置软件安装与配置本部分将讨论两种最常用的软件安装方法:使用Red Hat Package Manager软件包管理工具软件(RPM)和自行编译源代码。本部分中所有需要输入的命令都是以根用户的身份输入的。因此
2、最好是直接以根用户身份登录进入系统。Acegene IT Co.Ltd.4RPM Package ManagerManage software packagesInstall,upgrade,remove,verify,query,buildPackage files referred to as RPMsDistributed by the vendorInclude files to be installed plus some install scriptsSource RPMs contain the source codee.g.,kernel-2.4.9-e.24.src.rpmB
3、inary RPMs contain the pre-built binariese.g.,kernel-2.4.9-e.24.i686.rpmChoose the highest architecture the machine can usee.g.,i686,i586,i486,i386 (uname-m)Acegene IT Co.Ltd.51 Red Hat Package Manager一些可以获得到rpm软件的站点http:/ftp:/ IT Co.Ltd.61 安装新的软件包安装新的软件包普通安装:#rpm-i bc-1.05a-4.i386.rpm升级软件:#rpm-U bc
4、-1.05a-4.i386.rpm强行安装:强行安装:#rpm-i-force-nodeps packagename.rpm其他参数-h 使用符号“#”指示安装进度,与-v参数一起使用时显示效果更好-v 告诉RPM报告每一步操作的情况-test 这个参数并不进行真正的安装;它只是用来检查安装能否成功地完成。用于检查依赖关系是否安全。-percent 显示已完成的百分比指示安装进度。如果从另外一个程序(比如某个Perl脚本程序)中来运行RPM,并且想了解安装的进度时,这个参数就很方便。Acegene IT Co.Ltd.71 查询软件包查询软件包列出已经安装的全部软件包#rpm-qa#rpm-q
5、a|grep-i name找出某个特定的文件到底是属于哪个软件包的#rpm-qf filename查出某个已经安装的软件包的功能#rpm-qi packagename查出软件包中的文件#rpm-qlp packagename其中的packagename是准备要了解其组成文件的软件包名称列出已经安装的软件包中的文件:#rpm ql Acegene IT Co.Ltd.81 反安装(清除)软件包反安装(清除)软件包RPM反安装(清除)软件包#rpm-e packagename其中的packagename是rpm-qa命令清单中列出的软件包名称。Acegene IT Co.Ltd.91 gnorpm
6、工具工具那些喜欢使用GUI工具简化操作的人们可以使用gnorpm软件。虽然它是被设计运行于GNOME环境的,但在KDE环境中也运行得相当好。它可以完成通过命令行完成的全部操作,但是用户就不必费力记住那些命令行参数了。当然,这样做是要增加一些系统开销的,这也是命令行版本依然存在的原因。Acegene IT Co.Ltd.10RPM BuildsBuilds consist of multiple phases:Prep extracts and patches sourcesBuild make individual binariesInstall creates an install stag
7、ing areaDoesnt install it for use on the local system!Additional actions come after Install phase:Create a source RPMCreate a binary RPMAcegene IT Co.Ltd.11RPM Work AreaWork area is used for building RPMsLocation depends on vendor:Red Hat:/usr/src/redhatUnitedLinux:/usr/src/packagesDirectory structu
8、re contents:SPECS RPM spec fileSOURCES source archives and patchesBUILD extracted source,objects,binariesRPMS generated binary RPMsSRPMS generated source RPMsAcegene IT Co.Ltd.12RPM Build Procedure1.First,install source RPMPopulates SPECS and SOURCES2.Run build phasesPopulates BUILD and creates stag
9、ing area3.Generate binary and/or source RPMsPopulates RPMS and SRPMS,respectively4.Clean up the build area5.Install the new binary RPM if desiredAcegene IT Co.Ltd.13RPM Build ExampleAll in one go:#rpm rebuild stat-2.5-3.src.rpmStep-by-step:#rpm i stat-2.5-3.src.rpm#cd/usr/src/redhat/SPECS#rpm bp sta
10、t.spec#rpm bc stat.spec#rpm bi stat.spec#rpm bl stat.spec#rpm ba stat.spec clean#rpm i./RPMS/i386/stat-2.5-3.i386.rpmAcegene IT Co.Ltd.142 开机和关机开机和关机2.1 系统引导2.2 启动文件2.3 内核加载2.4 init进程Acegene IT Co.Ltd.152.1 启动引导启动引导-Boot LoadersGrubNew and improved boot loaderConfigured via/boot/grub/menu.lstNot nec
11、essary to rerun after config changesGrub Configuration default=0timeout=10splashimage=(hd0,0)/boot/grub/splash.xpm.gztitle Red Hat Ent Linux AS(2.4.21-9.EL)root(hd0,0)kernel/boot/vmlinuz-2.4.21-9.EL root=LABEL=/initrd/boot/initrd-2.4.21-9.EL.imgLILOOriginal Linux boot loaderConfigured via/etc/lilo.c
12、onfMust run/sbin/lilo after any change to lilo.conf or binary images(/boot/*)Acegene IT Co.Ltd.162.2 Boot FilesKernel binary:IA-32(compressed):/boot/vmlinuz-$LABELOther architectures:/boot/vmlinux-$LABELinitrd images:/boot/initrd-$LABELSystem mapfile:/boot/System.map-$LABELBy convention kernel binar
13、y,initrd and system mapfile should share the same$LABELAcegene IT Co.Ltd.172.2 Initrd ImagesKernel cant mount root fs until appropriate disk drivers are loaded(except IDE)Initrd is loaded into memory by Grub/LILOContains drivers needed to mount real root fsInitrd must be rebuilt if a disk driver cha
14、ngesTo rebuild:RH:Use/sbin/mkinitrdSUSE:Use/sbin/mk_initrdAcegene IT Co.Ltd.182.3 开机引导的步骤开机引导的步骤加载内核 内核就必须完整地加载到可用RAM的第一个兆字节之内。为了实现这个目的,内核是被压缩了的。这个文件的头部包含着必要的代码,先设置CPU进入安全模式(以此解除内存限制)再对内核的剩余部分进行解压缩。执行内核 内核在内存中解压缩之后,它就可以开始运行了一旦内核启动运行,对硬件的检测就会决定需要对哪些设备驱动程序进行初始化。内核就能够挂装根文件系统,内核挂装了根文件系统之后,启动并运行一个叫做init的
15、程序。Acegene IT Co.Ltd.192.4 开机引导的步骤开机引导的步骤init进程是所有进程的发起者和控制者。init是第一个运行的进程,init的进程编号永远是1。如果init出现问题,系统随之垮掉。init进程有两个作用:扮演终极父进程的角色。失去了父进程的子进程就都会以init作为它们的父进程。快速执行一下ps-af 命令可以列出许多父进程ID(parent process ID,PPID)为1的进程来。特定运行级别(runlevel)时运行相应的程序,init读取配置文件/etc/inittab,决定启动的运行级别(runlevel)。缺省的运行级别取决于配置文件/etc/
16、inittab id:3:initdefault:Run Level Description6543210RebootGUI(Unused)MultiUserNo NetworkSingle UserHaltAcegene IT Co.Ltd.202.4 开机引导的步骤开机引导的步骤命令脚本程序执行 rc.sysinit执行脚本在各个运行级别的子目录中/etc/rcRUNLEVEL.d 都建立有到/etc/rc.d/init.d子目录中的符号链接。但是这些符号链接并不使用命令脚本程序在/etc/rc.d/init.d子目录中原来的名字,如果命令脚本程序是用来启动一个服务的,其符号链接的名字就以
17、字母S打头;如果命令脚本程序是用来关闭一个服务的,其符号链接的名字就以字母K打头运行级别3和5中,在字母S后面使用了数字99,这就保证了这个命令脚本程序将作为引导过程的组成部分,其最后阶段被执行。Acegene IT Co.Ltd.212.4 编写自己的编写自己的rc命令脚本程序命令脚本程序有两种方法可以用来实现修改开机或者关机命令脚本的目的:/etc/rc.d/rc.local 如果所做的修改只在引导开机的时候起作用,并且改动不大的话,可以考虑简单地编辑一下/etc/rc.d/rc.local脚本。这个命令脚本程序是在引导过程的最后一步被执行的。/etc/rc.d/init.d子目录中添加一
18、个命令脚本程序适合修改比较细致,或者还要求关闭进程的操作必须使之明确地停止运行这个命令脚本程序必须可以接受start和stop参数并完成相应的操作。Acegene IT Co.Ltd.223 系统服务管理系统服务管理用于在激活或停用启动时的服务会修改/etc/rcX.d 到/etc/init.d的(符号联接symbolic links)配置服务 chkconfigchkconfig-list chkconfig-level 2345 service on|off 服务管理 serviceservice servicename start|stop|restartAcegene IT Co.Lt
19、d.23使用使用 chkconfig#See where sendmail is runningchkconfig-list sendmailsendmail 0:off 1:off 2:off 3:on 4:off 5:on 6:off#Turn off sendmail at levels 3&5#too many spammers out there!chkconfig-level 35 sendmail offAcegene IT Co.Ltd.244 内核内核4.1 核心服务4.2 内核编译和安装4.3 模块加载卸载Acegene IT Co.Ltd.254.1 核心级系统服务核心级
20、系统服务核心系统服务:init、inetd、syslog和cron。本部分将对每一个核心系统服务、相应的配置文件以及推荐的应用方式(如果有的话)逐个进行介绍。Acegene IT Co.Ltd.264.2 安装新内核安装新内核Distributed by vendors in binary RPM formatRed Hat:kernel-smp|enterprise-*.i686.rpmUnitedLinux:?RPM contents:/boot/vmlinuz-$LABEL/boot/System.map-$LABEL/lib/module/$LABEL/RPM script gener
21、ates a new initrd-$LABEL and automatically adds a Grub entryIf using LILO instead of Grub,then add lilo.conf entry manually and re-run/sbin/liloAcegene IT Co.Ltd.274.2 编译或者不编译内核的原因编译或者不编译内核的原因编译的原因运行一个程序,但是操作系统不支持该程序需要的功能。某个用户需要的内核功能比如说用户的机器中装有1GB到2GB容量之间的RAM系统内存,只能重新编译经过改动的内核才能够激活它。用户希望对内核进行优化。内核升级
22、(驱动、BUG、意愿、功能、安全、有时间进行升级)为什么不编译如果只是想给内核加上很少数量的功能的话,就没有必要进行编译编译内核可能会遇到的困难:面对众多的选项Acegene IT Co.Ltd.28确定内核版本uname r确定内核是测试版还是正式版按照下面的方法确定内核是测试版还是正式版:1)忽略句号”.”前的第一个数字。2)查看紧跟在句号”.”后面的第二个数字。在实验性版本中,紧跟在第一个句号后面的第一个数字是一个奇数。在成熟版本中,紧跟在第一个句号后面的第一个数字是一个偶数。举例来说,内核版本2.2.5-15是成熟版本,而版本2.3.4-12是实验性版本4.2 编译(或升级)内核编译(
23、或升级)内核Acegene IT Co.Ltd.294.2 为内核源代码打补丁为内核源代码打补丁内核经常需要小规模地升级。每次升级修复一个特定的bug,增加一个新的驱动程序或者功能,或者实现其他任务。1)下载主版本的源代码和升级到新版本需要的每一个补丁的源代码。2)使用c d命令把路径切换到/usr/src目录。3)使用l s命令列出目录中的内容清单。如果其中有一个/usr/src/linux-version-ext目录已经存在的话,一般情况这就是正在已经运行的内核源代码。4)输入“mkdir linux-newversion-ext”命令建立一个新的源代码目录。5)把下载的源代码和补丁都拷贝
24、到这个目录中。6)使用tar命令对源代码进行解包操作。7)每一个补丁都应该分别并按顺序来处理。使用tar命令对第一个补丁进行解包操作。8)使用patch命令把这个补丁打到源代码中去。输入“patch-p0 original patchname”命令。9)依次打补丁10)准备编译注意:在源代码中有时候会包括有一个名为kernel-patch的命令脚本程序,该程序的功能是按顺序打所有的补丁。Acegene IT Co.Ltd.304.2 编译内核编译内核1)获取需要安装的内核源代码。2)使用tar命令把源代码解包到/usr/src/linux-version-ext目录3)使用cd命令把路径切换到
25、这个目录。4)选择你想使用的内核配置工具程序:图形化功能最少,又很乏味的工具是config程序一个图形化的工具是menuconfig程序用于对内核进行配置的X工具总是最流行的,它叫做xconfigMake config|menuconfig|xconfig保存并退出内核配置程序之后,就已经有了用来配置内核设置值了。5)输入“make dep”命令建立依赖关系表,它定义了包括在内核源代码中的某个特定文件如果发生了变化,就需要修改哪一个文件。6)输入“make clean”命令删除安装过程中产生的大量临时文件。7)输入“make bzImage”命令完成建立新内核的过程。8)输入“make mod
26、ules”命令编译内核模块并把它们存放到相应的位置。这是那些需要加载或者卸载的内核模块,另外还有一些固定加载的。9)安装内核Acegene IT Co.Ltd.314.2 安装内核安装内核简单(自动)方法:make install make module_install rebootAcegene IT Co.Ltd.324.2 安装内核安装内核手工方法:1)使用ls命令列出/boot目录中的内容。2)备份/boot/vmlinuz文件。改名为vmlinuz-version-ext。3)拷贝编译过程中生成的bzImage文件到/boot目录中。/usr/src/LINUX_PATH/arch/
27、i386/boot/目录中找到。4)把/boot目录中的bzImage文件改名为“vmlinuz”。5)把/usr/src/linux/System.map文件拷贝到/boot目录。6)把路径切换回/usr/src/LINUX_PATH目录。7)“make module_install”命令把内核模块存放到相应的位置。8)如果SCSI硬盘要确保SCSI模块能够被及时加载。输入“mkinitrd/boot/initrd-version-ext version-ext”命令确保SCSI模块在引导过程中能够被及时加载。9)拷贝initrd-version.img到/boot目录,输入“mkinitr
28、d/boot/initrd-version.img version-ext”命令建立一个RAM盘,它将在开机引导启动过程中加载,然后再从机器中被删除10)配置LILOAcegene IT Co.Ltd.334.2 使用使用RPM包升级内核的步骤包升级内核的步骤从Red Hat公司的Web升级站点下载内核软件包,按照下面的方法进行操作:1)以根用户身份登录进入系统。2)使用rpm命令升级下载的非内核文件,输入“rpm-Uvh packagename”命令。警告千万要在手边准备好一张引导启动盘以防新的内核出现问题。3)为确保不出现问题,最好安装一个新内核,而不是简单的升级。安装内核文件需要输入“r
29、pm-ivh packagename”命令。4)从/boot目录中查看当前内核的名称是什么。格式应该是“/boot/vmlinuz-version-ext”5)输入“mkinitrd/boot/initrd-version.img version-ext”命令建立一个RAM盘,它将在开机引导启动过程中加载,然后再从机器中被删除。7)配置LILOAcegene IT Co.Ltd.344.2 配置配置LILO1)以根用户身份登录进入系统。2)使用“vi/etc/lilo.conf”之类的命令打开/etc/lilo.conf文件。3)除了被升级的部分,文件中新的数据段必须和用户当前运行的旧版本的有
30、关内容保持一致。举例来说,用户原来的数据可能是如下所示的样子:image=/boot/vmlinuz-2.2.5-15label=linuxroot=/dev/hda1initrd=/boot/initrd-2.2.54)把光标移动到以“image”字样开头的那一行。5)输入“4yy”拷贝4行文本到缓冲区。6)按下“G”键前进到文件末尾。7)按下“o”键在文件末尾插入一个新的文本行。8)按下ESC键返回到命令模式。9)按下“p”键把拷贝的文本复制到/etc/lilo.conf文件的末尾。10)在新的语句中做必要的修改。比如说,把2.2.5-15修改为2.2.5-25等等。initrd项的数据根
31、据版本之间差异的大小可以修改也可以不改。11)再回到原始数据段部分,把它的label项改为“linuxold”之类的东西,这样用户就可以把这两个数据段区分开了。12)输入“:wq”保存文件并退出编辑器程序。13)输入“/sbin/lilo-v”命令执行LILO程序,让新设置生效。14)重新启动Acegene IT Co.Ltd.355 加载核心模块加载核心模块安装模块:insmod.omodprobe 列出已经安装的模块:lsmod cat/proc/modules每一个已经安装的内核版本都应该有一个对应的目录。把路径切换到当前运行内核对应的目录中。Acegene IT Co.Ltd.365
32、卸载模块卸载模块卸载模块rmmod 只对idle和不再使用的模块起作用如果机器警告有其他的模块依赖于想要删除的这个,但你还是想删除它的话,可以使用rmmod-r modulename5 检查坏的模块检查坏的模块(Tainted Kernel)Use the/sbin/lsmod command to see whether the kernel is tainted:#/sbin/lsmod Module Size Used by Not tainted nfs 87936 0(autoclean)lockd 60224 0(autoclean)nfs sunrpc 79952 0(autoc
33、lean)nfs lockd iptable_filter 2912 0(autoclean)(unused)ip_tables 14080 1 iptable_filter ad1848 23968 0 cs4232 ext3 70240 5 jbd 51004 5 ext3Acegene IT Co.Ltd.386 核心参数核心参数Control dynamic kernel configuration/tuningMost parameters can be changed on the fly!Can be set multiple ways:In/etc/sysctl.conf:(R
34、ecommended)fs.aio-max-size=1048576In/etc/rc.local(RH)or/etc/boot.local(SUSE):echo 1048576 /proc/sys/fs/aio-max-sizeUsing sysctl:sysctl w fs.aio-max-size=1048576Will be lost on reboot if not in/etc/sysctl.confAcegene IT Co.Ltd.396 shmfsMount tmpfs on/dev/shm via fstabOption“size=8g”means 8GBOption“si
35、ze=?”can be larger than physical RAMRequired by Oracle for VLM modeOnly used for buffer cacheNever used in non-VLM modeAcegene IT Co.Ltd.406 IA-32系统上使用超过系统上使用超过4g内存内存Bigpages(x86)Separate memory pool using large hw pagesNon-swappableMust be set aside at boot timeBoot with kernel parameter“bigpages=8
36、192MB”Use Workaround in bug 3080838To prevent Kernel panic in sshd_config set:UsePrivilegeSeparation no -OR-Compression no (preferred)Hugetlbfs(RHEL)Similar to bigpages but,configured at runtime,no need to reboot:Shutdown instance (free memory)echo 600 /proc/sys/vm/hugetlb_poolAsk for 600MBcat/proc/
37、sys/vm/hugetlb_poolVerify you got 600MB,if not might need to rebootStartup instanceVerify usage in/proc/meminfoAcegene IT Co.Ltd.416 参数参数:异步异步IO-async io requests/proc/sys/fs/aio-max-sizeMax size of data passed to driver at onceRequests larger than this will be broken upNext chunk will not be submit
38、ted until the previous one has completedDefault value:131072 Unit:bytes/proc/sys/fs/aio-max-nrMax number of aio requests system-wideLimits number of structures allocated,not the number of requests in flight!Each Oracle process allocates 1024Default value:65536Unit:countAcegene IT Co.Ltd.426 参数参数:共享内
39、存共享内存/proc/sys/kernel/shmmaxMax size of a single shared memory segmentSmaller values mean more segments neededDefault value:33554432Unit:bytesMaximum allowed:4GB-1(4294967295)/proc/sys/kernel/shmallMax amount of shared memory system-wideDefault:2097152Unit:?/proc/sys/kernel/shm-use-bigpagesAllowed v
40、alues:0:dont use bigpages pool for shared memory1:use bigpages pool for SysV shared memory2:use bigpages pool for SysV and shmfsDefault value:0Use Workaround in bug 3080838To prevent Kernel panic in sshd_config set:UsePrivilegeSeparation no -OR-Compresson no (preferred)Acegene IT Co.Ltd.436 RHEL Ker
41、nel Types(IA-32)Choose the right kernel“smp”:2-level page tablesHW can only address 4GB of RAM4kB pages and 4MB“large”pages“enterprise”:3-level page tablesHW can address up to 64GB of RAM4kB pages and 2MB“large”pagesRHEL2.1:max 16GB RAM supportedSLES8:64GB officially supportedKernel#CPUsRAMStandard1
42、4 GBSMPMulti4 GBEnterpriseMulti 4 GBAcegene IT Co.Ltd.446 进程地址空间进程地址空间(IA-32)3GB user/1GB kernel address space0 x00000000-0 xbfffffff user0 xc0000000-0 xffffffff kernelStack grows down from 0 xbfffffffmapped_baseAddress where.so libraries are loadedDefault value:0 x40000000Configure via/proc/$PID/ma
43、pped_baseVariable SGAReserved for kernelDB Buffers(SGA)Code,etc.Default0 xFFFFFFFF0 xC00000000 x500000000 x400000000 x00000000Variable SGAReserved for kernelDB Buffers(SGA)Code,etc.After Relink0 xFFFFFFFF0 xC00000000 x150000000 x100000000 x00000000mapped_base(/proc/mapped_base)sga_base(relink Oracle
44、)AQ&Q U E S T I O N SA N S W E R SAcegene IT Co.Ltd.46练习练习为虚拟机安装vmware-tools软件安装 确认是否安装 卸载配置系统服务 启动服务:rsh rexec rlogin telnet sshd vsftpd rawdevices 禁用服务:cups sendmail smartd apmd chkconfig service 配置自动启动服务/etc/rc.d/rc.local,启动时自动授权oracle用户文件权限/dev/rawctl/dev/raw/*chown chmod 设置Linux核心参数编辑/etc/sysct
45、l.conf参数生效#sysctl-p/etc/sysctl.conf net.ipv4.ip_forward=0net.ipv4.conf.default.rp_filter=1net.ipv4.ip_local_port_range=1024 65000net.core.rmem_default=262144 net.core.rmem_max=262144 net.core.wmem_default=262144 net.core.wmem_max=262144 kernel.sysrq=0kernel.core_uses_pid=1kernel.shmmax=1610612736 kernel.shmmni=4096kernel.shmall=2097152kernel.msgmax=8192kernel.msgmnb=65535kernel.msgmni=2878kernel.sem=500 64000 100 512#fs.aio-max-size=1048576fs.file-max=327680fs.aio-max-nr=1048576
限制150内