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
的錯誤報告。請按有關要求使用較新的版本。
Watch out for bug reports on kernel-package
, gcc
,
binutils
, and modutils
. Use new versions of them as
needed.
在Debian系統中用源碼編譯自定義內核要特別小心。用make-kpkg
的--append_to_version選項來創建多重內核鏡像比較安全。
Compiling a custom kernel from source under a Debian system requires special
care. Use the new --append_to_version with make-kpkg
to build multiple kernel-images.
# 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 # 輸入姓名和 E-mail $ cd /usr/src # 編譯目錄 $ tar --bzip2 -xvf kernel-source-2.4.18.tar.bz2 $ cd kernel-source-2.4.18 # 如果這是妳的 kernel 源碼 $ cp /boot/config-2.4.18-386 .config # 預設是取得現有的 config 檔案 $ make menuconfig # 自訂我們需要的項目 $ make-kpkg clean # 必須執行 (man make-kpkg) $ fakeroot make-kpkg --append_to_version -486 --initrd \ --revision=rev.01 kernel_image \ modules_image # modules_image is for pcmcia-cs* etc. $ cd .. # dpkg -i kernel-image*.deb pcmcia-cs*.deb # 安裝
make-kpkg kernel_image實際上執行了make oldconfig和make dep。如果沒使用initrd就不要使用--initrd選項。
如果想加入pcmcia-cs模組或沒有pcmcia,應該在make menuconfig後選 "Generalsetup —>" 進入 "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 ... add needed module names to /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
。參閱
X 的硬體偵測, 第 9.4.2 節。
參閱 模組處理措施, 第 2.7.5 節 和
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 miquels@cistron.nl
說:
“我將筆記中所有有關pcmcia的東西包括cardmgr等一鼓腦全刪了,只裝了支持car
dbus的2.4版核心和woody中新的hotplug
套件。
只要你使用的是32-bit卡,你就不需要pcmcia套件;2.4內置了 card services。標準的tulip驅動亦可在dlink卡上正常工作。
—Mike。”
參閱Linux PCMCIA
HOWTO
和 網路設定和
PCMCIA, 第 10.10.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
來操作上述某些模組。
對預先編譯好的 Kernel-image(> 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 may take care of everything # 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
節。
參閱 sysctl.conf(5)
了解如何透過
/etc/init.d/procps.sh
和
/proc
檔案系統來設定核心啟動組態。/etc/rcS.d/S30procps.sh
在執行時會呼叫 /etc/init.d/procps.sh
script。
Linux核心有時會報告 “Too many open files”,原因是file-max預設值(8096)太小。要解決這個問題,請用 root 身份執行下列命令:
# echo "65536" > /proc/sys/fs/file-max # for 2.2 and 2.4 kernel # echo "131072" > /proc/sys/fs/inode-max # for 2.2 kernel only
或者修改加入底下的敘述到 /etc/sysctl.conf
:
file-max=65536 # for 2.2 and 2.4 kernel inode-max=131072 # for 2.2 kernel only
透過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, 週一 四月 3 22:58:37 UTC 2005osamu@debian.org
asho@debian.org.tw