本文介绍 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内核服务的相关内容就介绍完了,希望对大家有所帮助。