1.16 内核

   摘要 内核 编译

 

内核服务
     职责
        系统初始化
        进程调度
        内存管理
        文件系统
        硬件驱动
        安全
        提供缓冲和缓存以提高硬件的访问速度
        采用标准网络协议和文件系统格式
   内核类型 微内核  单内核
      内核组成  /boot/vmimuz-version
                /boot/initrd-version
                /lib/models/version
  编译内核
           举例来说
    如果您是从kernel.org 下载的类似 linux-2.6.28.10tar.bz2 或者 linux-2.6.38.tar.gz的,

您要把下载下来的文件移到 /usr/src 目录中解压; 然后进入解压的目录中进行配置和编译;


[root@localhost ]# cp linux-2.6.28.10tar.bz2  /var/src/linux-2.6.28.10tar.bz2
 [root@localhost ]# cd /usr/src/
[root@localhost src]# tar jxvf linux-2.6.28.10.tar.bz2
                    # ln -sv linux linux-2.6.28.10.tar.bz2
提示:本文以linux-2.6.28.10为例,其实通过发行版的升级版的kernel-devel 和从kernel.org 下

载下来的差不多,大同小异;不同的是通过在线升级的rpm格式的内核源码包,有配置文件.config

可以参考;安装到的目的地是/usr/src/kernel 对redhat来说;如果您要高编译和配置内核,


四、内核的配置;

 

1、进入目录执行 make mrproper ,对于从 kernel.org 下载而来的tar.bz格式的源码包;

 

[root@localhost src]# cd linux-2.6.12.3/ (or cd linux)
[root@localhost linux-2.6.12.3]#
[root@localhost src]# cd linux-2.6.12.3/
[root@localhost linux-2.6.12.3]# make mrproper
[root@localhost linux-2.6.12.3]# make menuconfig

2.简要的配置内核;


进入配置内核的配置模式后,我们可能一无所知,看下面;

内核配置有两种方法,一种是直接置入内核 * ;另一种是编成模块 M ;两种方法各有优点;直接编

入内核的,比如设备的启动,不再需要加载模块的这一过程了;而编译成模块,则需要加载设备的内

核支持的模块;但直接把所有的东西都编入内核也不是可行的,内核体积会变大,系统负载也会过重

。我们编内核时最好把极为重要的编入内核;其它的如果您不明白的,最好用默认。


1)移动键盘上下左右键,按Enter 进入一个目录。把指针移动到Exit就退出当前目录到上级目录;

2)针对自己机器存在的问题进行修改,比如大内存的支持;

选择自己机器的CPU;

移动键盘到 Processor type and features ---> ,然后按ENTER进入;
找到 Processor family (Pentium-Pro) ---> 按ENTER进入;

进入后我们发现有好多CPU的型号可选;一般的情况下要根据
bash-3.00# cat /proc/cpuinfo 输出的信息来选,比如我们的是Celeron (P4)一代的,应该选如

下的,当然默认的 486也是可以正常运行的,既然我们重编一次内核,就得选中对应型号的,也许性

能有所提高呢;


Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon)

对大内存支持;如果内存是1G或者1G以上,但小于4G的,就要选4G支持;如果超过4G的,要选64G的

支持;


High Memory Support (4GB) --->

(X) 4GB
( ) 64GB

还有比如声卡等硬件,需要我们一步一步的查看;如果有不明之处,就要按 [shift]+?的组合键来

查看说明。一般的情况下,2.6.x的内核会根据机器的情况自动配出一个文件,只需要我们来查看一

下,把重要的地方改改就行了;

再举个例子:比如我现在所用的声卡是intel ac97的,我应该怎么配置呢?

首先要知道自己的声卡的芯片组,我们要通过lspci -v 来查看;


[root@localhost beinan]#lspci -v

只查看声卡的,应该用如下的方法:

[root@localhost beinan]# lspci -v |grep audio
00:1f.5 Multimedia audio controller: Intel Corp. 82801DB (ICH4) AC'97 Audio Controller

