Thursday, March 22, 2007

Digital Hermit - Kernel-Build-HOWTO

Digital Hermit - Kernel-Build-HOWTO: "Dedication
To penguin lovers everywhere...
Table of Contents
Introduction
Copyright and License
Why Rebuild?
What is the kernel?
Preparation
Hardware Requirements
Software Requirements
Determine Current Hardware
Acquiring the Sources
Download the Source
Extract and Patch
Configuration
The Configuration Process
Compile Modules or Static
Assign Unique Name
Backup .config
Configuring the 2.4.x kernels
Configuring the 2.6.x kernels
Build
Dependencies
Build the Kernel
Build the Modules
Create Initial RAMDisk
Troubleshooting Build Failures
Installation
Copy the Kernel and System.map
GrUB Configuration
LiLO Configuration
Bibliography
Resources
Online Resources
Feedback
Comments and corrections
Colophon"

Monday, March 19, 2007

编译内核 - Soso的七维空间 - CSDNBlog

编译内核 - Soso的七维空间 - CSDNBlog: "其实现在编译内核最关键的地方就是配置内核。我一般用make menuconfig配置内核。
配置2.6.0内核时如果你的主板是Intel芯片的话,你用默认配制也许就可以得到一个满意的内核哦。做法是make menuconfig后离开时选择保存。

   这里的难点是pci,如果你硬盘是IDE的那一定要选择好你主板上南桥芯片。SCSI的话就是要选择上你的SCSI卡型号。
   还有就是网卡,声卡芯片的型号了,他们的型号你都可以用lspci 查找到比如我的是。


sh-2.05a# /sbin/lspci
00:00.0 Host bridge: ServerWorks CNB20LE Host Bridge (rev 05)
00:00.1 Host bridge: ServerWorks CNB20LE Host Bridge (rev 05)
00:0"

Linux配置与编译内核 - CSDN_document的专栏 - CSDNBlog

Linux配置与编译内核 - CSDN_document的专栏 - CSDNBlog


好文章,保存下了。

编置内核包含两大项内容,即配置内核和编译内核。这两项工作需要经常查看内核的文档,至少要查看Readme文件和Documentation目录下的Changes文件。它们对内核进行了描述,比如升级内核可能出现的问题和内核对系统中工具的版本要求等。Linux内核的编制方法下面将做具体说明。
下载与解压
首先需要将内核源码下载到/usr/src/目录下面。如果压缩格式是gzip,那么执行如下命令:

#tar xzvf linux-2.4.23.tar.gz


如果是bzip2格式,则执行如下命令:


#tar xjvf linux-2.4.23.tar.bz2


这时会建立Linux-2.4.23内核源代码树。进入该目录,并确保今后的所有操作都在这个目录下完成。

配置内核
有了要编译配置的内核,先来介绍怎么样配置内核。具体的步骤分为一下几步:
1.在开始配置内核之前,首先需要通过下面的命令清除所有的临时文件、中间件和配置文件。对于一个刚从网上下载的内核来说,它肯定是干净的,这么做只会多此一举。但是这是一个良好习惯,而且不会有坏结果。

#make mrproper


2. 然后要了解自己系统的硬件配置情况,比如CPU的类型、主办芯片、显卡和声卡的型号等。
3. 配置内核选项,用到的命令是:

#make

用到的配置工具有:
config 基于交互式的文本配置界面。每个问题以线形格式出现,并被一个一个地回答,而且一旦作出了回答就不能再修改了。
oldconfig config相似,但是使用原有的配置文件,而且只会提问有关新内核特性的问题,对于内核升级很方便。
menuconfig 一个文本模式、选单驱动的配置界面。
xconfig 基于Tcl/TkX图形配置界面。
现在开始配置内核,使用的工具为menuconfig。在命令行模式下执行下面的命令:

#make menuconfig


在闪过几行字之后就出现了如图1所示的界面。



1 内核配置界面

