|
第六章:高级用户管理
6.01 设置和管理磁盘限额
6.02 系统初始化脚本
6.03 内核编译与安装
6.04 可插入认证模块
6.05 cron系统
6.06 系统级别SHELL配置文件----Bash shells
在这一章,你会学到如何基于每个用户或每个组来创建和应用关于磁盘利用管理的策略,接着我们会详细探讨linux启动的每一个步骤.一旦你明白linux是如何启动工作的,你就能够定制进程来使能你所需的服务,更重要的是你可以关闭你不需要的服务.
接着,你会学习如何更新,配置,编译和安装你自己定制的内核,你会明白monolithic单一的内核和模块化内核的区别,以及它们每一种风格的好处和缺点,你将会看到三种不同的定制和优化内核(尽可能小而能运行)的办法,同时也会学到建议你配置和安装内核的技术.
这一章节也会讨论有关可插入认证模块(红帽子提供的一个一致性的功能强在的认证包用于控制许多服务的访问),最后,你会学习如何依照用户会话(你或他们)的需要而设置系统不同的Shell配置脚本和如何安排周期性执行的作业.
6.01
设置和管理磁盘限额
磁盘限额是用于限制一个用户或一个组的使用磁盘空间的能力,这样阻止了一个小的用户组垄断了整个磁盘容量和潜在地妨妨碍了其他用户甚至于整个系统.磁盘限额通常用于ISP,WEB主机公司,FTP站点或者公司文件服务器来确保系统的可用性.用户可能能过上传文件服务器来填充文件系统来危及系统的安全(默认是不会阻止这些发生的),一旦文件系统满了,其他用户会有效地被阻止上传到磁盘(拒绝服务),如果填充的文件系统是根文件系统(/),这样会引起系统的不稳定甚至崩溃.
有两种方法来设置管理磁盘的消耗量,一是限制每一个用户拥有inodes节点的数量,你也可以限制每一个用户可用的磁盘块数量,Linux使用inode节点在文件系统上标识一个文件(一个文件就有一个inode节点),通过限制用户的inode节点数可以防止用户创建过量的文件,而限制用户可拥有的最多磁盘块就限制用户的磁盘空间(这与文件数量无关,因为磁盘块的大小是固定的).
磁盘限额可以通过命令行或者linuxconf工具来配置,我们先讨论命令行下磁盘限额的实现,再讨论在linuxconf下的实现.
注意:磁盘限额只能在EXT2文件系统中得到支持.
内核配置
系统运行时内核的维护会消耗资源,因些在你使用磁盘限额前要在内核中设置支持限额,对于red hat 默认是使能磁盘限额的,如果没有,你可以下载新的内核或者安装内核源代码,重新编译来使能磁盘限额支持,要知道更多有关信息,看下面的内核安装与编译.
To verify quota support in any custom-built kernels you may have, issue the command:
要校对任何定制的内核是否支持磁盘限额,使用下面的命令:
# grep CONFIG_QUOTA /usr/src/linux/.config
你会看到输出的行类似于:
CONFIG_QUOTA=y
如果你看到的是
CONFIG_QUOTA=n
那么你的内核并不支持磁盘限额,如果没有输出,那么你并没有安装一个可定制内核源代码树,这并不是一个问题,因为Red Hat 7.x内核并不包括磁盘限额支持的,而默认内核是支持磁盘限额的.
如果你有一个定制的内核.可以使用make menuconfig或者make xconfig命令来使能磁盘限额,这个选项是定位于文件系统章节,简单地打开磁盘限额使能,重新编译内核和安装就可以要完成这个工作,你需要重新启动计算机(用新内核),
安装quota 的RPM软件包
首先你要检查quota软件包是否已安装在系统上,可以用下面的命令来完成
[root@notebook /]# rpm -qa | grep quota
quota-2.00pre3-7
这说明系统已安装了quota软件包
要安装quotq软件包有很多种方法,最直接的方法会是挂载Red Hat CD-ROM光盘,然后转到相应的目录
mount /dev/cdrom
cd /mnt/cdrom/RedHat/RPMS
用这个命令来安装软件包
rpm -Uvh quota-2.00pre3-7
这会告诉RPM管理器来-U(update更新)或者(pv 安装如果并没有安装更关版本的quota软件包),-v表明是一个详细的模式,-h表明是用一系列的#号来表明安装的进度,你也可以通过FTP或者HTTP来获得软件包,也可以使用Red Hat 7.x带有的Gnome rpm中点击Web Find来安装,这样就会通过internet检查quota软件包并安装.
获得软件包的最好方法是发布的CD光盘,因为光盘上的软件是经red hat 检测发布的,可以与当前系统无缝的接合.
安装完这个包后,你可以使用下面的命令和相关的手册页
quotaon /fs 在相应的/fs文件系统上使能磁盘限额
quotaoff 关闭磁盘限额功能
edquota name 编辑用户名的磁盘限额配置
quota 允许用户查看他们当前的资源消耗和限制
repquota产生一个有关所有用户磁盘消耗的报告
quotacheck 扫描一个文件系统中磁盘限额的用量,初始化磁盘限额数据库
你可以查找有关它们的详细信息,只要输入下面相关的命令
如# info program
或者
#man program
来查看程序的手册页
/etc/rc.d/rc.sysinit 磁盘限额处理
/etc/rc.d/init.d/rc.sysinit脚本,正如在第四章所说的,是用来在linux启动时提供系统初始化服务的,脚本内包括了使能磁盘限额的命令,特别的是,这个脚本同时运行了quotacheck (确保磁盘消耗利用记录是正确的)和quotaon (在/etc/fstab文件中指明的文件系统中使能磁盘限额).
你也可以手动运行quotaon和quotaoff,通常这是不必要的, Red Hat 7.x's /etc/rc.d/init.d/rc.sysinit确保在系统启动时使能磁盘限额,当系统关闭时, Red Hat顺序执行卸载所有文件系统,当那些使能磁盘限额的文件系统卸载时,内核中有关系统中的用户,组,文件,inode节点的信息会写回到这个文件系统中去.
修改/etc/fstab
/etc/fstab文件是用来告诉linux有关你要在启动时加载的文件系统,而在这个文件中options这一列是用来设置有关文件系统加载时设置相关选项的,这些选项是用于在加载文件系统时传递给mount命令的,要在一个文件系统中使能磁盘限额,你要更新/etc/fstab文件中options(选项)这一条目,这样来提示你想要对用户或/和组进行磁盘限额,只能对一个文件系统进行磁盘限额,而不是一个目录,切记!
下面是一个示例文件
Device Mount point Filesys Options dump Fsck
LABEL=/ / ext2 defaults 1 1
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner 0 0
none /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
/dev/hda5 swap swap defaults 0 0
/dev/hda1 /win vfat uid=500,gid=500,owner,rw 0 0
/dev/hda6 /home ext2 defaults 0 0
在这个例子中.我们只能在根文件系统和/home文件系统中使能磁盘限额(只有它们是ext2文件系统),要在文件系统使能用户磁盘限额跟踪,在选项中添加关键词usrquota, 要在文件系统使能组磁盘限额跟踪,在选项中添加关键词grpquota,,你可以使用Vi或者其他你喜欢的编辑器来更新/etc/fstab文件.
在下面的示例中,我们在根文件系统(/)使能了用户和组磁盘限额
Device Mount point Filesys Options dump Fsck
LABEL=/ / ext2 exec,dev,suid,rw,usrquota,grpquota 1 1
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner 0 0
none /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
/dev/hda5 swap swap defaults 0 0
/dev/hda1 /win vfat uid=500,gid=500,owner,rw 0 0
/dev/hda6 /home ext2 defaults 0 0
如果你手工编辑/etc/fstab文件,你要确保你的编辑没有覆盖到下一行,如果覆盖到了下一行,那么你的/etc/fstab将会是非法的,下一次启动不能完满成功.
Linuxconf能够为你更新/etc/fstab文件,你只要进入file system | Access local drive菜单和编辑你想使能磁盘限额的EXT2分区,编辑时,有一个检查框选项来对用户和组磁盘限额进行编辑,选上这两个选项和激活更改,那么Linuxconf会为你编辑/etc/fstab文件.
首先你要选择一个是EXT2文件系统的分区,如下图6-1所示
要想更改一个文件系统的设置,双击你要更改的文件系统,会出现图6-2所示
现在,点击options选项,你就可以更改文件系统选项了,见图6-3
注意你要滑动到选项列表的底端才能看到用户和组的选项
最后,选上 User Quota Enabled和 Group Quota Enabled 这两个选项,接着是Accept 更改和关闭这个对话框, 这样就会返回到inuxconf的主菜单.
建立/quota.user和quota.group文件
这时,你要打开一个终端窗口(作为一个超级用户),同时创建两个文件用于在根文件系统中保留有关磁盘限额额信息,输入命令如下:
# touch /quota.user
# touch /quota.group
# chmod 0600 /quota.user /quota.group
如果不运行这三个命令,那么你将不能完成你的磁盘限额配置.
预览你的更改
你可以通过file|Act/changes选项来预览你的更改,下图6-4是linuxconf为我们做的一个示例:
图6-4提示了有潜在的问题,丢失了/quota.usre和/quota.group两个文件,如果我们不象先前所说的手动创建了这些文件,那么我们就不能启动磁盘限额系统,尽管你选择了Do It按钮,哪果你忘记了创建这两个文件,你会看到象上图6-4类似的图示,选择Do Nothing按钮, 打开一个终端窗口(作为一个超级用户),同时创建这两个文件.
注意linuxconf是十分关注即将要运行的命令的,这个优势是你可以从linuxconf中学习和执行下次要想实现磁盘限额的命令
一旦你准备好,选择Do It,linuxconf会告诉我们重新以新的文件系统选项来加载根文件系统,在这里必须选择Yes否则磁盘限额就不会使能.由于我们是第一次使能磁盘限额,linuxconf要运行quotacheck来获得有关用户和组的有关磁盘空间的使用,.linuxconf会要求有权限来执行,如下图6-5所示:
刚才我们使能了根文件系统的磁盘限额,在这里,我们要指定那些用户进行磁盘限额,在下节我们会看到如何实现用户的磁盘限额.
升级者要注意:
在版本7.1中更改了管理磁盘限额的方法,它现在使用文件aquota.usert和aquota.group来代替quota.user和quota.group这两个文件.如果你使用的是Red Hat7.0或更前的版本,或者你升级到了7.1版本,你要运行命令convertquota来更新这些文件.你知道在这种情况下,quotaon会失败并提示找不到文件aquota.usert和aquota.group.我们可以使用命令来更新我们的磁盘限额文件
# convertquota -u -g /
这样我们就可以使能磁盘限额功能了
# quotaon -u -g /
手工管理磁盘限额
如果你没有选择使用Linuxconf工具来管理你的磁盘限额,你要手工创建文件/quota.user和/quota.groupIf 文件,要创建这两个文件,在你的根文件系统上创建两个空的文件,同时为它们建立安全权限,只有超级用户才能读写这些文件.示例如下:
# touch /quota.user /quota.group # RedHat 7.0 或更前的版本
# chmod 600 /quota.user /quota.group
或者
# touch /aquota.user /aquota.group # RedHat 7.1版本
# chmod 600 /aquota.user /aquota.group
This step will be done automatically for you when you run quotacheck -avug. The options for quotacheck are:
当你运行quotacheck– avug命令时,这一步会自动运行,有关quotacheck参数有:
-a:检查/etc/mnttab文件来查看所有使能磁盘限额的文件系统
-v:执行一个详细模式的扫描,如果没有这个参数就是一个简单模式的扫描
-u:为用户磁盘限额扫描
-g:为组磁盘限额扫描
这会检查有关当前所有用户,组和分区的磁盘限额信息它会保存在进行磁盘限额的分区的根目录上,如果你没有手动创建这些文件,你必须现在创建它并给予正确的权限,但你为了安全应该再次检查一下
# ls -l /quota.usr /quota.group # Red Hat 7.0或更前的版本
或者
# ls -l /aquota.user /aquota.group # for Red Hat 7.1
如果你用linuxconf 来使能磁盘限额,当你激活更改时会提示你是否运行quotacheck,你要选Yes来执行它。
无论你如何创建文件,你要运行quotacheck来收集有关你的用户的初始化信息,这可以由重新启动或者运行quotacheck来完成,例如,要在根文件系统上初始化你的磁盘限额,运行
quotacheck /
使用edquota来实现磁盘限额
要指定磁盘限额,你要运行edquota,edquota会用VI编辑器来编辑quota.user或者quota.group文件,你可以指定你自己想要的编辑器,你只要修改$EDITOR变量(如EDITOR=/path/th/new/editor,export EDITOr),在我们的示例中,假设有一个用户叫craig,我们想限制它使用的磁盘空间,我们使用下面的命令来编辑它的磁盘限额记录:
|# edquota -u craig
这会运行VI并显示如下信息:
Edit block and inode quota for user craig:
Device /dev/hda2 (/):
Used 60KB, limits: soft=0 hard=0
Used 15 inodes, limits: soft=0 hard=0
如果你运行这个命令但只看到第一行,那么你可能是在它之前忘记运行quotacheck命令了
在这个例子中,我们对inodes节点的文件的软限制和硬限制均设置为0,这是默认的设置,即没有限制,尽用户所需要用的节点数或磁盘块数。我们看到现在用户craig 在这个分区用了60KB的磁盘空间和15个文件(inode节点),我们想设置限制craig只用20MB的磁盘空间,首先,我们要对软限制和硬限制有一个说明:
软限制是一个用户可以在这个分区使用的最大数量的空间,如果你设置了,那它就会作为一个边界的一个阀值,接着用户会通知他违反了磁盘限额,当然你设置了宽限期,你也要设置硬限制。宽限期是允许用户在违反磁盘限额时存在的天数,超过时间后用户必须保留在软限制下。
硬限制:只有在使用了宽限期时才用到硬限制,它绝对限制一个用户的使用磁盘空间的量,任何想使用超过个限制的都会被制止,如果没有使用宽限期,那么软限制就是用户可用的绝对空间量
在我们的示例中,我们会设置一个18MB软限制和一个20MB的硬限制,同时我们也给用户craig一个七天的宽限期来让他清理他的资源.
Edit block and inode quota for user craig:
Device /dev/hda2 (/):
Used 60KB, limits: soft=18000 hard=20000
Used 15 inodes, limits: soft=0 hard=0
注意我们并没有限制用户craig使用节点数,即他可以用任意多的文件(不要在空间上超出限制就行了)
现在我们必须保存这个文件,要设置宽限期,我们使用命令edquota,同时也提供了参数-t
# edquota -t
vi 会装载文件同时你会看到类似下面的东西:
Edit grace times for user quota:
Device /dev/hda2 (/):
Block grace: 7 days Inode grace: 7 days
现在,LINUX提供给我们一个默认为七天的同时包括节点数和磁盘块的使用限制.因为一个用户可能会资源使用上超出他的软限制,如果这样,七天后,他的使用Inode节点或磁盘块请求会被拒绝,我们的用户Craig会不得不删除一些文件来确保他的磁盘块点用量低于18MB,这样它才可以创建新的文件或者对现有的文件的追加.
要激活我们的宽限期,我们要保存这个文件.
在磁盘限额中有一个值得注意的地方是,当你用edquota来指定宽限期时,你不能在数字和单元间使用空格,因此,条目”7 days”不会工作但是”7days”可以有效地工作,如果你看到类似下面的信息:
Can't parse grace period time 7
你要知道你忽略了空格,最奇怪的是, Red Hat 7.1在你使用edquota –t时会插入空格.
Edquota允许你用一个已经配置了的用户限额作为新用户的模板,要使用这个特性,你要输入参数 –p < configured_user>
# edquota -u -p craig bob sue
这一命令并不会提供什么输出,但它会使用到Craig的设置并应用到用户bob和sue身上,你可以用这个模板来应用到尽可多的用户身上.
你也可以根据基于组来设置磁盘限额,要实现这个目标,你只要简单运行edquota –g <groupname>就可以了,注意组名<groupname>是一个在文件/etc/group中的有效的组名.
# edquota -g games
对组games进行磁盘块和inode节点限制
Device /dev/hda2 (/):
Used 0KB, limits: soft=0 hard=0
Used 0 inodes, limits: soft=0 hard=0
要使用linuxconf,选择User accounts | Normal | User account,同时选择一个用户,在编辑用户信息时,有一个选项是磁盘限额的,你可以在这个文件中添加软限制和硬限制.
First, select the user you wish to add a quota for; you’ll see the screen shown in Figure 6-6. Next, you will need to choose the Disk Quotas tab to see the screen shown in Figure 6-7.
首先,选择一个要进行磁盘限额的用户,如下图6-6,并在图6-7中的磁盘限额标签中进行设置
图6-7
选择一个要进行磁盘限额的用户,在这里是用户Craig,点击它的帐号记录,这时带出一个用户信息标签.
你现在可以指定磁盘和文件的软限制和硬限制了,同时你也可以指定用户的宽限期,如果没有指定宽限期,那么硬限制将会被忽略,当你设置完后,点击Accept,当你退出linuxconf时,它会问你是否激活更改,一旦这些更改被激活,它们会立即生效.
创建默认的磁盘限额配置
You can set up system-wide defaults for your quotas, as shown in Figure 6-8. This is a nice feature that will save you some time if you have a system-wide policy. The easiest way to do this is with linuxconf. You need to access the Quota Defaults menu through File Systems | Set Quota Defaults. In this menu, you can add both soft and hard limits, as well as grace periods
你可以为你的磁盘限额设置系统级别的默认配置,如图6-8,如果你一个系统级别的策略的话那么这个特性会节省你不少时间.做这些最简单的办法是使用linuxconf,你要在file systems | set quota defaults|在这里你可设置软\硬限制和宽限期.
在这里,上图显示用户磁盘空间和文件占用,我们还可以设置组默认值,而关于宽限期的格式为日:小时:分钟:秒,为了避免过度花费,只要简单地设置日期就行了.
当你个修改这些设置时,所有先前的设置会由系统默认的设置所取代,最好你先设置好系统默认值,最后才根据个别用户需要个别设置.
磁盘限额报告
经常查看谁使用最多磁盘空间是一个好习惯,你可以根据用户,组或者每一个分区上的任何人来产生报告,要看一个所有磁盘限额信息的报告,运行repquota –a命令:
# repquota -a
*** Report for user quotas on device /dev/hda2 (/)
Block grace time: 7 days; Inode grace time: 7 days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 24 0 0 2 0 0
craig -- 60 0 0 15 0 0
你也可以用repquota来生成你有关指定分区上所有用户的报告,使用命令如下:
|# repquota –u
要想看某个用户的磁盘限额信息,使用下面的命令:
# quota -uv craig
Disk quotas for user craig(502):
Filesystem blocks quota limit grace files quota limit grace
/dev/hda2 60 0 0 15 0 0
一个用户用quota只能查看他自己的使用情况,但ROOT用户可以用- u选项来查看其他用户的情况.
在NFS文件系统上进行磁盘限额
在NFS文件系统上进行磁盘限额基本上是一样的,NFS将远程用户化为本地用户,你用NFSD配置来指定如何进行这些转化工作,参考第七章节有关NFS驱动程序和信息,你要为你计划作映射外边的用户进行磁盘限额,因此,如果你创建了一个用户nfsuser,你将所有远程请求化为这个用户的请求,那么你要为这个用户在加载的分区上进行磁盘限制,这样会限制所有进入的NFS用户的磁盘消耗.
6.02
系统初始化脚本
Red Hat 7.x在系统启动上和运行状态管理上跟从标准的unix 系统VR4(system 5 release 4)方法,init守护进程作为第一个进程启动(进程ID为1),init读取它的启动配置文件/etc/inittab,基于这个配置文件继续它的初始化进程.下面是red hat 7.1的一个/etc/inittab示例文件.
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
...
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, no NFS (The same as 3, if you don't have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# Things to run in every runlevel.
ud: nce:/sbin/update
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
pf::powerfail:/sbin/shutdown -f -h +2 " ower Failure; System Shut Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c " ower Restored"
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon
/etc/rc.d/rc.sysinit脚本 (在第四章中有描述)中会运行一些其他脚本,根据需要,它会运行/etc/rc.serial(用于初始化任何串行接口) ,而setserial命令用于用指定的设置来初始化端口(代替/etc/rc.serial中的值),这个文件只在旧版本中(6.X)存在,而在新版本7.X中不再出现.
/etc/rc.d/rc.local文件还在,它是在其他系统脚本运行完后执行本地系统初始化(在你登录系统前),作为一个普通配置文件,它的作用受到批评,当前,它唯一提供的功能是创建一个/etc/issue文件用于标识你当前使用的内核和Red Hat 版本(就是在你登录前的头部显示的内容,无论是在终端还是用TELNET/SSH登录).最后,它复制/etc/issue来产生一个叫/etc/issue.net的文件,如果你想显示不同的信息,你可以修改/etc/rc.d/rc.local,你可以在/etc/issue和/etc/issue.net中用你想要的内容来代替内核版本等信息.
也有一个脚本/etc/rc.d/rc,它是用来管理运行级别的更改的,不能编辑.
You should consider modifying the content of both the /etc/issue file and the /etc/issue.net file for security reasons. There are two issues:
基于安全理由,你应该考虑修改/etc/issue和/etc/issue.net这两个文件,这里有两个值得注意的问题.
大部份用户并不要求知道当前使用的发布版和内核版本,而邪恶的入侵者则关注这些信息,因为这让他们迅速测试你的系统的弱点.基于这点原因,你应该想修改/etc/issue.net来提供虚假的情报误导入侵者.通过修改内核版本或者/和linux发布商.
??????????????????????????????你的系统用于私人用途,
/etc/rc.d, /etc/rc0.d ... /etc/rc6.d
Linux, 象许多商业 UNIX一样,通过定制的运行级别来管理它提供的服务.运行级别命令runlevel可以用来查询系统当前和先前的运行级别.
# runlevel
N 3
第一个字母(N)说明没有先前的运行级别,这是因为我们直接启动到运行级别3中,而数字3则说明了我们当前的运行级别,捎带一句的是,Unix命令who –r命令在Linux下并不工作.
在文件/etc/inittab里./etc/rc.d/rc脚本会被调用,而运行级别则作为一个参数传递,下面是摘录自我们的文件/etc/inittab:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
要想知道更多有关/etc/inittab是如何工作的.看第四章.在这里你可以看每一个运行级别.而/etc/rc.d/rc会被调用同时传递运行级别这一参数.
/etc/rc.d/rc 通过更改到特定的适合于该运行级别的目录来管理运行级别的更改.一旦进入了正确的目录,它会运行一系列的脚本来停止一系列不必要的服务和启动需要的服务.这里有独特的运行级别目录对应于运行级别0, 1, 2, 3, 和 5.它们分别称之为/etc/rc.d/rc0.d, /etc/rc.d/rc1.d, /etc/rc.d/rc2.d, /etc/rc.d/rc3.d, 和/etc/rc.d/rc5.d,
通常,你在这些目录看到是符号连接,它们指向于/etc/rc.d/init.d目录下的脚本.这些脚本通常以S或者K开头,以两个数字来结尾.以S开头的脚本是一个启动脚本,S表示这些脚本在这个运行级别是需要且是必须运行的;但以K开关的脚本是要关闭的脚本,表明这些脚本并不适合在这个运行级别上运行.
也有在一个字母后接两个数字再加上服务名的脚本,这两个数字序号是用来确保脚本以一定的顺序来运行的,由于Linux(象UNIX)分类它的文件名,使用数字来确保我们的脚本运行在可见的方式.就是,它们会象ls程序报告的顺序来运行.
这里是/etc/rc3.d目录的一个示例:
K01kdcrotate K25sshd K92ipchains S20random S90crond
K01pppoe K30sendmail K96irda S25netfs S90xfs
K14alsasound K34yppasswdd S05kudzu S40atd S91smb
K15httpd K45arpwatch S08iptables S45pcmcia S95anacron
K20nfs K45named S10network S50xinetd S97rhnsd
K20rstatd K60lpd S12syslog S56rawdevices S99linuxconf
K20rusersd K65identd S13portmap S75keytable S99local
K20rwalld K83ypbind S14nfslock S77Win4Lin
K20rwhod K84ypserv S16apmd S85gpm
这里只有符号连接指向真实的程序,真实的脚本却在/etc/rc.d/init.d目录里,如果我们仔细查看这些文件,会发现它们都是指向于目录/etc/rc.d/init.d的.
# ls -l S85gpm
lrwxrwxrwx 1 root root 13 May 15 15:05 S85gpm-> ../init.d/gpm
# ls -lL S90crond
-rwxr-xr-x 1 root root 1316 Feb 12 2001 S90crond
注意:在ls命令中带有的参数-lL中-L表明跟随符号连接同时指出指向的真实的文件的属性,这对于找出那些是真正的文件很有作用.这个程序会以顺序85启动,这意味着它运行在S77Win4Lin之后而在S90crond之前,这个脚本真正运行的是当前目录的上一级目录下init.d的目录下的gpm程序由于这个脚本连接的是在rc3.d目录,因些在运行级别是3时它会自动激活的,这种方法比较快速而且占用较少的磁盘空间,因为几乎所有的文件都是连接到真正的文件.它也是最容易定制的,脚本遵照一个简单的结构,要启动这些服务只要在服务名后添加一个start参数就行了,要关闭这个服务只要加一个stop参数就行了.
自动地启动X-window
正如在第四章所简述的,现在我们详细看看其中的一些在第四章节中运行脚本,在第四章节,在第四章节,你会发现运行级别5是inittab文件中的默认运行级别, 它在启动时自动运行X-window,下面的两行是显示X是如何启动的
l5:5:wait:/etc/rc.d/rc 5
x:5:respawn:/etc/X11/prefdm -nodaemon
在这里,你首先看到的是运行的是rc5.d连接,接着运行的是prefdm.如果你看下rc5.d连接,你会发现大部份(如果不是全部的话)程序都是一样的,不是由X指定的当运行了prefdm后真正的奇迹出现了.
Prefdm是一个指向提供显示管理器的连接.这通常是xdm(标准的X显示管理器),kdm(KDE显示管理器),gdm(gnome显示管理器,)显示管理器负责下面的工作:
决定你是否用图形化来访问系统
通过接受用户名和密码来认证用户
基于你的首选项来启动正确的图形化环境
你可能会想:"哇,这真是迷人的,但我仍然不知如何自动启动X呀?"OK,要自动启动X,我们只要手动改动inittab文件中的一个数字:
id:5:initdefault:
如果这个数字不是5,将它改成5并重新启动,可以选择地,你也可以让Linux更改运行级别,只要用命令telinit就行了,要转换到运行级别5,使用:
# telinit 5
很快就会出现图形登录界面的了.
如果你选择了重启,你的系统会跳转到图形模式,你能够选择你想要的窗口管理器.
你也可以用linuxconf来更改默认的运行级别,如图6-9所示,你可以间接地通过选择Graphic & Network(注意我们选择的linuxconf窗口左边部分窗口中的选择树)来使能运行级别5.当你选择这个值时你要设置和测试你的x配置,使用Xconfigurator命令.
如果你设置了但启动窗口失败,你可以跳转回文字模式的终端,只要同时按住三个键就行了,分别是ctrl+alt+F1~F6
6.03
内核编译与安装
Linux一个强大的特点是提供重新编译内核来调整适合你自己的需要,内核是整个操作系统的心脏,它管理硬件,决定运行那一个进程,为进程提供独立的虚拟地址空间来运行,内核是由LILO(Linux loader, inux装载器)装载入内存的,同时也是由内核决定什么设备驱动程序模块是必须的和硬件资源是如何分配的(如中断,I/O端口,内存地址和DMA通道等),如果有能力重新编译内核,你可以:
编译直接支持经常用到驱动程序和动态装载比较少用到的驱动程序,大大提高服务的速度.
通过移除那些不必要的组件来减少内存的消耗
通过配置来支持那些高端硬件,如超过4GB的内存,硬件阵列控制器,并行多处理器支持等.
通常,你可以为的计算机构架编译特定的内核.
最佳实践
你应该编译你所需要的内核组件,而添加到内核中的不会用到的东西越少,整个系统的运行就会越快,例如,你的系统没有声卡,那么你就没理由添加声音支持到你的内核中去,通过移除你不需要的设备,你能够:
减少内核的大小
将现存的设备在速度上有适度的提高
为扩展卡获得更多的系统资源(I/O端口,中断等),如网卡,磁盘控制器和其他
减少遇上计算机硬件限限制(如压缩内核的大小)的机会
对于任何你现在用不着的设备,把它的驱动程序编译成模块是一个好主意.如果你想添加第二块网卡,在内核中编译时先将它的驱动程序编译为模块,那么当你真正添加这个网卡时,马上就能用.
模块化是内核的扩展,它们并没有直接编译进内核中去,但可以在需要时加入内核或者移除.这将会在本章后面部份详细讨论.这样做的原因是因为当出现硬件故障时不用重新编译内核.例如,当前你用到的网卡是3com 3c595,你库存有3com3c905网卡,那么将3com3c905的网卡驱程序模块化加入到内核中是一个好主意.那么当先前的网卡失效时,你只要更换网卡和让内核中加载它的驱动程序即可,这只会占用你少许时间.
内核概念
Monolithic内核是将所有设备模块直接编译到内核中去的,而模块化内核刚将大部份设备的驱动程序作为模块单独加载到内核中去,也可以直接说是monolithic内核比模块化内核启动更快.而模块化内核则是间接通过模块表来加载的.
Monolithic 内核比较大,内核大就会减少系统能得到的可用内存,同时一些系统会要求系统内核要比较小,有一定的大小限制,主要是为了启动.你可以添加多个设备到一个monolithic 内核.系统会自动装载正确的那一个.尽管这会添加系统的启支时间 (因为内核较大且每一个模块要运行它自己的初始化程序),这有一个好处,当你工作在一个其他人都不懂Linux的环境中,你可以编译它,比方说,网络设备最终运行起来了,例如,一块网卡失效了,而你只有另外一个牌子的网卡,但它的驱动程序已经编译进入内核了,你只要更换网卡,打开服务器的电源就行了,就是说,服务器会启动加载新网卡,同时会分配它应该的IP(旧网卡的IP等参数).
模块化内核有更大的灵活性,你可以编译你所有的驱动程序作为模块,那么在你需要的时候你可以将所需要的模块模块插入到内核中去,模块化可以减少初始化内核的大小,这也减少了启动所占用的时间,提高性能,你可以用modprobe或者insmod来加载所需的模块.
正如你所想的,大部份系统都是混合了monolithic和模块化的内核,必要的驱动程序会直接编译到内核中去,而其他的则是模块化.
更新内核
更新内核是一个相当容易的事,你应该要保持一个旧内核的拷贝防止编译内核时出错.新内核会安装于/boot里面同时配置linux启动装载器lilo,也就是在文件/etc/lilo.conf文件中添加image=这一节来指向新内核,如果你真的出错新内核不能启动的话,那么重启后在lilo提示下你只要选择旧内核就行了.你也应该保存你的内核配置文件,这样你可以复制到新内核和使用它们作为一个方针.下面我们将会详细讨论.
/boot分区
在使用新内核之前,你要把新内核复制到/boot目录来,让/boot目录拥有自己的文件系统是一个好主意.这是在安装时就决定了的,它用于确保你的内核是由计算机的BIOS编址的,当你配置linux逻辑单元时,你可以设置第一个分区是一个在1024柱面前的小分区(如20MB),同时加载它为/boot,这样做你可以在你的一个比较旧的BIOS中移动你的硬驱动,但不用做任何更改而启动系统,比较旧的驱动有一个硬限制就是只支持到500MB,而1998年之前的计算机很多不支持大于8GB的硬盘,如果你的/Boot分区超出了BIOS编址范围,那么内核的加载就会失败.但是,Linux并没有受到磁盘编址的限制,一旦Linux启动后,它可以支持任何大小的磁盘,如果你有一个大磁盘,如上所述来做,那么你的系统也能启动起来.
/proc文件系统
/proc文件系统是虚拟的,它并不是真正存在于硬驱动上,内核维护所有有关它的信息.这里面是有关内核在做什么最原始的信息..在这甚至可以调整内核中的变量来改变内核的行为你应该花费些时间来熟悉这些信息,以及认识它所包含的价值.下面是一个典型的red hat 7.1系统的例子:
# ls /proc
1 1967 2058 2125 2446 430 bus interrupts misc sys
1837 1968 2061 2127 2448 445 cmdline iomem modules sysvipc
1865 1980 2064 2155 2449 5 cpuinfo ioports mounts tty
1877 2 2066 2412 2471 501 devices irq mtrr uptime
1909 2012 2070 2413 2475 531 dma kcore net version
1921 2017 2072 2414 2493 543 driver kmsg partitions
1926 2018 2075 2432 3 6 execdomains ksyms pci
1963 2022 2076 2433 393 64 fb loadavg self
1964 2038 2077 2435 398 7 filesystems locks slabinfo
1965 2044 2078 2436 4 8 fs mdstat stat
1966 2055 2122 2438 410 apm ide meminfo swaps
那些已编号的条目是处理器的地址空间,经由进程ID,作为一个目录出现,在每一个目录内是内存分段,由些构成了活动进程.如果你想检查这些文件,那么你会读到那些进程的内存空间中内容(就好象一个程序员所做的)其他的条目是对应于组件的配置信息 (或者是整个子系统) 的文件和目录.
下面是一些有关类型信息文件的示例,首先看看我们安装的内存,看看linux是如何使用它的
# cat /proc/meminfo
total: used: free: shared: buffers: cached:
Mem: 195674112 151814144 43859968 0 6709248 101732352
Swap: 232202240 0 232202240
MemTotal: 191088 kB
MemFree: 42832 kB
MemShared: 0 kB
Buffers: 6552 kB
Cached: 99348 kB
Active: 103632 kB
Inact_dirty: 2268 kB
Inact_clean: 0 kB
Inact_target: 2284 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 191088 kB
LowFree: 42832 kB
SwapTotal: 226760 kB
SwapFree: 226760 kB
下面我们再看看有关CPU的信息
# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 5
model name : Pentium II (Deschutes)
stepping : 2
cpu MHz : 300.016
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception: yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat
pse36 … bogomips : 598.01
我们甚至可以通过检查文件来查看什么硬件资源在使用
如/proc/ioports, /proc/iomem, 和/proc/dma.下面是/proc/ioports 文件:
# cat /proc/ioports
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-008f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : fpu
01f0-01f7 : ide0
0220-022f : soundblaster
02f8-02ff : serial(auto)
0310-031f : 3c589_cs
03c0-03df : vga+
03f6-03f6 : ide0
03f8-03ff : serial(auto)
0cf8-0cff : PCI conf1
1000-100f : Compaq Computer Corporation Triflex Dual EIDE Controller
1000-1007 : ide0
1008-100f : ide1
1400-14ff : PCI CardBus #02
1800-18ff : PCI CardBus #02
1c00-1cff : PCI CardBus #03
2000-20ff : PCI CardBus #03
There are many programs that simply look at the information stored in /proc and report it in a more readable format. Top is a perfect example. It reads the process table, queries used memory and swap as well as CPU utilization and presents it all on one screen. A GUI version of top (gtop) is also available (see Figure 6-10).
有许多程序只是简单地显示那些存在于/proc的,但提供一个更具有可读性的信息,TOP就是一个很好的例子,它读取进程表,查询使用的内存,交换分区和CPU利用率,在一个屏幕上显示,而一个GUI版本是gtop,如下图6-10所示:
更重要的是,你可以更改内核变量来更改内核的行为,下面是一些例子:
# cat /proc/sys/net/ipv4/ip_forward
0
# echo 1 > /proc/sys/net/ipv4/ip_forward
# cat /proc/sys/net/ipv4/ip_forward
1
恭喜你!你的系统现在是一个路由器了,现在它能够转发IP包到另一个网络.
# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
这会使能TCP SYN 包,这样可以阻止SYN 泛洪攻击.
内核源代码树和文档
内核源代码是保存在/usr/src/linux目录的,/usr/src目录看起来通常是这样的:
# ls –l /usr/src/
total 12
lrwxrwxrwx 1 root root 11 Jul 15 18:14 linux -> linux-2.4.4
lrwxrwxrwx 1 root root 11 Jul 19 20:42 linux-2.4 -> linux-2.4.2
drwxr-xr-x 16 root root 4096 Jul 19 20:41 linux-2.4.2
drwxr-xr-x 14 1046 101 4096 Jul 30 20:30 linux-2.4.4
drwxr-xr-x 7 root root 4096 Jul 19 20:38 redhat
The physical directory is linux-2.4.4, and there is a soft link called linux that points to this directory. Using this method, you can create a directory for a new kernel, change the link to point to the new directory, and still keep your old source for reference.
真正的目录是linux-2.4.4,有一个软连接叫linux指向这个目录,使用这种办法,你可以为新内核创建一个新的目录,更改连接到一个新的目录,仍旧保存你的旧源代码来参考.
你要注意到Red Hat 7.1使用的是新的linux 2.4 内核.当安装新的内核源代码集时,你应该创建一个名为linux-2.4的连接来连接到真正的内核去(如符号连接连接到linux-2.4.4),这样做就行了:
# ln linux-2.4.4 linux-2.4
/usr/src/linux大概就是下面这个样子了:
arch CREDITS include lib net scripts
config Documentation init MAINTAINERS README System.map
Config.Good drivers ipc Makefile REPORTING-BUGS
COPYING fs kernel mm Rules.make
我建议你先看看README文件,当然,检查一个文档目录也是好的,里面包括你的要的任何东西,从多处理器到串行终端,而其他的目录主要是源代码,你可能不用花时间在这里面(除非你真的想知道TCP/IP是如何工作的)这里也有一个隐藏文件叫.config,在随后的章节中将会对它有的讨论.
内核的rpm文件和linux 内核的tar文件
如果你并没有看到先前所讲的目录,那么意味着你并没有安装内核的源代码,要想安装Red Hat 提供的源代码,只要加载cd-rom和安装的rpm内核就行了,如下:
# mount /dev/cdrom
# cd /mnt/cdrom/redhat/RPMS/
# rpm -ivh kernel-2.4.2-2src.rpm
或者,你可以从http://www.kernel.org中下载 ... 录/usr/src目录.
# cd /usr/src
# mkdir linux-2.4.2
# rm linux
# ln -s linux-2.4.2 linux
# ln -s linux-2.4.2 linux-2.4
# tar xvfz linux-2.4.2.tar.gz
在这里我们要手动为新内核创建一个新的目录,然后我们移除旧的连接,为新的目录创建一个新的连接.当我们解压了tar.gz文件后.它也会解压到linux的连接
所需的RPM
为了从源代码中创建新内核,你要确保你已经安装了所有必要的rpm包,同时也安装为创建内核所必要的工具,检查你的系统确保已经安装了下面这些内核,看下图6-11确保你已安装了所必要的内核,如果没有,更新安装它们(rpm –Uvh )
确保系统已安装了的必要的工具要比记住要安装什么工具容易多了,当你进行其他程序的安装时,确保你做了下面两件事:
选取定制安装(这样你可以自己选择想要安装的东西)
确保你总是选择了内核开发和软件开发工具包
通过这两步,你可以节省自己大部份时间和减少烦恼
理解内核的版本数字
版本数字看起来使人有点迷糊,但它真的很有用,例如,我们使用的版本是2.4.2
第一个数字(2)是主版本号,通常是进行了很多的更改.通常主版本的更改是因为旧版本资源在新版本中不能工作,它欠缺了当前所需要的对许多新的特性的支持. 主版本号通常保留来为新内核的设计.
第二个数字(4)有两个意思,首先,它表明是主版本号中第四个进行了主要修改的版本.如果这个数字是一个偶数,那么说明它是发布是一个比较稳定的版本.如果它是一个奇数,表明它是一个开发版本.
第三个数字(2)是一个进行了比较少修改的内核版本,这些修改通常是一些比较小的修改,臭虫的修复,安全漏洞的修复和加强等.
通常.对内核有要求的软件通常指向内核中的前两个主要的数字.如你安装的软件只工作在内核版本是2.2或以后的版本. 这个软件旧不能运行在2.0.X版本中.(如第三方软件.如数据库).
最后,它是一个一般的惯例,就是Red Hat 标识它的修订版本,主要是Red Hat用于提示这个版本是它们自己发布的,通常会由一个破折号开始.
内核配置脚本
有一个隐藏文件包含了所有内核配置信息,它就是/usr/src/linux/.config文件,它由一系列的变量构成,下面是这个文件的一些条目:
CONFIG_IP_MASQUERADE=y
CONFIG_IP_MASQUERADE_IPAUTOFW=m
# CONFIG_IP_ROUTER is not set
这里有三类主要类型的变量,第一类是会直接编译到内核使内核直接支持的(因为它的值是”y”),第二类条目会当作是模块来支持的(因为它的值是”m”),第三类是被注释了的,这一类自然不会被支持啦.你应该不要试图直接编辑这个文件,这里有更好的方法来配置你的内核.
可以运行下面这个小脚本来配置你的新内核:
# cd /usr/src/linux
# make config
这个脚本会通过不同的选项来提示你,下面是摘录的一些输出:
Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC,
PPro/6x86MX) [386] 686
defined CONFIG_M586
Math emulation (CONFIG_MATH_EMULATION) [Y/n/?] n
MTRR (Memory Type Range Register) support (CONFIG_MTRR) [Y/n/?] n
Symmetric multi-processing support (CONFIG_SMP) [N/y/?] n
*
* Loadable module support
*
Enable loadable module support (CONFIG_MODULES) [Y/n/?] y
在这里你的应答值括在方括号内,你只要选择它们中的一个值即可,默认值是方括号内的大写字母,如果你的回答是一个?,那么会出现一个帮助页来解释这个选项的作用,如果你回应的是回车键,那么就会接受默认值,注意在red hat 7.1里,有743个不同的问题,通常你要回答这些问题.通常我们不会用这种配置内核的方法.
一个创建.config文件的更好的方法是使用menuconfig.这要求你安装ncurses,它是一个基于文本的菜单驱动系统,它使得更改内核更容易,要加载它,输入下面的命令:
# make menuconfig
你会看到下图6-12
有关memuconfig一个好的地方是它可以通过telnet会话来运行并且工作得很好,当你退出系统时,在底部也有选项来保存.config文件或者以其他文件名来保存.
第三种方法(也是最后的方法)来更改内核是使用X-windows,你可以运行make Xconfig来产生一个图形菜单系统来配置你的内核,如下图6-13:
在这里你也能以你想要的名称来保存文件名,下面提供的截图会说明一些子菜单系统的选项:
理解内核配置选项
你需要理解一些主要的内核配置选项,要知道得更多,选择上面所说的帮助来学习关于某些特定选项的说明.
标准Red Hat内核配置
标准的内核发布版本支持所有,几乎编译了所有可用的模,这是一个大的内核,有许多模块在标准安装系统时是可用的,当然这在安装时不是一个问题了.但强烈建议你修订内核移除不必要的模块.所有的Xconfig图象是来自默认的red hat 配置.
代码成熟级别选项
代码成熟级别选项,如下图所示,是用于使能提示内核源代码驱动程序并没有完全开发,可以认为是一个发布的alpha驱动程序,这通常意味着这些驱动程序还不能广泛地使用(开发人员不想收到有关这个驱动程序并没有工作的信息),它通常用于让一些爱好者来进行测试代码用的.
可装载模块支持选项
可装载模块支持截图,如下图6-15,是在内核中使能模块化的地方,你也具有使能内核装载模块的能力,在这样的情况下,内核会自动装载所要的模块,注意这是没在理由关闭装载模块支持的,实际上,如果你关闭了这个功能你的内核会不能正确的工作.
常用配置选项
这里是你常用的低级别的选项,在常用配置选项里,如图6-16所示,你可以打开或关闭pci,微通道甚至是SGI虚拟工作站,你也可以指定的你的二进制支持,Linux来自已配置的支持大多数二进制类型(包括旧的a.out格式,新的ELF格式,java等),你在这里选择默认就行了.
MISC支持允许内核运行基于是在文件的开头(/usr/src/linux/Documentation/binfmt_misc.txt)有特殊代码的二进制或者是基于扩展名的二进制文件.例如,如果你安装了dos仿真器(DOSEMU),你可以在命令行下运行dos程序,系统可以认识到它是可以运行的(通过文件开头的特殊代码或者扩展名,如.exe或者.com).
当然,在这一节里也包括了高级电源管理选项(APM),在这里你可以指定主板的BIOS如何与linux一起工作,如果你想计算机启动时找开APM,你可以在这里指定.
ATA/IDE/MFM/RLL 支持
ATA/IDE/MFM/RLL这些缩写,是有着个人电脑风格的磁盘和CD-ROM接口.这菜单,作为Red Hat 7.1的新特性之一,是配置磁盘支持和CD-ROM支持的主要配置界面,明显地,对于所有块存储设备的配置是使用一个单一的会话框..如下图6-17所示:
关闭对这些设备的支持的唯一理由是你的系统是一个基于SCSI系统的,即使这样我们也建议你将这个作为模块来支持.
块设备选项
在这里你可以指定软盘设备和非标准硬盘,如下图6-18所示,你可以指定支持ATAPI CD-ROMs , 磁带驱动程序,甚至是ATAPI软盘驱动程序,你也可以使能lookback支持和网络块支持(这样让你在网络上使用网络上的物理磁盘就好象在使用本地磁盘一样),如果你有什么并行端口设备如外接的CD-ROM或硬盘等,你也可以在这里使能支持.对于对RAM磁盘的支持也是在这里设置的.
对RAID和LVM等多设备的支持
这是2.4版本内核的一个新部件,这里,你可以配置逻辑卷来跨越多个磁盘,注意在这里的支持是对镜象(RAID0),带(RAID1)和带奇偶较验的带(RAID5),图6-19显示了有关多设备支持的配置屏幕:
非IDE/SCSI CD-ROM的支持
如果你有一个老式的CD-ROM,它不是IDE或者SCSI接口的,那么你要使能特定的支持.如下图6-20所示,这部份有很多驱动程序是对Mitsumi, Goldstar, Philips, Sony, SoundBlaster和其他老式硬件(流行于90年代初和中期),常在486级别和早期奔腾级别的计算机系统中发现,因为这些系统不在适用于生产工作,常用于实验性质的配置安装:
网络和网络设备选项:
There are many options for networking in the Linux kernel, which we will now discuss in more detail. (Refer to Figures 6-21 through 6-23.)
在Linux内核中有很多选项是有关网络的,在这里我们将详细讨论(参考图6-21~图6-23)
Packet Sockets and Kernel/User Netlinks:使能用户可以使用低层的网络的程序,这些程序通常不用到网络协议,它们通常是一些网络包嗅探程序,如tcpdump和ethereal, Kernel/User Netlinks允许用户读写低层的网络包.
Network Firewalls 允许用户建立包级别的防火墙,另外,你需要启用IP包转发.IP伪装选项也要求启用IP包转发,在这里你要注间不能使用快速交换选项.
Linux Socket Filtering 允许用户程序连接到套接字和过滤他们指定的套接字.这是基于BSD网络的套接字过滤,比其他的简单得多了.
IP Multicasting 允许用户建立一个由多方人在MBONE上构建的组播服务器, MBONE是一个负载声音和音像的高带宽的网络, 如果你的服务器是一个路由器,你也可以启用IP组播路由.
IP Kernel-Level Autoconfiguration 允许用户在启动时从命令行或者BOOTP/RARPj里建立IP地址,如果你想通过NFS启动你的根文件系统,你也要启用这个选项.
IP Firewalling 与网络防火墙选项一起用,你或者需要2.2版本的ipchains(8)或者旧的2.0.X内核版本的ipfwadm(8).这些程序通常由Linux分布版本里附带发布.
IP Firewall Packet Netlink Device会创建一个用户空间设备,它拒绝将包复制到它的空间,你可以运行程序监控这个netlink设备来发现攻击并进行适当的反应.
IP Transparent Proxy Support 允许路由器秘密地转发一个包到一个代理服务器,这并不要求客户端进行额外的设置,因为路由器接口的地址就是它们的网关地址,路由器负责包的转发.它在使用ipchains时也有一个好特性来建立转发规则,它允许你指定特定的端口来发送到服务器,允许其他不使用代理(如果你想的话).
IP ipportfw masq support 让你可以重定向端口.例如你公司有一个服务器伪装为路由器,但有人想他们自己的计算机作为内部网的WEB服务器,你可以重定向进入的包在端口80透明地连接到用户的WEB服务器,而外边看来就好象路由器是一个WEB服务器.
IP optimize as router not host 在你创建路由器是要启用,它通过移除不必要的包检查来加速路由.
IP aliasing support 让你在一块网卡上有多个IP地址,可用一台主机有多个WEB服务器,或者连接两个逻辑网络或者以太网如果想知道得更多,可以参考mini-HOWTO.
IP TCP syncookie support会保护计算机免除来自YN flooding的攻击,这些攻击是拒绝服务攻击 ,可以严重地影响计算机网络的性能,启用这一选项可免除这一攻击.编译这一选项后你要输入下面的命令来:
echo 1 >/proc/sys/net/ipv4/tcp_syncookies
IP Reverse ARP让你的计算机响应来自无盘工作站的RARP请求,这是典型的sun 3机器和Linux无盘工作站,当然你也可以使用其他协议如ipv6,IPX,AppleTalk,X.25和LAPD
Compile in WAN router support. 这会将典型高价的WAN路由器砍掉一半,如果你要的是一个WAN接口卡,WAN-tools包,启用这个选项来创建一个广域网路由器.
Fast switching是一个可选项,允许你通过一条线缆直接连接两台计算机,这是让两台计算机直接通信较快的的方法,这个选项与IP FIREWALL不兼容,但可以与IP ADVANCED ROUTER 选项.
QoS and/or fair queuing让你建立你想要的规则让那些包可以路由,启用这一选项可以给你不同的方法来检测那些包你会路由和那些包你要它排队或丢弃 这样可以让一些优先级高的IP包获得一定的带宽,同时限制其他IP包消耗较少的带宽, QoS 代表 Quality of Service ,现在正在使用这样用户付费多的就获得更多带宽,在网络设备部份,你可以进行流量修整来限制带外带宽.
A wide range of network cards are supported. 你只要选择你计算机上网卡即可或者以后你想用到的网卡.
Other network devices are also supported,如 T-1 cards, 袖珍网卡, FDDI卡, HIPPI 卡, Frame Relay DLCI, 无线网卡.
You can also encapsulate AppleTalk into IP, or vice versa. 这让你的计算机作为一个网关或者仅有MAC地址的网络,注意你只能选用一个封装类型.
SLIPP, PLIP, and PPP support全在网络设备选项选择.
图6-21
.图6-22网络设备支持子菜单
图6-23
SCSI Support Options and Low-level Drivers
你启用了SCSI硬盘,磁带驱动器和CD-ROM支持等,如下图6-24所示,如果你有一个CSCI接口的CD-ROM光盘机,你要启用探测所有来强制控制器探测多个LUNs,有一部分是关于SCSI错误报告的,你可能要启用特定的低级别的SCSI支持你的控制器和关闭其他控制器.如图6-25所示,这会节少省不小空间和加速你的装载,如果你有一个ADAPTEC控制器,你要在你的配置文件上关闭其他的控制器.
注意到Red Hat Linux 7.1支持高端硬件RAID-enabled SCSI主适配器,包括64位的PCI适配器,流行的Adaptec适配器也出现在截图上,通过滑动,你也可以发现对AMI,Mtkex,Compaq控制器的支持,正如对其他的生产商的支持一样.
ISDN选项
,综合业务数字网络(ISDN) 是相当流行和便宜的高速数字线路,添加ISDN支持会让你在带外或带内使用ISDN卡进行拔号连接,ISDN设备有内建的AT指令兼容的调制解调器仿真器,自动拔号,信道绑定,回复呼叫和呼叫者认证,这些都不必要求额外的程序的运行来实现.
如图6-26所示,你可以启用同步ppp连接,你要下载IPPPD来利用这一特性,通过同步PPP和常用微处理器的支持,你可以绑定多条ISDN线路来提高你的带宽.
文件系统选项:
The file system subsection is a list of all the different types of file systems Linux supports. Select the Quota option if you need to support quotas. You can also compile in the kernel automounter here. The menu for selecting supported file systems is presented in Figure 6-27.
文件系统子菜单是Linux支持的所有不同类型的文件系统列表,选择quotq选项如果你要支持磁盘配额.你也可以在这里编译内核自动挂接器,,下6-27显示支持的文件系统
由于Linux支持众多的硬件平台,也就支持众多的文件系统类型,一些厂商并没有发布有关他们文件系统的说明,因此Linux并不能完全确定对这类文件系统的支持.读阅读你需要的文件系统的相关的帮助信息,如果你只用linux 文件系统,或其他有很好的文档的文件系统(如DOS的FAT,VFAT),那么对这些文件系统的读写是没有问题的。表6-1显示了一些不现的文件系统的列表。
文件系统 描述
ADFS (只读) RiscOS
Amiga FFS AmigaOS
Apple Macintosh Macintosh文件系统
MS-DOS 旧式dos文件系统
VFAT Windows 95/98 文件系统
UMSDOS UNIX file system on top of an MS-DOS file system
ISO 9660/Microsoft Joliet CD-ROM CD-ROM file system
Minix Old Linux file system, usually found on old floppies
NTFS (read-only or read/write) NT's file system. Because the implementation details of this file system are proprietary, Linux cannot guarantee to be able to write reliably to NTFS file systems. Best to mount these read-only.
OS/2 HPFS (read-only) OS/2s file system
QNX (read-only or read/write) QNX 4 file system
ROM (read-only) Small read-only file system
Second extended file system (Ext2) Linux standard file system
UFS (read-only or read/write) *BSD and NextStep file system
字符设备选项
字符设备工作于字节流格式,这包括在真正的硬件设备如串口或者只是软件的设备如虚拟疑终端或者pseudo-ttys,有关字符设备的子菜单,如图6-28所示,你可以指定大部份你要支持的设备。包括串口,虚拟终端,新的AGP显卡,操纵杆等。而对并行口的支持有它自己的子菜单。
许多不同类型的标准或者串口智能板被支持,你可以启用串口支持和修改系统级别的信息到串口来关闭终端对虚拟终端的支持和启用终端对串口的支持,这会发送所有系统级别的信息到你的串口和你当前激活的终端(在系统启动时使用console =ttyS1来关闭它)。另外,这里面支持大范围的多端口串口板。
你也可能启用Unix98 PTY 支持,这让你许可传统的pseudo 终端命名协定为 ptyXX是一个精细的命名惯例。Unix98命名惯例 有一个目录保存所有设备 (/dev/pts/xxx).
你也可以启用watchdog计时器支持,这个选项会强迫内核将信息写入/dev/watchdog文件,如果每分钟的写入失效,系统会重启,你可以使用watchdog计时器的软件支持或者用一块watchdog硬件卡.当然watchdog硬件卡是更可靠些,这个选项对于网络服务器比较有用.如路由器.(尽可能要求全天在线的设备).如果大量的包或者其他东西让内核锁定,路由器可以在指定的间隔后重启,现实中,你并不要设置这个选项.
如果你有一个视频卡或TV卡,在linux内核中有一整节讲述这个,你甚至可以直接编译支持基本的QuickCams和 Mediavision Pro 电影工作室卡.
如果你有一个软盘磁带驱动器(QIC驱动器,) 那么你要启用Ftape支持.如果你忘记添加这一选项,你就不能使用你的磁带驱动器.
声卡支持:
linux支持大多数流行的声卡,如下所示:
·1 · S3 SonicVibes
·2 · Turtle Beach MultiSound Classic and Pinnacle
·3 · ProAudioSpectrum 16
·4 · SoundBlaster and 100 percent compatible
·5 · Generic OPL2/OPL3 FM synthesizer
·6 · Gravis Untrasound
·7 · PSS
·8 · Microsoft Sound System
·9 · Ensoniq SoundScape
·10 · MediaTrix AudioTrix Pro
·11 · OPTi MAD16 (Mozart)
·12 · Crystal CS4232-based PnP cards
·13 · Yamaha OPL3-SAx-based PnP cards
·14 · Aztech Sound Galaxy (non-PnP)
·15 · Support for AD1816 cards
·16 · Loopback MIDI
·17 · 6850 UART
·18 · ACI mixer
·19 · AWE32 synch
·20 · And many others
任何使用上述的(硬件)制作的声卡可以使用同类的驱动程序.你可以检查你的声音子系统来查看最新的内核支持声卡支持列表.如果你的声卡并不在列表里面,你可以用同类的驱动程序作一个尝试.很多声卡是sound Blaster或者其他OPL/2或者OPL/3兼容的,如果你的声卡是windows下使用的,那么很可能它不能在Linux下工作,如果你想要在linux下使用声卡,那么买一个比较有名的牌子的声卡,下图6-29显示有关声音子系统下的配置.
并行口:
并行口现在有了它们专属的子系统,如下图6-30.它们明显地是与字符设备是一组的,在对话框里提供了有关你有的并行口的有关详细信息,包括你想要的兼容级别,(如标准端口,EPP或者ECP)多端口并行设备同样被支持,如LPT1,LPT2,LPT3可以现时存在.但是,并行端口使用内核资源.如i/o端口和中断,占用先关的卡的插槽,并且并提供的是不很快的网络挂接打印机,因此,大部分linux管理员只是启用标准的并行口编译进入内核.
编译和安装一个定制的内核
After setting up all the options you want and saving your changes, you then need to compile your kernel. The following is a list of things you should do to successfully compile your kernel
当设置完所有选项,保存更改后,你要编译你的内核,为了成功编译你自己的内核,你要做下列的事情:
Cd /usr/src/linux 这个命令会带你到正确的目录,所在你要输入的命令应该在这个目录下进行,注意在下面要进行的手续中,我们会用/usr/src/linux作为你内核的基本目录.这暗示我们已正确建立这个符号连接指向那正确的内核源代码树:
编辑/usr/src/linux/Makefile文件中第四行,将EXTRAVERSION=-2改成其他一个唯一的数字.例如用你编译内核的月日来作为这一个数字,接着我们会创建一个内核映射,这样模块可以装载,使用你现在选择的名字,请记住自己的输入呵!
make mrproper这个命令确保你的源代码在一个一致的和干净的状态.
保存你的旧配置文件. 重建内核包括创建一个新的/usr/src/linux/.config文件. 如果你改变心意,选择放弃你的修改,有一个备份的配置文件跟随版本一起发布,,它保存在configs/kernel-2.4.2-i686.conf,执行下面的命令就行了cp configs/kernel-2.4.2-i686.config arch/i386/defconfig.
现在,安装这个标准配置文件到/usr/src/linux/.config,用命令make oldconfig
要定制你的配置文件/usr/src/linux/.config .使用make config命令,它会运行基于文字的配置脚本.你也可以运行 make menuconfig 得到一个基于菜单驱动的配置界面.或者运行make xconfig,它是一个基于X-Window 配置工具
make dep这个命令会正确设置你的所有依赖关系
make bzImage这命令创建一个gzip压缩的内核映象文件,这里只有几个选项与bzImage有关,在内核2.0.X中我们用的是命令 make zImage
这是内核真正出现的地方,这是一个相当消耗时间的进程,在386或者 486,你可能要让你的计算机编译通宵.在一台 Pentium 166,可能会占用30到45分钟,如果你用的是Pentiun III 或者Pentium IV,它可能只占用你几分钟的时间,耐心点,你的系统要编译数百MB的程序代码.
现在我们要编译我们的模块了,使用命令make modules来创建你的模块
创建好内核后,我们要将它复制到/boot分区去,cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.4.2-2rh.
现在我们要安装我们编译的模块了,这会安装那些可装载的模块到/lib/modules/2.4.2-2rh ,它对应于配置文件中EXTRAVERSION 的设置.如果名字已经存大,新模块会覆盖旧的模块,这可能会导致新旧内核都不能启动,确保EXTRAVERSION值设置是唯一的.用下面的命令来安装模块make modules_intall.
如果你已经有了一个可用的内核而且在运行当中,你想安装一个新设备,但你并没有为这一新设备创建模块,你只要简单地重新运行配置程序make menuconfig 或者make xconfig 就好了.选择你的模块,选M来对设备进行模块化支持,之后,你就可以通过命令modprobe或者insmod来装载这一模块.这会节省大量时间(仅编译缺少的模块),如果这个模块失效,尝试modprobe \*来装载所有模块(带有依赖关系检查).
编译内核是一个繁杂的过程但跟随一个标准的模式,熟悉内结构和排障是很重要的,参看下面的Scenario & Solution来解决遭遇到的问题和它建议的解决方案
SCENARIOS and Solutions
你在目录/usr/src/下但并没有看到 Linux内核源代码,出了什么问题 你并没有安装内核的源代码,你要安装kernel-source的rpm包或者下载新的内核来安装.
你配置内核为一个monolithic内核,但在运行 make bzImage失败了,提示这个内核太大,你应该怎样做, 你要重新配置内核为模块化因为对内核压缩有限制,你应该总是创建一个模块化内核
你找不到你的新内核 确保你的内核版本在编译的每一步都是正确的,否则你可能没有正确定位模块和内核
已创建成的程序:
There are still some more steps that must be completed before you can use your new kernel. These include:
在你使用新的内核之前,这里仍然有几个步骤要完成
为一个初始化的RAM盘创建支持(用于启动时)
复制剩余的文件到/boot分区
mkinitrd命令是用来创建初始化的RAM磁盘映象的,这个映象会在你第一次内核启动时重新装载.它主要用来装载一些必要的块设备如SCSI磁盘驱动程序(那些并不是原来Red Hat内核的一部份).例如,如果你在使用一个高端的硬件RAID控制器,在原来的内核中它并不能获得支持,然而我们可以把它作为模块来装载这个驱动程序.在启动过程里只有原版的内核特性可支持.这会使得这个控制器不可访问,要解决这个问题,我们创建了一个RAM盘,用于装载我们的内核映象,一个小型的根文件系统和我们所有的内核可装载驱动程序(包括我们需要的SCSI驱动程序),接着,我们启动系统,初始化的RAM盘装载,我们的驱动模块装载,那么启动进程就可以继续了.
这个命令自动装载所有在文件/etc/conf.modules中的SCSI驱动程序,和其他在这个文件中指定的模块.
要创建你自己的初始化RAM盘
# mkinitrd /boot/initrd 2.4.2-2rh.img 2.4.2-2rh
这样安装你的初始化RAM盘到/boot根文件系统.
接着,我们需要复制新的内核符号表到/boot分区:
# cp /usr/src/linux/System.map /boot/System.map-2.4.2-
最后,对/usr/src/linux/.config文件作一个备份是一个好主意,将它复制到/boot分区.(正如运行menuconfig或者 xconfig会更改配置文件一样,复制你的配置文件 如下:
# cp /usr/src/linux/.config /boot/config-2.4.2-2rh
更新lilo
要执行的最后一个步骤是配置linux启动管理器,lilo要使用你的新内核,你先要将内核复制到/boot目录,我们通过修改文件/etc/lilo.conf文件来实现,在文件里添加一节来描述我们的新内核.警告:不要删除你的旧内核配置文件和/etc/lilo.conf文件.除非你做了测试确保你的新内核能用起来.过早地删除你的旧内核给你这样的一个机会.如何从一个失效的系统中恢复系统.
下面是我们修改前的lilo.conf文件
boot=/dev/had
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
linear
default=linux
image=/boot/vmlinuz-2.4.2-2
label=linux
read-only
root=/dev/hda2
other=/dev/hda1
label=dos
这里我们可以知道原先的内核叫vmlinuz-2.4.2-2,保存在主分区中的第二个磁盘分区(hda2),我们有一个DOS分区,lilo保存在主引导扇区,控制启动进程.
默认启动的映象是在文件顶部那标识着default=设置系统,我们的标识是Linux,现在我们要添加一个新的映象来指向新的内核,下面就是更改后的文件:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
message=/boot/message
linear
default=linux
image=/boot/vmlinuz-2.4.2-2
label=linux
read-only
root=/dev/hda2
image=/boot/vmlinuz-2.4.2-2rh
label=newLinux
read-only
root=/dev/hda2
other=/dev/hda1
label=dos
保存这个文件,接着运行/sbin/lilo -v..输出会类似下面一样
LILO version 21.4-4, Copyright (C) 1992-1998 Werner Almesberger
'lba32' extensions Copyright (C) 1999,2000 John Coffman
Reading boot sector from /dev/hda
Merging with /boot/boot.b
Mapping message file /boot/message
Boot image: /boot/vmlinuz-2.4.2-2
Added linux
Boot image: /boot/vmlinuz-2.4.2-2rh
Added newLinux
Boot other: /dev/hda1, on /dev/hda, loader /boot/chain.b
Added dos
/boot/boot.0300 exists - no backup copy made.
Writing boot sector.
当你得启,LILO会让你输入一个标签,如果你只是按回车而没有输入任何东西,那么标识为linux映象将会被装载.你要特别指定你的新内核(标识为newLinux)来让它装载启动,从上面的配置来看我们是故意没有让计算机启动新的,末经测试的内核的,如果你的新内核不工作,你只要重新启动并装载旧内核启动就行了.另外,如果你的内核并不是十分稳定和当你不在时重启,你并不要担心它会在重启时挂起(因为默认时重启用的是旧内核).
Mkbootdisk
mkbootdisk 是一个用于创建启动盘的工具,它是一个基本的救急盘,当创建这个盘后,可用于启动你的系统,你也可以在LILO提示时输入rescue.你只要输入使用的内核版本号作为选项就行了.表6-2给出了创建启动盘的一些选项.
Command Description
–device <device file> 指定映象写到什么设备
–mkinitrdargs <args> 将参数传递给mkinitrd.
–noprompt 不提示插入磁盘
–verbose 通常, mkbootdisk 没有输出的,这个选项打开输出开关
下面是mkbootdisk的一个例子
mkbootdisk –device /dev/fd1 –verbose –noprompt 2.4.2-2rh
这个命令让mkbootdisk在第二个磁盘驱动器中创建启动盘,它有输出,但没有提示插入磁盘,它使用的内核是2.4.2-2rh.,注意到mkbootdisk并不是作为标准red hat安装的一部份来装载的,要想这样做,你要:
# mount /dev/cdrom /mnt
# cd /mnt/RedHat/RPMS
# rpm –Uvh mkbootdisk*
当使用这个磁盘时,你也可以在lilo提示符时输入rescue来将这个磁盘作为一个救急盘.
作为实践考试中检查你的能力的一个重要部分就是当系统在某些地方失效让你恢复这个系统,基于协议我不能告诉你真实考试的内容,但是我可以说能够创建和使用救急盘是一个非常重要的linux 管理技巧.
6.04
可插入认证模块
PAM 代表着Pluggable Authentication Modules可插入认证模块. 它为大多数linux服务提供了集中认证的能力.被用于创建和强迫使用访问限制.PAM 在单用户环境中和在一个所有用户均可信任的网络中并不是十分有用,但它在多用户系统中和连接到一个不信任的网络(如互联网)是十分完美的., PAM 在定义安全时提供了更多的尺度,你可以让PAM管理某些特定资源的访问,这并不给原来的程序添加代码,例如,你可以在pppd使用Novell或者NT 用户数据库来认证而不必用到 /etc/password 或者 /etc/shadow 文件.
PAM 配置文件保存在/etc/pam.d/. 目录里,在旧的版本中它是在文件/etc/pam.conf. 下面是Red Hat 7.1下的/etc/pam.d d目录列表:
adsl-config kde ppp su
chfn kppp printconf-gui system-auth
chsh kscreensaver reboot system-auth.rpmnew
firewall-config linuxconf rexec up2date
ftp linuxconf-auth rhn_register up2date-config
gdm linuxconf-pair rlogin up2date-nox
gnorpm-auth login rp3-config xcdroast
halt netcfg rsh xdm
internet-config other samba xscreensaver
isdn-config passwd smtp xserver
kbdrate poweroff sshd
These files are text configuration files telling PAM what authentication steps are required for the named applications. The syntax for these configuration files is as follows, using the FTP file as an example:
这些文件是文本配置文件告诉PAM什么认证步骤对这些有名的程序是要求,配置这些文件的语法如下面,下面是一个FTP文件的示例:
# cat ftp
#%PAM-1.0
auth required /lib/security/pam_listfile.so
item=user
sense=deny
file=/etc/ftpusers onerr=succeed
auth required /lib/security/pam_stack.so
service=system-auth
auth required /lib/security/pam_shells.so
account required /lib/security/pam_stack.so
service=system-auth
session required /lib/security/pam_stack.so
service=system-auth
#
旧PAM模块的配置文件是在/etc/pam.conf,语法如下:
service-name module-type control-flag module-path arguments
正如你所说的,它除了你要指定的服务名外几乎都是一样的,这是因为这里只有一个文件但要管理许多不同的服务.它在新的red hat 7.X中不再使用.
表6-3给出了每一列的用途,
列 描述
Service-name PAM配置记录应用到的程序名,不在red hat 7.X使用
Module-type 必须是 auth, account, session, 或者 password之一
Control-flag 必须是 required, requisite, sufficient, 或者optional之一
Module-path PAM模块的绝对路径,负责这个服务的管理,通常保存在 /lib/security
Arguments PAM 模块的参数,由模块指定的和可涉及文件,用户名其他PAM服务,用于如何检测成功或者失败,甚至更多
表6-4给出了PAM模块的类型关键字和它你的意思
Keyword Meaning
Auth 告诉PAM 提示用户认证
Account 基于帐号的限制应用,用户必须在系统上有一个帐号, 跟踪用户和组的ID
Session 面向会话的限制是强迫的(如文件最大尺寸,进程数等等,其他基于会话的活动可能会执行(如登录)
Password 为密码管理设置检测,包括如何测试有效性(如允许空密码)密码如何由hast算法加密,用于/etc/shadow文件 ,也可以检测密码强度长度等.
当选择模块类型后,我们要知道如何成功应用这些认证进程,作为测试中的一个部份,是否满足这些条件,或者这些测试是可选的,表6-5列出了控制标记及它们的相关注释:
控制标识 注释
Required 这个检测必须成功的,否则它就是失败的.可能要经过许多 required标识才能获得成功授权访问
Requisite 这个检测必须成功的.Requisite用于满足一个测试 is used when one test is sufficient.
Sufficient 这个测试成功后,就表示全部认证通过.也可能存在其他测试,但一旦它成功后,其他的测试就不用再继续了
Optional 可选表明它只是一个额外的测试选项,有没有并不重要.
PAM 有许多认证测试.每一个执行唯一的认证任务或者认证一定的行为,同时,PAM连接库在/lib/security,下表6-6是一个可用PAM模块的描述和如何使用的快速参考.
Module Description
pam_chroot 允许程序更改根目录到真正的根目录下的某个目录,这用于让某些程序如匿名FTP来确保末经标识的用识不能访问指定目录(如/var/ftp)外的目录.
pam_cracklib 运行密码强度测试,包括密码长度,无规则排列,使用特殊字符,字典测试,更改用户名等
pam_deny 拒绝访问这个服务
pam_env 控制用户的环境变量
pam_filter 可以调用终端过滤程序
pam_ftp 允许用户匿名访问FTP模式访问
pam_group 通过检查/etc/group来授权用户访问
pam_krb4 使用 Kerberos 4.认证
pam_lastlog 显示上次最后登录的用户
pam_limits 限制可获得的系统资源
pam_listfile 允许访问基于文件名的访问,FTP使用它来确保系统账号(如root)免受通过FTP服务攻击,通过在文件/ftp/ftpusers中列出拒绝访问的用户.这种机制有很大的灵活性,它可以表明那些用户可以(或是不可以)使用这些服务
pam_mail 检查是否有新邮件
pam_nologin 当文件/etc/nologin 存在拒绝telnet或者rlogin访问
pam_permit 总是允许访问
pam_radius 通过 RADIUS服务器来认证
pam_rhost_auth 通过检查文件/etc/hosts.equiv或者~/.rhosts来认证
pam_rootok 允许用户root访问不用密码
pam_securetty 检查 /etc/securetty 文件看是否一个特权用户(如root)允许从一个终端登录,这强迫root只能从一个可信任的物理终端上登录
pam_time 基于时间来限制访问
pam_warn 有关这个进程的登录信息
pam_wheel 如果用户是wheel组的成员则给予root访问权限
PAM 服务是设计在众多服务之上的,这样,可以设置一个基本的策略和基于每个独特的服务进行个别的修改.这个基本的策略在文件/etc/pam.d/system-auth里设置.下面是一个Red Hat 7.1版本的示例
# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required /lib/security/pam_env.so
auth sufficient /lib/security/pam_unix.so likeauth nullok
auth required /lib/security/pam_deny.so
account required /lib/security/pam_unix.so
password required /lib/security/pam_cracklib.so retry=3
password sufficient /lib/security/pam_unix.so nullok use_authtok
md5 shadow
password required /lib/security/pam_deny.so
session required /lib/security/pam_limits.so
session required /lib/security/pam_unix.so
system-auth文件为每一个模块设置了最小要求检测,例如,对于password 模块类型 (用于强迫密码更新策略).当更新密码时我们需要传递给pam_cracklib.so .如果我的密码强度不够(.如与登录名相近,是一个单词,或太短,易于被人攻破等) 如果三次都是这样.那么密码更改就会失败.下一卜是,下一个测试会是pam_unix.so 模块,这个模块提供了一个null_ok参数 (允许不带密码的帐号),使用use_authtok (来产生认证令牌), md5 (给传统的unix系统一个更强大的密码hash加密),而shadow (在文件/etc/shadow中用新的加密密码来更新用户帐号记录).
现在,让我们看看那些服务是会如何用到这些基本设置的,下面是/etc/pam.d/rlogin文件.
# cat /etc/pam.d/rlogin
#%PAM-1.0
# For root login to succeed here with pam_securetty, "rlogin" must be
# listed in /etc/securetty.
auth required /lib/security/pam_nologin.so
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_env.so
auth sufficient /lib/security/pam_rhosts_auth.so
auth required /lib/security/pam_stack.so service=system-auth
account required /lib/security/pam_stack.so service=system-auth
password required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
唯一与密码管理有关的一行说明它要求模块/lib/security/pam_stack.so的验证通过,这个模块用于告诉我们延迟我们的对另一个测试文件的测试,既然这样,那service=system-auth说明对于一个rlogin用户更改他们的密码要通过在/etc/pad.d/system-auth文件中说明的通过密码测试
然而,这并不是认证模块类型,我们的rlogin文件说明我们必须要通过pam_nologin检测,pam_securetty检测和pam_env检测,接着它要满足我们的通过pam_rhosts测试(这就是,我们经过/etc/host.equiv或者~/.rhosts),如果我们通过了(因为这个测试是充分的)我们就进入了,如果我们没有通过这个测试,我们就必须通过其他额外的在文件system-auth模块中的测试(因为pam_stack.so service = system-auth)
当确认了规则,PAM使用下面的逻辑
如果充分控制标志通过,系统就授予访问权限
如果必要控制标志通过,系统也授予访问权限
另外,如果任何一个充分的或必要的控制标志没有通过测试,那么PAM继续基本的认证检查.这样到后来访问才拒绝.这样的目的一些检查让屏幕上的提示运行(如登录提示,密码提示),如果PAM在第一个检测没有通过时就停止了检查,那么一个聪明的用户就会推断出他们是如何失效的,这也就可能得知如何攻击你的系统.
Authconfig程序设置基本系统策略,图6-3是一个有关这个程序的截图:
这里它给我们提供了同时使用shadow密码/etc/shadow和md5 hashing(都是强烈建议使用) Authconfig在每一次运行后都重写/etc/pam.d/system-auth文件,所以你不应该直接修改这个文件.(如用vi编辑它).
PAM 是十分复杂的,但它也大大提高了你系统的安全.要想知道更多有关配置PAM的信息,参考http://www.sun.com/software/solaris/pam.
象其他的linux服务配置一样,PAM是对配置文件的拼写错误或者格式十分敏感的,请在修改时要注意.
练习一: 仅对受限的一些用户允许访问FTP服务
我们想只让一些用户访问FTP服务,通常,对于不出现在/etc/ftpusers的用户都可以访问FTP的文件,这是传统的unix行为,它假设大部份用户可以访问FTP服务.默认时,/etc/ftpusers只包括在linux安装时的的系统帐号.
下面是我们编辑/etc/pam.d/ftp文件前它的原样:
# cat ftp
#%PAM-1.0
auth required /lib/security/pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
auth required /lib/security/pam_stack.so service=system-auth
auth required /lib/security/pam_shells.so
account required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
现在我们想允许用户 tom, dick, 和 harriet访问FTP,但不让其他的用户访问,要完成这个练习,跟着下面的指示做.
创建一个新文件为/etc/myftpusers,在这个文件里面输入tom, dick,和 harriet's
第一行说明获得访问FTP服务,我们要通过认证规则---要求在列表中有一个名字,文件是/etc/ftpusers,由于我们想要定制一个列表,我们更改这个文件名为/etc/myftpusers
检测意思设置拒绝,这意味着如果文件中有用户名,那这个用户拒绝访问,我们设置拒绝为接受,这样只有在文件/etc/myftpusers中列出的用户才可以访问FTP服务.
最后要修改的是移除onerr=succeed 指令,这就是说用户允许访问(即使测试失败)由于我们需要我们的测试对有限的用户成功,所以要移除这条指令
现在你可以测试你的配置文件,他只可以让三个用户访问FTP服务,而其他的用户则不行.
6.05
CRON 系统
Cron系统允许系统管理员或者其他用户可以在给定的时间隔里按进度表来执行指定的程序.一个名叫crond守护进程,它每分钟检查 /var/spool/cron目录下以用户名为子目录来看有什么工作要做. 注意linux下的 cron与商业版本Unix的cron是不同的,因为它只有在需要运行另一个程序时才用到.
Crond也检查文件/etc/crontab和/etc/cron.d目录下的文件,这些文件并不是故意要在这个目录下编辑的,你可以使用命令crontab命令来编辑(crontab -e),浏览(crontab -l)或者删除(crontab -d)这些文件. 你可以让用户使用crontab或者拒绝用它.如果/etc/cron.allow文件存在,那么文件里明列有的用户可以使用这些crontab,如果文件 cron.allow 不存在,那么在cron.deny 文件中列有的用户不可以使用crontab,如果两个文件都不存在,那么所有用户都可以使用cron.
Cron守护进程每一分钟都会检查crontab文件有没有被个性如果有则得读这个文件.
因为cron老是检查crontab文件有没有修改,因此你修改这个文件后并不需要重启这个程序.
系统crontab及其组件
Crontab命令用于编辑文件cron,常见的选项有
-u <user>指定用户的crontab来编辑.如果你使用su(8)来转换用户,那么你应该常用-U选项
-l显示当前crontab文件里面的条目
-r移除cron里的条目
-e 使用指定的编辑器来编辑当前的crontab 条目
Crontab文件有一定的格式,每一行可以是空白,一个注释(#),一个变量,或者一个命令,空白行与注释行(以#开头)会忽略,在命令行你不可以有一个注释.
你可以用下面的语法来设置环境变量.
Variable=Value
一些变量已经设置好了,如HOME是你的主目录,SHELL是用户的默认shell,LOGNAME是你的用户名,HOME和SHELL可以被覆盖,但LOGNAME不可以。
一个近便的变量是MAILTO变量,只要它不是设置是空值,那么cron程序会将输出通过邮件发送到想要的目标去。如果你想按进度作业或常要作邮件检查,那么这对你来说是非常有用的。你只要设置MAILTO=me@somewhere.com来将发送给用户的信息发送给指定的邮件账号中去,如果这个变量没有设置,就默认发送给运行这个程序的用户。
下面是crontab中一行的格式:
#minute, hour, day of month, month, day of week, command
* * * * * command
命令就是cron要做的事,表6-7给出有指定域中的有效值
Field Value
Minute 0-59,代表一小时内的分钟
Hour 0-23,代表一个中的那一个小时
Day of month 1-31,代表一月中的那一天
Month 1-12,代表一年中的那一月
Day of week 0-6,0代表星期天,而6代表星期六
对于那些我们没有关心的域,使用星号*来代替就行了,如果你忽略了这些值,那么这一行就会缺少一些值,当然它也就不能象你想那样来工作了。
Cron允许连续的范围的值或者是离散的值,例如我想一个程序在7:00 a.m., 8:00 a.m., 9:00 a.m.,和10:00 a.m.运行, 我可以在hour-of-day域使用7-10,而用逗号分开的离散值也是有效的,我可以让一个程序每五分钟运行一次,如0,5,10,15,20,25,30,35,40,45,50,55.注意在这里我不用到60。
你也可以在 month 和day-of-week域中使用名字, 如下面的简写Jan, Mar, Sat, Sun等.你不能列出一大列名字或者指定名字的范围,但是,
真正要运行的命令是第六个域,这个命令会占用这一行中剩余的部份,或者它延伸到一个%符号,如果这样就会当它成为一个新行,紧接着的文字会当成标准的输入,下面是一个例子:
# crontab -l
# Sample crontab file
#
# Force /bin/sh to be my shell for all of my scripts.
SHELL=/bin/sh
# Run 15 minutes past Midnight every Saturday
15 0 * * sat $HOME/scripts/scary.script
# Do routine cleanup on the first of every Month at 4:30 AM
30 4 1 * * /usr/scripts/removecores > /tmp/core.tmp 2>&1
# Mail a message at 10:45 AM every Friday
45 10 * * fri mail -s " roject Update employees%Can I have astatus
update on your project?%%Your Boss.%
# Every other hour check for alert messages
0 */2 * * * /usr/scripts/check.alerts
练习题:创建一个cron作业
这个练习中,我们会创建一个cron作业,它会在每天早上4:00更新locate数据库,并在每星期五邮寄磁盘使用量的报告,要完成这个作业,看下面的步骤:
1. 1. Log in as root.
2. 2. Run crontab -e.
3. 3. Type in the following line to update the locate database:
00 4 * * * updatedb &2>/dev/null
4. 4. Add the following line to mail a disk usage report to your account. The remote admin account is admin@remote.site.com.
00 9 * * 5 df | mail admin@remote.site.com -s DiskUsage &2>/dev/null
5. 5. Save and exit.
以root登录
运行crontab –e
输入下在内容来更新locate数据库
00 4 * * * updatedb &2>/dev/null
添加下面的内容来邮寄磁盘使用量报告到你的帐号,远程管理帐号是admin@remote.site.com
00 9 * * 5 df | mail admin@remote.site.com -s DiskUsage &2>/dev/null
保存并退出
6.06
System-wide Shell Configuration for Bourne and Bash Shells
所有系统级别shell配置文件都保存在/etc目录下,这些文件是bashrc,profile和profile.d目录下包括特定shell配置脚本,在这本书里我们只会讨论小数几个Bash shell脚本,如果你想要知道得更多,请参考相关的手册页。
/etc/bashrc
/etc/bashrc 用于系统级别的别名和功能,在调用bash时你可以用参数不清-norc来旁路这些脚本,下面是有关bashrc的一个简单例子:
#/etc/bashrc
# System-wide aliases and functions
# Set up the prompt
PS1="[\u@\h \W]\\$ "
# This alias shows colors with ls(1)
alias ls='ls -color'
而在redhat 7.1里面,/etc/bashrc有30多行那么多,要想看,输入如下:
# less /etc/bashrc
/etc/profile
/etc/profile用于系统级别的变量和启动文件,在调用bash时你可以用参数不清-noprofile来旁路这些脚本,下面是来自Red Hat 7.1的profile脚本:
# /etc/profile
# System wide environment and startup programs
# Functions and aliases go in /etc/bashrc
if ! echo $PATH | /bin/grep -q "/usr/X11R6/bin" ; then
PATH="$PATH:/usr/X11R6/bin"
fi
ulimit -S -c 1000000 > /dev/null 2>&1
if [ `id -gn` = `id -un` -a `id -u` -gt 14 ]; then
umask 002
else
umask 022
fi
USER=`id -un`
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
HOSTNAME=`/bin/hostname`
HISTSIZE=1000
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
INPUTRC=/etc/inputrc
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
for i in /etc/profile.d/*.sh ; do
if [ -x $i ]; then
. $i
fi
done
unset i
Its primary job is to systematize basic system variables (HOSTNAME, LOGNAME, MAIL), account default permissions (with umask), and user maximum file sizes (with ulimit). It also runs the correct start-up script for your login shell.
它的主要工作是同步系统变量(HOSTNAME, LOGNAME, MAIL)用户默认权限(用umask)和用户最大文件尺寸(用ulimit)它也为你的登录shell运行正确的启动脚本。
/etc/profile.d/
Profile.d不是一个脚本,是一个有小许脚本的目录,你可能会注意到/etc/profil脚本管理这个目录, 下面是它的部份列表:
-rwxr-xr-x 1 root root 184 Apr 19 02:47 kde.csh
-rwxr-xr-x 1 root root 149 Apr 19 02:47 kde.sh
-rwxr-xr-x 1 root root 1444 Apr 19 15:39 lang.sh
-rwxr-xr-x 1 root root 64 Apr 19 15:03 mc.csh
-rwxr-xr-x 1 root root 107 Apr 19 15:03 mc.sh
通过看/etc/profile脚本,你可以看到这个目录下所有脚本以sh结尾并设置可运行,当运行/etc/profile时也就运行了它们。在这里,它会运行kde.sh,lang.sh和mc.sh,而文件.csh并不匹配文件/etc/profilej里要求的*.sh(其实.csh由/etc/csh.cshrc调用)。
练习三:让你的系统更安全
我们想我们的系统尽可能的安全,要想这样,我们要更改用户创建新的文件和目录时的默认权限,我们会设置新文件或目录对于组用户和其他成员是不可访问的。
编辑/etc/profile 文件。有两行是有关设置umask的,其中一行根据上面的if语句来选择. 如果你看见了一行对于普通用户是可运行的就要注意了
if语句检查看用户ID与组ID是否相同并且大于14,如果说是真的话,那么运行第一个umask.否则运行第二个umask语句。第二个语句是用于root和其他系统帐号而第一个语句是用于普通用户的.
修改第一个语句来拒绝组和其他成员的权限,用umask 077来作这个工作C。
保存并退出
用一个非特权用户登录,用touch命令创建一个空文件,用ls –l来检查权限。
以root登录系统,用touch命令创建一个空文件,用ls –l来检查权限。
就这样,你改变了所有用户的默认umask.
认证总结:略 |
|