当前位置:Linux教程 - Linux - Linux系统安全与优化(配置和编译内核)

Linux系统安全与优化(配置和编译内核)



        
    第五章 配置和编译内核

    概述

    安装说明如下

    软件包

    做一张紧急启动盘

    优化

    增强内核的安全性

    编译

    内核配置

    安装新内核

    删除和模块相关的程序、文件和内容

    创建新的急救盘

    制作紧急启动软盘

    更新“/dev”目录下的项

    Linux内核
    概述
    下面讨论如何根据自己系统的需求重新编译生成新的内核。编译内核是非常简单的工作,一般只要根据“/usr/src/linux/”目录下的README文件中的指示就都可以完成。为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:①自己定制编译的内核运行更快(具有更少的代码);②系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中);③不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞;④将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些。

    在下面的内核配置和编译示例中,我们将编译生成一单块内核(monolithic kernel)。单块内核指在回答编译配置选项时只回答“yes”或“no”,而不回答“M”,也就是将所有要支持的功能都直接编译到内核中,而不编译为模块方式,故在编译内核过程中可以忽略make_modules和make_modules_install两个步骤。同样我们这里对编译的内核添加“缓冲区溢出防范”补丁,如: Solar设计者开发的不可执行性栈补丁(non-executable stack patch)。

    若需要使用防火墙的IP伪装及PPP拨号连接功能,则不能采用下面的介绍的单块内核方式,因为这些功能必须缺省地被编译为模块方式。

    一个新的编译生成的内核是与特定计算机硬件相关的,这些都是在内核编译配置中确定的。下面的例子里我们假设计算机有如下的硬件配置:

    l 1 Pentium II 400 MHz (i686) 处理器

    l 1 SCSI主板

    l 1 SCSI硬盘

    l 1 Adaptec AIC 7xxx SCSI控制器

    l 1 ATAPI IDE CD-ROM

    l 1 软驱

    l 2 Intel EtherExpressPro 10/100网卡

    l 1 PS/2鼠标

    安装说明如下
    命令为Unix兼容的。

    源代码位于“/usr/src”目录下。

    安装测试是在RedHat Linux 6.1进行的。

    所有的步骤都是以root用户的身份进行的。

    最后的内核版本是2.2.14。

    最后的内核补丁版本号是2_2_14-ow1。

    软件包
    内核源代码下载路径http://www.kernelnotes.org/

    下载linux-2_2_14_tar.gz。

    安全Linux核补丁主页为http://www.openwall.com/linux/

    下载linux-2_2_14-ow1_tar.gz。

    做一张紧急启动盘
    安装前的准备工作的第一步是创建一个紧急启动软盘:使用mkbootdisk命令来实现创建启动盘。首先查看文件“/etc/lilo.conf”来确定系统当前是使用哪个核启动的。例如:

    [root@deep]# cat /etc/lilo.conf
    boot=/dev/sda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    image=/boot/vmlinuz-2.2.12-20
    label=linux
    root=/dev/sda6
    initrd=/boot/initrd-2.2.12-20.img
    read-only

    现在需要查看用来启动的内核,在标准安装中,将是映像标签为linux的内核映像。在上面的例子显示该系统是使用“/boot/vmlinuz-2.2.12-20”内核来作为启动映像的。在软驱中插入一张经过格式化的1.44英寸软盘,以根用户的身份登录,执行如下命令:

    [root@deep]# mkbootdisk --device /dev/fd0 2.2.12-20
    Insert a disk in /dev/fd0. Any information on the disk will be lost.
    Press to continue or ^C to abort:

    按照上面的步骤,将创建成功一个带有可以正常工作的内核映像的启动软盘,以在升级内核出现错误时使用。推荐在进行下一步以前首先使用该软盘引导进入系统成功以后在继续进行下面的步骤。

    优化
    解压内核源代码:

    [root@deep]# cp linux-version_tar.gz /usr/src/
    [root@deep]# cd /usr/src/
    [root@deep]# rm -rf linux (这个一般是一个符号链接)
    [root@deep]# rm -rf linux-old.version.number (这是存放系统内核头文件目录)

    注意:上面删除Linux符号链接(rm -rf linux)和Linux头文件子目录的做法仅仅适用于以前曾经安装了过tar格式的Linux内核的情况。若这是第一次安装Linux kernel内核,则应该使用删除在系统中的kernel-headers-version.i386.rpm, kernel-version.i386.rpm两个RPM包的方法,删除这两个RPM包的同时将使目录“/usr/src/linux”及目录“/lib/modules/2.2.XX”下的相关的模块文件将自动被去除。

    若系统安装的是一个RPM格式的内核包,而不是tar格式的包,则说明你以前没有更新安装过Linux系统或者是使用RPM包来更新Linux系统。则使用下面的方法来删除Linux核。

    可以使用下面的命令来验证你的系统安装了RPM内核包:

    [root@deep]# rpm -qa | grep kernel
    kernel-headers-2.2.12-20.i386.rpm
    kernel-2.2.12-20.i386.rpm

    使用下面的命令来删除安装的RPM内核包:

    [root@deep]# rpm -e --nodeps kernel-headers kernel

    使用“rpm –e”命令以后,再手工删除空的“usr/src/linux-2.2.12”和“/lib/modules/2.2.12”目录(RPM反安装程序并不能完全删除这些目录)。然后解开内核源代码,改变新的Linux源代码的所有者为根用户,然后删除压缩的源代码。

    [root@deep]# rm -rf /usr/src/linux-2.2.12/
    [root@deep]# rm -rf /lib/modules/2.2.12-20/
    [root@deep]# tar xzpf linux-version_tar.gz
    [root@deep]# chown -R 0.0 /usr/src/linux/
    [root@deep]# rm -f linux-version_tar.gz

    增加任务数
    为了增加允许的任务数(每个用户的最大进程数),需要修改文件“/usr/src/linux/include/linux/tasks.h”中如下所示的内容:

    NR_TASKS from 512 to 3072
    MIN_TASKS_LEFT_FOR_ROOT from 4 to 24

    注意:

    1. NR_TASKS指定内核将分配给每个用户的最大数量的任务。增加这个数字将允许系统服务器进程处理客户端更多连接请求(例如WEB服务器将能处理多哥客户端的服务请求)

    2. Linux被设计为避免所有的进程槽被普通用户所占用。必须保留至少MIN_TASKS_LEFT_FOR_ROOT个时间槽给根用户。也就实现了避免所有的内存被普通用户所占用。

    优化内核
    为了优化定制适合系统需要的内核来适应系统的CPU类型及优化参数需求,也许需要编辑“/usr/src/linux/Makefile”文件并改变如下的参数部分:

    l 修改:

    CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer



    CFLAGS = -Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions

    l 修改

    HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer



    HOSTCFLAGS = -Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions

    上面的修正是一些比较冒进的优化,这些优化并不一定适用于所有的情况,如果这些优化不适合你的情况,请不要勉强使用这些优化。

    增强内核的安全性
    来自Openwall工程的安全内核补丁是一个非常好安全增强补丁,可以防止如栈溢出等攻击。这个补丁集合了一系列针对内核的安全相关特性,所有的新增加的安全选项配置将增加内核的安全性。

    除了新增的特性,某些版本的补丁还包含了各种其他安全弥补措施。这种弥补是随着版本的不同而不同的,某些修补已经消失了(因为新的内核的发布已经弥补了错误),而有些却是针对出现的新的安全漏洞。

    linux-2_2_14-ow1_tar.gz的新的特性包括:
    l 不可执行的用户堆栈区

    l 限制“/tmp”目录下的链接

    l 限制“/tmp”下的FIFO

    l 受限制的“/proc”目录

    l 特殊文件句柄 0、 1和2

    l 在execve(2)中对RLIMIT_NPROC进行了加强

    l 将不使用的共享内存段释放归还给系统

    注意:当施用内核补丁linux-2_2_14-ow1 补丁时,将在内核配置的最后添加新的安全选项部分。想知道到关于这些新配置选项的意思,可以参见该补丁带的自述文件。

    对内核施用补丁如下:
    [root@deep]# cp linux-2_2_14-ow1_tar.gz /usr/src/
    [root@deep]# cd /usr/src/
    [root@deep]# tar xzpf linux.2_2_14-ow1_tar.gz
    [root@deep]# cd linux-2.2.14-ow1/
    [root@deep]# mv linux-2.2.14-ow1.diff /usr/src/
    [root@deep]# cd ..
    [root@deep]# patch -p0 < linux-2.2.14-ow1.diff
    [root@deep]# rm -rf linux-2.2.14-ow1
    [root@deep]# rm -f linux-2.2.14-ow1.diff
    [root@deep]# rm -f linux-2_2_14-ow1_tar.gz

    注意:和linux-2.2.14-ow1相关的所有的安全信息:如非可执行堆栈等将被记录到“/var/log/messages”中。

    编译
    确保“/usr/include/asm”、“/usr/include/linux”和“/usr/include/scsi”等子目录是指向内核源代码的链接。子目录asm、linux和scsi都是链向源代码目录下的真正的、该计算机体系结构所需要的真正的include子目录。如:asm指向“/usr/src/linux/include/asm-i386”等。若没有这些链接,就需要手工创建,按照下面的步骤进行:

    [root@deep]# cd /usr/include/
    [root@deep]# rm -rf asm linux scsi
    [root@deep]# ln -s /usr/src/linux/include/asm-i386 asm
    [root@deep]# ln -s /usr/src/linux/include/linux linux
    [root@deep]# ln -s /usr/src/linux/include/scsi scsi

    这是配置非常重要的一部分。删除掉“/usr/include”下的asm、linux和scsi目录后,再创建新的链接指向新内核源代码目录下的同名的目录。这些头文件目录包含着保证内核在系统上正确编译所需要的重要的头文件。

    使用下面的命令来确保系统没有陈旧的“.o”文件及依赖关系:

    [root@deep]# cd /usr/src/linux/
    [root@deep]# make mrproper

    注意:上面的两个命令把以前无意留下来的垃圾文件清除掉。

    现在已经正确的安装了源代码。可以通过三种方式来配置你的内核:第一种是使用命令“make config”。这个命令提供了一个基于文本的交互式的内核选项配置方式;第二种是使用命令“make menuconfig”,它提供了一个易于使用的菜单式的配置界面;第三种方式是使用命令“make xconfig”,它提供了一个完全的图形化的内核配置界面。

    这里我们以“make config”为例来说明,其他两种方式类似:.

    [root@deep]# cd /usr/src/linux/
    [root@deep]# make config

    内核配置
    Code maturity level options

    Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL) [N]

    Processor type and features

    Processor family (CONFIG_M386) [Ppro/6x86MX]
    Maximum physical Memory (CONFIG_1GB) [1GB]
    Math emulation (CONFIG_MATH_EMULATION) [N]
    MTRR Memory Type Range Register support (CONFIG_MTRR) [N]
    Symmetric multi-processing support (CONFIG_SMP) [Y] N

    Loadable module support

    Enable loadable module support (CONFIG_MODULES) [Y] N

    General setup

    Networking support (CONFIG_NET) [Y]
    PCI support (CONFIG_PCI) [Y]
    PCI access mode (BIOS, Direct, Any) [Any]
    PCI quirks (CONFIG_PCI_QUIRKS) [Y] N
    Backward-compatible /proc/pci (CONFIG_PCI_OLD_PROC) [Y] N
    MCA support (CONFIG_MCA) [N]
    SGI Visual Workstation support (CONFIG_VISWS) [N]
    System V IPC (CONFIG_SYSVIPC) [Y]
    BSD Process Accounting (CONFIG_BSD_PROCESS_ACCT) [N]
    Sysctl support (CONFIG_SYSCTL) [Y]
    Kernel support for a.out binaries (CONFIG_BINFMT_AOUT) [Y]
    Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y]
    Kernel support for MISC binaries (CONFIG_BINFMT_MISC) [Y]
    Parallel port support (CONFIG_PARPORT) [N]
    Advanced Power Management BIOS supports (CONFIG_APM) [N]

    Plug and Play support

    Plug and Play support (CONFIG_PNP) [N]

    Block devices

    Normal PC floppy disk support (CONFIG_BLK_DEV_FD) [Y]
    Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support (CONFIG_BLK_DEV_IDE) [Y]
    Use old disk-only driver on primary interface (CONFIG_BLK_DEV_HD_IDE) [N]
    Include IDE/ATA-2 disk support (CONFIG_BLK_DEV_IDEDISK) [Y]
    Include IDE/ATAPI CDROM support (CONFIG_BLK_DEV_IDECD) [Y]
    Include IDE/TAPE support (CONFIG_BLK_DEV_IDETAPE) [N]
    Include IDE/FLOPPY support (CONFIG_BLK_DEV_IDEFLOPPY) [N]
    SCSI emulation support (CONFIG_BLK_DEV_IDESCSI) [N]
    CMD640 chipset bugfix/support (CONFIG_BLK_DEV_CMD640) [Y] N
    RZ1000 chipset bugfix/support (CONFIG_BLK_DEV_RZ10000 [Y] N
    Generic PCI IDE chipset support (CONFIG_BLK_DEV_IDEPCI) [Y]
    Generic PCI bus-master DMA support (CONFIG_BLK_DEV_IDEDMA) [Y]
    Boot off-board chipsets first support (CONFIG_BLK_DEV_OFFBOARD) [N]
    Use DMA by default when available (CONFIG_IDEDMA_AUTO) [Y]
    Other IDE chipset support (CONFIG_IDE_CHIPSETS) [N]
    Loopback device support (CONFIG_BLK_DEV_LOOP) [N]
    Network block device driver support (CONFIG_BLK_DEV_NBD) [N]
    Multiple device driver support (CONFIG_BLK_DEV_MD) [N]
    RAM disk support (CONFIG_BLK_DEV_RAM) [N]
    XT hard disk support (CONFIG_BLK_DEV_XD) [N]
    Mylex DAC960/DAC1100 PCI RAID Controller support (CONFIG_BLK_DEV_DAC960) [N]
    Parallel port IDE device support (CONFIG_PARIDE) [N]
    Compaq SMART2 support (CONFIG_BLK_CPQ_DA) [N]

    Networking options

    Packet socket (CONFIG_PACKET) [Y]
    Kernel/user netlink socket (CONFIG_NETLINK) [N]
    Network firewalls (CONFIG_FIREFALL) [N] Y
    Socket filtering (CONFIG_FILTER) [N]
    Unix domain sockets (CONFIG_UNIX) [Y]
    TCP/IP networking (CONFIG_INET) [Y]
    IP:Multicasting (CONFIG_IP_MULTICAST) [N]
    IP:Advanced router (CONFIG_IP_ADVENCED_ROUTER) [N]
    IP:Kernel level autoconfiguration (CONFIG_IP_PNP) [N]
    IP:Firewalling (CONFIG_IP_FIREWALL) [N] Y
    IP:Transparent proxy support (CONFIG_IP_TRANSPARENT_PROXY) [N]
    IP:Masquerading (CONFIG_IP_MASQUERADE0 [N]
    IP:ICMP masquerading (CONFIG_IP_MASQUERADE_ICMP) [N]
    IP:Optimize as router not host (CONFIG_IP_ROUTER) [N]
    IP:Tunneling (CONFIG_NET_IPIP) [N]
    IP:GRE tunnels over IP (CONFIG_NET_IPGRE) [N]
    IP:Aliasing support (CONFIG_IP_ALIAS) [N]
    IP:TCP syncookie support (CONFIG_SYN_COOKIES) [N] Y
    IP:Reverse ARP (CONFIG_INET_RARP) [N]
    IP:Allow large windows (CONFIG_SKB_LARGE) [Y]
    The IPX protocol (CONFIG_IPX) [N]
    AppleTalk DDP (CONFIG_ATALK) [N]

    Telephony support

    Linux telephony support (CONFIG_PHONE) [N/y/m/?] (NEW)

    SCSI support

    SCSI support (GONFIG_SCSI) [Y]
    SCSI disk support (CONFIG_BLK_DEV_SD) [Y]
    SCSI tape support (CONFIG_CHR_DEV_ST) [N]
    SCSI CD-ROM support (CONFIG_BLK_DEV_SR) [N]
    SCSI generic support (CONFIG_CHR_DEV_SG) [N]
    Probe all LUMs on each SCSI device (CONFIG_SCSI_MULTI-LUM) [Y] N
    Verbose SCSI error reporting (kernel size +=12K) (CONFIG_SCSI_CONSTANTS) [Y] N
    SCSI logging facility (CONFIG_SCSI_LOGGING) [N]

    SCSI low-level drivers

    7000FASST SCSI support (CONFIG_SCSI_7000FASST) [N]
    ACARD SCSI support (CONFIG_SCSI_ACARD) [N]
    Adaptec AHA152X/2825 support (CONFIG_SCSI_AHA152X) [N]
    Adaptec AHA1542 support (CONFIG_SCSI_AHA1542) [N]
    Adaptec AHA1740 support (CONFIG_SCSI_AHA1740) [N]
    Adaptec AIC7xxx support (CONFIG_SCSI_AIC7XXX) [N] Y
    Enable Tagged Command Queuering (CONFIG_AIC7XXX_TCQ_ON_BY_DEFAULT) [N] Y
    Maximum number of TCQ commands per device (CONFIG_AIC7XXX_CMDS_PER_DEVICE) [8]
    Collect statistics to report in /proc (CONFIG_AIC7XXX_PROC_STATS) [N]
    Delay in seconds after SCSI bus reset (CONFIG_AIC7XXX_RESET_DELAY) [5]
    IBM ServeRAID support (CONFIG_SCSI_IPS) [N]
    AdvanSys SCSI support (CONFIG_SCSI_ADVANSYS) [N]
    Always IN2000 SCSI support (CONFIG_SCSI_IN2000) [N]
    AM53/79C974 PCI SCSI support (CONFIG_SCSI_AM53C974) [N]
    AMI MegaRAID support (CONFIG_SCSI_MEGARAID) [N]
    BusLogic SCSI support (CONFIG_SCSI_BUSLOGIC) [N]
    DTC3180/3280 SCSI support (CONFIG_SCSI_DTC3280) [N]
    EATA ISA/EISA/PCI (DPT and generic EATA/DMA-compliant boards) support (CONFIG_SCSI_EATA) [N]
    EATA-DMA (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix) support (CONFIG_SCSI_EATA_DMA) [N]
    EATA-PIO (old DPT PM2001, PM2012A) support (CONFIG_SCSI_EATA_PIO) [N]
    Future Domain 16xx SCSI/AHA-2920A support (CONFIG_SCSI_FUTURE_DOMAIN) [N]
    GDT SCSI Disk Array Controller support (CONFIG_SCSI_GDTH) [N]
    Generic NCR5380/53c400 SCSI support (CONFIG_SCSI_GENERIC_NCR5380) [N]
    Initio 9100U(W) support (CONFIG_SCSI_INITIO) [N]
    Initio INI-A100U2W support (CONFIG_SCSI_INIA100) [N]
    NCR53c406a SCSI support (CONFIG_SCSI_NCR53C406A) [N]
    symbios 53c416 SCSI support (CONFIG_SCSI_SYM53C416) [N]
    Simple 53c710 SCSI support (Compaq, NCR machines) (CONFIG_SCSI_SIM710) [N]
    NCR53c7,8xx SCSI support (CONFIG_SCSI_NCR53C7xx) [N]
    NCR53C8XX SCSI support (CONFIG_SCSI_NCR53C8XX) [N]
    SYM53C8XX SCSI support (CONFIG-SCSI_SYM53C8XX) [Y] N
    PAS16 SCSI support (CONFIG_SCSI_PAS16) [N]
    PCI2000 support (CONFIG_SCSI_PCI2000) [N]
    PCI2220i support (CONFIG_SCSI_PCI2220I) [N]
    PSI240i support (CONFIG_SCSI_PSI240I) [N]
    Qlogic FAS SCSI support (CONFIG_SCSI_QLOGIC_FAS) [N]
    Qlogic ISP SCSI support (CONFIG_SCSI_QLOGIC_ISP) [N]
    Qlogic ISP FC SCSI support (CONFIG_SCSI_QLOGIC_FC) [N]
    Seagate ST-02 and Future Domain TMC-8xx SCSI support (CONFIG_SCSI_SEAGATE) [N]
    Tekram DC390(T) and Am53/79C974 SCSI support (CONFIG_SCSI_DC390T) [N]
    Trantor T128/T128F/T228 SCSI support (CONFIG_SCSI_T128) [N]
    UltraStor 14F/34F support (CONFIG_SCSI_U14_34F) [N]
    UltraStor SCSI support (CONFIG_SCSI_ULTRASTOR) [N]

    Network device support

    Network device support (CONFIG_NETDEVICES) [Y]

    ARQnet devices

    ARCnet support (CONFIG_ARCNET) [N]
    Dummy net driver support (CONFIG_DUMMY) [M] Y
    EQL (serial line load balancing) support (CONFIG_EQUALIZER) [N]
    General Instruments Surfboard 1000 (CONFIG_NET_SB1000) [N]

    Ethernet (10 or 100Mbit)

    Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y]
    3COM cards (CONFIG_NET_VENDOR_3COM) [N]
    AMD LANCE and PCnet (AT1500 and NE2100) support (CONFIG_LANCE) [N]
    Western Digital/SMC cards (CONFIG_NET_VENDOR_SMC) [N]
    Racal-Interlan (Micom) NI cards (CONFIG_NET_VENDOR_RACAL) [N]
    Other ISA cards (CONFIG_NET_ISA) [N]
    EISA, VLB, PCI and on board controllers (CONDIF_NET_EISA) [Y]
    AMD PCnet32 (VLB and PCI) support (CONFIG_PCNET32) [N]
    Apricot Xen-II on board Ethernet (CONFIG_APRICOT) [N]
    CS89x0 support (CONFIG_CS89x0) [N]
    DM9102 PCI Fast Ethernet Adapter support (EXPERIMENTAL) (CONFIG_DM9102) [N]
    Generic DECchip & DIGITAL EtherWORKS PCI/EISA (CONFIG_DE4X5) [N]
    DECchip Tulip (dc21x4x) PCI support (CONFIG_DEC_ELCP) [N]
    Digi Intl. RightSwitch SE-X support (CONFIG_DGRS) [N]
    EtherExpressPro/100 support (CONFIG_EEXPRESS_PRO100) [Y]
    PCI NE2000 support (CONFIG_NE2K_PCI) [N]
    TI ThunderLAN support (CONFIG_TLAN) [N]
    VIA Rhine support (CONFIG_VIA_RHINE) [N]
    SiS 900/7016 PCI Fast Ethernet Adapter support (CONFIG_SIS900) [N/y/m/?] (NEW)
    Pocket and portable adaptors (CONFIG_NET_POCKET) [N]
    SysKonnect SK-98xx support (CONFIG_SK98LIN) [N/y/m/?] (NEW)
    FDDI driver support (CONFIG_FDDI) [N]
    PPP (point-to-point) support (CONFIG_PPP) [N]
    SLIP (serial line) support (CONFIG_SLIP) [N]
    Wireless LAN (non-hamradio) (CONFIG_NET_RADIO) [N]

    Token ring devices

    Token Ring driver support (CONFIG_TR) [N]
    Fibre Channel driver support (CONFIG_NET_FC) [N]

    Wan interfaces

    Comtrol Hostess SV-11 support (CONFIG_HOSTESS_SV11) [N]
    COSA/SRP sync serial boards support (CONFIG_COSA) [N]
    Sealevel Systems 4021 support (CONFIG_SEALEVEL_4021) [N]
    MultiGate (COMX) synchronous serial boards support (CONFIG_COMX) [N/y/m/?] (NEW)
    Frame relay DLCI support (CONFIG_DLCI) [N]
    WAN drivers (CONFIG_WAN_DRIVERS) [N]
    SBNI12-xx support (CONFIG_SBNI) [N]

    Amateur Radio support

    Amateur Radio support (CONFIG_HAMRADIO) [N]

    IrDA subsystem support

    IrDA subsystem support (CONFIG_IRDA) [N]

    ISDN subsystem

    ISDN support (CONFIG_ISDN) [N]

    Old CD-ROM drivers (not SCSI, not IDE)

    Support non-SCSI/IDE/ATAPI CDROM drives (CONFIG_CD_NO_IDESCSI) [N]

    Character devices

    Virtual terminal (CONFIG_VT) [Y]
    Support for console on virtual terminal (CONFIG_VT_CONSOLE) [Y]
    Standard/generic (dumb) serial support (CONFIG_SERIAL) [Y]
    Support for console on special port (CONFIG_SERIAL_CONSOLE) [N]
    Extended dumb serial driver options (CONFIG_SERIAL_EXTENDED) [N]
    Non-standard serial port support (CONFIG_SERIAL_NONSTANDAR) [N]
    Unix98 PTY support (CONFIG_UNIX98_PTYS) [Y]
    Maximum numbers of Unix98 PTYs in use (0-2048) (CONFIG_UNIX98_PTY_COUNT) [256] 128
    Mouse support (Not serial mice) (CONFIG_MOUSE) [Y]

    Mice

    ATIXL busmouse support (CONFIG_ATIXL_BUSMOUSE) [N]
    Logitech busmouse support (CONFIG_BUSMOUSE) [N]
    Microsoft busmouse support (CONFIG_MS_BUSMOUSE) [N]
    PS/2 mouse (aka 揳uxiliary device? support (CONFIG_PSMOUSE) [Y]
    C&T 82C710 mouse port support (CONFIG_82c710_MOUSE) [Y] N
    PC110 digitizer pad support (CONFIG_PC110_PAD) [N]

    Joystick support

    Joystick support (CONFIG_JOYSTICK) [N]
    QIC-02 tape support (CONFIG_QIC02_TAPE) [N]
    Watchdog Timer support (CONFIG_WATCHDOG) [N]
    /dev/nvram support (CONFIG_NVRAM) [N]
    Enhanced Real Time Clock support (CONFIG_RTC) [N]

    Video for Linux

    Video for Linux (CONFIG_VIDEO_DEV) [N]
    Double Talk PC internal speech controller support (CONFIG_DTLK) [N]

    Ftape, the floppy tape device driver

    Ftape (QIC-80/Travan) support (CONDFIG_FTAPE) [N]

    Filesystems

    Quota support (CONFIG_QUOTA) [N] Y
    Kernel automounter support (CONFIG_AUTOFS_FS) [Y] N
    Amiga FFS filesystem support (CONFIG_AFFS_FS) [N]
    Apple Macintosh filesystem support (CONFIG_HFS_FS) [N]
    DOS FAT fs support (CONFIG_FAT_FS) [N]
    ISO 9660 CDROM filesystem support (CONFIG_ISO9660FS) [Y]
    Microsoft Joliet CDROM extensions (CONFIG_JOLIET) [N]
    Minix fs support (CONFIG_MINIX_FS) [N]
    NTFS filesystem support (CONFIG_NTFS_FS) [N]
    OS/2 MPFS filesystem support (CONFIG_HPFS_FS) [N]
    /proc filesystem support (CONFIG_PROC_FS) [Y]
    /dev/pts filesystem support (CONFIG_DEVPTS_FS) [Y]
    ROM filesystem support (CONFIG_ROMFS_FS) [N]
    Second extended filesystem (CONFIG_EXT2_FS) [Y]
    System V and coherent filesystem support (CONFIG_SYSV_FS) [N]
    UFS filesystem support (CONFIG_UFS_FS) [N]

    Network File Systems

    Coda filesystem support (Advanced Network fs) (CONFIG_CODA_FS) [N]
    NFS filesystem support (CONFIG_NFS_FS) [Y] N
    SMB filesystem support (CONFIG_SMB_FS) [N]
    NCP filesystem support (CONFIG_NCP_FS) [N]

    Partition Types

    BSD disklabel (BSD partition tables) support (CONFIG_BSD_DISKLABEL) [N]
    Macintosh partition map support (CONFIG_MAC_PARTION) [N]
    SMD disklabel (Sun partition tables) support (CONFIG_SMD_DISKLABEL) [N]
    Solaris (x86) partition table support (CONFIG_SOLARIS_X86_PARTITION) [N]

    Console drivers

    VGA text console (CONFIG_VGA_CONSOLE) [Y]
    Video mode selection support (CONFIG_VIDEO_SELECT) [N]
    Sound
    Sound card support (CONFIG_SOUND) [N]
    (Security options will appear only if your are patched your kernel with the Openwall Project patch).

    Security options

    Non-executable user stack area (CONFIG_SECURE_STACK) [Y]
    Autodetect and emulate GCC trampolines (CONFIG_SECURE_STACK_SMART) [Y]
    Restricted links in /tmp (CONFIG_SECURE_LINK) [Y]
    Restricted FIFOs in /tmp (CONFIG_SECURE_FIFO) [Y]
    Restricted /proc (CONFIG_SECURE_PROC) [N] Y
    Special handling of fd 0, 1, and 2 (CONFIG_SECURE_FD_0_1_2) [Y]
    Enforce RLIMIT_NPROC on execve(2) (CONFIG_SECURE_RLIMIT_NPROC) [Y]
    Destroy shared memory segments not in use (CONFIG_SECURE_SHM) [N] Y

    Kernel hacking

    Magic SysRq key (CONFIG_MAGIC_SYSRQ) [N]

    注意:各个配置选项的意义可以在查看配置时的帮助。

    现在返回到“/usr/src/linux/”目录下,下面开始进行内核编译工作,按照下面的命令进行:

    [root@deep]# make dep; make clean; make bzImage

    这行包含三个命令,第一个命令“make dep”实际上读取上一步配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要;第二命令“make clean”完成删除前面步骤留下的文件,以避免出现一些错误;第三步“make bzImage”实现完全编译内核。

    处理结束以后,生成的被压缩的新内核就可以被安装了。如果你在回答Enable loadable module support (CONFIG_MODULES)选“Yes”,在安装新内核以前,就还需要编译一些模块并且正确的安装。通过下面的命令来实现对模块的编译和安装:

    [root@deep]# make modules;make modules_install

    安装新内核
    拷贝新内核文件“/usr/src/linux/arch/i386/boot/bzImage”到启动目录,并改为合适的名字:

    [root@deep]# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-kernel.version.number

    注意:退荐新内核的命名格式为vmlinuz-2.*.*。给新内核起这样的新名字,对于希望用makebootdisk命令来创建一个新的紧急启动盘是有意义的,因为makebootdisk命令对参数有特定的要求。

    拷贝“/usr/src/linux/System.map”到启动目录下,并设定合适的名字:

    [root@deep]# cp /usr/src/linux/System.map /boot/System.map-kernel.version.number

    进入启动目录下,将目录下的链接文件“vmlinuz”及“System.map”指向新的内核:

    [root@deep]# cd /boot
    [root@deep]# ln -fs vmlinuz-kernel.version.number vmlinuz
    [root@deep]# ln -fs System.map-kernel.version.number System.map

    必须将链接文件vmlinuz及System.map指向新内核的相关文件,因为如果没有新的链接,LILO程序将缺省地自动使用老内核。

    删除启动目录下无用过期的文件:

    [root@deep]# rm -f module-info
    [root@deep]# rm -f initrd-2.2.12-20.img

    “module-info”链接指向系统的旧核的模块目录。由于现在安装了新内核,我们就无需保持这个文件。文件“initrd-2.2.12-2”包含在系统启动到可以使用磁盘来作为磁盘使用的初始RAM盘映像。这个文件只有在系统有scsi设备的情况下才会在安装系统时生成。由于这里生成编译的是一个单块(非模块化)的新内核。所以即使系统有scsi设备,这里仍然可以安全的删除该文件。

    创建一个新Linux内核目录,使以后编译别的程序可以找到和该内核相关的系统头文件:

    为了编译内核,前面在“/usr/include/”目录下创建了三个符号链接,由于顺利的进行了新内核的编译,所以编译别的程序也应该是成功的。“/usr/indlude”目录是包含所有的系统头文件的目录,编译程序时,系统会到该目录下寻找头文件信息。当被编译的程序需要系统当前内核的某些函数信息时,就会使用asm,linux及scsi链接来获取信息。

    [root@deep]# mkdir -p /usr/src/linux-2.2.14/include
    [root@deep]# cp -r /usr/src/linux/include/asm-generic /usr/src/linux-2.2.14/include
    [root@deep]# cp -r /usr/src/linux/include/asm-i386 /usr/src/linux-2.2.14/include
    [root@deep]# cp -r /usr/src/linux/include/linux /usr/src/linux-2.2.14/include
    [root@deep]# cp -r /usr/src/linux/include/net /usr/src/linux-2.2.14/include
    [root@deep]# cp -r /usr/src/linux/include/video /usr/src/linux-2.2.14/include
    [root@deep]# cp -r /usr/src/linux/include/scsi /usr/src/linux-2.2.14/include
    [root@deep]# rm -rf /usr/src/linux
    [root@deep]# cd /usr/src
    [root@deep]# ln -s /usr/src/linux-2.2.14 linux

    首先,创建一个新的根据新内核的版本命名的子目录:Linux-2.2.14。然后拷贝/usr/linux/include的子目录asm-generic, asm-i386, linux,net, video及scsi到/usr/src/linux-2.2.14/include。然后删除整个编译新内核的子目录,创建一个新的符号链接linux指向/usr/src/linux-2.2.14/。从而随后的编译新的程序可以正确地找到和新内核相对应的头文件信息。

    最后,编辑/etc/lilo.conf加入新内核作为引导选项:

    第一步:

    编辑文件“lilo.conf ”文件(vi /etc/lilo.conf)对“image=/boot/”一行做适当的修改:

    [root@deep]# vi /etc/lilo.conf

    例:

    boot=/dev/sda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=00
    restricted
    password=somepasswd
    image=/boot/vmlinuz-kernel.version.number #(add your new kernel name file here).
    label=linux
    root=/dev/sda6
    read-only

    注意:记住删除包含\"initrd=/boot/initrd-2.2.12-20.img\"一行的内容,因为单块(非模块化)的内核不需要initrd文件。

    第二步:更新lilo.conf作的修改。

    [root@deep]# /sbin/lilo -v
    LILO version 21, [Copyright 1992-1998 Werner Almesberger
    Reading boot sector from /dev/sda
    Merging with /boot/boot.b
    Boot image: /boot/vmlinuz-2.2.14
    Added linux *
    /boot/boot.0800 exits ?no backup copy made.
    Writing boot sector.

    注意:如果在配置新内核回答“Unix98 PTY support(CONFIG_UNIX98_PTYS)”为“No”时,则需要编辑“文件/etc/fstab”,删除下面一行:

    none /dev/pts devpts gid=5,mode=620 0 0

    删除和模块相关的程序、文件和内容
    缺省地,当你第一次安装RedHat版本的Linux时,内核是被编译为模块化的方式。也就是说需要的每个设备或功能都被作为一个模块存在,并且由名为kerneld的内核守护进程(在2.2.*版本名为kmod)在需要时自动将功能对应的模块加载到内核里,在不需要时自动将其从内核中去除。

    kerneld守护进程使用“/etc/conf.modules”文件来获取模块信息:例如,网卡需要特殊的参数时,kerneld从文件“conf.modules”中取得网卡模块的相关参数,但是由于我们这里编译得到的内核是单块(非模块化)内核,所以我们不需要“/etc/conf.modules”文件,并且可以删除“modutils”程序。

    Modutils软件包包括程序kerneld,用于实现自动从内核中加载和删除模块。需要加载的模块一般完成设备驱动及文件系统功能。

    为了去除“conf.modules”文件,使用命令:

    [root@deep]# rm -f /etc/conf.modules

    为了卸载modutils包,使用命令:

    [root@deep]# rpm -e --nodeps modutils

    最后,编辑文件“rc.sysinit”,将所有的有“depmod –a”内容的行注释掉(通过在相关行前面加#)。注释掉这些行是因为在启动时,系统会缺省的读取“rc.sysinit”脚本文件来查看模块依赖性。

    在“rc.sysinit”文件中做如下修改:

    if [ -x /sbin/depmod -a -n \"$USEMODULES\" ]; then

    改为:

    #if [ -x /sbin/depmod -a -n \"$USEMODULES\" ]; then

    if [ -L /lib/modules/default ]; then
    INITLOG_ARGS= action \"Finding module dependencies\" depmod -a default
    else
    INITLOG_ARGS= action \"Finding module dependencies\" depmod -a
    fi
    fi

    改为:

    # if [ -L /lib/modules/default ]; then
    # INITLOG_ARGS= action \"Finding module dependencies\" depmod -a default
    # else
    # INITLOG_ARGS= action \"Finding module dependencies\" depmod -a
    # fi
    # fi

    注意:再次强调,只有在配置内核时对问题“Enable loadable module support (CONFIG_MODULES)?”回答“NO”时,才可以实施删除模块相关内容的步骤。

    现在重新启动机器:

    [root@deep]# reboot

    系统重新启动以后,使用下面的命令来证实使用的是新的内核:

    [root@deep]# uname -a
    Linux deep.openarch.com 2.2.14 #1 Mon Jan 10 10:40:35 EDT 2000 i686 unknown

    创建新的急救盘:
    如果前面的步骤都很顺利的话,应该为新内核创建一个紧急恢复盘。以根用户登录,使用命令如下:

    [root@deep]# mkbootdisk --device /dev/fd0 2.2.14
    Insert a disk in /dev/fd0. Any information on the disk will be lost.
    Press to continue or ^C to abort:

    注意:mkbootdisk程序只能在模块化内核的系统中运行。在单块内核系统中,是不能使用该命令的。

    什么是拯救(Rescue)模式

    拯救模式(Rescue Mode)指从软盘启动一个小型的linux系统。通过拯救模式,使管理员可以在不能从硬盘启动的情况下访问硬盘的数据。

    制作紧急启动软盘
    由于只能在模块化内核系统中创建紧急恢复盘,所以应该寻求另外一种在硬盘上的内核被破坏的情况下启动linux系统的方法。成功地以根用户身份登录到系统以后,按照下面的方法创建一个紧急启动盘:

    将一个软盘格式化:

    [root@deep]# fdformat /dev/fd0H1440
    Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
    Formatting ... done
    Verifying ... done

    拷贝启动目录中的文件vmlinuz到软盘中:

    [root@deep]# cd /boot
    [root@deep]# cp vmlinuz /dev/fd0
    cp: overwrite `/dev/fd0\? y

    这里的的vmlinuz是系统启动使用的内核映相。

    使用下面的命令确定内核启动设备:

    [root@deep]# rdev
    /dev/sda12 /

    内核的根设备(root device)是指根文件系统所在的分区。这里的例子根设备为“/dev/sda12”,你的系统也许会不同。

    设置内核的根设备:

    [root@deep]# rdev /dev/fd0 /dev/sda12

    第二个参数就是第三步得到的值

    设置根设备为只读标记:

    [root@deep]# rdev -R /dev/fd0 1

    这将使linux初始将根文件系统以只读模式加载,通过设置为只读模式,可以避免出现若干警告错误信息。

    然后将启动软盘放进软盘驱动器中,重新启动机器:

    [root@deep]# reboot

    更新“/dev”目录下的项
    若系统内核做了升级或在系统中添加了新的设备,就需要确保更新了“/dev/”目录的内容:

    [root@deep]# cd /dev
    [root@deep]# ./MAKEDEV update

    注意:MAKEDEV是调用mknod的一个脚本文件。
    发布人:netbull 来自:LinuxAid