> RedHat >

RHCE学习笔记-RHEL5.4内核服务

linux 内核服务的相关知识

Linux内核
内核是linux操作系统的核心部分,

内核的职责
1 系统初始化     检测硬件资源并引导系统
2 进程的调度      决定进程的启动和允许时间
3 内存的管理     为允许的进程分配内存
4 安全                 经常校验文件系统的权限,selinux环境和防火墙规则
还可以提高缓冲和缓存以提高硬件的访问速度
采用标准网络协议和文件系统格式

linux内核在系统中的位置
[root@localhost ~]#
[root@localhost ~]# cd /boot/
[root@localhost boot]#
[root@localhost boot]# ll -h | grep vm
-rw-r--r-- 1 root root 1.8M Aug 19  2009 vmlinuz-2.6.18-164.el5
[root@localhost boot]#
这个文件就是linux系统的内核文件,这个文件的大小为1.8M。我们可以看到,linux内核很小,主要是为了系统运行的更快,保证安全。内核越庞大,其漏洞也就会越多,内核怎么小,怎么能够提供那么强大的功能呢,因为linux很多功能都是由模块来提供的,linux也叫模块化的操作系统。

内核的映像和版本
支持的平台: x86(32位)   x86_64(64位)   IA64/Itanium  PowerPC64  s390x
32位最多支持4G的内存。 
可用于X86的三种内核版本
常规的 :  一个或多个处理器,最多可以支持4G内存。
PAE   :   多处理器,可以支持64G的内存。
Xen   :    虚拟化所需。

关于linux内核的版本
RHEL5.1     2.6.18-53.el5
RHEL5.4     2.6.18-164.el5
2.6   主版本
18   次版本
53   修正版
El5  红帽封装的
2.4   2.6   2.8  这些偶数位的内核版本代表正式版,
2.3   2.5   2.7  这些奇数位的内核版本代表测试版。

内核模块
模块是小型的,可根据需要装载或者卸载的内核扩展。
那么内核模块在系统中哪里呢
[root@localhost ~]#
[root@localhost ~]# cd /lib/modules/
[root@localhost modules]# ls
2.6.18-164.el5  2.6.18-164.el5PAE
[root@localhost modules]#
可以看到,这里有两个文件夹,现在看下来我们使用的是那个内核。

[root@localhost modules]#
[root@localhost modules]# uname -r
2.6.18-164.el5
[root@localhost modules]#
我们使用的是常规内核,进入2.6.18-164.el5这个目录

[root@localhost modules]#
[root@localhost modules]# cd 2.6.18-164.el5
[root@localhost 2.6.18-164.el5]# ls
build   modules.alias      modules.inputmap   modules.seriomap  updates
extra   modules.ccwmap  modules.isapnpmap  modules.symbols   weak-updates
kernel  modules.dep          modules.ofmap      modules.usbmap
misc    modules.ieee1394map  modules.pcimap     source
[root@localhost 2.6.18-164.el5]# cd kernel/
[root@localhost kernel]# ls
arch  crypto  drivers  fs  lib  net  sound
[root@localhost kernel]# cd fs/
[root@localhost fs]# ls
autofs4    cramfs    ext3      fscache  hfsplus  lockd       nfsd      vfat
cachefiles  dlm      ext4     fuse    jbd    msdos       nls
cifs        ecryptfs  fat      gfs2     jbd2    nfs         squashfs
configfs    exportfs  freevxfs  hfs      jffs2    nfs_common  udf
[root@localhost fs]#

在这里可以看到,我们的系统支持所有的文件系统都在这里拉。
[root@localhost fs]#
[root@localhost fs]# cd ext3/
[root@localhost ext3]# ls
ext3.ko
[root@localhost ext3]#
每个目录里面都有一个模块,并且都是以.ko结尾的。
在linux系统中,以.ko结尾的都是模块。

内核模块的管理工具
查询系统中有多少模块被加载了
#lsmod
[root@localhost ~]#
[root@localhost ~]# lsmod | grep ext3
ext3                  125001  4
jbd                    57065  1 ext3
[root@localhost ~]#