使用方向键在各选项间移动;使用“Enter”键进入下一层选单;每个选项上的高亮字母是键盘快捷方式,使用它可以快速地到达想要设置的选单项。在括号中按“y”将这个项目编译进内核中,按“m”编译为模块,按“n”为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按“h”将显示这个选项的帮助信息,按“Esc”键将返回到上层选单。
注意,如果“make menuconfig”命令失败,很可能是ncurses库没有安装。
内核的配置选项很多,这里就主要选项进行简要说明,使大家能根据自己的情况,进行内核定制。如果某些项把握不准,可以参考documentation/Configure.help文件,也可搜索整个系统,并查看相关的选项都在哪些文件中出现了。接下来就是个选项的配置说明情况。
Loadable module support(可加载模块支持)。其中“Enable loadable module support”选项可让内核支持模块;“Module unloading”选项可以让用户卸载不再使用的模块,如果不选的话用户将不能卸载任何模块(注意,有些模块一旦加载就不能卸载,与是否选择了此选项无关);“Module versioning supportEXPERIMENTAL选项允许用户可以使用其它版本内核中编译的模块,不过并不可靠,所以一般不选择它;“Automatic kernel module loading”选项允许内核自动调用“modprobe”命令来加载需要的模块。
模块是一小段代码,编译后可在系统内核运行时被动态地加入内核,从而为内核增加一些特性或对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以缩小内核的体积。在运行时可以使用“modprobe”命令把模块加载到内核中去(在不需要时还可以卸载它)。
Set version infomation on all symbols for modulesCONFIG_MODVERSIONS)是有关内核模块版本控制的选项。如果用户打算开发内核模块代码(包括当前内核源码树中之外的任何模块代码),就开启这个设置。一般的用户可以关闭。
Pentium-III/CeleronCoppermine))Processor family用来选择CPU类型。它允许内核使用高级处理器内部的特殊指令。当然,如果用户的CPU80386,就没必要选择P4。但是如果实在不知该怎么选择,就选386。这时如果用户使用高级的CPU,内核的运行速度会比它应有的速度慢,但至少它能够运行。建议使用Help/proc/cpuinfo获得更多的帮助。
High Memory Support CONFIG_NOHIGHMEM)使内核支持大内存。通常情况下内核只支持1GB内存(实际情况是896MB,它与vmalloc()的实现有关,这超出了我们的讨论范围)。如果用户的内存数量超过了896MB,请选择内核对4GB内存的支持,甚至64GB内存的支持。
Symmetric multi-processing supportCONFIG_SMP)使内核支持多处理器。如果用户有多于一个CPU,那么一定要选这项。
Maximum number of CPUs2-32)用以选择处理器数量。对于单CPU用户来说,选多少都没有意义。
General setup表示通用配置。这里可设置内核对虚拟内存的支持和为System V的进程提供通信机制;通过“Sysctl support”选项可以动态地更改一些核心参数与变量,而不需要重新启动系统。
File systems(文件系统)。这里的内容很多,建议在缺省的基础上进行修改。一般需要DOS FAT(FAT16FAT32)VFAT,EXT3NTFSISO9660(标准光盘使用的文件系统)支持。
介绍完这些内核配置的主要选项,用户在根据自己的要求配置好内核之后,接下来就要编译内核。
Power management options (ACPIAPM)是高级电源管理。要注意ACPIAPM不能同时使用。如果同时配置了这两者,那么在系统启动时,若发现一个可工作的ACPI设备,那么APM将被关闭,ACPI会被加载。
如果想让Linux支持高级电源管理,例如软关机、系统休眠等,需要选择“Power Management support”选项;“Software SuspendEXPERIMENTAL选项可以挂起计算机(类似Windows XP中的休眠),这个功能不需要高级电源管理的支持;“Processor”选项可让处理器在空闲时节省电能,应该选上;“Thermal Zone”选项在系统温度过高时,及时调整系统的工作状态,以保护CPU(需要硬件的支持)。
Bus optionsPCIPCMCIAEISAMCAISA)用以设置系统总线。根据主板参数自己进行选择。针对PCI总线的是“PCI support”选项,下面还有ISAEISA子项,一般都是需要的;“Support for hot-pluggable devices”选项是对热插拔设备的支持;“PCMCIA/CardBus support”选项支持PCMCIA
Executable file formats表示可执行文件格式,一般全要选上。
Device Drivers用来选择设备驱动程序。声卡、显卡、网卡和电视卡等驱动都在这里选择。其中“Plug and Play support”选项支持即插即用;“Block devices”选项支持块设备;“SCSI device support”选项支持SCSI 设备;“Multi-device supportRAID and LVM选项支持RAID和逻辑卷;“Networking support”选项支持网络,包括网络协议和网络设备,协议中肯定要“TCP/IP”项,根据自己的网卡选择相应的设备;ISDN上网必需选“ISDN subsystem”选项;“Sound”选项是声卡驱动,有两种选择,一种是ALSA驱动,一种是Open Sound System驱动,选择支持自己声卡的那种,将之编译进内核;“USB Support”选项该项很重要,平常用的优盘就是一种USB设备;对USB而言,至少需要“Support for USB”“USB device filesystem”“ECHI HCDUSB 2.0support”“UCHI HCDmost Intel and VIAsupport”“USB Audio support”“USB MIDI support”“USB Mass Storage support”选项。
执行了“make ”之后,系统会在include/linux目录下生成一个autoconf.h文件。例如,在配置内核选项时选择支持NTFS文件系统,并把它编译进了内核,那么在.config中就会生成“CONFIG_NTFS_FS=y”这项,相应的在include/linux/autoconf.h中会生成“#define CONFIG_NTFS_FS 1”这项。因此所有与NTFS文件系统相关的C源文件都会包含include/config/ntfs/fs.h这个头文件。
新的2.6.0内核中增加了两个GUI配置工具,要使用xconfig必需先安装Qt库(一般发行版的光盘里都有),要使用gconfig就要先安装Gtk库。
在启动配置工具时,2.6.0内核会读取当前的系统配置,从而保持与当前配置相同的选项。这个特性是为方便以后的升级工作,在内核特性变化不大的情况下可以直接以当前的选项为基础,省去了逐项配置的麻烦。有两种方法可以让2.6.0内核以默认选项来启动配置工具,一种是将当前的配置文件/boot/config-XXX删除;另一种是在执行配置工具前先执行“make defconfig”命令。
除此之外,还为make添加了几个新选项,是allyesconfigallnoconfigallmodconfig。它们是为内核开发人员与测试人员准备的。
用户根据自己的要求配置好内核之后,接下来就要编译内核。

