[隐藏]

 

预备知识:vim 的操作、apt-get 的操作、tar 的操作、dpkg 的操作、make-kpkg 的操作、SMP 的概念、虚拟机知识、SSH 知识、SFTP 知识等

 

筹备 用到五个包:

 

1.kernel-package

build-essentiallibncurses5-dev dpkg-dev

服务器如果没有网络环境的话,kernel-package 包需要去以下链接下载

http://mirrors.163.com/ubuntu/pool/main/k/kernel-package/kernel-package_12.032_all.deb

 

libncurses5-devCD 版的光盘没有这个包,需要去下面的地址下载) http://mirrors.163.com/ubuntu/pool/main/n/ncurses/libncurses5-dev_5.7+20100626-0ubuntu1_i386.deb 服务器无网络环境时需要 ubuntu ISO 一个,最好是 DVD 版的

 

1.1.服务器没有网络环境

有网络环境请跳到此步

 

2.1.以下内容是演示在服务器没有网络环境的预备工作:

 

先用有网络环境的机器在虚拟机装上 ubuntu, 安装两个个开发包:

输入如下命令:

 

#apt-get install dpkg-dev -y

#apt-get install build-essential 之后获取到 kernel 的源码: 输入如下命令:

#mkdir /tmp/kernel

#cd /tmp/kernel

#apt-get source linux-image-$(uname -r)

 


下载完后,会自动解压出一个 liunx-<ver>的文件夹,如下面的 linux-2.6.35

 


之后打包此文件夹: 输入如下命令:

tar -zcvf linux-<var>.tar.gz /linux-<var>

 


打包完后如图,多出一个 90 MB linux-<var>.tar.gz,这里是 linux-2.6.35.tar.gz

 


3.1.将这个包下载到实体系统里,我这里用 SFTP 的方法(这里不演示了),如果是图形化的 ubuntu,装了 tools 之后可以直进拖出来。

http://mirrors.163.com/ubuntu/pool/main/k/kernel-package/kernel-package_12.032_all.deb 中把 kernel-package_12.032_all.deb 下载下来, 如你的 ISO CD 版的话,也需要去

http://mirrors.163.com/ubuntu/pool/main/n/ncurses/libncurses5-dev_5.7+20100626-0ubuntu1_i386.deb

下载 libncurses5-dev

C 盘新建文件夹 update,把 kernel-package_12.032_all.deb linux-2.6.35.tar.gz 还有 libncurses5-dev_5.7+20100626-0ubuntu1_i386.deb 放进去:

 


现在工作场合转移到服务器上。我们用 Ilo 连上服务器

目的:通过 Ilo update 这个目录挂载到服务器上,并将 ubuntu iso 镜像挂载到服务器上做 apt-get 的源,也可以直进使用 U 盘和光盘挂载。 这里演示的是 Ilo 挂载。

先挂载光盘镜像(有网络环境时无需挂载光盘做 apt-get )

 


 


 

在挂载 update 文件夹:

 


挂载文件夹成功后服务器会有如下提示,按回车即可返回命令行:

 

 


 

现在需要将光盘和文件夹 mount 到系统中: 输入如下命令:

#mkdir /tmp/kernel

#mkdir /tmp/iso

#mount -t iso9660 /dev/cdrom /tmp/iso(如果是图形界面的话,一般会自动挂载的。为了保持后面的一致性,输入这个命令之前先输入 umount /dev/cdrom)

 


#mount /dev/sda /tmp/kernel

 


现在将光盘设置为 apt-get 的源:

 

4.1.#cd /etc/apt

#cp sources.list sources.list.bk

#cat > sources.list

deb file:///tmp/iso maverick main restricted

ctrl+d

 


这里解释下:

Maverick ubuntu 版本对应的别名,点击此可查看相关信息。 现在更新 apt-get

 

服务器有网络环境(无网络环境也要看) 输入如下命令:

 

5.1.#apt-get update

 


有网络环境时需要在服务器上补充如下命令: 输入如下命令:

#mkdir /tmp/kernels

#cd /tmp/kernels

#apt-get source linux-image-$(uname -r)

 

现在安装三个开发包,输入如下命令:

 

#apt-get install dpkg-dev -y

 

#apt-get install build-essential

 


 


现在装 libncurses5-dev

现在需要安装 kernel-package 包,输入如下命令:

#dpkg -I /tmp/kernel/kernel-package_<var>.deb (有网络环境的话只是输入 apt-get install kernel-package,不用输入#apt-get -f install)

之后会报错,此时输入如下命令:

 