(rev 03)

通过上面的输出,我们知道这台机器用的是intel AC97声卡;所以我们要特别注意AC97的配置;


找到 Device Drivers ---> Sound --->
<M> Sound card support 声卡的支持,这个是一定要选中的吧;
<M> Advanced Linux Sound Architecture 对声卡支持的ALSA驱动的支持;
下面有OSS驱动,只是一部份。如果想用OSS的驱动更全的,可以去买;其它的就看如下的选吧;
<M> Sequencer support
<M> Sequencer dummy client
<M> OSS Mixer API
<M> OSS PCM (digital audio) API[*] OSS Sequencer API
<M> RTC Timer support[*] Verbose printk
[ ] Debug

Generic devices ---> 进入里面
<M> Dummy (/dev/null) soundcard
<M> Virtual MIDI soundcard
<M> MOTU MidiTimePiece AV multiport MIDI
<M> UART16550 serial MIDI driver
<M> Generic MPU-401 UART driver
ISA devices ---> 如果您用ISA声卡就在这里面选;
PCI devices ---> 如果您用PCI声卡,就在这里面选,集成声卡也在这里;
USB devices ---> 这是USB声卡内核支持选项;我有一个这样的声卡,但没有试过;
PCMCIA devices ---> 这是PCMCIA声卡的选项,我还没有看过这样的声卡呢;如果您有,就在这里面

动动手吧。

因为我用的是Intel 集成的声卡,所以要在PCI中选择,我们在 中可以看到有两个与INTEL有关的;

<M> Intel/SiS/nVidia/AMD/ALi AC97 Controller 这个才是Intel AC97声卡的;
< > Intel/SiS/nVidia/AMD MC97 Modem (EXPERIMENTAL) 这个是机器集成的INTEL猫的蜂鸣器的;

因为我发现如果把猫的蜂鸣器的驱动也选上,可能造成两个冲突。所以只能选上面的那个;

我们再回到 Open Sound System ---> 中看看,与我用的声卡是不是有关的?


<M> Open Sound System (DEPRECATED)
<M> Intel ICH (i8xx) audio support
<M> OSS sound modules
<M> Loopback MIDI device support
<M> Microsoft Sound System support

我们也可以看到Open Sound System中也有好多的声卡驱动,大家根据前面的lspci -v 来选择吧。


3)对于操作系统所采用的文件系统的支持要编入内核,最好不要编成模块;(重要)


比如我的Fedora core 4.0 所采用的文件系统用的是ext3 ,所以我要把它直接编入内核;好处是不

受模块丢失或者损坏而不能启动系统;而有时您把系统所采用的文件系统编译成模块,出现VFS错误

,也有这方面的事,可能是您没有把ext3加入到相应的加载模块的配置文件中,所以我们为了减少麻

烦,把风险降到最低,还是要直接置入内模的好;


File systems --->
<*> Ext3 journalling file system support
[*] Ext3 extended attributes
[*] Ext3 POSIX Access Control Lists
[*] Ext3 Security Labels

如果您还有其它的硬盘分区要读取,比如是reiserfs、ext2、fat、fat32、ntfs等,这样的可以编成

模块来支持;

再举一例:如果您的的操作系统用的是reiserfs的文件系统,当然就要把reiserfs的直接编入内核,

其它的可以编成模块来支持了;


4)对于硬盘及RAID的支持,要直接编入内核;

比如ATA、SATA、SCSI及RAID的支持直接内核支持;有时编完内核后,启动时不能识别硬盘和RAID,

大多事情出在这里;Slackware中在这方面有的是模块支持,我们可以把它由模块M改成内核*来支持

; 如果您不明白,就按默认进行;SATA的硬盘的支持除了选中SATA的支持、IDE设备的支持以外,还

要选中SCSI的支持;

5)对于咱们所没有的设备,可以在内核中不选,熟能生巧罢了;

比如我没有ISDN设备 ,所以就把ISDN去掉;


ISDN subsystem --->
< > Linux telephony support