手动加载和卸载模块
#modprobe  vfat
#modprobe  -r   vfat
[root@localhost ~]#
[root@localhost ~]# modprobe vfat
[root@localhost ~]#
[root@localhost ~]# lsmod | grep vfat
vfat                   15937    0
fat                    51165     1   vfat
[root@localhost ~]#
[root@localhost ~]# modprobe -r vfat
[root@localhost ~]#
[root@localhost ~]# lsmod | grep vfat
[root@localhost ~]#

查询模块的详细信息
#modinfo  ext3
[root@localhost ~]#
[root@localhost ~]# modinfo ext3
filename:        /lib/modules/2.6.18-164.el5/kernel/fs/ext3/ext3.ko
license:          GPL
description:    Second Extended Filesystem with journaling extensions
author:          Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
srcversion:      51D84081C475FE078B1D891
depends:        jbd
vermagic:       2.6.18-164.el5 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
module_sig:     883f3504a8b7a0d18758d6145e112f4300a08dae31fac7f50d1e7b6d5b862d010384fbc1ea609f47bb1fe9f093d11a96a74986f486c45bf3ea246
[root@localhost ~]#

关于/etc/modprobe.conf文件
这个文件是模块的配置文件,在这个模块配置文件里面可以定义模块的别名,在加载模块的时候,系统会自动读取模块的配置文件。

管理initrd映像

这个文件通常叫做RAM DISK文件,

我们知道在系统启动的过程中,计算机会先加载根文件系统,根文件系统又是一个ext3的文件系统,所以计算机必须先加载ext的模块,但是ext3的模块又是在根文件系统下面。这样就会有个矛盾。所以我们RAM DISK文件中就有系统在启动的时候需要加载的模块文件。
[root@localhost ~]#
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# ls
[root@localhost tmp]# cp /boot/initrd-2.6.18-164.el5.img .
[root@localhost tmp]# ls
initrd-2.6.18-164.el5.img
[root@localhost tmp]# zcat initrd-2.6.18-164.el5.img |cpio -imd
11798 blocks
[root@localhost tmp]# ls
bin  dev  etc  init  initrd-2.6.18-164.el5.img  lib  proc  sbin  sys  sysroot
[root@localhost tmp]# cd lib/
[root@localhost lib]# ls
ata_piix.ko   dm-region_hash.ko  mptbase.ko   scsi_transport_spi.ko
dm-log.ko     ehci-hcd.ko       mptscsih.ko  sd_mod.ko
dm-mem-cache.ko  ext3.ko            mptspi.ko    uhci-hcd.ko
dm-message.ko    firmware           ohci-hcd.ko  vmxnet3.ko
dm-mod.ko        jbd.ko             pvscsi.ko    vmxnet.ko
dm-raid45.ko     libata.ko          scsi_mod.ko
[root@localhost lib]#
这个里面就有我们系统在启动的时候需要加载的模块。

如何重新生成这个RAM DISK文件呢
[root@localhost ~]# cd /boot/
[root@localhost boot]#
[root@localhost boot]# ls | grep initrd-2.6.18-164.el5
initrd-2.6.18-164.el5.img
initrd-2.6.18-164.el5kdump.img
initrd-2.6.18-164.el5PAE.img
[root@localhost boot]# rm -rf initrd-2.6.18-164.el5.img
[root@localhost boot]# ls | grep initrd-2.6.18-164.el5.img
[root@localhost boot]#
我们已经删除了RAM DISK文件,那么我们系统在下次启动的时候是肯定不能够正常启动的。

现在我们重新生成一下这个文件,
[root@localhost ~]#
[root@localhost ~]# mkinitrd /boot/initrd-$(uname -r).img $(uname -r)
[root@localhost ~]# cd /boot/
[root@localhost boot]# ls | grep initrd-2.6.18-164.el5.img
initrd-2.6.18-164.el5.img
[root@localhost boot]#
这个RAM DISK文件又重新回来了。

我们也可以在生成这个文件的时候指定要加载的模块,
[root@localhost ~]#
[root@localhost ~]# mkinitrd --with=raid5 /boot/initrd-$(uname -r).img $(uname -r)
[root@localhost ~]#
使用- - with参数来添加指定的模块。

使用/proc进行内核的配置

