| 查看: 2344 | 回复: 5 | ||
| 【奖励】 本帖被评价3次,作者yuanchu09增加金币 2.2 个 | ||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | ||
[资源]
【原创】精简Linux内核编译的简单方法
|
||
|
关于Linux内核的编译 采用先make defconfig、make menuconfig再make localmodconfig,并将后2者反复应用的过程。最后能达到比较简单的过程。基本上采取了做加法(将硬件驱动或模块依次加上,逐步改进)的思路。 简述如下: 1、下载源代码并建立编译工作目录和编译目标目录 简单点,按照源码中的README文件中所述完成: 编译工作目录:/usr/src/linux-2/6.34.1 编译目标目录:/home/abc/build/kernel 这里/home/abc即主文件夹 将下载的源码放到/usr/src下解压,则源码所在工作目录是/usr/src/linux-2.6.34.1 2、编译配置(重要工作) 可以有3种比较简单的方式对要编译进内核核心或模块的源代码进行配置。难易程度不一(需要投注的精力和时间不一样,编译生成的initrd.img-2.6.34.1、vmlinuz-2.6.34.1和System.map-2.6.34.1 这3个主要文件的大小也不一样)。采用何种方式也可以根据需要选择如下3种方式之一对内核进行编译前的配置。 目标:建立并得到“/home/abc/build/kernel”目录下的“.config”文件。 (1)最简单的方式: 将/boot下的配置文件拷贝过来使用,作为编译目标目录下的.config文件。这样对内核没有精简。 cp /boot/config-2.6.32-21-generic ~/build/kernel/.config 这样产生的initrd.img-2.6.34.1大概达到17M左右。不知Ubuntu采用这个配置文件怎样做到了将近8M。 (2)中等难度方式:在拷贝配置文件的基础上,使用make localmodconfig命令自动精简 从linux-2.6.32开始可以使用make localmodconfig自动精简内核了。命令如下: cp /boot/config-2.6.32-21-generic ~/build/kernel/.config sudo make O=/home/abc/build/kernel localmodconfig 一般说法:在运行第二条命令前,将系统的各种硬件都用一遍,以便你的系统中的模块均被调用了一次,使用“make localmodconfig”命令时,才能将你的系统将调用的模块包含进来。比方说:摄像头、U盘、光驱、SD卡等。 如果忘了,没关系,先将上述硬件依次用一遍,再运行第二条命令一次(呵呵,重新精简,不确定的话,就将上述2条命令重新执行一遍)。 哦,有点忘了,在第二条命令之前是否要先从.config文件中去掉一项,再使用make localmodconfig命令自动精简配置文件。如果在运行make localmodconfig命令后需要回答一些问题,而不是系统自动完成,那就按下Ctrl+c中断当前配置工作,再按照如下命令序列完成配置: (a)拷贝配置文件 cp /boot/config-2.6.32-21-generic ~/build/kernel/.config (b)去掉“Prompt for development and/or incomplete code/drivers”项 sudo make O=/home/abc/build/kernel menuconfig 进入图形界面后,选择倒数第二项(Load an Alternate Configuration File)回车,弹出窗口中提示输入欲调入的配置文件名。这里默认是~/build/kernel/.config文件,无须输入任何字符,按回车即可。 使用光标键上移到“Linux Kernel Configuration”窗口中的第一项(General Setup--->)”,按下回车,选择General setup窗口下第一项(Prompt for development and/or incomplete code/drivers),按下“N”字符键去掉这一项(将其前*去掉)。 用向右光标键选择 (c)使用“make localmodconfig”命令自动精简内核 sudo make O=/home/abc/build/kernel localmodconfig 因为添加了第二个步骤(b),这时应该没什么选择了。 使用这样配置产生的.config进行编译比配置方式(1)要精简许多,但是内核相关的3个文件还是较大。 (3)最难(相对繁复)方式: 先make defconfig、make menuconfig再make localmodconfig,并将后2者反复应用的过程。最后能达到比较简单的过程。 这个过程较繁,但可望得到较简的内核。很难达到最简(除非对自己系统的硬件情况非常熟悉,并勇于实践,我们购买机器后,相对长时间内不会更换或升级硬件,所以这样的花费时间精力还是值得的),只有更简。闲话少说,上命令: (a)建立默认的.config文件。 sudo make O=/home/abc/build/kernel defconfig 本命令在文件夹“/home/abc/build/kernel”下建立一个“.config”文件。 按照i386建立,据说是linus的配置。呵呵,还是需要对它进行增删的。以 config-2.6.32-21-generic为基础进行增删工作也可得到.config文件,但删的工作太多,容易删除不该删除的选项(再恢复就很难了,记不住也很难确定哪些该恢复)。以“make defconfig”命令建立的.config为基础增删就相对简单多了。 (b)去掉“Prompt for development and/or incomplete code/drivers”项 操作同2(2)(b)。 一般说法:在运行第二条命令前,将系统的各种硬件都用一遍,以便你的系统中的模块均被调用了一次,使用“make localmodconfig”命令时,才能将你的系统将调用的模块包含进来。比方说:摄像头、U盘、光驱、SD卡等。 如果忘了,没关系,先将上述硬件依次用一遍,再运行第二条命令一次(呵呵,重新精简,不确定的话,就将上述2条命令重新执行一遍)。 (c)使用“make localmodconfig”命令自动精简内核 sudo make O=/home/abc/build/kernel localmodconfig 一般说法:在运行第二条命令前,将系统的各种硬件都用一遍,以便你的系统中的模块均被调用了一次,使用“make localmodconfig”命令时,才能将你的系统将调用的模块包含进来。比方说:摄像头、U盘、光驱、SD卡等。 如果忘了,没关系,先将上述硬件依次用一遍,再运行第二条命令一次(呵呵,重新精简,不确定的话,就将上述2条命令重新执行一遍)。 (d)编辑“~/build/kernel/.config”文件,添加缺失模块 在上面(c)执行命令时,肯定会出现一些类似如下内容的信息: module lp did not have configs CONFIG_PRINTER module vgastate did not have configs CONFIG_VGASTATE 先将它们复制粘贴到文本文件中,呵呵,然后寻找“~/build/kernel/.config”文件中对应项,例如“CONFIG_VGASTATE”,可能“~/build/kernel/.config”文件中对应的信息为: # CONFIG_VGASTATE is not set 将它改为: CONFIG_VGASTATE=m 表示将这个模块包含进来。依次处理,如果找不到,没关系,先放在那儿。将上述信息中对应项都改完后保存,退出。 (e)再次运行“make localmodconfig”命令,将(d)步骤的修改带来的变化包含进内核 sudo make O=/home/abc/build/kernel localmodconfig 这时系统会有一些提问。别嫌麻烦,仔细回答(如果嫌麻烦,可以全部回答m,没“m”选项时,就回答“y”。毕竟无法一次就做到非常精简---没有最简)。 这正是本文的精彩之处,多次重用“gedit”和“make localmodconfig”命令,当然,还有后面再次使用的“make menuconfig”命令。 (f)将(e)步骤再次出现(d)中显示的未包含模块添加进来 如果(e)步骤中再次出现(d)中没有包含某些模块的选项,不要气馁。在编辑“~/build/kernel/.config”文件时,将相应项改为“=y”而不是“=m”。然后回到步骤(e),直到在没有模块没有包含进来的信息,或者你已经无法再减少这些信息。 我这样做到最后,还是有如下信息: ricoh_mmc config not found!! (g)使用“make menuconfig”命令对上面得到的“~/build/kernel/.config”文件中的选项进行增删 使用现在的.config文件进行编译,无法得到可正常运行的内核。需要注意的问题如下: (I)Device Drivers->Generic Driver Options--->下的2项必须选择为“y”: Matain a devtmpfs filesystem to mount at /dev Automount devtmpfs at /dev, after the kernel mounted the rootfs 否则,出现“Can not mount /dev”的错误。 (II)File systems->FUSE (Filesystem in Userspace) support必须选择为“y”,否则,无法读取光驱和Windows下的分区和盘。点击Windows下的盘符时,出现如下提示信息: FATAL: Module fuse not found. fuse: device not found, try 'modprobe fuse' first (III)某些经验文档可能说了如下选项应该去掉,千万不要相信 Enable the block layer->support for large (2TB+) block devices and files (一定要选y,否则无法读入启动文件) 这反映了“尽信书不如无书”这句话的正确性。如果不信,实践可检验。如果此时到步骤3开始编译,得到的内核文件已经能够运行。如果还存在问题,就需要到步骤6了解有关你的机器硬件的相关信息后,再使用“make menuconfig”命令对.config文件进行增删修改,再编译安装内核。 我的机器这样处理之后,还无法使用摄像头、访问SD卡。除此之外,如访问键盘鼠标的使用、网络、声音、显示器、U盘、Windows下的盘的访问等操作已经没有问题。 3、编译内核 编译内核非常简单: sudo make O=/home/abc/build/kernel 如果是双核,想要加快编译速度,还可做相关设置。 4、安装内核 sudo make O=/home/abc/build/kernel modules_install install 这个操作将编译的内核安装到/boot下。在Ubuntu 10.04下,会在/boot目录下产生如下文件: config-2.6.34.1 System.map-2.6.34.1 vmlinuz-2.6.34.1 还会在/lib/modules目录下产生一个新的目录“2.6.34.1”以及其下的若干子文件夹和文件。 但是,没有启动内核还需要的一个文件: initrd.img-2.6.34.1 “initrd.img-2.6.34.1”文件通过“mkinitramfs”命令产生: sudo mkinitramfs -o /boot/initrd.img-2.6.34.1 /lib/modules/ 2.6.34.1 5、修改/boot/grub/grub.cfg文件,以便启动编译好的新内核 此时你一定急于检验编译好的内核是否能够正常启动和工作,且慢,先修改启动项: sudo gedit /boot/grub/grub.cfg 将“### BEGIN /etc/grub.d/10_linux ###”下的如下信息复制并粘贴一份,然后将粘贴信息中的“2.6.32-21-generic”全部改为“2.6.34.1”即可(不要不好意思,复制粘贴就足够了)。 menuentry 'Ubuntu, with Linux 2.6.32-21-generic' --class ubuntu --class gnu-linux --class gnu --class os { recordfail insmod ext2 set root='(hd0,7)' search --no-floppy --fs-uuid --set 4b836918-3471-4fa7-85f6-79bee5970506 linux /boot/vmlinuz-2.6.32-21-generic root=UUID=4b836918-3471-4fa7-85f6-79bee5970506 ro quiet splash initrd /boot/initrd.img-2.6.32-21-generic } 重启机器,回车,用你刚才编译好的内核启动机器了。如果还有问题,你需要看步骤6、7。 6、硬件信息的搜集 如果想充分调动硬件并将内核精简到自己比较满意的程度,还是有必要了解自己机器的硬件信息的。 用于了解硬件信息的命令: lshw 显示你的硬件以及所需的模块 dmidecode 查看硬件信息,包括bios、cpu、内存等信息 dmesg 查看硬件信息 lspci -v lspci (比cat /proc/pci更直观) /proc文件夹下的若干文件: cat /proc/cpuinfo 查看CPU信息 cat /proc/meminfo 查看内存信息 cat /proc/bus/input/devices 查看键盘和鼠标 cat /proc/pci 查看板卡信息 cat /proc/bus/usb/devices 查看USB设备 cat /proc/interrupts 查看各设备的中断请求(IRQ) uname -a 查看系统体系结构 例子: lspci |grep Ethernet 查看网卡型号 dmesg | more dmidecode | grep -i 'serial number' dmidecode -t processor 7、再次精简内核 按照某些经验文档,对 linux-2.6.34.1.tar.bz2 内核源文件还可如下配置,可能将来的版本应该做一些变化。 (1')General setup->kernel compression mode改为bzip2 (2')如果是笔记本,将General setup->kernel log buffer size改为15 (3')去掉General setup->Control group support (按下n) (4')去掉Processor type and features->Enable MPS table (5')去掉Processor type and features->Support for extended (non-pc) x86 platforms (6')将Processor type and features->Processor family改为自己的处理器类型(双核均可选择core 2/newer xeon) (7')如果做了(6')的操作,那么去掉Processor type and features->Generic x86 support (8')将Processor type and features->Maximum number of CPUs改为4(双核改为4,单核改为2) (9')去掉Processor type and features->SMT (Hyperthreading) scheduler support (10')如果是笔记本,将Processor type and features->Preemption model改为“Preemptible kernel (Low-Latency Desktop)” (11')去掉Processor type and features->AMD MCE features (12')去掉Processor type and features->Enable x86 board specific fixups for reboot (13')去掉Processor type and features->/dev/cpu/microcode-microcode support (14')如果内存是2G,将Processor type and features->High Memory support改为4G (15')只要是家用,将Processor type and features->Timer frequency改为1000HZ (16')将Power management and ACPI options->CPU Frequency scaling->选项下: 如果是笔记本,将Default CPUfreq governor改为conservative 将“powersave” governor、“userspace” governor for userspace frequency scaling、“ondemand” cpufreq policy governor这3项均选上。 如果是Intel的CPU,将有关AMD和VIA的选项全删除。 (17')去掉Networking support->Networking options->The Ipv6 protocol 现在上网都使用IP v4,IP v6尚处于实验阶段或在某些校园网内使用。 (18')去掉Networking support->Networking options->Asynchronous Transfer mode (ATM) (19')去掉Networking support->Amateur Radio support (20')去掉Networking support->IrDA (infrared) subsystem support (21')去掉Networking support->Bluetooth subsystem support (22')选上File systems->The extended 4 (ext4) filesystem (23')去掉File systems->Dnotify support (24')去掉File systems-> DOS/FAT/NT Filesystems-->MSDOS fs support (25')去掉File systems-> DOS/FAT/NT Filesystems-->Default iocharset for FAT改为“CP936” (26')选上File systems-> DOS/FAT/NT Filesystems->NTFS file system support (27')选上File systems-> DOS/FAT/NT Filesystems->NTFS write support (28')去掉File systems->Miscellaneous filesystems--> (29')去掉File systems->Network filesystems--> (30')选上File systems->Native language support-->Simplified Chinese charset (CP936, GB2312) (31')选上File systems->Native language support-->Traditional Chinese charset (Big5) 下面重点谈Device Drivers--->下的选择(直接驱动硬件的相关选项,步骤7搜集的信息用到这里) 这部分根据自己的硬件,可以大刀阔斧地去掉很多,在一个大的选项下,与自己的机器对应的通常只有一、两个。 (1')去掉SCSI device support--->SCSI tape support (2')去掉Multiple devices driver support (RAID and LVM)---> (3')去掉ISDN support---> (4')去掉Telephone support---> (5')去掉Auxiliary Display support---> (6')去掉X86 Platform Specifis Device Drivers---> 其它,只能根据自己的机器选择了。例如: 我的网卡是千兆网卡和无线网卡,只选这两样足够了: Network device support--->Ethernet (1000 Mbit)--->Broadcom Tigon3 support Network device support--->Intel Wireless Wifi---> Network device support--->Intel Pro/Wireless 3945ABG/BG Network connection (iwl3945) |
» 猜你喜欢
2025冷门绝学什么时候出结果
已经有5人回复
Bioresource Technology期刊,第一次返修的时候被退回好几次了
已经有7人回复
真诚求助:手里的省社科项目结项要求主持人一篇中文核心,有什么渠道能发核心吗
已经有8人回复
寻求一种能扛住强氧化性腐蚀性的容器密封件
已经有5人回复
请问哪里可以有青B申请的本子可以借鉴一下。
已经有4人回复
孩子确诊有中度注意力缺陷
已经有14人回复
请问下大家为什么这个铃木偶联几乎不反应呢
已经有5人回复
请问有评职称,把科研教学业绩算分排序的高校吗
已经有5人回复
天津工业大学郑柳春团队欢迎化学化工、高分子化学或有机合成方向的博士生和硕士生加入
已经有4人回复
康复大学泰山学者周祺惠团队招收博士研究生
已经有6人回复
» 本主题相关价值贴推荐,对您同样有帮助:
6楼2017-04-10 14:06:39
3楼2013-02-04 21:37:06
5楼2017-04-10 14:05:46













回复此楼