#apt-get -f install

 


我这里用的是 CD 版的 ISODVD 版的 ISO 或者有网络环境时直接用 apt-get install libncurses5-dev 命令即可。

#dpkg -I /tmp/kernel/libncurses5-dev_<补全键”TAB>

 


现在将内核源码解压(有网络环境时无需做此步)

#mkdir /tmp/kernels\

#cp /tmp/kernel/linux-<var>.tar.gz /tmp/kernels

(如果是用 Ilo 挂载,这个时间会比较长,大概 5 10 分钟。成功复制后如下图)

 


#cd /tmp/kernels

 

#tar -zxvf /tmp/kernels/linux-<var>.tar.gz

 


 

 


 

输入如下命令:

 

#ll

#cd linux-2.6.35.tar.gz

如下图:

 


此时校准时钟(时间小于内核包创建时间是无法编译的) 输入如下代码:

#date

#date -s //

#date -s ::秒 如下图:

 


查看当前 CPU 核数:

#cat /proc/cpuinfo |grep processor\

如图可以看到只有 8 个核,(明明有 12 ,intel 超线程后 24 ),现在我们就来解决这个问题。

 


编译前的准备: 输入如下命令(用于清空内核目录下多余的文件,如之前的编译信息)

#make mrproper

 


复制当前系统内核的配置文件到此目录: 输入如下命令:

#cp /boot/config-`uname -r` ./.config

 


输入如下命令:

 

#apt-get install vim -y

 

 


编辑配置文档 编辑.config 文件

 


6.1.输入如下命令:

#vim .config

 


修改 X86_BIGSMP 项: 输入”/X86_BIGSMP“之后回车(一定要大写)

 


输入”a“,即可编辑文本内容:

改成下图(此参数可以让内核开启支持大于 8 核的 CPU 功能) (后面的_是光标,请不要多输入一个_符号):

 

 


 

再修改 X86_32_NON_STANDARD 参数,先按”Esc“键(在键盘左上角) 之后输入”/X86_32_NON_STANDARD“回车(此参数是让内核支持非标准的 32 CPU): 如图:

 


输入”a“修改,改后如图:

 

 


 

修改 NR_CPUS 参数,输入”ESC“键,之后输入”/NR_CPUS“(此参数是修改内核支持的最大核数,数值在 2-225 之间,但是不是设置的越大越好)

 


输入”a“进行编辑,改后如图(后面的_是光标,请不要多输入一个_符号):

 


最后按”ESC“键,输入”:wq“并回车,如图:

 


 


现在进入配置菜单:

 

# make menuconfig

 


用上下键移动光标,用回车进行选择,按”E“是退出,进行下图的操作:

 

 


 


 


 

按两次”E

按一次”Y

 


 


 

6.1.现在开始编译:

#make-kpkg clean

 

 


 

#make-kpkg -initrd –initrd –append-to-version=dell1400 kernel_image kernel-headers

 


当出现类似下图时:

 


 

可以直进回车使用默认值或者输入”?“回车后查看参数的意义再决定。

选完所以选项后就真正开始编译了,单核编译大概要 2 小时,不建议多核编译,多核编译出来的内核很可能不稳定。下图是编译完后的大概状况:

 

 


6.1.现在开始安装内核:

# cd ..

#ll

# dpkg -i linux-image-(按 tab 键),如图:

 


安装完后如图:

 


输入如下命令重启服务器:

 

#reboot

 


重启后输入如下命令:

 

#cat /proc/cpuinfo | grep processor

 


查看到是 12 CPU

 

开超线程后如下图:

 


 

6.1.附录:

 

7.1.1.Ubuntu 的别名对应版本如下:

 

Hardy

8.04

Lucid

10.04

Maverick

10.10

Natty

11.04

Oneiric

11.10

Precise

12.04

Quantal

12.10

 

7.1.2..config 重要参数解释:

1General setup–>Cpuset support:

该条目为 y 或者 n,为 y 时定义 CONFIG_CPUSETS 宏。建议不勾选这项。因为这个特性是主要是用于 NUMA 架构和拥有大量逻辑 CPU SMP 架构,开启这一特性会浪费一些内存,对一般人的桌面环境没有任何帮助。

2Processor type and features–>Symmetric multi-processing support

该条目为 y 或者 n,为 y 时定义 CONFIG_SMP 宏。勾选这一项使得内核支持对称多处理器。建议勾选,因为最新的 CPU 大多支持双核或者超线程,就算你现在是单 CPU,难保你哪天升级:)。

