个人工具

UbuntuManual:Ubuntu下的 Linux 内核

来自Ubuntu中文

跳转至: 导航, 搜索
序言 Ubuntu 基础 Ubuntu 系统安装提示 Ubuntu指南
发行版升级 Ubuntu 软件包管理 Ubuntu下的 Linux 内核 Ubuntu 小技巧
Ubuntu 系统微调 网络设置 编辑器 版本控制系统
编程 GnuPG Ubuntu 技术支持 附录

第 7 章 - Ubuntu下的 Linux 内核

Ubuntu 使用自己的方法来编译内核及相关模块。参阅 Ubuntu 和系统内核, 第 2.7 节。

内核编译

Ubuntu Edgy 发行版中的 gcc、binutils 和 modutils 可用来编译最新的 Linux 内核。这方面的官方信息,参阅 /usr/share/doc/kernel-package/README.gz,特别是文件的后半部分。

内核编译是个很困难的议题,由于目标在不断的变化,即使是最受人尊敬的开发者也会有不同的见解。

对于单机内核编译,initrd 不是必须的。我用它是希望我新编译的内核与相应的内核镜像一模一样。如果使用 initrd,请先阅读一下 mkinitrd(8) 和 mkinitrd.conf(5)。

Ubuntu 标准方式

关心一下有关 kernel-package、gcc、binutils 和 modutils 的错误报告。在需要时使用较新的版本。

在 Ubuntu 系统中用源码编译自定义内核要特别小心。用 make-kpkg 的 --append_to_version 选项来创建多重内核镜像比较安全。

# apt-get install debhelper modutils libncurses5-dev
# apt-get install linux-source-2.6.15   # 使用最新版本
# apt-get install fakeroot
# vi /etc/linux-pkg.conf                # 输入我的名字和 email
$ cd /usr/src                            # 创建目录
$ tar --bzip2 -xvf linux-source-2.6.15.tar.bz2
$ cd linux-source-2.6.15                # 如果这是你的内核源码
$ 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 linux-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。

经典方式

从下列地址获得干净的源代码:

或使用 Ubuntu 所附的等价的源代码:

# 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 所用的头文件,它们位于 Ubuntu 系统的 /usr/include/linux 和 /usr/include/asm 目录下。

故不要在 /usr/src/linux 目录中创建指向 /usr/include/linux 和 /usr/include/asm 的链接,一些过时的文档曾建议创建它们。

如果某些内核类应用程序需要特定的内核头文件,可修改 Makefile(s),使其包含指向“特定内核头文件目录/include/linux”和“特定内核头文件目录/include/asm”的路径。

模块化的 2.4 内核

kernel-image-2.4.NN 提供了新版的 Debian 2.4 内核,该版内核模块化程度极高。你必须激活相关的模块才能获得想要的内核功能。

尽管在接下来的部分中提供了许多通过配置 /etc/modules 来解决问题的范例。但据说,在 /etc/modutils/ 中用一个文件来提供所有的设备别名,就可解决这类有关模块问题,当前的内核有足够多的别名供你使用。某些模块也可以被硬件探测程序自动激活,例如 discover。参阅 X 服务器的硬件侦测, 第 9.4.2 节。

参阅 模块加载规定, 第 2.7.5 节和 Linux 内核源码目录中的 Documentation/*.txt 获取详细信息。

PCMCIA

要使一些老的 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,不再需要它。

参阅 Linux PCMCIA HOWTO 和 网络设置和 PCMCIA, 第 10.8.5 节。

SCSI

[没有测试过] 想要 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 来操作上述某些模块。

EXT3 文件系统(> 2.4.17)

对预编译内核镜像包(> 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
... 继续启动


激活 EXT3 功能会造成某些系统发生严重内核死锁的情况,不过我没遇到过这种问题(我的内核是2.4.17)。

2.4 版内核对 Realtek RTL-8139 的支持

不知何故,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 文件系统进行调节。

有关在 /proc 文件系统下修改内核参数的基础知识,可参阅 Linux 源码包中的 Documentation/sysctl/* 文件。

调整内核参数的例子,可参考 /etc/init.d/networking 和无法访问某些站点的怪问题, 第 3.8.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 版内核

磁盘缓存清除时间(Disk flush intervals)

可通过 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

2.6 版内核和 udev

udev 是取代 /dev/ 的动态设置的系统。我们可以选择很短的设备名字。而 2.4 版内核使用的 devfs 已经被淘汰。

安装 Ubuntu 新版的 linux-image-2.6.NN 和 udev 就能启用这个功能。