也包含 sgml 和 html。欢迎大家提供意见。
<!-- CVS revision of this document "$Revision: 1.1 $" --> <!-- CVS revision of original english document "1.68" --> <chapt id="kernel">DebianÏ嵀 Linux ÄÚºË <p> Debian ʹÓÃ×Ô¼ºµÄ·½·¨À´±àÒëÄں˼°Ïà¹ØÄ£¿é¡£²ÎÔÄ <ref id="kernel-details">¡£ <sect id="kernel-compile">Äں˱àÒë <p> Debian unstable ·¢ÐаæÖÐµÄ <prgn>gcc</prgn>¡¢<prgn>binutils</prgn> ºÍ <prgn>modutils</prgn> ¿ÉÓÃÀ´±àÒë×îÐ嵀 Linux Äںˡ£Õâ·½ÃæµÄ¹Ù·½ÐÅÏ¢£¬²ÎÔÄ <file>&f-kernel-readme;</file>£¬ÌرðÊÇÎļþµÄºó°ë²¿·Ö¡£ <p> Äں˱àÒëÊǸöºÜÀ§ÄѵÄÒéÌ⣬ÓÉÓÚÄ¿±êÔÚ²»¶ÏµÄ±ä»¯£¬¼´Ê¹ÊÇ×îÊÜÈË×𾴵Ŀª·¢ÕßÒ²»áÓв»Í¬µÄ¼û½â£º <taglist compact> <tag>Manoj Srivastava дµ½£º <item><tt>--initrd</tt> ÐèÒª Debian רÓà cramfs ²¹¶¡¡£ <tag>Herbert Xu дµ½£º <item>²»£¬Ëü²»ÐèÒª£¬ÏëʹÓóý CRAMFS ÒÔÍâµÄÎļþϵͳֻÐèÔÚ <file>/etc/mkinitrd/mkinitrd.conf</file> ÖÐÉèÖà MKIMAGE¡£ </taglist> <p> °´ÕÕ Manoj ºÍ Kent ׫дµÄ <file>&f-kernel-readme;</file> µÄÖ¸µ¼Ð¡ÐÄÐÐÊ£¬Èç¹ûÒª±àÒë×îа汾µÄÄÚºËÇëÈ·Èϰ²×°ÁË×îРunstable °æ <package>kernel-package</package> Èí¼þ°ü¡£ <p> ¶ÔÓÚµ¥»úÄں˱àÒ룬<tt>initrd</tt> ²»ÊDZØÐëµÄ¡£ÎÒÓÃËüÊÇÏ£ÍûÎÒбàÒëµÄÄÚºËÓëÏàÓ¦µÄÄں˾µÏñһģһÑù¡£Èç¹ûʹÓà <tt>initrd</tt>£¬ÇëÏÈÔĶÁһϠ<manref name="mkinitrd" section="8"> ºÍ <manref name="mkinitrd.conf" section="5">¡£Òà¿É²ÎÔÄ <url id="&bug-initrd;">¡£ <sect1 id="kernel-debian">Debian ±ê×¼·½Ê½ <p> ¹ØÐÄÒ»ÏÂÓÐ¹Ø <package>kernel-package</package>¡¢<prgn>gcc</prgn>¡¢<prgn>binutils</prgn> ºÍ <prgn>modutils</prgn> µÄ´íÎ󱨸档ÔÚÐèҪʱʹÓýÏеİ汾¡£ <p> ÔÚ Debian ϵͳÖÐÓÃÔ´Âë±àÒë×Ô¶¨ÒåÄÚºËÒªÌØ±ðСÐÄ¡£Óà <prgn>make-kpkg</prgn> µÄ <tt>--append_to_version</tt> Ñ¡ÏîÀ´´´½¨¶àÖØÄں˾µÏñ±È½Ï°²È«¡£ <example> # apt-get install debhelper modutils kernel-package libncurses5-dev # apt-get install kernel-source-<var>2.4.18</var> # ʹÓÃ×îа汾 # apt-get install fakeroot # vi /etc/kernel-pkg.conf # ÊäÈëÎÒµÄÃû×ÖºÍ email $ cd /usr/src # ´´½¨Ä¿Â¼ $ tar --bzip2 -xvf kernel-source-<var>2.4.18</var>.tar.bz2 $ cd kernel-source-<var>2.4.18</var> # Èç¹ûÕâÊÇÄãµÄÄÚºËÔ´Âë $ cp /boot/config-<var>2.4.18-386</var> .config # ½«µ±Ç°ÅäÖÃÉ趨ΪĬÈÏÅäÖà $ make menuconfig # °´×Ô¼ºµÄϲºÃÀ´¶¨ÖÆ $ make-kpkg clean # ±ØÐëÖ´ÐÐÕâ²½(per: man make-kpkg) $ fakeroot make-kpkg --append_to_version -<var>486</var> --initrd \ --revision=<var>rev.01</var> kernel_image \ modules_image # modules_image ¿ÉÒÔÊÇ pcmcia-cs* µÈ¡£ $ cd .. # dpkg -i kernel-image*.deb pcmcia-cs*.deb # °²×° </example> <tt>make-kpkg kernel_image</tt> ʵ¼ÊÉÏÖ´ÐÐÁË <tt>make oldconfig</tt> ºÍ <tt>make dep</tt>¡£Èç¹ûûʹÓà initrd ¾Í²»ÒªÊ¹Óà <tt>--initrd</tt> Ñ¡Ïî¡£ <p> Èç¹ûÏë¼ÓÔØ pcmcia-cs Ä£¿é»òÄÚºË pcmcia Ô´ÂëÖÐûÓеÄÄ£¿é£¬Ó¦¸ÃÔÚ <tt>make menuconfig</tt> ºóÑ¡¡°General setup —>¡±½øÈë¡°PCMCIA/CardBus support —>¡±,ÅäÖá°< > PCMCIA/CardBus support¡±Ñ¡ÏÀýÈ磬ȡÏû¸´Ñ¡Ï¡£ <p> ¶ÔÓÚ SMP »úÆ÷£¬²ÎÕÕ <manref name="kernel-pkg.conf" section="5"> µÄ˵Ã÷ÉèÖà CONCURRENCY_LEVEL¡£ </sect1> <sect1 id="kernel-classic">¾µä·½Ê½ <p> ´ÓÏÂÁеØÖ·»ñµÃ¸É¾»µÄÔ´´úÂ룺 <list compact> <item>Linux: <url id="&linuxsrc;"> <item>pcmcia-cs: <url id="&pcmciasrc;"> </list> »òʹÓà Debian Ëù¸½µÄµÈ¼ÛµÄÔ´´úÂ룺 <example> # cd /usr/src # tar xfvz linux-<var>whatever</var>.tar.gz # rm -rf linux # ln -s linux-<var>whatever</var> linux # tar xfvz pcmcia-cs-<var>whatever</var>.tar.gz # ln -s pcmcia-cs-<var>whatever</var> 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 ... Æô¶¯µ½ÐÂÄÚºË ... </example> </sect1> <sect1 id="kernel-headers">ÄÚºËÍ·Îļþ <p> ¾ø´ó¶àÊý¡°ÆÕͨ¡±³ÌÐò²»ÐèÒªÄÚºËÍ·Îļþ£¬ÊÂʵÉÏÈç¹ûÖ±½ÓÒýÓÃËüÃÇ»á³ö´í¡£ÕâЩ³ÌÐòÓ¦¸ÃÒýÓÃÄÇЩ<strong>±àÒë <prgn>glibc</prgn></strong> ËùÓõÄÍ·Îļþ£¬ËüÃÇλÓÚ Debian ϵͳµÄ <file>/usr/include/linux</file> ºÍ <file>/usr/include/asm</file> Ŀ¼Ï¡£ <p> ¹Ê²»ÒªÔÚ <file>/usr/src/linux</file> Ŀ¼Öд´½¨Ö¸Ïò <file>/usr/include/linux</file> ºÍ <file>/usr/include/asm</file> µÄÁ´½Ó£¬Ò»Ð©¹ýʱµÄÎĵµÔø½¨Òé´´½¨ËüÃÇ¡£ <p> Èç¹ûijЩÄÚºËÀàÓ¦ÓóÌÐò<strong>ÐèÒª</strong>ÌØ¶¨µÄÄÚºËÍ·Îļþ£¬¿ÉÐÞ¸Ä Makefile(s)£¬Ê¹Æä°üº¬Ö¸Ïò¡°<file><var>ÌØ¶¨ÄÚºËÍ·ÎļþĿ¼</var>/include/linux</file>¡±ºÍ¡°<file><var>ÌØ¶¨ÄÚºËÍ·ÎļþĿ¼</var>/include/asm</file>¡±µÄ·¾¶¡£ </sect1> </sect> <sect id="kernel-modules">Ä£¿é»¯µÄ 2.4 ÄÚºË <p> <package>kerntl-mage-2.4.<var>NN</var></package> ÌṩÁËаæµÄ Debian 2.4 Äںˣ¬¸Ã°æÄÚºËÄ£¿é»¯³Ì¶È¼«¸ß¡£Äã±ØÐ뼤»îÏà¹ØµÄÄ£¿é²ÅÄÜ»ñµÃÏëÒªµÄÄں˹¦ÄÜ¡£ <p> ¾¡¹ÜÔÚ½ÓÏÂÀ´µÄ²¿·ÖÖÐÌṩÁËÐí¶àͨ¹ýÅäÖà <file>/etc/modules</file> À´½â¾öÎÊÌâµÄ·¶Àý¡£µ«¾Ý˵£¬ÔÚ <file>/etc/modutils/</file> ÖÐÓÃÒ»¸öÎļþÀ´ÌṩËùÓеÄÉ豸±ðÃû£¬¾Í¿É½â¾öÕâÀàÓйØÄ£¿éÎÊÌ⣬µ±Ç°µÄÄÚºËÓÐ×ã¹»¶àµÄ±ðÃû¹©ÄãʹÓá£Ä³Ð©Ä£¿éÒ²¿ÉÒÔ±»Ó²¼þ̽²â³ÌÐò×Ô¶¯¼¤»î£¬ÀýÈç <package>discover</package>¡£²ÎÔÄ<ref id="hdetect-x">¡£ <p> ²ÎÔÄ<ref id="modules">ºÍ Linux ÄÚºËÔ´ÂëĿ¼ÖÐµÄ <file>Documentation/*.txt</file> »ñÈ¡ÏêϸÐÅÏ¢¡£ <sect1 id="kernel-pcmcia">PCMCIA <p> ҪʹһЩÀ쵀 PCMCIA ¿¨ÄÜÕý³£¹¤×÷£¬ÄãÐèÔÚ <file>/etc/modules</file> Öаüº¬ÏÂÁÐÄÚÈÝ£º <example> # ISA PnP driver isa-pnp # New Low level PCMCIA driver # yenta_socket # ÎҵĻúÆ÷ÉÏËÆºõ²»ÐèÒª </example> Ê£ÏµĹ¤×÷¾ÍÓÉ PCMCIA ½Å±¾£¨À´×Ô <package>pcmcia-cs</package> Èí¼þ°ü£©¡¢<prgn>depmod</prgn> ºÍ <prgn>kmod</prgn> ¸ºÔðÁË¡£ÎÒÐèÒª <prgn>isa-pnp</prgn> ÒòΪÎҵıʼDZ¾µçÄÔʹÓõÄÊÇ¾É ISA-PCMCIA¡£½ÏеıʼDZ¾µçÄÔʹÓà CardBus/PCMCIA£¬²»ÔÙÐèÒªËü¡£ <p> Ìì²ÅµÄ Miquel van Smoorenburg <email>miquels@cistron.nl</email> ˵£º <p> ¡°ÎÒ½«±Ê¼ÇÖÐËùÓÐÓÐ¹Ø pcmcia µÄ¶«Î÷°üÀ¨ cardmgr µÈÒ»¹ÄÄÔȫɾÁË£¬Ö»×°ÁËÖ§³Ö cardbus µÄ 2.4 °æÄÚºËºÍ woody ÖÐÐ嵀 <package>hotplug</package> Èí¼þ°ü¡£ <p> Ö»ÒªÄãʹÓõÄÊÇ 32-bit ¿¨£¬Äã¾Í²»ÐèÒª pcmcia Èí¼þ°ü£»2.4 ÄÚÖÃÁË cardservices¡£±ê×¼µÄ tulip Çý¶¯Òà¿ÉÔÚ dlink ¿¨ÉÏÕý³£¹¤×÷¡£ <p> —Mike¡£¡± <p> ²ÎÔÄ <url id="&pcmcia-howto;" name="Linux PCMCIA HOWTO"> ºÍ<ref id="trigger-pcmcia">¡£ </sect1> <sect1 id="kernel-scsi">SCSI <p> <!-- Osamu: maybe test this section? I do not have SCSI :( But this is almost sure :) I use some of these too now for firewire devices --> [ûÓвâÊÔ¹ý] ÏëÒª SCSI ¹¤×÷£¬ÇëÔÚ <file>/etc/modules</file> Öаüº¬ÈçÏÂÄÚÈÝ£º <example> # SCSI core scsi_mod # SCSI generic driver sg # SCSI disk sd_mod # All other needed HW modules ... </example> ¿ÉÓà <prgn>depmod</prgn> À´²Ù×÷ÉÏÊöijЩģ¿é¡£ </sect1> <sect1 id="kernel-net">ÍøÂ繦ÄÜ <p> <file>/etc/modules</file> ÖÐÐèÒª°üº¬ÈçÏÂÄÚÈÝÒÔÀ©³äÍøÂ繦ÄÜ£º <example> # 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 </example> ÉÏÊöÄÚÈݲ¢Ã»ÓнøÐÐÓÅ»¯¡£¿ÉÓà <prgn>depmod</prgn> À´²Ù×÷ÉÏÊöijЩģ¿é¡£ </sect1> <sect1 id="ext3">EXT3 Îļþϵͳ£¨> 2.4.17£© <p> ¶ÔÔ¤±àÒëÄں˾µÏñ°ü£¨> 2.4.17£©Ö´ÐÐÏÂÊö²Ù×÷¿É¼¤»î EXT3 ÈÕÖ¾Îļþϵͳ¡£ <example> # 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-<var>2.4.17-686-smp</var> ... °²×°×îÐÂÄں˲¢ÅäÖà boot£¨lilo´ÓÕâ¶ùÔËÐУ© # tune2fs -j -i 0 <var>/dev/hda1</var> # tune2fs -j -i 0 <var>/dev/hda2</var> ... ½«ËùÓÐ EXT2 FS ת»¯³É EXT3 # shutdown -r now </example> ÏÖÔھͿÉʹÓà EXT3 ÈÕÖ¾ÎļþϵͳÁË¡£ ÔÚ <prgn>fstab</prgn> µÄ¡°type¡±ÖÐʹÓà <tt>ex3¡¢ext2</tt> µÄÊÇΪÁ˱£ÏÕÆð¼û£¬Èç¹ûÄں˲»Ö§³Ö·Ç root ·ÖÇø²ÉÓà EXT3 »¹¿ÉÍ˻ص½ EXT2¡£ <p> Èç¹ûÄãÒѰ²×°ÁË 2.4 °æÄں˲¢ÇÒ²»ÏëÔÙ´Î֨װ£¬Ö´ÐÐÉÏÊö²½ÖèÖÐ <prgn>apt-get</prgn> ÃüÁî֮ǰµÄ²½Öè¾ÍÐÐÁË¡£½Ó×Å£º <example> # mkinitrd -o /boot/initrd.img-<var>2.4.17-686-smp</var> /lib/modules/<var>2.4.17-686-smp</var> # lilo # tune2fs -j -i 0 <var>/dev/hda1</var> # tune2fs -j -i 0 <var>/dev/hda2</var> ... ½«ËùÓÐ EXT2 FS ת»¯³É EXT3 # shutdown -r now </example> ÏÖÔÚ EXT3 ÈÕÖ¾ÎļþϵͳÒÑÉúЧ¡£ <p> Èç¹ûûÓÐÉèÖà <file>/etc/mkinitrd/modules</file> ¾Í <prgn>mkinitrd</prgn> ÔËÐУ¬×îºÃÔÚϵͳÆô¶¯Ê±¼ÓÔØÒ»Ð©Ä£¿é£º <example> ... µ± initrd Ìáʾ»ñÈ¡ shell ʱ£¨5ÃëÖÓ£©£¬ÊäÈë RETURN # insmod jbd # insmod ext3 # modprobe ext3 »á¸ºÔðÒ»ÇÐ # insmod ext2 # ^D ... ¼ÌÐøÆô¶¯ </example> ÔÚϵͳÆô¶¯ÆÁÄ»£¨<prgn>dmesg</prgn>£©ÖУ¬»á³öÏÖ¡°cramfs: wrong magic¡±£¬±ðµ£ÐÄÕâûÓÐʲôº¦´¦¡£ÔÚ Sarge£¨2002/10£©ÖÐÒѽâ¾öÁËÕâ¸öÎÊÌâ¡£²ÎÔÄ <url id="&bug-ext3;"> ºÍ <url id="&howtoext3;" name="EXT3 File System mini-HOWTO">£¬»òÕßÊÇ <file>&f-howtoext3;</file> »ñµÃÓйØÏêÇé¡£ <p> ¼¤»î EXT3 ¹¦ÄÜ»áÔì³ÉijЩϵͳ·¢ÉúÑÏÖØÄÚºËËÀËøµÄÇé¿ö£¬²»¹ýÎÒûÓöµ½¹ýÕâÖÖÎÊÌ⣨ÎÒµÄÄÚºËÊÇ2.4.17£©¡£ </sect1> <sect1 id="ss-rtl8139">2.4 °æÄÚºË¶Ô Realtek RTL-8139 µÄÖ§³Ö <p> ²»ÖªºÎ¹Ê£¬RTL-8139 Ö§³ÖÄ£¿éÒѲ»ÔٽРrtl8139£¬ÏÖÔÚËü½Ð 8139too¡£´Ó 2.2 °æÄÚºËÉý¼¶µ½ 2.4 °æÊ±£¬Çë¼ÇµÃÔÚ <file>/etc/modules</file> ÖÐ×öÏàÓ¦Ð޸ġ£ </sect1> <sect1 id="parport">²¢Ðж˿ÚÖ§³Ö <p> ¶ÔÓÚ <package>kernel-image-2.4.*</package>£¬²¢Ðж˿ÚÖ§³ÖÒѱ»Ä£¿é»¯£¬Òª¼¤»î¿ÉÖ´ÐУº <example> # modprobe lp # echo lp >> /etc/modules </example> ²ÎÔÄ Linux ÄÚºËÔ´ÂëĿ¼ÖÐµÄ <file>Documentation/parport.txt</file>¡£ </sect1> </sect> <sect id="proc-sys">ͨ¹ý proc Îļþϵͳµ÷ÕûÄÚºË <p> Linux ÄÚºËÐÐΪ¿ÉÒÔÔÚÔËÐÐ״̬ÏÂͨ¹ý proc Îļþϵͳ½øÐе÷½Ú¡£ <p> ÓйØÔÚ <file>/proc</file> ÎļþϵͳÏÂÐÞ¸ÄÄں˲ÎÊýµÄ»ù´¡ÖªÊ¶£¬¿É²ÎÔÄ Linux Ô´Âë°üÖÐµÄ <file>Documentation/sysctl/*</file> Îļþ¡£ <p> µ÷ÕûÄں˲ÎÊýµÄÀý×Ó£¬¿É²Î¿¼ <file>/etc/init.d/networking</file> ºÍ<ref id="killecn">¡£ <p> ²ÎÔÄ <manref name="sysctl.conf" section="5"> Á˽âÈçºÎʹÓà <file>/proc</file> ÎļþϵͳºÍ½Å±¾ <file>/etc/init.d/procps.sh</file> À´ÉèÖÃÄں˿ª»úʱµÄÅäÖᣴ˽ű¾ÓÉ <file>/etc/rcS.d/S30procps.sh</file> Ö´ÐС£ <sect1 id="many-files">´ò¿ªÁËÌ«¶àÎļþ <p> Linux ÄÚºËÓÐʱ»á±¨¸æ¡°Too many open files¡±£¬ÆðÒòÊÇ <tt>file-max</tt> ĬÈÏÖµ£¨8096£©Ì«Ð¡¡£Òª½â¾öÕâ¸öÎÊÌ⣬¿ÉÒÔ root Éí·ÝÖ´ÐÐÏÂÁÐÃüÁ£¨»ò½«ËüÃǼÓÈë<file>/etc/rcS.d/*</file>Ï嵀 init ½Å±¾¡££© <example> # echo "65536" > /proc/sys/fs/file-max # ÊÊÓÃÓÚ 2.2 ºÍ 2.4 °æÄÚºË # echo "131072" > /proc/sys/fs/inode-max # ½öÊÊÓÃÓÚ 2.2 °æÄÚºË </example> »ò½«ÏÂÁÐÄÚÈÝ·ÅÈë <file>/etc/sysctl.conf</file>£¬×öÓÀ¾ÃÐԵĸü¸Ä£º <example> file-max=65536 # ÊÊÓÃÓÚ 2.2 ºÍ 2.4 °æÄÚºË inode-max=131072 # ½öÊÊÓÃÓÚ 2.2 °æÄÚºË </example> <sect1 id="bdflush">´ÅÅÌ»º´æÇå³ýʱ¼ä£¨Disk flush intervals£© <p> ¿Éͨ¹ý proc ÎļþϵͳÀ´Ð޸ĴÅÅÌ»º´æÇå³ýʱ¼ä¡£ÏÂÃæµÄ²Ù×÷½«Ä¬È쵀 5 Ãëʱ¼ä¼ä¸ôËõ¶Ìµ½ 1 Ãë¡£ <example> # echo "40 0 0 0 100 30000 60 0 0" > /proc/sys/vm/bdflush </example> Õâ¿ÉÄܶÔÎļþ I/O ÐÔÄܲúÉúÒ»µã¶ù¸ºÃæÓ°Ïì¡£µ«ËüÄܱ£Ö¤ÎļþÄÚÈÝÊÇ×î½ü 1 ÃëµÄ£¬±ÈĬÈ쵀 5 Ãë¸ü¶Ì¡£¶ÔÈÕÖ¾ÎļþϵͳÀ´Ëµ¸üÊÇÈç´Ë¡£ </sect1> <sect1 id="over-commit">³Ù»ºµÄСÄÚ´æ¾É»úÆ÷ <p> ¶ÔijЩСÄÚ´æµÄ¾É»úÆ÷À´Ëµ£¬ÔÚ proc ÎļþϵͳÖдò¿ªÄÚ´æµÄ over-commit ¹¦ÄÜ»áºÜÓÐЧ¹û£º <example> # echo 1 > /proc/sys/vm/overcommit_memory </example> </sect1> </sect> <sect id="udev">2.6 °æÄÚºËºÍ udev <p> udev ÊÇÈ¡´ú <file>/dev/</file> µÄ¶¯Ì¬ÉèÖõÄϵͳ¡£ÎÒÃÇ¿ÉÒÔÑ¡ÔñºÜ¶ÌµÄÉ豸Ãû×Ö¡£¶ø 2.4 °æÄÚºËʹÓÃµÄ devfs ÒѾ±»ÌÔÌ¡£ <p> °²×° Debian аæµÄ <package>kernel-image-2.6.<var>NN</var></package> ºÍ <package>udev</package> ¾ÍÄÜÆôÓÃÕâ¸ö¹¦ÄÜ¡£ </sect> </chapt>Title: Debian 参考手册 - Debian下的 Linux 内核
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/
中用一个文件来提供所有的设备别名,就可解决这类有关模块问题,当前的内核有足够多的别名供你使用。某些模块也可以被硬件探测程序自动激活,例如
discover
。参阅Hardware
detection for X, 第 9.4.2 节。
参阅模块加载规定, 第 2.7.5 节和
Linux 内核源码目录中的 Documentation/*.txt
获取详细信息。
要使一些老的 PCMCIA 卡能正常工作,你需在 /etc/modules
中包含下列内容:
# ISA PnP driver isa-pnp # New Low level PCMCIA driver # yenta_socket # 我的机器上似乎不需要
剩下的工作就由 PCMCIA 脚本(来自 pcmcia-cs
软件包)、depmod
和 kmod
负责了。我需要
isa-pnp
因为我的笔记本电脑使用的是旧
ISA-PCMCIA。较新的笔记本电脑使用 CardBus/PCMCIA,不再需要它。
天才的 Miquel van Smoorenburg miquels@cistron.nl
说:
“我将笔记中所有有关 pcmcia 的东西包括 cardmgr 等一鼓脑全删了,只装了支持
cardbus 的 2.4 版内核和 woody 中新的 hotplug
软件包。
只要你使用的是 32-bit 卡,你就不需要 pcmcia 软件包;2.4 内置了 cardservices。标准的 tulip 驱动亦可在 dlink 卡上正常工作。
—Mike。”
参阅 Linux PCMCIA
HOWTO
和网络设置和
PCMCIA, 第 10.8.5 节。
[没有测试过] 想要 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
。
Linux 内核行为可以在运行状态下通过 proc 文件系统进行调节。
有关在 /proc
文件系统下修改内核参数的基础知识,可参阅 Linux
源码包中的 Documentation/sysctl/*
文件。
调整内核参数的例子,可参考 /etc/init.d/networking
和无法访问某些站点的怪问题, 第 3.7.5
节。
参阅 sysctl.conf(5)
了解如何使用 /proc
文件系统和脚本
/etc/init.d/procps.sh
来设置内核开机时的配置。此脚本由
/etc/rcS.d/S30procps.sh
执行。
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 版内核
或将下列内容放入 /etc/sysctl.conf
,做永久性的更改:
file-max=65536 # 适用于 2.2 和 2.4 版内核 inode-max=131072 # 仅适用于 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
udev 是取代 /dev/
的动态设置的系统。我们可以选择很短的设备名字。而
2.4 版内核使用的 devfs 已经被淘汰。
安装 Debian 新版的 kernel-image-2.6.NN
和
udev
就能启用这个功能。
Debian 参考手册
CVS, 星期四 七月 28 03:50:01 UTC 2005osamu@debian.org
iamlyoo@163.net