3Processor type and features–>Processor family

这是一个单选条目,目的是为了指定 CPU 的具体型号以便进行优化,应该慎重选择,选错有可能造成内核无法正常工作。举个例子来说明这个选项的优化作用,比 如你选中了 Athlon/Duron/K7,那么内核在进行 memcpy()

的时候就会使用经过 3DNow!指令集优化过的版本。下面我大致把市面上常见 的 CPU 应该选哪项做一个粗糙地分类:

针对 AMD CPUaSempron(闪龙)/Duron(毒龙)/Athlon(速龙):选择 Athlon/Duron/K7

bSempron64Athlon64Athlon64 X 2Opteron(皓龙):选择 Opteron/Athlon64/Hammer/K8

c)比上述 CPU 都古老的:选择 K6/K6-II/K6-III。(当然如果你的 CPU K5 的就得选 586/K5/5×86/6×86/6x86MX 了。)

针对 INTEL CPU

a)奔腾 2:选择 Pentium-II/Celeron(pre-Coppermine)

b)奔腾 3:选择 Pentium-III/Celeron(Coppermine)/Pentium-III Xeon

c)奔腾 4/奔腾 D/赛扬 D:选择 Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon d)酷睿 2:选择 Core 2/newer Xeon

注意:如果你的 CPU 是赛扬(赛扬 D 除外),你必须先确认它到底是基于 P2P3 还是 P4 的,一般来讲主频高于 1G 的是基于 P4 的,高于 500M 但小于 1G 的是基于 P3 的,其它的是基于 P2 的。另外,志强处理器你也要 区分是基于 P3P4 或者是 Core 2

Intel Core 取代了 Pentium 成为主要命名代号。Core Duo 是双核心处理器(Core Solo 为单核心)Centrino Duo 全称为 Centrino Core Duo,其中 Centrino 是迅驰移动技术 Intel Pentium M Yonah processor 指的就是 Centrino Core Duo********************************************

 

4Processor type and features–>Generic x86 support

该条目为 y 或者 n,为 y 时定义 CONFIG_X86_GENERIC 宏,目的是针对 x86 体系结构进行一般优化。比如,当 CONFIG_X86_GENERIC 宏定义的情况下(当然 CONFIG_X86_TSC 宏也要定义,这个取决于前面 Processor family 的 选择。),内核中的 get_cycles()函数会使用 TSC(time stamp counter)获取 cycles 值。这个选项一定要勾选上。

5Processor type and features–>Maximum number of CPUs

 

这个条目是一个数字的宏(NR_CPUS,范围为 2-255),该数字决定内核最多支持的逻辑 CPU 数量。恰当地设定该数字可以使你的内核节省一些内存, 这是因为内核中有许多数据结构是根据 NR_CPUS 的大小来固定分配空 间的,即使你现有的逻辑 CPU 少于 NR_CPUS,这些空间也会被分配出来从而造成 浪费。如何确定你有多少个逻辑 CPU 呢?举例来说吧:比如你的系统是单 CPU,但是支持超线程(Hyper-threading),那么逻辑 CPU 数量 为 2;再比如说你的系统是双 CPU,每个 CPU 又支持双核,那么逻辑 CPU 数量为 4。一般来说,大家应该把这个数值设定为大于等于你系统的逻辑 CPU 数。考 虑到大多数人应该还是使用单 CPU 系统,我推荐大家将这个值 设定为 4,因为目前个别 INTEL CPU 同时支持双核与超线程,另外 INTEL 还推出了四核 心的 CPUAMD 应该也会很快推出四核心 CPU,所以将这个值设定为 4 是为了给不久的未来上个保险同时对于少于 4 个逻辑 CPU 的 朋友又不会浪费你太多的 内存。

6Processor type and features–>SMT (Hyperthreading) scheduler support

该条目为 y 或者 n,为 y 时定义 CONFIG_SCHED_SMT 宏。定义它的目的是为了对支持超线程的 CPU 提供能好的调度功能。我举例说明一下:比如一 个系统有两个 CPU,每个 CPU 又支持超线程,那么系统中有四个逻辑 CPU, 我们将这个四个 CPU 记为 C00, C01, C10, C11,其中 C00 C01 是一个物理 CPU 上的两个硬件线程,而 C10 C11 则是另一个物理 CPU 上的两个硬件线程。假设某一个时刻系统中有两个线程 在执行,在没有定义 CONFIG_SCHED_SMT 宏的情况下内核很可能会将这两个线程分别调度到 C00 C01 上去,但这是不优化的,因为 C00 C01 是一个物理 CPU 上的两个硬件线程,它们共享了许多硬件资源,导致两个线程运行时并不能充分 发挥这个系统的资源优势;而定义了 CONFIG_SCHED_SMT 宏的情况下,内核的调度器就会将这两个线程调度到位于不同物理 CPU 的逻辑 CPU 上,比如 C00 C10 上。

