Linux-2.6.34 编译笔记

内核编译和嵌入式产品的设计与开发
Bill Lee
帖子: 598
注册时间: 2009-09-19 20:50

Linux-2.6.34 编译笔记

#1

帖子 Bill Lee » 2010-06-06 14:06

写在开头:这篇文章是 Step by Step 的介绍,是给初学者看的。实际情况是在 686 平台上进行本机编译。
在配置内核时,没有提到的选项就是保持了默认。
Linux-2.6.34 是目前的最新稳定版。
内核配置里面还有一些我也没弄清楚,如果有哪个高手比较闲,没事做,也可以帮忙看一下
准备自己编译一下 Linux, 这样做的目的是初步了解一下 Linux, 还有就是提高启动速度,减少内存开销。
为什么自己编译 Linux 能提高启动速度呢?原因就在于在内核映像是在开机时加载到内存的,里面有很多必须的驱动,如 CPU, 硬盘 等。由于发行版带的内核映像必须支持各种主流机器,所以内核映像里面有各种驱动。自己编译的内核可以根据自己硬件的实际情况选择编进内核映像的,这样可以减小内核映像的大小,提高启动速度,减少不必要的内存开销。
先去 http://www.kernel.org/ 下载了最新稳定版 2.6.34. 然后解压到 /usr/src
cd /usr/src/linux-2.6.34
补充:这样编译出来的内核不会提高启动速度,因为 Ubuntu 的内核经过优化,有 ureadahead 预读功能。因此,我们也给 linux-2.6.34 加上预读功能吧。这样自己编译的内核启动速度就会比 Ubuntu 自带的有很大提高。
首先到 13楼,把那里的补丁代码复制到剪贴板,再粘贴到 gedit 中,保存为 kernel-tracing-for-ureadahead.patch
然后

代码: 全选

sudo cp kernel-tracing-for-ureadahead.patch /usr/src
接下来

代码: 全选

cd /usr/src/linux-2.6.34/
patch -p0 < ../kernel-tracing-for-ureadahead.patch
这样就可以给内核打上 kernel-tracing 补丁, ureadahead 需要 kernel-tracing 来获知系统启动过程中读取了哪些文件。
等到内核安装完成,重启确认正常工作后。清除以前的预读

代码: 全选

cd /var/lib/ureadahead/
sudo rm *.home.pack home.pack pack
然后重启,重启后进入 gdm 登录界面后赶快登录。从进入图形界面开始计算, 45 秒后 ureadahead 将停止 tacing, 前面访问过的文件都将在以后的启动中预读。
以后也可以用同样的方法重新生成预读文件
更多关于 ureadahead 的内容,移步 http://newyork.ubuntuforums.org/showthr ... ?t=1434502
Linux 可以用 config, menuconfig, xconfig, gconfig 配置
要用什么配置呢?
首先排除 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, 就把这两个都编译成模块。其它显卡驱动都关了。
补充:那个 VESA 的驱动也是要的,我没选,结果受到了惩罚。开启了受限驱动还打不开 framebuffer
esc 回到 Device drivers

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 就需要很长时间了。
上次由 Bill Lee 在 2010-06-15 13:45,总共编辑 2 次。
aMule 2.3.1 is coming...
真正动态的 amule-dlp is coming...
本人帐号在2011年1月被盗,在2011年1月3日17:19到2010年1月6日13:34之间本帐号发的一切帖子、短信等与本人无关!
amule-dlp 开发动态
amule-dlp on Google Code
WebArchiver - 基于 wget 的网页归档工具(PyQt4 GUI 前端)
Linux 2.6.34 编译笔记
头像
xjpvictor
帖子: 2837
注册时间: 2007-08-22 15:55
系统: Archlinux
来自: 新加坡
联系:

Re: Linux-2.6.34 编译笔记

#2

帖子 xjpvictor » 2010-06-06 14:09