编译内核
编译内核的软件环境是kbuild系统,它泛指构建一个完整并能够运行的Linux内核所需要的一切资源。这些资源包括构建程序、脚本、中间件、配置文件和Makefile。现在就讲解内核的编译过程,具体步骤如下:
1.“make dep”“make depend”
kbuild调用中间件scripts/mkdep来生成描述与相关核心文件形成依赖关系的.h文件(绝大多数)列表。这个列表保存在.depend中。用户即使不执行这一步,kbuild也会自动执行的。
2. 构建内核镜像的命令是:

#make


其参数如下:
zImage 构建小内核镜像。
compressed zImage
bzImage 构建大内核镜像。
zdisk 使用zImage生成一张引导软盘。
bzdisk 使用bzImage生成一张引导软盘。
zlilo 使用lilo作为zImage的引导器。
bzlilo 使用lilo作为bzImage的引导器。
根据实际情况选择内核境象类型,大多数情况下选择“make bzImage”
2.6.0内核的kbuild系统与2.4.23比起来有一定的差异,但是绝大多数功能都是相似的。只是构建内核镜像的命令参数增加了一下几项:
fdimage 制作一张1.44M的引导软盘
fdimage144 fdimage
fdimage288 制作一张2.88M的引导软盘
3.通过下面的命令安装内核:

#make install


如果用户使用LILO,它会把内核镜像放到正确的位置并且修改LILO的配置,那么用户可以免去手动操作。如果使用别的引导器(例如GRUB),那么不使用这个命令。因为修改grub.conf需要交互式的手动编辑,自动修改可能会带来一些不可预计的错误,所以编译完毕后用户需要进行一些手动操作(见下面第6步)。
2.6.0“make install”更加智能,它会依此将arch/i386/boot/bzImageSystem.map复制为/boot/vmlinuz-2.6.0/boot/System.map-2.6.0,并创建vmlinuz-2.6.0的软链接vmlinuzSystem.map-2.6.0的软链接System.mapkbuild还会自动创建/boot/initrd-2.6.0.img,并且修改grub.conf,以前这一切都要手动才能完成。引用别人的话来说:“2.4.x还是半自动的,而2.6.x是全自动的。
4. 用下条命令编译所有被配置为模块的内核组件:

#make modules


5. 把所有编译好的内核模块按照功能拷贝到/lib/modules/2.4.23/目录下,使用下面命令:

#make modules_install


6. 手动操作将内核境像文件(/linux/arch/i386/boot/bzImage)拷贝到/boot分区,然后修改LILOGRUB的相关设置。这里以grub.conf为例:

default=0

timeout=10

splashimage=(hd0,1)/grub/image/37.xpm.gz

title kernel-2.4.22

root (hd0,1)

kernel/vmlinuz-2.4.22 ro root=oot=LABEL=/

initrd /initrd-2.4.22.img

title kernel-2.4.23

root (hd0,1)

kernel /vmlinuz-2.4.23 ro root=/dev/hda1

initrd /initrd-2.4.23.img

title kernel-2.6.0

root (hd0,1)

kernel /vmlinuz-2.6.0 ro root=/dev/hda1

initrd /initrd-2.6.0.img


注意,在2.4.23之前的内核,通常制定LABEL参数,但是对于2.4.232.6.0内核,这个参数已经被废弃了,使用root参数指定根文件系统的位置。
如果重新启动后出现“kernel panic”错误或显示应该修改“init”信息,则基本都是以上kernel语句错误。
根据发行版的不同,通常GRUB配置文件会在/etc/grub.conf/boot/grub/menu.lst/boot/grub/grub.conf三个地方。
7.最后将在编译过程中的垃圾文件进行清理,命令如下:

#make clean



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=421075


[收藏到我的网摘] CSDN_document发表于 2005年07月11日 17:22:00

相关文章:

Friday, March 02, 2007

» 说说大型高并发高负载网站的系统架构 俊麟 Michael`s blog

» 说说大型高并发高负载网站的系统架构 俊麟 Michael`s blog


说说大型高并发高负载网站的系统架构
By Michael EMail This Post
转载请保留出处:俊麟 Michael’s blog (http://www.toplee.com/blog/?p=71)Trackback Url : http://www.toplee.com/blog/wp-trackback.php?p=71
  我在CERNET做过拨号接入平台的搭建,而后在Yahoo&3721从事过搜索引擎前端开发,又在MOP处理过大型社区猫扑大杂烩的架构升级等工作,同时自己接触和开发过不少大中型网站的模块,因此在大型网站应对高负载和并发的解决方案上有一些积累和经验,可以和大家一起探讨一下。
  一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富,网站相关的技术经过这些年的发展,已经细分到很细的方方面面,尤其对于大型网站来说,所采用的技术更是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求,已经不是原来简单的html静态网站所能比拟的。
  大型网站,比如门户网站。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决大型网站面临的高负载和高并发问题。
  上面提供的几个解决思路在一定程度上也意味着更大的投入,并且这样的解决思路具备瓶颈,没有很好的扩展性,下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。
1、HTML静态化  其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。
  除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。目前很多博客也都实现了静态化,我使用的这个Blog程序WordPress还没有静态化,所以如果面对高负载访问,www.toplee.com一定不能承受
  同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现,比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。
  在进行html静态化的时候可以使用一种折中的方法,就是前端使用动态实现,在一定的策略下进行定时静态化和定时判断调用,这个能实现很多灵活性的操作,我开发的台球网站故人居(www.8zone.cn)就是使用了这样的方法,我通过设定一些html静态化的时间间隔来对动态网站内容进行缓存,达到分担大部分的压力到静态页面上,可以应用于中小型网站的架构上。故人居网站的地址:http://www.8zone.cn,顺便提一下,有喜欢台球的朋友多多支持我这个免费网站:)
2、图片服务器分离  大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的图片服务器,甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。
  在应用服务器和图片服务器上,可以进行不同的配置优化,比如Apache在配置ContentType的时候可以尽量少支持,尽可能少的LoadModule,保证更高的系统消耗和执行效率。
  我的台球网站故人居8zone.cn也使用了图片服务器架构上的分离,目前是仅仅是架构上分离,物理上没有分离,由于没有钱买更多的服务器:),大家可以看到故人居上的图片连接都是类似img.9tmd.com或者img1.9tmd.com的URL。
  另外,在处理静态页面或者图片、js等访问方面,可以考虑使用lighttpd代替Apache,它提供了更轻量级和更高效的处理能力。
3、数据库集群和库表散列  大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。
  在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。
  上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。
4、缓存  缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。
  架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的mod_proxy缓存模块,也可以使用外加的Squid进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。
  网站程序开发方面的缓存,Linux上提供的Memcached是常用的缓存方案,不少web编程语言都提供memcache访问接口,php、perl、c和java都有,可以在web开发中使用,可以实时或者Cron的把数据、对象等内容进行缓存,策略非常灵活。一些大型社区使用了这样的架构。
  另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块和eAccelerator加速和Cache模块,还要知名的Apc、XCache(国人开发的,支持!)php缓存模块,Java就更多了,.net不是很熟悉,相信也肯定有。
5、镜像  镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。
6、负载均衡  负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。
  负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个人接触过一些解决方法,其中有两个架构可以给大家做参考。另外有关初级的负载均衡DNS轮循和较专业的CDN架构就不多说了。
6.1 硬件四层交换  第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。
  在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。
6.2 软件四层交换  大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的,有人说软件实现方式其实更灵活,处理能力完全看你配置的熟悉能力。
  软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的鲁棒性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满足多种应用需求,这对于分布式的系统来说必不可少。
  一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。
总结:  对于大型网站来说,前面提到的每个方法可能都会被同时使用到,Michael这里介绍得比较浅显,具体实现过程中很多细节还需要大家慢慢熟悉和体会,有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大,希望大家一起讨论,达到抛砖引玉之效。
  转载请保留出处:俊麟 Michael’s blog (http://www.toplee.com/blog/?p=71)Trackback Url : http://www.toplee.com/blog/wp-trackback.php?p=71