/proc用来进行对内核的设置,反应当时计算机的状态。文件没有保存在硬盘上面。用来显示进程信息,内存资源,硬件设备,内核内存,等等。下次启动这些文件就都没有了。
/proc的示例
只读文件
/proc/cpuinfo
/proc/1/*
/proc/partitions
/proc/meminfo
这些信息修改并没有意义。
[root@localhost ~]#
[root@localhost ~]# more /proc/partitions
major minor  #blocks  name
   8     0     15728640    sda
   8     1     104391        sda1
   8     2     4192965     sda2
   8     3    4192965      sda3
   8     4          1            sda4
   8     5    1052226      sda5
   8     6    522081        sda6
[root@localhost ~]#
这是用来显示系统中的分区,修改它并没有意义。

但是有些信息也是可以被修改的。
/proc/sys/kernel/hostname
/proc/sys/net/ipv4/ip_forward
/proc/sys/vm/drop_caches
/proc/sys/vm/swappiness
这些信息是可以修改的。

Sysctl工具
可以使/proc/sys设置具有永久性。
在/etc/sysctl.conf这个文件中去修改,在这个里面修改的会永久生效,因为在这个配置文件在/etc/rc.d/rc.sysinit这脚本里面被激活了。
列出当前设置
#sysctl  -a

从sysctl.conf中重新加载
#sysctl  -p

通过/dev/访问驱动程序
/dev目录下面的文件可用来访问驱动程序。
[root@localhost ~]#
[root@localhost ~]# cd /dev/
[root@localhost dev]#
[root@localhost dev]# ls -l sda1
brw-r----- 1 root disk 8, 1 Mar  3 13:08 sda1
[root@localhost dev]#
前面的b代表是个块设备文件,后面的8代表设备的主版本号,1代表次版本号。
系统识别一个设备,其实是通过设备的设备类型,主版本号,次版本号来识别的。

我们知道cdrom是用来挂载光驱里面的光盘的。
[root@localhost dev]#
[root@localhost dev]# ll -l cdrom
lrwxrwxrwx 1 root root 3 Mar  3 13:08 cdrom -> hdc
[root@localhost dev]# ll -l hdc
brw-rw---- 1 root disk 22, 0 Mar  3 13:08 hdc
[root@localhost dev]#
可以看到我们cdrom的主版本号是22,次版本号是0。

默认情况下,系统中的第一块硬盘的第一个分区/dev/sda1,应该就是b,8,1。
硬盘识别成b,第一块硬盘从8开始,1代表第一个分区。依次类推。
如果是第二块硬盘从17开始,因为一块scsi硬盘最多可以分15个分区。
应该就识别成了b,8,17。

创建块设备文件
#mknod  abc   b  8  1
[root@localhost ~]#
[root@localhost ~]# mknod abc b 8 1
[root@localhost ~]# ll abc
brw-r--r-- 1 root root 8, 1 Mar  3 17:23 abc
[root@localhost ~]#

设备节点示例
块设备
/dev/hda    /dev/hdc   IDE硬盘,光驱
/dev/sda    /dev/sdb   SCSI,SATA或者是USB的存储设备
/dev/md0   /dev/md1  软件RAID

字符设备
/dev/tty(0-6)          虚拟控制台
/dev/null    /dev/zero  软件设备
/dev/random /dev/urandom随即数字

Udev机制
Udev可管理保存在/dev/目录下的文件,
文件只有在接入相应的设备后才会生成。
文件在设备拔出后自动删除。
可以在/etc/udev/rules.d/下面去定义策略。
在这个目录下面去创建一个文件,以.rules结尾。
在这个文件中定义U盘的唯一性。
[root@localhost rules.d]#
[root@localhost rules.d]# cat 99-myusb.rules
BUS="usb",SYSFS{serial}=="21185601958E7211",NAME="myusb"
[root@localhost rules.d]#
这个就是我定义的,当一个USB的设备,并且对应这个序列号,系统就识别这个USB设备的名字叫做myusb。
可以使用下面这条命令来查看U盘的信息
# udevinfo -a -p /block/sdb

我们可以使用hal-device-manager这个图像化界面来查看计算机的状态。

至此,linux内核服务的相关内容就介绍完了,希望对大家有所帮助。

(责任编辑:IT)