Debian运用自己的方式来编译内核及相关模块。参阅Debian和系统内核, 第 2.7 节。
Debian
unstable发行版中的gcc
、binutils
和modutils
可用来编译最新的Linux内核。这方面的官方信息,参阅/usr/share/doc/kernel-package/README.gz
文件的后半部分。
内核编译是个很困难的议题,由于目标在不断的变化,即使是最受人尊敬的开发者也会有不同的见解:
/etc/mkinitrd/mkinitrd.conf
中设置MKIMAGE。
按照Manoj和Kent撰写的/usr/share/doc/kernel-package/README.gz
的指导小心行事,如果要编译最新版本的内核请确认安装了最新unstable版kernel-package
软件包。
对于单机内核编译,initrd不是必须的。我用它是希望我新编译的内核与相应的内核镜像一模一样。如果使用initrd,请先阅读一下mkinitrd(8)
和mkinitrd.conf(5)
。亦可参阅http://bugs.debian.org/149236
。
关心一下有关kernel-package
、gcc
、binutils
和modutils
的错误报告。请按有关要求使用较新的版本。
在Debian系统中用源码编译自定义内核要特别小心。用make-kpkg
的--append_to_version选项来创建多重内核镜像比较安全。
# apt-get install debhelper modutils kernel-package libncurses5-dev # apt-get install kernel-source-2.4.18 # 使用最新版本 # apt-get install fakeroot # vi /etc/kernel-pkg.conf # 输入我的名字和email $ cd /usr/src # 创建目录 $ tar --bzip2 -xvf kernel-source-2.4.18.tar.bz2 $ cd kernel-source-2.4.18 # 如果这是你的内核源码 $ cp /boot/config-2.4.18-386 .config # 将当前配置设定为默认配置 $ make menuconfig # 按自己的喜好来定制 $ make-kpkg clean # 必须执行这步(per: man make-kpkg) $ fakeroot make-kpkg --append_to_version -486 --initrd \ --revision=rev.01 kernel_image \ modules_image # modules_image可以是pcmcia-cs*等。 $ cd .. # dpkg -i kernel-image*.deb pcmcia-cs*.deb # 安装
make-kpkg kernel_image实际上执行了make oldconfig和make dep。如果没使用initrd就不要使用--initrd选项。
如果想加载pcmcia-cs模块或没有pcmcia,应该在make menuconfig后选“General setup —>”进入“PCMCIA/CardBus support —>”,配置“< > PCMCIA/CardBus support”选项(例如,取消复选项)。
对于SMP机器,参照kernel-pkg.conf(5)
的说明设置CONCURRENCY_LEVEL。
从下列地址获得干净的源代码:
http://www.kernel.org/
http://pcmcia-cs.sourceforge.net/
或使用Debian所附的等价的源代码:
# cd /usr/src # tar xfvz linux-whatever.tar.gz # rm -rf linux # ln -s linux-whatever linux # tar xfvz pcmcia-cs-whatever.tar.gz # ln -s pcmcia-cs-whatever pcmcia # cd linux # make menuconfig ... 配置内核选项 ... # make dep # make bzImage ... 编辑lilo/grub ... ... 移动/usr/src/linux/arch/i386/boot/bzImage到boot ... ... /sbin/lilo or whatever you do for grub # make modules; make modules_install # cd ../pcmcia # make config # make all # make install ... 添加需要的模块名称到/etc/modules # shutdown -r now ... 启动到新内核 ...
绝大多数“普通”程序不需要内核头文件,事实上如果直接引用它们会出错。这些程序应该引用那些编译glibc
所用的头文件,它们位于Debian系统的/usr/include/linux
和/usr/include/asm
目录下。
故不要在/usr/src/linux
目录中创建指向/usr/include/linux
和/usr/include/asm
的链接,一些过时的文档曾建议创建它们。
如果某些内核类应用程序需要特定的内核头文件,可修改Makefile
(s),使其包含指向“特定内核头文件目录/include/linux
”和“特定内核头文件目录/include/asm
”的路径。
kerntl-mage-2.4.NN提供了新版的Debian 2.4内核,该版内核模块化程度极高。你必须激活相关的模块才能获得想要的内核功能。
尽管在接下来的部分中提供了许多通过配置/etc/modules
来解决问题的样例,但据说,在/etc/modutils/
中用一个文件来提供所有的设备别名,就可解决这类有关模块问题,当前的内核有足够多的别名供你使用。
参阅Linux内核源码目录中的Documentation/*.txt
获取详细信息。
要使用PCMCIA,需在/etc/modules
中包含下列内容:
# ISA PnP driver isa-pnp # Low level PCMCIA driver # yenta_socket # 我的机器上似乎不需要
剩下的工作就由PCMCIA脚本(来自pcmcia-cs
软件包)、depmod
和kmod
负责了。我需要isa-pnp
因为我的笔记本电脑使用的是旧ISA-PCMCIA。较新的笔记本电脑使用CardBus/PCMCIA,不再需要它。
慷慨的Miquel van Smoorenburg [email protected]
说:
“我将笔记中所有有关pcmcia的东西包括cardmgr等一鼓脑全删了,只装了支持cardbus的2.4版内核和woody中新的hotplug
软件包。
只要你使用的是32-bit卡,你就不需要pcmcia软件包;2.4内置了cardservices。标准的tulip驱动亦可在dlink卡上正常工作。
—Mike。”
[没有测试过] 想要SCSI工作,请在/etc/modules
中包含如下内容:
# SCSI core scsi_mod # SCSI generic driver sg # SCSI disk sd_mod # All other needed HW modules ...
可用depmod
来操作上述某些模块。
/etc/modules
中需要包含如下内容以扩充网络功能:
# net/ipv-4 ip_gre ipip # net/ipv-4/netfilter # iptable (in order) ip_tables ip_conntrack ip_conntrack_ftp iptable_nat iptable_filter iptable_mangle # ip_nat_ftp ip_queue # ipt_LOG ipt_MARK ipt_MASQUERADE ipt_MIRROR ipt_REDIRECT ipt_REJECT ipt_TCPMSS ipt_TOS ipt_limit ipt_mac ipt_mark ipt_multiport ipt_owner ipt_state ipt_tcpmss ipt_tos ipt_unclean # #ipchains #ipfwadm
上述内容并没有进行优化。可用depmod
来操作上述某些模块。
对预编译内核镜像包(> 2.4.17)执行下述操作可激活EXT3日志文件系统。
# cd /etc; mv fstab fstab.old # sed 's/ext2/ext3,ext2/g' <fstab.old >fstab # vi /etc/fstab ... 将root文件系统类型设置成“auto”而非“ext3,ext2” # cd /etc/mkinitrd # echo jbd >>modules # echo ext3 >>modules # echo ext2 >>modules # cd / # apt-get update; apt-get install kernel-image-2.4.17-686-smp ... 安装最新内核并配置boot(lilo从这儿运行) # tune2fs -j -i 0 /dev/hda1 # tune2fs -j -i 0 /dev/hda2 ... 将所有EXT2 FS转化成EXT3 # shutdown -r now
现在就可使用EXT3日志文件系统了。在fstab
的“type”中使用ex3、ext2的是为了保险起见,如果内核不支持非root分区采用EXT3还可退回到EXT2。
如果你已安装了2.4版内核并且不想再次重装,执行上述步骤中apt-get
命令之前的步骤就行了。接着:
# mkinitrd -o /boot/initrd.img-2.4.17-686-smp /lib/modules/2.4.17-686-smp # lilo # tune2fs -j -i 0 /dev/hda1 # tune2fs -j -i 0 /dev/hda2 ... 将所有EXT2 FS转化成EXT3 # shutdown -r now
现在EXT3日志文件系统已生效。
如果没有设置/etc/mkinitrd/modules
就mkinitrd
运行,最好在系统启动时加载一些模块:
... 当initrd提示获取shell时(5秒钟),输入RETURN # insmod jbd # insmod ext3 # modprobe ext3会负责一切 # insmod ext2 # ^D ... 继续启动
在系统启动屏幕(dmesg
)中,会出现“cramfs: wrong
magic”,别担心这没有什么害处。在Sarge(2002/10)中已解决了这个问题。参阅http://bugs.debian.org/135537
和EXT3 File System
mini-HOWTO
,或者是/usr/share/doc/HOWTO/en-txt/mini/extra/ext3-mini-HOWTO.gz
获得有关详情。
激活EXT3功能会造成某些系统发生严重内核死锁的情况,不过我没遇到过这种问题(我的内核是2.4.17)。
不知何故,RTL-8139支持模块已不再叫rtl8139,现在它叫8139too。从2.2版内核升级到2.4版时,请记得在/etc/modules
中做相应修改。
对于kernel-image-2.4.*
,并行端口支持已被模块化,要激活可执行:
# modprobe lp # echo lp >> /etc/modules
参阅Linux内核源码目录中的Documentation/parport.txt
。
通过proc文件系统,可在运行状态下进行调整Linux内核行为。
在关在/proc
文件系统下修改内核参数的基础知识,可参阅Linux源码包中的Documentation/sysctl/*
文件。
调整内核参数的例子,可参考/etc/init.d/networking
和无法访问某此站点的怪问题, 第 3.7.5
节。
Linux内核有时会报告“Too many open
files”,起因是file-max默认值(8096)太小。要解决这个问题,可以root身份执行下列命令(或将它们加入/etc/rcS.d/*
下的init脚本。)
# echo "65536" > /proc/sys/fs/file-max # 适用于2.2和2.4版内核 # echo "131072" > /proc/sys/fs/inode-max # 仅适用于2.2版内核
可通过proc文件系统来修改磁盘缓存清除时间。下面的操作将默认的5秒时间间隔缩短到1秒。
# echo "40 0 0 0 100 30000 60 0 0" > /proc/sys/vm/bdflush
这可能对文件I/O性能产生一点儿负面影响。但它能保证文件内容是最近1秒的,比默认的5秒更短。对日志文件系统来说更是如此。
对某些小内存的旧机器来说,在proc文件系统中打开内存的over-commit功能会很有效果:
# echo 1 > /proc/sys/vm/overcommit_memory
Debian 参考手册
CVS, 星期二 八月 17 00:35:13 UTC 2004[email protected]
[email protected]