乍一看似乎只要你的 CPU 支持超线程,那么你就应该勾选这一项,但是我认为并不一定这样。比如你的系统是单 CPU 并且支持超线程,那么这个时候 CONFIG_SCHED_SMT 宏对于提高调度效果并没有什么意义(当然前提 是我对内核调度器的理解无误的话:)),而且定义 CONFIG_SCHED_SMT 宏还会对调度增加额外的开销。

我的建议是:在你的 CPU 支持超线程的前提下,只有当你的系统有多个 CPU 或者支持多核的时候才有必要勾选这一项。

7Processor type and features–>Multi-core scheduler support

该条目为 y 或者 n,为 y 时定义 CONFIG_SCHED_MC 宏。它的作用很类似于前面提到的 CONFIG_SCHED_SMT,只不过它针对多核 (multi-core)。我的建议是只有你的系统拥有多个物理 CPU 时才有必要勾选。比如我家里的 机器 CPU 为单 AMD Athlon 64 X2 4200+,虽然是双核,但只有一个物理 CPU,我就没有必要定义这个宏。

8Processor type and features–>Preemption Model

这是一个单选条目。它是一条对桌面响应能力有很重要意义的选项,我强烈建议大家选择 Preemptible Kernel (Low-Latency Desktop) ,选中这项会定义 CONFIG_PREEMPT 宏,表示该内核将支持抢占式内核(Preemptible

Kernel )特性。为了突出它的重要性,我下面通过一个例子简单介绍一下抢占式内核的概念:假设某系统中(假定只有一个逻辑 CPU)有两个线程在运行,一个叫线程 H,一个叫线程 L,线程 H 的动态优先级要比线程 L 高, 在某一时刻,线程 H 由于等待键盘响应进入了阻塞状态,这时内核将会调度线程 L 将其投入运行,而再假设 在线程 L 运行的过程中由于某种原因进入了内核空间(这里主要指由于系统调用或者异常),而恰巧在 L 进入了 内核之后用户按下了键盘,键盘中断导致线程 H 从阻 塞状态进入了就绪状态,那么按照正常的逻辑此时应该立刻将 CPU 交给线程 H(因为线程 H 的动态优先级高),从而让线程 H 立刻进行用户按键后的操作处理。这 个 时候,如果系统支持抢占式内核特性的话,那么 linux 确实会像刚才的逻辑那样做,但是如果不支持抢占式内核特性的话,那么线程 H 将无法立刻得到执行, 它必须要等到线程 L 完成了在内核空间中的所有工作并返回用 户空间的前一刻才能得到调度,这就会对线程 H 造成一个调度上的延迟,这种延迟最大可能达到几百毫 秒之多,而几百毫秒的延时可能让人产生响应迟钝的感觉。因此对于以响应能力为重要指标的桌面系统来说,抢占式 内核特性是很重要的(据我所知 windows mac os x 的内核都属于抢占式内核),因此极力建议大家选中这项。

抢占式内核特性是从 2.6.x 内核开始有的,我从 fedora core 2 一直到 fedora core 6 以及 ubuntu 6.10 自己编译的内核都开启这个特性,从来没有遇到过任何稳定性方面的问题,所以请大家放心。另外,再多说一句,不要把 抢占式内核与抢占式多任务 (preemptive multitasking)混为一谈,linux 从最开始就是支持抢占式多任务的。

9Processor type and features–>Preempt The Big Kernel Lock

该条目为 y 或者 n,为 y 时定义 CONFIG_PREEMPT_BKL 宏。定义该宏是为了在某线程占有大内核锁(Big Kernel Lock)的时候仍然可以被其它高优先级线程抢占调度。这个特性同样是为了提高桌面系统的响应能力,建议勾 选。

10Processor type and features–>High Memory Support

这是一个单选条目。目的是用于配置 linux 内核对 high memory 的支持。这个条目解释起来比较麻烦,我就不细说了。我的建议是:如果你的物理内存小于等于 896MB,并且在短期内没有升级内存的可能性的 话,你就选 择 off;如果内存大于 896MB 或者说有可能升级到大于 896MB 内存的话,并且小于 4GB,那么选择 4GB;如果你的内存大于 4GB 的话, 原则上你应该选择 64GB,但是为了充分利用你的系统资源,这种情况我还是建议你 安装 x86_64 版本的 ubuntu

