Linux 内核发布版本 3.x http://kernel.org/
这些是 Linux 版本 3 的发布说明。请仔细阅读,因为它们会告诉你这是什么,解释如何安装内核,以及如果出现问题该怎么做。
什么是 Linux?
Linux 是 Unix 操作系统的克隆,由 Linus Torvalds 从零开始编写,并得到了来自互联网的一群松散的黑客团队的协助。它致力于符合 POSIX 和单一 UNIX 规范。
它具有你期望在现代全功能 Unix 中拥有的所有特性,包括真正的多任务处理、虚拟内存、共享库、按需加载、共享写时复制可执行文件、正确的内存管理,以及包括 IPv4 和 IPv6 的多堆栈网络。
它根据 GNU 通用公共许可证分发 - 有关详细信息,请参阅随附的 COPYING 文件。
它运行在什么硬件上?
虽然最初是为 32 位 x86 PC(386 或更高版本)开发的,但今天 Linux 也运行在(至少)Compaq Alpha AXP、Sun SPARC 和 UltraSPARC、Motorola 68000、PowerPC、PowerPC64、ARM、Hitachi SuperH、Cell、IBM S/390、MIPS、HP PA-RISC、Intel IA-64、DEC VAX、AMD x86-64、AXIS CRIS、Xtensa、Tilera TILE、AVR32 和 Renesas M32R 架构上。
只要目标架构具有分页内存管理单元(PMMU)并且有 GNU C 编译器(gcc)(GNU 编译器套件 GCC 的一部分)的移植,Linux 就很容易移植到大多数通用的 32 位或 64 位架构。Linux 也已移植到一些没有 PMMU 的架构上,尽管功能显然会有所限制。 Linux 也已经移植到自身。你现在可以将内核作为用户空间应用程序运行——这被称为 UserMode Linux(UML)。
文档:
互联网上有大量的电子文档和书籍,既有 Linux 特定的,也有关于一般 UNIX 问题的。我建议在任何 Linux FTP 站点上查看 LDP(Linux 文档项目)书籍的文档子目录。本 README 并非系统的文档:有更好的来源可用。
Documentation/ 子目录中有各种 README 文件:这些文件通常包含一些驱动程序的内核特定安装说明等。请参阅 Documentation/00-INDEX 以了解每个文件中包含的内容。请阅读 Changes 文件,因为它包含关于升级内核可能导致的问题的信息。
Documentation/DocBook/ 子目录包含一些针对内核开发人员和用户的指南。这些指南可以呈现为多种格式:PostScript (.ps)、PDF、HTML 和 man 手册页等。安装后,"make psdocs"、"make pdfdocs"、"make htmldocs" 或 "make mandocs" 将以请求的格式呈现文档。
安装内核源代码:
如果你安装完整源代码,请将内核 tarball 放在你有权限的目录(例如你的主目录)中,然后解压:
gzip -cd linux-3.X.tar.gz | tar xvf -
或 bzip2 -dc linux-3.X.tar.bz2 | tar xvf -
将 "XX" 替换为最新内核的版本号。
不要使用 /usr/src/linux 区域!该区域有一组(通常不完整的)内核头文件,供库头文件使用。它们应该与库匹配,并且不要被任何特定内核版本搞乱。
你也可以通过补丁在 3.x 版本之间升级。补丁以传统的 gzip 和较新的 bzip2 格式发布。要通过打补丁安装,获取所有较新的补丁文件,进入内核源代码的顶层目录(linux-3.x),然后执行:
gzip -cd ../patch-3.x.gz | patch -p1
或 bzip2 -dc ../patch-3.x.bz2 | patch -p1
(对大于当前源代码树版本的所有版本重复执行 xx,按顺序),你应该就 ok 了。你可能想要删除备份文件(xxx~ 或 xxx.orig),并确保没有失败的补丁(xxx# 或 xxx.rej)。如果有,要么是你弄错了,要么是我弄错了。
与 3.x 内核的补丁不同,3.x.y 内核(也称为 -stable 内核)的补丁不是增量式的,而是直接应用于基础 3.x 内核。请阅读 Documentation/applying-patches.txt 以获取更多信息。
或者,可以使用脚本 patch-kernel 来自动化此过程。它会确定当前内核版本并应用找到的任何补丁。
linux/scripts/patch-kernel linux
上面命令中的第一个参数是内核源代码的位置。补丁从当前目录应用,但可以指定另一个目录作为第二个参数。
如果你使用稳定系列补丁(例如 patch-3.x.y)在版本之间升级,请注意这些"点发布"不是增量式的,并且必须应用于 3.x 基础树。例如,如果你的基础内核是 3.0 并且你想应用 3.0.3 补丁,你不应该也绝对不能首先应用 3.0.1 和 3.0.2 补丁。类似地,如果你运行的内核版本是 3.0.2 并且想跳到 3.0.3,你必须首先反转 3.0.2 补丁(即 patch -R)_然后_再应用 3.0.3 补丁。 你可以在 Documentation/applying-patches.txt 中阅读更多相关信息。
确保你的目录中没有过时的 .o 文件和依赖关系:
cd linux
make mrproper
现在你应该已经正确安装了源代码。
软件要求
编译和运行 3.x 内核需要各种软件包的最新版本。请参考 Documentation/Changes 以了解所需的最低版本号以及如何获取这些包的最新更新。请注意,使用过旧版本的这些包可能会导致难以追踪的间接错误,因此不要认为只有在构建或运行期间出现明显问题时才需要更新包。
内核的构建目录:
编译内核时,所有输出文件默认将与内核源代码存储在一起。 使用选项 "make O=output/dir" 可以指定输出文件(包括 .config)的备用位置。 示例: 内核源代码: /usr/src/linux-3.N 构建目录: /home/name/build/kernel
要配置和构建内核,请使用: cd /usr/src/linux-3.N make O=/home/name/build/kernel menuconfig make O=/home/name/build/kernel sudo make O=/home/name/build/kernel modules_install install
请注意:如果使用 'O=output/dir' 选项,则必须在所有 make 调用中都使用它。
配置内核:
即使你只是升级一个次要版本,也不要跳过此步骤。每个新版本都会添加新的配置选项,如果配置文件没有按预期设置,就会出现奇怪的问题。如果你希望以最小的工作量将现有配置迁移到新版本,请使用 "make oldconfig",它只会询问你新问题的答案。
备用配置命令有: "make config" 纯文本界面。 "make menuconfig" 基于文本的彩色菜单、单选列表和对话框。 "make nconfig" 增强的基于文本的彩色菜单。 "make xconfig" X windows(Qt)基于的配置工具。 "make gconfig" X windows(Gtk)基于的配置工具。 "make oldconfig" 基于现有的 ./.config 文件内容回答所有问题,并询问新的配置符号。 "make silentoldconfig" 与上述类似,但避免用已经回答过的问题充斥屏幕。 还更新依赖关系。 "make defconfig" 通过使用 arch/$ARCH/defconfig 或 arch/$ARCH/configs/${PLATFORM}_defconfig 中的默认符号值创建 ./.config 文件,取决于架构。 "make ${PLATFORM}_defconfig" 通过使用 arch/$ARCH/configs/${PLATFORM}_defconfig 中的默认符号值创建 ./.config 文件。 使用 "make help" 获取你架构的所有可用平台列表。 "make allyesconfig" 通过尽可能将符号值设置为 'y' 来创建 ./.config 文件。 "make allmodconfig" 通过尽可能将符号值设置为 'm' 来创建 ./.config 文件。 "make allnoconfig" 通过尽可能将符号值设置为 'n' 来创建 ./.config 文件。 "make randconfig" 通过将符号值设置为随机值来创建 ./.config 文件。
你可以在 Documentation/kbuild/kconfig.txt 中找到更多关于使用 Linux 内核配置工具的信息。
关于 "make config" 的注意事项:
编译内核:
确保你有至少 gcc 3.2 可用。 更多信息,请参考 Documentation/Changes。
请注意,你仍然可以使用此内核运行 a.out 用户程序。
执行 "make" 以创建压缩的内核映像。如果你安装了适合内核 makefile 的 lilo,也可以执行 "make install",但你可能需要首先检查你的特定 lilo 设置。
要实际安装,你必须以 root 身份登录,但正常的构建过程不应需要这样做。不要滥用 root 的权限。
如果你将内核的任何部分配置为 `modules',你还需要执行 "make modules_install"。
详细的内核编译/构建输出:
通常内核构建系统以相当安静的模式运行(但并非完全静默)。然而,有时你或其他内核开发人员需要看到编译、链接或其他命令的确切执行方式。为此,请使用 "verbose" 构建模式。这可以通过在 "make" 命令中插入 "V=1" 来实现。例如:
make V=1 all
要让构建系统还告知每个目标重建的原因,请使用 "V=2"。默认值是 "V=0"。
保留一个备用内核,以防出现问题。这对于开发版本尤其重要,因为每个新版本都包含尚未调试的新代码。确保你也保留了与该内核对应的模块的备份。如果你要安装与正在运行的内核版本号相同的新内核,请在执行 "make modules_install" 之前备份你的模块目录。 或者,在编译之前,使用内核配置选项 "LOCALVERSION" 向常规内核版本追加一个唯一后缀。LOCALVERSION 可以在 "General Setup" 菜单中设置。
要引导你的新内核,你需要将内核映像(例如编译后的 .../linux/arch/i386/boot/bzImage)复制到常规可引导内核所在的位置。
不再支持在没有引导加载程序(如 LILO)的情况下直接从软盘引导内核。
如果你从硬盘引导 Linux,你可能使用 LILO,它使用 /etc/lilo.conf 文件中指定的内核映像。内核映像文件通常是 /vmlinuz、/boot/vmlinuz、/bzImage 或 /boot/bzImage。要使用新内核,保存旧映像的副本并将新映像复制到旧映像上。然后,你必须重新运行 LILO 以更新加载映射!!如果不这样做,你将无法引导新的内核映像。
重新安装 LILO 通常只需运行 /sbin/lilo。 你可能希望编辑 /etc/lilo.conf,为旧内核映像(例如 /vmlinux.old)指定一个条目,以防新内核不起作用。更多信息请参阅 LILO 文档。
重新安装 LILO 后,一切就绪。关闭系统,重新启动,然后尽情享受吧!
如果你需要更改内核映像中的默认根设备、视频模式、初始 ramdisk 大小等,请使用 'rdev' 程序(或者适当时使用 LILO 引导选项)。无需重新编译内核来更改这些参数。
使用新内核重新启动,尽情享受吧。
如果出现问题:
如果你遇到似乎是由于内核错误引起的问题,请检查 MAINTAINERS 文件,看看是否有特定人员与你遇到问题的内核部分相关。如果那里没有列出任何人,那么次好的选择是发邮件给我([email protected]),并可能发送到任何其他相关的邮件列表或新闻组。
在所有错误报告中,请说明你正在讨论的是什么内核,如何重现问题,以及你的设置是什么(使用你的常识)。如果问题是新出现的,请告诉我,如果问题是旧问题,请尽量说明你是什么时候第一次注意到它的。
如果错误导致类似以下的消息
unable to handle kernel paging request at address C0000010 Oops: 0002 EIP: 0010:XXXXXXXX eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx ds: xxxx es: xxxx fs: xxxx gs: xxxx Pid: xx, process nr: xx xx xx xx xx xx xx xx xx xx xx
或类似的内核调试信息出现在屏幕上或系统日志中,请精确地复制它。转储可能看起来难以理解,但它包含的信息可能有助于调试问题。转储上方的文本也很重要:它说明了一些关于内核为什么转储代码的原因(在上面的示例中,是由于一个错误的内核指针)。有关如何理解转储的更多信息,请参阅 Documentation/oops-tracing.txt
如果你使用 CONFIG_KALLSYMS 编译了内核,你可以直接发送转储,否则你将需要使用 "ksymoops" 程序来理解转储(但使用 CONFIG_KALLSYMS 编译通常是首选)。此工具可以从 ftp://ftp..kernel.org/pub/linux/utils/kernel/ksymoops/ 下载。 或者,你也可以手动进行转储查找:
在调试类似上述的转储时,如果你能查找 EIP 值的含义会有很大帮助。十六进制值本身对我或其他人帮助不大:它取决于你的特定内核设置。你应该做的是获取 EIP 行中的十六进制值(忽略 "0010:"),然后在内核名称列表中查找它,以查看哪个内核函数包含该违规地址。
要找出内核函数名称,你需要找到与显示症状的内核关联的系统二进制文件。这是文件 'linux/vmlinux'。要提取名称列表并将其与内核崩溃中的 EIP 匹配,请执行:
nm vmlinux | sort | less
这将为你提供按升序排序的内核地址列表,从中可以很容易地找到包含违规地址的函数。请注意,内核调试消息给出的地址不一定与函数地址完全匹配(事实上,这非常不可能),所以你不能仅仅 'grep' 列表:然而,列表会给你每个内核函数的起始点,因此通过查找起始地址低于你要搜索的地址但后一个函数地址更高的函数,你将找到你想要的那个。实际上,在你的问题报告中包含一些"上下文"可能是个好主意,给出感兴趣的行周围的几行。
如果由于某种原因你无法执行上述操作(你有一个预编译的内核映像或类似情况),尽可能多地告诉我你的设置会有所帮助。有关详细信息,请阅读 REPORTING-BUGS 文档。
或者,你可以在正在运行的内核上使用 gdb。(只读;即你不能更改值或设置断点。)为此,首先使用 -g 编译内核;适当编辑 arch/i386/Makefile,然后执行 "make clean"。你还需要启用 CONFIG_PROC_FS(通过 "make config")。
使用新内核重新启动后,执行 "gdb vmlinux /proc/kcore"。你现在可以使用所有常用的 gdb 命令。查找系统崩溃点的命令是 "l *0xXXXXXXXX"。(将 XXX 替换为 EIP 值。)
目前,gdb 一个未运行的内核会失败,因为 gdb(错误地)忽略了内核编译时的起始偏移量。