准备自己编译一下 Linux, 这样做的目的是初步了解一下 Linux, 还有就是提高启动速度,减少内存开销。写在开头:这篇文章是 Step by Step 的介绍,是给初学者看的。实际情况是在 686 平台上进行本机编译。
在配置内核时,没有提到的选项就是保持了默认。
Linux-2.6.34 是目前的最新稳定版。
内核配置里面还有一些我也没弄清楚,如果有哪个高手比较闲,没事做,也可以帮忙看一下
先去 http://www.kernel.org/ 下载了最新稳定版 2.6.34. 然后解压到 /usr/src为什么自己编译 Linux 能提高启动速度呢?原因就在于在内核映像是在开机时加载到内存的,里面有很多必须的驱动,如 CPU, 硬盘 等。由于发行版带的内核映像必须支持各种主流机器,所以内核映像里面有各种驱动。自己编译的内核可以根据自己硬件的实际情况选择编进内核映像的,这样可以减小内核映像的大小,提高启动速度,减少不必要的内存开销。
cd /usr/src/linux-2.6.34
Linux 可以用 config, menuconfig, xconfig, gconfig 配置补充:这样编译出来的内核不会提高启动速度,因为 Ubuntu 的内核经过优化,有 ureadahead 预读功能。因此,我们也给 linux-2.6.34 加上预读功能吧。这样自己编译的内核启动速度就会比 Ubuntu 自带的有很大提高。
首先到 13楼,把那里的补丁代码复制到剪贴板,再粘贴到 gedit 中,保存为 kernel-tracing-for-ureadahead.patch
然后接下来代码: 全选
sudo cp kernel-tracing-for-ureadahead.patch /usr/src
这样就可以给内核打上 kernel-tracing 补丁, ureadahead 需要 kernel-tracing 来获知系统启动过程中读取了哪些文件。代码: 全选
cd /usr/src/linux-2.6.34/ patch -p0 < ../kernel-tracing-for-ureadahead.patch
等到内核安装完成,重启确认正常工作后。清除以前的预读然后重启,重启后进入 gdm 登录界面后赶快登录。从进入图形界面开始计算, 45 秒后 ureadahead 将停止 tacing, 前面访问过的文件都将在以后的启动中预读。代码: 全选
cd /var/lib/ureadahead/ sudo rm *.home.pack home.pack pack
以后也可以用同样的方法重新生成预读文件
更多关于 ureadahead 的内容,移步 http://newyork.ubuntuforums.org/showthr ... ?t=1434502
要用什么配置呢?
首先排除 config, 那是一个一个问题回答,非累死不可。
决定先试试 sudo make gconfig, 结果它提示我缺 gtk+-2.0, 于是我 sudo aptitude, 找呀找,没找到有 libgtk+-dev 之类的。只能放弃。
sudo make mrproper #清除刚才 make gconfig 的残留
再试试 menucofig 吧。这次也提示确了一个东西,不过很快就找到 lib*-dev 装上,搞定。很快进入了配置界面。
现在一点一点来配置吧。
先进入 General Setup
先把 Local Version 改了,才好区分不同的版本,我这里改成了 bill-1
下面就没什么要改的了。只是一个 Optimize for size, 我开启了。我要的是启动速度,个头太大可不行。
按两次 esc 出来,下一个 Enable loadable moudule support 内核模块支持,没什么好改。
block layer 也没什么好改。
processor type anf features, 这个要注意了。
首先要改的是 Support for big SMP systems with more than 8 CPUs, 我用的才是双核,没用,关掉,可以节省代码大小。
因为我们是在 PC 上用,所以 Support for extended (non-PC) x86 platforms 也关掉。
Paravirtualized guest support 和虚拟化有关,虽然我的 E2140 不支持虚拟化,但是这方面我了解太少,不改动,免得出问题。
Processor family 要注意了。这个是很关键的优化。只是我的 E2140 是 Intel Dual Core, 没得选,所以就选 586/K5/5x86/6x86/6x86MX, E2140 是 686 的, 所以我又把 Generic x86 support 选上了。
Maximun number of CPUs, 我的是双核,所以改成 2,可以节省大小。
下面的那个 SMT scheduler support,是支持超线程的,E2140 不支持,关掉。
Multi-core scheduler support,当然要打开。
下面那个 Preemption Model 抢占模式,根据实际选择,因为我的电脑是当成 desktop 用,那就选 desktop
Machine Check / overheating reporting 当然要启用,不过子项中我只保留 Intel. 其他通通关掉。
Machine check injector support 这个看不太懂, 机器检查伤害支持。按 Shift + ?, 看帮助。如果不知道 Machine check 是什么,那么回答 n 是安全的。
下面几个 laptop 支持全关掉。我的是台式机。
Enable X86 board specific fixups for reboot 看不懂。但它说就算不需要,也可以开启。那我就开了。
/dev/cpu/microcode - microcode support 看不懂,就按默认编译成模块把。不过子项只留 Intel.
High Memory Support 就选默认的 4 GB 了。我的是 1 GB 内存。
EFI runtime service support 关掉。 EFI 是未来技术(用于取代 BIOS )。
Timer Frequency 内核时钟频率。根据帮助,我选择了 300 MHz
kexec system call 用不依赖于 BIOS 直接加载另一个内核,我打开了。
kernel crash dumps 内核崩溃转储,我不是开发者,关了。
kexec jump (EXPERIMENTAL) 看帮助好像是在两个内核之间转跳,没用,又是实验功能,关了。
Build a relocatable kernel 就是内核可以在任意位置执行,没用。关闭该选项后内核会自动解压到编译时指定的位置。(也就是下面那个配置指定的地址)
Support for hot-pluggable CPUs 热插拔 CPU ? 根据帮助,其实是可以通过 sysfs 来控制 CPU 的开关,不是在线把 cpu 拔下来。这个被 SMP 依赖,多核 CPU 必选。
Compat VDSO support 看不懂。不过帮助里说如果 glibc 的版本在 2.3.3 以上,就关闭;否则打开。我看了 glibc, 是 2.1.x 的,所以打开。
Built-in kernel command line 就是内置的内核启动参数,不需要。
按 Esc 出来,下一个 Power management and ACPI options
Suspend to RAM and standby 挂起到内存,就是待机。打开。子项 Test suspend/resume and wakealarm during bootup 是在启动时检测挂起,既然是默认打开,也就不改了。
Hibernation (aka 'suspend to disk') 休眠(挂起到磁盘),本来是没什么用,不过为了和 userspace 保持兼容,还是打开。
下面进入 ACPI Support 子菜单。
ACPI 4.0 power meter 由于我的主板不支持 ACPI 4.0 所以就关掉。
下面的 Battery 也关了,我的是台式机,没电池。
Dock 不知道是什么,不动,保持默认。
Processor Aggregator 也不懂。根据帮助是 ACPI 4.0 的,所以关掉。
PCI slot detection driver 检测所有 PCI 插槽?帮助说 if unsure, say no. 那我就选 no 了。
Smart Battery System 我的电脑上没有,不选。据说这种设备很少见。
Esc 出来,下一个 SFI Support. 根据帮助,在 Intel Atom 平台上才有。关掉。
下一个 APM BIOS Support 我的 BIOS 是不支持 APM 的。而且帮助里也说 APM 有很多问题,如果可以不开启就不要开启。所以我关了。
进入 CPU Frequency scaling 子项( CPU 变频)。
Default CPUFreq governor 默认频率管理器。默认是 performance, 我改成了 ondemand.
先解释以下各个管理器:
performace 性能。就是不降频。
powersave 节能。就是已最低频率运行。
ondemand 根据需要。就是繁忙调高频率,空闲时降频。
conservative 保守。和 ondemand 差不多,只是调节频率时是一级一级调节。适合笔记本。
userspace 用户空间。就是在 sysfs 提供一个接口供用户空间程序读写,内核根据这个接口来设定频率。也就是频率由用户空间的第三方程序控制。这个我选择编译成模块。
下面就是要选择 变频驱动了。本来 E2140 应该是 Intel Enhanced SpeedStep 的,但这个驱动已经过时了。根据帮助,我选择了开启 ACPI Processor P-States driver. 其他全部关掉。
esc 跳出,再 esc 回到主菜单。
Bus option 总线选项。
Support for DMA Remapping Devices 目前的设备大多不支持,有时实验选项,关了。
PCI Stub driver 和虚拟机有关,我选择编译成 module
ISA support 和 MCA support 都关了,没这种设备。
下面的那些也都关了。
跳出
下一个 Executable file formats / Emulations 不需要改动。
下一个 Network Support 网络支持。
进入 Network options 子项。
IP: multicasting IP 多播。这个根本没用。关了
The DCCP Protocol (EXPERIMENTAL) 没听说过,关了。
The TIPC Protocol (EXPERIMENTAL) 和进程间通信有关的协议,留着。
Asynchronous Transfer Mode (ATM) 异步传输模式。这么高级的东西我没有,关了。
Appletalk Protocol support 留着吧。
但下面那几个直到 QoS 之前都没用,关了。
Data Center Bridging support 也关了。
按 esc 出来,下面的 Amateur Radio support 业余无线电,没有,关了。
CAN bus subsystem support 也关了。
IrDA (infrared) subsystem support 红外线。留着吧,可能以后有扩展。
Bluetooth subsystem support 蓝牙也留着以备扩展。
下面的都不改了。esc 跳出。
Device Drivers 设备驱动。这个要仔细了。
MTD support 关了。
Parallel port support 并行端口支持。因为主板上有并行端口,把 M 改成 y 直接进内核。
子项 PC-style hardware 也改成 y, 因为我的并口就是用这个驱动。
Multi-IO cards 没这种设备,关了。(其实开始我也不清楚,用 lsmod | grep 'parport_serial' 看到没输出,说明当前系统没加载这个模块,那就是没这个设备了)
AX88796 Parallel Port 也关了。
IEEE 1284 transfer modes 看清楚,是 1284 不是 IEEE 1394, 这是支持 ECP, EPP 用的。留着。
esc 跳出。下一个 PnP support 不用改动。
Block Device 块设备(即储存设备)当然要打开,进入子菜单。
Normal floppy disk support 标准软驱。虽然没软驱,不过为了兼容性还是编译成模块吧。
下面知道 Loopback device support 之前都不是常见设备。关了。
Loopback device support 回环设备,这是虚拟的设备。用来加载磁盘映像用的(知道 mount -t iso9660 a.iso /mnt 吗?),一般都要开启。
Cryptoloop Support 加密回环支持,不清楚。保持默认的 M 吧。
下面两项都关了。
OSD object-as-blkdev support 也是一种虚拟设备,似乎和 ramdisk 有异曲同工之妙。留着吧。
下面两项也关了。
RAM block device support 这个要留着。保持默认
Packet writing on CD/DVD media 保持默认。
ATA over Ethernet support 基于以太网的 ATA 设备。没有用,关了。
Virtio block driver (EXPERIMENTAL) 和虚拟机有关,保持默认的 M。
Very old hard disk (MFM/RLL/IDE) driver 早已过时了,关掉。(注意这个 IDE 可不是我们用的 IDE 接口,我们用的 IDE 接口标准说法是 ATA, 即 AT 附加设备)
esc 跳出
Misc devices 杂项设备。认真看了里面的设备,没有,直接把这个关了。
ATA/ATAPI/MFM/RLL support (DEPRECATED) 这个配置已经过时了。
SCSI device support SCSI 设备支持。虽然电脑没有 SCSI, 但是 SCSI 作为 抽象层 被 USB Mass Storage 和 SATA 依赖,要进去看看。
SCSI tape support 和 SCSI OnStream SC-x0 tape support 是两种不同的磁带,个人用户不可能有。关了。
SCSI low-level drivers 底层 SCSI 驱动。由于我的电脑上没有 SCSI 设备,这个选项可以关闭。
下面的都不改了。 esc 跳出
Serial ATA and Parallel ATA drivers, SATA 与 并行 ATA ( 即 IDE) 设备,进入子菜单。
Silicon Image 3124/3132 SATA support 这种设备我没有,关了。
ATA SFF support 是一定要打开的,子项就是选择驱动了。
我只选了 Intel ESB, ICH, PIIX3, PIIX4 PATA/SATA support 。(其实这么躲 Intel 的驱动我也不知道选那个好,用了 sudo hwinfo | grep 'ata' 命令来查看,注意这里可别用 lsmod 了,因为 ATA 驱动是直接进内核映像的,不是 module )
esc 跳出
RAID and LVM (冗余磁盘阵列 与 逻辑卷管理)我留了默认,为了保持和 userspace 的兼容性。
Fusion MPT device support 没有这种设备,我关了。
IEEE 1394 (FireWire) support 留着以备扩展。
I2O device support 和 Macintosh (即苹果机) device drivers 都关了。
Network device support 网络设备支持。这个怎么默认是模块呢,我的是集成网卡,按 y 直接进内核映像。
Bonding driver support 把几块以太网卡绑定成一块使用,这么高级的功能,我不要了。
EQL (serial line load balancing) support 把几个串行线设备绑定成一个使用,需要 ISP 的支持。没用,关了。
Universal TUN/TAP device driver support 这个是虚拟设备,我选 M
Virtual ethernet pair device 这个是虚拟设备,我选 M
General Instruments Surfboard 1000 和 ARCnet support 我都没有,关了。
PHY Device support and infrastructure 帮助说是和以太网控制器绑定在一起的设备,不知到被什么依赖了。先不管
Ethernet (10 or 100Mbit) 也就是标准以太网卡。不要编译成模块,直接进内核。进入子菜单。
我的网卡是 Atheros L2 Fast Ethernet, 只开启这个和 Generic Media Independent Interface device support,其他全部关了。
Ethernet (1000 Mbit) 和 Ethernet (10000 Mbit) 千兆以太网、万兆以太网 我都没有,直接关了。
Token Ring driver support 令牌环路设备,这种设备在 PC 上是不会有的。
Wireless LAN 无线局域网,留着以备扩展。
WiMAX Wireless Broadband devices 和 USB Network Adapters 留着以备扩展。
Wan interfaces support 这种设备一般 PC 都没有。
FDDI driver support 光纤设备,用不起呀。关了。
HIPPI driver support (EXPERIMENTAL) 也是光纤上用的,关了。
PLIP (parallel port) support 并行端口互联网协议。可以留着备用。常用于两台电脑直接通讯。
PPP (point-to-point protocol) support 想用 ADSL 就给我选上。
PPP multilink support (EXPERIMENTAL) 把几条 PPP 线路绑定成一条,需要 ISP 支持,关了。
SLIP (serial line) support 就是基于公共电话交换网的拨号协议(在中国就是 16300 ),我编译成 module
Six bit SLIP encapsulation 6 位 SLIP, 没用。
Fibre Channel driver support 用于取代 SCSI 的设备。太高级, SCSI 都用不起。
Network console logging support 把日志输出到网络。我选了 M
Netpoll traffic trapping 通信陷阱? 这个连帮助都没有的东西肯定不是什么好东西。
Virtio network driver (EXPERIMENTAL) 和虚拟机有关,保持默认。
VMware VMXNET3 ethernet driver, VMware 虚拟机的支持。 VMware 已经过时了,不选。
按 esc 跳回 Device drivers.
ISDN support 这种协议早就被淘汰了吧。
Telephony support 这和拨号上网无关。和 IP 电话有关,不选。
进入 Input devices 输入设备 子项。
前面部分没什么可以改的。进入 keyboards 子项。
我晕了,该选那个驱动呢。 里面的模块用 lsmod | grep 测试遍了也没有对上号的。再用 hwinfo 查看,正确的驱动是 atkbd. 跳出来看 keyboards 的帮助: This option doesn't affect the kernel. 我真晕了。也许 atkbd 是默认支持的吧,没得选。我就把 keyboards 里面的全部子项都关了。(试试吧,要是键盘用不了,那也还有鼠标嘛)
Mice 鼠标。只留 PS/2 和 Apple USB 的那几项。
Joysticks/Gamepads, Tablets, Touchscreens 都不修改,以备扩展。反正编译成 module 不占内存。
进入子项 Miscellaneous devices 杂项设备。只留 PC Speaker. User level driver support 编译为模块。
进入子项 Hardware I/O ports 硬件输入/输出端口:我关了第三到七项。
esc 回到 Devices Drivers
进入下一项 Character devices 字符设备:
Serial drivers 子菜单中:Non-8250 serial port support 可以全部关了。
Legacy (BSD) PTY support 可以关了。
IPMI top-level message handler 没这种设备。
Hardware Random Number Generator Core support 硬件随机数生成器。用 lsmod, hwinfo, ls /dev/hw_* 都没有检查到。关了。
/dev/nvram support 用来直接访问 CMOS 的。保持默认,编译为模块。
下面一直到 RAW driver 前面都关了。
TPM Hardware Support 和 Telecom clock driver for ATCA SBC 都关了,没这种设备。
esc 回到 Devices Drivers
I2C Support 不知道被什么依赖了。不管了。
SPI support 和 PPS support 关了。没这些设备。
GPIO support 通用输入输出,在嵌入式系统才有, PC 上是不会有的。关了。
Dallas's 1-wire support 这个没听说过的设备又不知道被什么依赖了。
Power supply class support 电源供应模块支持。里面的电池我的台式机都不会有,关了。回到 Devices Drivers 发现 Dallas's 1-wire support 可以关了。
Hardware Monitoring support 硬件监视当然要打开。里面的驱动我只选了 Intel Core/Core2/Atom temperature sensor, Winbond W83627EHF/EHG/DHG, W83667HG, ASUS ATK0110. 编译成模块
Generic Thermal sysfs driver 不改动。
Watchdog Timer Support 里面的驱动我只选了 Software watchdog, Intel TCO Timer/Watchdog, W83627HF Watchdog Timer. 编译成模块。
Sonics Silicon Backplane 不知道是什么,但被依赖了。
Multifunction device drivers 多功能设备。我把能关的都关了。
Voltage and Current Regulator Support 电压和频率。我的 asus 主板是通过 ASUS ATK0110 监视电压和频率的,没用。关了。
Multimedia support 多媒体支持。这是用来接受广播、电视等的。没用,关了。
Graphics support 图形支持,这个要仔细了。
AGP Support, APG 是 7, 8 年前的古董显卡接口。我是没有了。如果你怀疑你的显卡是这种, ls /dev/agpgart 看看。
Maximum number of GPUs, GPU 最大数量。我不清楚该怎么算。流处理器算不?帮助说了,每个 GPU 的开销很小,算了,保持默认。
Laptop Hybrid Grapics - GPU switching support 混合交火。这个和笔记本无关,和多显卡有关。如果有多个显卡(一般是一个集成显卡和一个独显),那么打开这个选项可以在 Xserver 关闭时由内核控制混合交火。
Direct Rendering Manager 这个是用来支持 AGP 的。没用,关了。
Lowlevel video output switch controls 底层显示输出切换控制,这就是传说中的 KMS 吧。当然要留着,编译成 M.
Support for frame buffer devices 这个是一定要的。进入子菜单。
Framebuffer foreign endianness support 就是如果你的显卡内存结构和系统内存不同( Little-Endian 和 Big-Endian) 那就需要打开。我关了。
Enable Tile Blitting Support 这个选项只和 matroxfb 有关,我没有 Matrox 显卡,就关了。
下面的 Frame buffer hardware drivers 硬件驱动要根据实际选择,我用 nVIDIA 显卡,这些就都可以关了。
esc 跳出。
下面就是显卡驱动了,我也不知道我的 N 卡要用 nVidia Framebuffer Support 还是 nVidia Riva support, 就把这两个都编译成模块。其它显卡驱动都关了。
esc 回到 Device drivers补充:那个 VESA 的驱动也是要的,我没选,结果受到了惩罚。开启了受限驱动还打不开 framebuffer
Sound card support 声卡支持,直接进内核映像。
进去先把过时的 OSS 关了,再把 ALSA 编译进内核映像。进入 ALSA 子菜单。
前面那些都不要动。我关注的是后面的 Generic sound devices 子菜单。
PC-Speaker support 用蜂鸣器做音箱,太神奇,我不要。
剩下的 MIDI 设备我是一窍不通。保持默认吧。(为了测试到底选那个驱动,还把 Xserver 弄崩溃了)
跳出,下一个 PCI sound devices, PCI 声卡,编译进内核映像。进入子菜单。
这里我关心的只是 Intel HD Audio, 其他全部关了。进入 Intel HD Audio 子子项。
所有以 Build 开头的都是硬件驱动。我只留了我的 Build Realtek HD-audio codec support
其他选项最好不要动。
esc 跳出
USB sound devices 不动。
ALSA for SoC audio support 没有这种设备。关了。
esc 跳出, 再 esc 回到 Device drivers
HID Devices 就是一些 USB 接口的输入设备之类的,不动。
进入 USB support 子项
Miscellaneous USB options 里留一个 USB Monitor, 其他那些 Wireless USB 太高级,没有。
USB Host Controller Drivers 里选了 EHCI HCD (USB 2.0) support 和 UHCI HCD (most Intel and VIA) support (即 USB 1.1) 支持。
USB Device Class drivers 和 USB Imaging devices 不动。
USB port drivers 全部关了
USB Miscellaneous drivers 不动。
esc 跳出
Ultra Wideband devices 没这种设备。
MMC/SD/SDIO card support 这个不是用来支持读卡器的。读卡器被抽象成 USB Mass Storage device. 这是直接驱动 MMC/SD 卡用的。一般 PC 都没有这种设备。
Sony MemoryStick card support 同上。
LED Support 里面那些 LED drivers 我都没有,关了。
Accessibility support 和 InfiniBand support 都没有。
进入 EDAC (Error Detection And Correction) reporting 子项。
那些驱动我也不知道要选什么,把 Intel 的全部留下。其他关了。
Real Time Clock 实时时钟。里面的驱动我只选了 PC-style 'CMOS'
DMA Engine support 不修改。
Auxiliary Display support 没这种设备
Userspace I/O drivers 用户空间 输入/输出 驱动。不需要,关了。
Staging drivers 开发中的驱动,不敢用。
X86 Platform Specific Device Drivers 这些都是笔记本用的。没用。
esc 回到主菜单。
Firmware Drivers 固件驱动。里面有一个 Dell 的 BIOS 刷新功能,我的是兼容机,关了。
进入 File systems 文件系统。
ext2, ext3 我都没使用,编译成模块
ext4 是我的根分区的格式,当然要进内核映像。
GFS2, OCFS2, Btrfs, NILFS2 这些要么是淘汰的,要么是开发中的,不用。
Old quota format support 旧配额格式支持。我没有这么旧的格式了,不用。
Kernel automounter support 一般要无盘工作站才有用。
FUSE (Filesystem in Userspace) support 这个要打开, ntfs-3g 需要这个支持。
Miscellaneous filesystems 杂项:里面的 eCrypt filesystem layer support 就是 ecryptfs, 一定要开,为了保持和用户空间兼容。Apple, OS/2, UFS, exofs 我开了。
Network File Systems 保持默认就可以了。
Partition Types 分区格式,我选了 Mac, PC BIOS, Windows Logical Disk Manager.
其他默认吧,跳出。
Kernel hacking 和 dmesg 日志有关的,不知道就别乱动。里面默认开启的选项最好别关。
Virtualization 虚拟化, E2140 不支持。
其它的也没什么了
esc 退出,会提示保存。
接下来 sudo make dep 读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要。
sudo make clean 删除前面步骤留下的文件,主要就是 menuconfig, 这个东西在内核中是不需要的。
sudo make bzImage 生成内核映像。 bzImage 即 Big gZipped Image, 大的、压缩的映像。
sudo make modules 生成内核模块。
到这篇文章发布时,我还正在编译内核模块。编译 bzImage 很快,因为需要的内容不多。但编译 modules 就需要很长时间了。