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 參考手冊
1.08-3, 週日 五月 1 07:45:18 UTC 2005osamu@debian.orgasho@debian.org.tw