如果您没有1394的设备 ,当然可以把1394的支持也去掉;等等。。。。。。。

如果您有USB的设备,要把USB方面好好看看;比如大家常用的移动硬盘;USB猫等,还有扫描仪等;

内核配置就说这么多吧,太多了,我也说不清楚,水平有限啊;

配置好后先要保存

Save Configuration to an Alternate File

出来一个

Enter a filename to which this configuration ,should be saved as an alternate. Leave

blank to abort.
.config

按回车就行了,这样就保存住了;

然后退出 Exit ,这时也会出现保存 ;

如果你想把.config保存起来,可以再复制一份到安全一点的目录,以备后用;

五、编译内核;

 

[root@localhost linux]# make
[root@localhost linux]# make modules_install

这样就编译好了,并把模块也安装在了 /lib/modules目录中了,请看:


[root@localhost linux-2.6.12.3]# ls /lib/modules/
linux-2.6.28.10_redhat  2.6.28.10
  在shell中捕捉信号的trap命令
   发送信号
语法: kill -signal pid

signal可以是要发送的信号的整数,与可以是信号的名称.

pid是信号要发送的进程PID,如:

kill -s SIGTERM pid   #同killl pid

向进程号为1001的进程发送1号信号

kill -1 1001

向进程号为1001的进程发送SIGQUIT信号

kill -s SIGQUIT 1001

四. 信号处理
(一). trap捕捉到信号之后,可以有三种反应方式:

  1. 执行一段程序来处理这一信号

  2. 接受信号的默认操作

  3. 忽视这一信号

(二). trap对上面三种方式提供了三种基本形式:

  第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双

  引号中的命令串。

  trap 'commands' signal-list

  trap "commands" signal-list

  为了恢复信号的默认操作,使用第二种形式的trap命令:

  trap signal-list

  第三种形式的trap命令允许忽视信号

  trap " " signal-list

  注意:

  1. 对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储。

  2. 在trap中可以定义对信号0的处理(实际上没有这个信号), shell程序在其终止(如

  执行exit语句)时发出该信号。

  3. 在捕捉到signal-list中指定的信号并执行完相应的命令之后, 如果这些命令没有

  将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将

  很容易导致shell程序无法终止。

  另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,

  将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会

  对commands中的变量和命令进行替换, 否则commands中的变量和命令将用当时具体的值来

信号的三种处理方式
在信号1(挂起),信号2(中断),信号15(软件中止)中任何一个到达时,删除所有临时文件,然后退出.

1. #trap 'rm tmp*;exit 1' 0 1 2 15 #或trap 'rm tmp*;exit 1' EXIT HUP INT TERM

将信号2重置为按缺省方式处理

2. #trap 2 #或trap INT

忽略信号1,信号2

3. #trap " " 1 2 #或trap "" HUP INT

列出中断信号与键盘的对应

4. stty -a

例9-2 禁止用户按下退出键退出程序
trap 'echo "control-C will not terminate $0."' INT
trap 'echo "control-\ will not terminate $0."' QUIT
trap 'echo "control-Z will not terminate $0."' TSTP

echo "enter any string after the prompt,when you are ready to exit ,type \"stop\". "

while :
do
  echo -n "Go ahead ...>"
  read
  if [[ $REPLY == [Ss]top ]] ;then
    break
  fi
done

例9-3 在函数中捕捉信号
function trapper() {
  echo "In trapper"
  trap 'echo "Caught in a trap"' INT
}

while :
do
  echo "In the main script"
  trapper
  echo "Still in main"
  sleep 5
done

例9-4 退出时,删除临时文件夹
当脚本接收到信号SIGHUP,SIGINT,SIGQUIT,SIGTERM,临时文件夹就会被删除,并且调用exit以返回值2

退出.

cleanup() {
    if [ -f "$OUTFILE" ] ;then
        printf "Cleaning up_";
        rm -f "$OUTFILE" 2> /dev/null ;
        echo "Done";
    fi
}

trap cleanup 1 2 3 15