菜鸟,看不懂,纯顶。。
Entschuldigung. Ich habe keine ahnung.
Secure with PGP: gpg --recv-keys 0x68b6e3d8
Fingerprint: 5556 517C F52F E402 DDF5 5400 6D30 F13E 68B6 E3D8
Towards A Sustainable Earth: Print Only When Necessary
Bill Lee
帖子: 598
注册时间: 2009-09-19 20:50

Re: Linux-2.6.34 编译笔记

#3

帖子 Bill Lee » 2010-06-06 14:43

终于把内核模块编译好了。
接下来要安装内核了。
sudo make modules_install #先安装模块
sudo make firmware_install #再安装 firmware
sudo make headers_install #安装头文件
sudo make install #安装内核映像
接下来要生成 initramfs, 我不太了解,所以先 man mkinitramfs, 但 man 里说这个是 low-level 工具,用 update-initramfs 可以按系统预先配置进行。于是我就 man update-initramfs, 看了参数,就执行 sudo update-initramfs 2.6.34bill-1 生成 initramfs.
接下来就要从新内核引导了。还是先不写进 grub 吧。先用 kexec 试试能不能用。
对了,还要先把 3D 特效关了。 开源的 n 卡驱动还不支持 3D 加速。
aMule 2.3.1 is coming...
真正动态的 amule-dlp is coming...
本人帐号在2011年1月被盗,在2011年1月3日17:19到2010年1月6日13:34之间本帐号发的一切帖子、短信等与本人无关!
amule-dlp 开发动态
amule-dlp on Google Code
WebArchiver - 基于 wget 的网页归档工具(PyQt4 GUI 前端)
Linux 2.6.34 编译笔记
佛山无影脚
帖子: 73
注册时间: 2010-04-24 22:11

Re: Linux-2.6.34 编译笔记

#4

帖子 佛山无影脚 » 2010-06-06 14:54

你这样install了之后,会把原来的ubuntu的内核模块什么的覆盖么?
basncy
帖子: 321
注册时间: 2009-11-19 10:40

Re: Linux-2.6.34 编译笔记

#5

帖子 basncy » 2010-06-06 16:29

我要顶顶!!

回五楼,预留个4G空间吧,我以前编译过,失败。
有空了重新折腾
basncy
帖子: 321
注册时间: 2009-11-19 10:40

Re: Linux-2.6.34 编译笔记

#6

帖子 basncy » 2010-06-06 16:38

sudo make gconfig出现下面错误,我狂晕!

代码: 全选

cy@cy-laptop:~/src/linux-2.6.33.2$ sudo make gconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/basic/hash
*
* Unable to find the GTK+ installation. Please make sure that
* the GTK+ 2.0 development package is correctly installed...
* You need gtk+-2.0, glib-2.0 and libglade-2.0.
*
  HOSTCC  scripts/kconfig/conf.o
scripts/kconfig/conf.c: In function ‘conf_askvalue’:
scripts/kconfig/conf.c:105: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result
scripts/kconfig/conf.c: In function ‘conf_choice’:
scripts/kconfig/conf.c:307: warning: ignoring return value of ‘fgets’, declared with attribute warn_unused_result
make[1]: *** 没有规则可以创建“scripts/kconfig/gconf.o”需要的目标“scripts/kconfig/.tmp_gtkcheck”。 停止。
make: *** [gconfig] 错误 2
没有gtk2-dev的可以

代码: 全选

sudo apt-get install libgtk2.0-dev
Bill Lee
帖子: 598
注册时间: 2009-09-19 20:50

Re: Linux-2.6.34 编译笔记

#7

帖子 Bill Lee » 2010-06-06 17:04

佛山无影脚 写了:你这样install了之后,会把原来的ubuntu的内核模块什么的覆盖么?
当然不会,会新建一个目录
但是 firmware_install 就有问题,没有新建目录,最后还要手动 mv 一次,不过由于原来的有子目录,不会被覆盖。
aMule 2.3.1 is coming...
真正动态的 amule-dlp is coming...
本人帐号在2011年1月被盗,在2011年1月3日17:19到2010年1月6日13:34之间本帐号发的一切帖子、短信等与本人无关!
amule-dlp 开发动态
amule-dlp on Google Code
WebArchiver - 基于 wget 的网页归档工具(PyQt4 GUI 前端)
Linux 2.6.34 编译笔记
Bill Lee
帖子: 598
注册时间: 2009-09-19 20:50