11Processor type and features–>Allocate 3rd-level pagetables from highmem

该条目为 y 或者 n,为 y 时定义 CONFIG_HIGHPTE 宏。这个宏的功能解释起来也比较麻烦,我也就不细说了。但注意这个宏只有在前一条目选择了 4GB 或者 64GB 才有意义。我的建议是:如果你的物理内存数量超出

896MB 不是很多的时候就不要选中这项,比如说只有 1GB 内存的时候就我觉得就没有 必要选;但如果超出很多就有必要选中,比如说 2GB 内存的时候。

12Processor type and features–>Timer frequency

这又是一个单选条目,选择完成后最终会定义一个叫 HZ 的宏,这是一个数字宏,目前在 2.6.20 内核中这个数字可以为 100250300 1000 四 种。这个数字决定了每秒钟时钟中断发生的次数,每次时钟中断要处理许多 事情,但就桌面性能来说,它的频率决定了内核定时器与用户空间定时器的精度。这个数 字越大,定时器的精度就越高,而用于处理定时器中断所造成的开销也就越大。不过为了提高桌面系统的多媒体性能,我建议大家 将这一条目选择为 1000 HZ。当然,如果你觉得自己的 CPU 性能不够高,也可以考虑选择 HZ_250 或者 HZ_300(当然,性能够不够高没有一个绝对的准绳,我觉的凡是主频高 于 1G CPU 选则 1000 HZ 是毫无问题的。)。

13) File systems–>Ext3 journalling file system support

 

该条目为 ym 或者是 n。这个条目决定了内核对 Ext3 文件系统的支持,前面提到过 y/m/n 三者的含义。我的建议是:如果大家大量使用 Ext3 文件系统 的话,那么选则 y(也就是在 qconf 中打上对勾,即把 Ext3 的支持代 码直接编译进内核镜像);否则的话,选则 m(也就是在 qconf 中打上圆点,即把 Ext3 的支持代码编译成一个 LKM)。

那么为什么在大量使用 Ext3 的时候就选择 y 呢?这是因为 LKM 在需要的时候会被加载到内核空间的非线性映射区域,这块区域的页表是动态的,需要在不同的 进程之间进行同步。而且一旦进程发生了切换之后,描述这 一区域的页表项的缓存(TLB)将会被 flush 掉,从而导致进程切换后访问相同 LKM 的性能有所 降低;而如果直接将代码编译进内核镜像的话,这些代码将会位于内核空间的线性映射区域,而这块区域的页表项是全局的, 其缓存不会在进程切换后被 flush 掉,从而提高了性能。

同理,如果你大量使用其它文件系统(比如 Reiserfs)的话,你也可以将相应的条目选择为 y

14File systems–>DOS/FAT/NT Filesystems–>NTFS file system support

该条目为 ym 或者是 n。这个条目与桌面性能倒是没有什么关系,只不过我估计大多数人都是 linux/windows 双系统,为了能够访问 NTFS 文件系 统,记得要将这一项选择为 m 或者 y。另外,值得一提的是:这个条目下 面还有一个子条目 NTFS file system support,这个条目只能为 y 或者 n,为 y 时定义 NTFS_RW 宏,定义该宏使得该模块支持对 NTFS 文件系统的写入操作。请注意,对于早期的 2.6.x 内核来说,这种写入操作是不安全的;而 在 2.6.20 里面说现在写操作已经安全了,但是只能写已经存在了的文件,而且文件长度还不能改变,这样 一来用处也不大了。所以我建议不要选中这个条目。

15Kernel hacking–>Kernel debugging–>Use 4Kb for kernel stacks instead of 8Kb

该条目为 y 或者 n。为 y 时定义 CONFIG_4KSTACKS 宏。这个特性是将每个线程的核心堆栈从 8Kb 减少到 4Kb,而发生外部中断时则给每个逻辑 CPU 准备一个 IRQ stack 以补偿核心堆栈减小带来的损失。这个特性的好处是在 系统中有大量线程存在时降低了内存的使用量,另外更重要的是由于 i386 体系结构一个页面的 大小就是 4Kb,每次分配 4Kb 会减少内核中 page allocator 分配页面时造成的内存碎片效果;它的坏处是发生中断时会有切换 堆栈的额外操作发生。我只建议内存比较少又需要同时运行大量线程的朋友开 启这个选项。

 

 

发表评论