Re: Linux-2.6.34 编译笔记

#8

帖子 Bill Lee » 2010-06-06 17:12

这次是在新内核下工作了。发现了一些问题:
1. 这个内核没有 X.org 开发的第三方 2D 驱动。重启后就出现“ Ubuntu 正在低分辨率模式下运行”。在 Recovery Mode 用 dkms 生成受限 nvidia 模块后此问题解决。
2. 受限 nvidia 驱动的 framebuffer 罢工。
3. 启动速度没有快,反而慢了。不知道为什么,日志里有一行

代码: 全选

Trying to unpack rootfs image as initramfs...
消耗超过了 0.3 秒的时间。这在发行版自带的内核中是没有的。
我是用 update-initramfs 生成的 initrd 呀。按理说应该解压后就是 initramfs, 而不该是 rootfs 再转换成 initramfs.
高手过来看看呀...
4. 我的电脑用双核 CPU, 配置成 2 个 SMP 支持,结果日志里说有 4 个 CPU, 超过了限制。
aMule 2.3.1 is coming...
真正动态的 amule-dlp is coming...
本人帐号在2011年1月被盗,在2011年1月3日17:19到2010年1月6日13:34之间本帐号发的一切帖子、短信等与本人无关!
amule-dlp 开发动态
amule-dlp on Google Code
WebArchiver - 基于 wget 的网页归档工具(PyQt4 GUI 前端)
Linux 2.6.34 编译笔记
Bill Lee
帖子: 598
注册时间: 2009-09-19 20:50

Re: Linux-2.6.34 编译笔记

#9

帖子 Bill Lee » 2010-06-06 17:13

pocoyo 写了:请教您编译后 那个src下的目录有多大?
430 MB
aMule 2.3.1 is coming...
真正动态的 amule-dlp is coming...
本人帐号在2011年1月被盗,在2011年1月3日17:19到2010年1月6日13:34之间本帐号发的一切帖子、短信等与本人无关!
amule-dlp 开发动态
amule-dlp on Google Code
WebArchiver - 基于 wget 的网页归档工具(PyQt4 GUI 前端)
Linux 2.6.34 编译笔记
头像
黄美姬
帖子: 8428
注册时间: 2009-10-08 11:15
来自: 大城市铁岭

Re: Linux-2.6.34 编译笔记

#10

帖子 黄美姬 » 2010-06-06 17:18

你好,按S或M,请选择,可以预见的未来,祝各位愉快 :em04 :em04

没人打补丁么?我打不上


启动速度没有快,反而慢了?

代码: 全选

官方ubuntu的内核有加速的,
软件包:
ureadahead
Read required files in advance

über-readahead is used during boot to read files in advance of when
they are needed such that they are already in the page cache,
improving boot performance.

Its data files are regenerated on the first boot after install, and
either monthly thereafter or when packages with init scripts or
configs are installed or updated.

ureadahead requires a kernel patch included in the Ubuntu kernel.

google翻译:

黚er - ReadAhead的是引导过程中使用提前阅读文件时 
他们需要这样,他们已经在页面缓存, 
改善启动性能。 

它的数据文件是再生后的第一次启动安装, 
无论此后每月或当包或init脚本 
configs安装或更新。 

ureadahead需要一个内核补丁包含在Ubuntu的内核。
提供更好的翻译建议
我们是命运的妓女,它把我们都嫖了

N卡驱动:http://www.nvidia.cn/Download/index.aspx?lang=cn
极品飞车:http://www.geforce.cn/optimize/optimal- ... ts-450-ops
孤岛危机优化设置:http://www.geforce.cn/optimize/optimal- ... tx-450-ops
:cp /etc/skel/.bashrc ~/
PS1="\[\e]2;\u@\H \w\a\e[32;1m\]\T$\[\e[0m\] "
http://cdimage.ubuntu.com/
http://releases.ubuntu.com/
头像
jmw778s
帖子: 994
注册时间: 2009-10-16 11:13
来自: 福安
联系:

Re: Linux-2.6.34 编译笔记

#11

帖子 jmw778s » 2010-06-06 18:19

很好,很有参考价值。 :em11
Acer 4738ZG-P22G50Mnkk 笔记本电脑
我用Windows 7 来这里装13的
Bill Lee
帖子: 598
注册时间: 2009-09-19 20:50

Re: Linux-2.6.34 编译笔记

#12

帖子 Bill Lee » 2010-06-07 16:16

重新编译了一次,这次加上了 VESA framebuffer 的支持, framebuffer 正常工作了。
这次还打上了 kernel tracing 的补丁( ureadahead 需要)。这个补丁我找了好久, google 竟然搜不出来,我在 launchpad 搜到一个 question 是关于这个的,结果回答说补丁就在 ureadahead 的源码包里。弄来直接 patch -p0 结果打不上。用 vim 打开一看原来这个 patch 还留留着 diff 的格式,不是标准的 patch 格式。下面的代码就是我修改后的标准 patch.
打上了这个补丁的内核启动速度果然有了长进。我在第一次启动前先删除了 /var/lib/ureadahead 下面的几个 pack, 以后重启时就快了。
在 splash 界面慢了 3 秒左右,但是在登录后进入桌面超快。进入桌面后打开常用程序也超快。
:em11
前面忘了说 dkms 怎么用,现在补充一下:
生成模块

代码: 全选

sudo dkms build -k 内核版本号 -m 模块名 -v 模块版本号
安装模块就是把 build 改成 install 就行了。
装完别忘了 update-initramfs

代码: 全选

Notice: this file is not exactly from launchpad. It has been modified by Bill Lee.
Modified by Bill Lee to adjust to the standard format of patch.
From ee9c0b591bf16ca11bb354bc68dae75a903f3a64 Mon Sep 17 00:00:00 2001
From: Scott James Remnant <scott@ubuntu.com>
Date: Tue, 27 Oct 2009 10:05:32 +0000
Subject: [PATCH] trace: add trace events for open(), exec() and uselib()

This patch uses TRACE_EVENT to add tracepoints for the open(),
exec() and uselib() syscalls so that ureadahead can cheaply trace
the boot sequence to determine what to read to speed up the next.

It's not upstream because it will need to be rebased onto the syscall
trace events whenever that gets merged, and is a stop-gap.

Signed-off-by: Scott James Remnant <scott@ubuntu.com>
---
 fs/exec.c                 |    8 +++++
 fs/open.c                 |    4 ++
 include/trace/events/fs.h |   71 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 83 insertions(+), 0 deletions(-)
 create mode 100644 include/trace/events/fs.h

index 172ceb6..c936999 100644
--- fs/exec.c
+++ fs/exec.c
@@ -56,6 +56,8 @@
 #include <linux/fsnotify.h>
 #include <linux/fs_struct.h>
 
+#include <trace/events/fs.h>
+
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
 #include <asm/tlb.h>
@@ -130,6 +132,10 @@ SYSCALL_DEFINE1(uselib, const char __user *, library)
 
 	fsnotify_open(file->f_path.dentry);
 
+	tmp = getname(library);
+	trace_uselib(tmp);
+	putname(library);
+
 	error = -ENOEXEC;
 	if(file->f_op) {
 		struct linux_binfmt * fmt;
@@ -665,6 +671,8 @@ struct file *open_exec(const char *name)
 
 	fsnotify_open(file->f_path.dentry);
 
+	trace_open_exec(name);
+
 	err = deny_write_access(file);
 	if (err)
 		goto exit;
index 04b9aad..41c87f3 100644
--- fs/open.c
+++ fs/open.c
@@ -31,6 +31,9 @@
 #include <linux/falloc.h>
 #include <linux/fs_struct.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/fs.h>
+
 int vfs_statfs(struct dentry *dentry, struct kstatfs *buf)
 {
 	int retval = -ENODEV;
@@ -1041,6 +1044,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, int mode)
 			} else {
 				fsnotify_open(f->f_path.dentry);
 				fd_install(fd, f);
+				trace_do_sys_open(tmp, flags, mode);
 			}
 		}
 		putname(tmp);
new file mode 100644
index 0000000..e967c55
--- /dev/null
+++ include/trace/events/fs.h
@@ -0,0 +1,71 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM fs
+
+#if !defined(_TRACE_FS_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_FS_H
+
+#include <linux/fs.h>
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(do_sys_open,
+
+	TP_PROTO(char *filename, int flags, int mode),
+
+	TP_ARGS(filename, flags, mode),
+
+	TP_STRUCT__entry(
+		__string(	filename, filename		)
+		__field(	int, flags			)
+		__field(	int, mode			)
+	),
+
+	TP_fast_assign(
+		__assign_str(filename, filename);
+		__entry->flags = flags;
+		__entry->mode = mode;
+	),
+
+	TP_printk("\"%s\" %x %o",
+		  __get_str(filename), __entry->flags, __entry->mode)
+);
+
+TRACE_EVENT(uselib,
+
+	TP_PROTO(char *filename),
+
+	TP_ARGS(filename),
+
+	TP_STRUCT__entry(
+		__string(	filename, filename		)
+	),
+
+	TP_fast_assign(
+		__assign_str(filename, filename);
+	),
+
+	TP_printk("\"%s\"",
+		  __get_str(filename))
+);
+
+TRACE_EVENT(open_exec,
+
+	TP_PROTO(char *filename),
+
+	TP_ARGS(filename),
+
+	TP_STRUCT__entry(
+		__string(	filename, filename		)
+	),
+
+	TP_fast_assign(
+		__assign_str(filename, filename);
+	),
+
+	TP_printk("\"%s\"",
+		  __get_str(filename))
+);
+
+#endif /* _TRACE_FS_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
-- 
1.6.3.3
aMule 2.3.1 is coming...
真正动态的 amule-dlp is coming...
本人帐号在2011年1月被盗,在2011年1月3日17:19到2010年1月6日13:34之间本帐号发的一切帖子、短信等与本人无关!
amule-dlp 开发动态
amule-dlp on Google Code
WebArchiver - 基于 wget 的网页归档工具(PyQt4 GUI 前端)
Linux 2.6.34 编译笔记
头像
rapistor
帖子: 1983
注册时间: 2009-01-19 15:09

Re: Linux-2.6.34 编译笔记

#13

帖子 rapistor » 2010-06-07 18:10

请问为什么我以前编译过一次内核,竟然有200多M,而且src有好几G大。听有人说,有个什么dbug不能打开,
是这么回事吗?
请指教一下。
坚守在linux的天堂!
Bill Lee
帖子: 598
注册时间: 2009-09-19 20:50

Re: Linux-2.6.34 编译笔记

#14

帖子 Bill Lee » 2010-06-07 20:20

内核中关于 debug 的选项一般不要改,除非你很清楚你在做什么
内核配置中的 debug 默认配置已经是很适合一般用户用了,那些 verbose debug 一般要开发者才会有用。
而如果把默认打开的 debug 选项关掉又会导致出了问题找不出原因。
debug 就是调试,内核配置中的 debug 一般是指调试日志,也就是 dmesg.
aMule 2.3.1 is coming...
真正动态的 amule-dlp is coming...
本人帐号在2011年1月被盗,在2011年1月3日17:19到2010年1月6日13:34之间本帐号发的一切帖子、短信等与本人无关!
amule-dlp 开发动态
amule-dlp on Google Code
WebArchiver - 基于 wget 的网页归档工具(PyQt4 GUI 前端)
Linux 2.6.34 编译笔记
头像
monk
帖子: 19507
注册时间: 2010-01-28 10:45

Re: Linux-2.6.34 编译笔记

#15

帖子 monk » 2010-06-07 21:32

收藏 蛋疼的时候拿来试试

*********宁静致远*********
如果我说的有什么不对,请看签名第一行
回复