文档库 最新最全的文档下载
当前位置:文档库 › Linux内核升级全过程 手把手教你一次成功

Linux内核升级全过程 手把手教你一次成功

Linux内核升级全过程 手把手教你一次成功
Linux内核升级全过程 手把手教你一次成功

Linux内核升级全过程手把手教你一次成功

由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。没想到这一弄就花了两天时间(反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。

网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多文章在转载过程中命令行都有错误。刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。

现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享~~!

首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。接下来,让我们一起开始精彩的Linux内核升级之旅吧!

一、准备工作

启动Linux系统,并用根用户登录,进入终端模式下。

1、查看Linux内核版本

#uname-a

如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是2.4.x,那恭喜你,闯关通过,赶快进行下一步。

2、下载2.6内核源码

下载地址:https://www.wendangku.net/doc/9719056110.html,/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2

3、下载内核升级工具

(1)下载module-init-tools-3.2.tar.bz2

https://www.wendangku.net/doc/9719056110.html,/pub/linux/utils/kernel/module-init-tools/module-init-tool s-3.2.tar.bz2

(2)下载mkinitrd-4.1.18-2.i386.rpm

https://www.wendangku.net/doc/9719056110.html,/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.r pm

(3)下载lvm2-2.00.25-1.01.i386.rpm

https://www.wendangku.net/doc/9719056110.html,/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.r pm

(4)下载device-mapper-1.00.19-2.i386.rpm

https://www.wendangku.net/doc/9719056110.html,/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2. i386.rpm

(2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到https://www.wendangku.net/doc/9719056110.html,/guestbook留下你的邮箱,我给你发过去)

二、配置工作

好啦,2.6内核和4个升级工具都下载完了(少一个也不行,如果没有下载齐全,请不要尝试下面的步骤,升级是不会成功的),下面回到Linux系统中开始配置工作吧。

4、将下载好的内核和4个升级工具都拷贝到/usr/src文件夹下。怎么拷贝就不用我教了吧~~~~不会拷贝的去撞墙吧!~~呵呵!

5、拷贝完毕,开始解压新内核,具体操作请依次执行以下命令:

#cd/usr/src(进入到/usr/src目录下,如果已经在/usr/src目录下,可不执行该命令)

#rm–rf linux(删除linux文件夹。值得一提的是,如果内核先前从未编译过,则没有这个文件夹,此命令行可略过)

#tar jvxf linux-2.6.18.tar.bz2(解压新内核)

#ln-s linux-2.6.18linux(重新生成linux文件夹)

6、安装module-init-tools工具包

在/usr/src目录下,依次执行下列命令:

#tar jvxf module-init-tools-3.2.tar.bz2(解压module-init-tools)

#cd module-init-tools-3.2(由/usr/src目录进入module-init-tools目录下)

#./configure--prefix=/

#make moveold

#make all install

#./generate-modprobe.conf/etc/modprobe.conf

7、安装另外三个升级工具

回到/usr/src目录下,依次执行下列3个命令来安装另外三个升级工具:

#rpm-ivh--nodeps mkinitrd-4.1.18-2.i386.rpm(注意,这里一定要加入--nodeps参数,下同)

#rpm-ivh--nodeps lvm2-2.00.25-1.01.i386.rpm

#rpm-ivh--nodeps device-mapper-1.00.19-2.i386.rpm

如果不更新以上几个升级包,在后面编译内核时会提示以下错误:

mkinitrd failed

make[1]:***[install]Error1

make:***[install]Error2

8、配置内核选项。有点繁琐,~~希望一次成功哦~~。

#cd linux-2.6.18(进入到/usr/src/linux-2.6.18目录下)

#make mrproper(该命令可确保源代码目录下没有不正确的.o文件)

#make menuconfig(配置内核各选项)

此时会出现一个图形界面,列出了所有的内核配置选项,有的选项下还有子选项,你可以用方向键来选择,用Y键来确定。经过我多次试验,大多数选项默认就行,以下几个选项必须选择(请认真核对下面每一个选项,否则编译很有可能前功尽弃):

(1)Loadable Module support选项中,一定要选上“Module unloading”和“Automatic kernel module loading”这两项;

(2)Device Drivers--->Block Devices中一定要选上Loopback device support;Device Drivers--->Multi-device support(RAID and LVM)”处要选上“device mapper support”;

Device Drivers--->Graphics support”,一定要选上”Support for frame buffer devices”;

Device Drivers--->;USB support--->选上”USB Mass Storage support”(如果是在实环境中,想要更多USB支持,就全选吧。我的是在虚拟机中,用不着了)

Device Drivers--->;Network device support--->;Ethernet(10or100Mbit)--->; <*>;AMD PCnet32PCI support

(3)File system--->(以下9个选项是关于ext2和ext3文件系统配置,全部选上)Second extended fs support

Ext2extended attributes

Ext2POSIX Access Control Lists

Ext2Security Labels

Ext3journalling file system support

Ext3extended attributes

Ext3POSIX Access Control Lists

Ext3Security Labels

JBB(ext3)debugging support

File system--->DOS/FAT/NT Filesystems--->选上“NTFS file system support”;File Systems-->Miscellaneous filesystems---><*>Compressed ROM file system support(cramfs)

注意:

ext2和ext3文件系统配置很重要,也是必需的,如果对Ext3、Ext2文件的支持直接编译进内核,在你reboot时机器就会当掉,出现如下错误信息:

kernel panic:no init found,try passing init=option to kernel.....

或者是:

VFS:Cannot open root device"hdxy"or unknow-block(0,0)

Please append a correct"root="boot option

kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)

或者是:

mount:error19mounting ext3

pivotroot:pivot_root(/sysroot,/sysroot/initrd)failed:2

umount/initrd/proc fail:2

Freeing unused kernel memory:244k freed

Kernel panic–not syncing:No init found.Try passing init=option to kernel (我的机器就是在重启之后出现第三种错误,进不去系统,郁闷死,只好重装了~~~)(4)如果你在vmware下重新编译内核,硬盘用的是scsi的,以下选项必选:Device Drivers--->SCSI device support---><*>SCSI disk support

Device Drivers--->SCSI device support--->SCSI low-level drivers--->;<*>;BusLogic SCSI support

三、编译工作

OK,繁杂的配置工作完成了,至此,编译前的准备工作都做好了!

9、开始编译啦……:

在/usr/src/linux-2.6.18目录下,执行以下命令即可编译。编译需要一段时间,给自己倒杯茶耐心等候吧!

#make dep(建立编译时所需的从属文件。注意:如果内核从未编译过,此步可跳过)#make clean(清除内核编译的目标文件)

#make bzImage(注意大小写。这一步才真正编译内核)

内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译,所以我直接用make bzImage来编译。

#make modules(编译可加载模块)

#make modules_install(安装可加载模块)

安装成功后,系统会在/lib/modules目录下生成一个2.6.18子目录,里面存放着新内核的所有可加载模块。

#make install(安装新内核)

注意:make install的时候可能会出现如下错误信息:

No module BusLogic found for kernel 2.4.12

mkinitrd failed

此问题一般只出现在SCSI硬盘+VMWARE+REDHAT架构中,因为BusLogic被编译进了内核而不是一个module的形式(2.4内核的Buslogic模块即使静态编译进内核也不行)。解决方式是直接将可以BusLogic.o文件复制过去:

#cp/usr/src/linux-2.6.18/drivers/scsi/BusLogic.o /lib/modules/2.6.18/kernel/drivers/scsi

不过别忘记,复制过后再执行一下make install。

(如果make menuconfig时,把BusLogic模块选成M--Module模式--就不会出现这个提示。)

四、启动新内核

10、将新内核和System.map文件拷贝到/boot目录下,依次执行以下命令:

#cp/usr/src/linux-2.6.18/arch/i386/boot/bzImage/boot/vmlinuz-2.6.18

#cp/usr/src/linux-2.6.18/System.map/boot/System.map-2.6.18

#cd/boot(进入boot目录)

#rm–rf System.map(删除原来的连接)

#ln-s System.map-2.6.18System.map(重新建立连接)

11、修改Grub启动管理器

如果没有错误的话,下面开始修改grub配置文件(不要告诉我你用的lilo)

在/boot目录下,执行以下命令:

#new-kernel-pkg--mkinitrd--depmod--install2.6.18(这时候你的/boot下生成一个initrd-2.4.12.img,并且你的grub.conf也作了相应更改)

#df(查看根目录在那个分区,下一步要用到。注意,这里根分区不时boot的那个50M的分区,而一般是你最大的那个分区,也就是”/”,千万不要搞错哦。我的为/dev/hda2)

#vi/grub/grub.conf

进入grub.conf文件,找到如下信息:

default=1

timeout=10

splashimage=(hd0,0)/grub/splash.xpm.gz

title Red Hat Linux(2.6.18)

root(hd0,0)

kernel/vmlinuz-2.6.18ro root=LABEL=/

initrd/initrd-2.6.18.img

做两处修改:

(1)将default=1改为default=0(不改的话,重启之后默认进入2.4内核)

(2)将kernel行的“LABEL=/”换成根目录所在的分区(上一步查看的就是)

此步很重要,修改错误将会可能导致进不去系统,我把我修改后的grub.conf文件列出来,不明之处,可以对照修改:

default=0

timeout=10

splashimage=(hd0,0)/grub/splash.xpm.gz

title Red Hat Linux(2.6.18)

root(hd0,0)

kernel/vmlinuz-2.6.18ro root=/dev/hda2

initrd/initrd-2.6.18.img

title Red Hat Linux(2.4.20-8)

root(hd0,0)

kernel/vmlinuz-2.4.20-8ro root=LABEL=/

initrd/initrd-2.4.20-8.img

12,OK,大功告成!赶快重启,看看升级后的2.6内核吧~~~~

(如升级过程中遇到不明问题,或是探讨内核升级话题,请到https://www.wendangku.net/doc/9719056110.html,/guestbook留言)

本文为飘扬原创,首发飞飞博客,请尊重版权,转载请保留本行说明

linux内核升级图文攻略

linux内核升级图文攻略 一、Linux内核概览Linux是一个一体化内核(monolithic kernel)系统。设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。1. linux内核linux 操作系统是一个用来和硬件打交道并为用户程序提供一个 有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:. 进程管理(process management) . 定时器(timer). 中断管理(interrupt management). 内存管理(memory management). 模块管理(module management). 虚拟文件系统接口(VFS layer). 文件系统(file system). 设备驱动程序(device driver). 进程间通信(inter-process communication). 网络管理(network management. 系统启动(system init)等操作系统功能的实现。2. linux内核版本号Linux内核使用三种不同的版本编号方式。. 第一种方

式用于1.0版本之前(包括1.0)。第一个版本是0.01,紧接着是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之后的1.0。. 第二种方式用于1.0之后到2.6,数字由三部分“A.B.C”,A代表主版本号,B代表次主版本号,C代表较小的末版本号。只有在内核发生很大变化时(历史上只发生过两次,1994年的1.0,1996年的2.0),A才变化。可以通过数字B来判断Linux是否稳定,偶数的B代表稳定版,奇数的B代表开发版。C代表一些bug修复,安全更新,新特性和驱动的次数。以版本2.4.0为例,2代表主版本号,4代表次版本号,0代表改动较小的末版本号。在版本号中,序号的第二位为偶数的版本表明这是一个可以使用的稳定版本,如2.2.5; 而序号的第二位为奇数的版本一般有一些新的东西加入,是个不一定很稳定的测试版本,如2.3.1。这样稳定版本来源于上一个测试版升级版本号,而一个稳定版本发展到完全成熟后就不再发展。. 第三种方式从2004年2.6.0版本开始,使用一种“time-based”的方式。 3.0版本之前,是一种“A.B.C.D”的格式。七年里,前两个数字A.B即“2.6”保持不变,C随着新版本的发布而增加,D代表一些bug修复,安全更新,添加新特性和驱动的次数。3.0版本之后是“A.B.C”格式,B随着新版本的发布而增加,C代表一些bug修复,安全更新,新特性和驱动的次数。第三种方式中不使用偶数代表稳定版,奇数代表开发版这样的命名

linux启动过程

Linux系统启动过程分析 by 王斌斌 binbinwang118@https://www.wendangku.net/doc/9719056110.html, Linux系统启动过程分析 操作系统的启动过程,实际上是控制权移交的过程。Linux 系统启动包含四个主要的阶段:BIOS initialization, boot loader, kernel initialization, and init startup.见下图: 阶段一、BIOS initialization,主要功能如下: 1.Peripherals detected 2.Boot device selected 3.First sector of boot device read and executed 系统上电开机后,主板BIOS(Basic Input / Output System)运行POST(Power on self test)代码,检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS( Complementary Metal Oxide Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后,信息不会丢失。 执行POST代码对系统外围关键设备检测通过后,系统启动自举程序,根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择合适的启动器,比如通常情况下的硬盘设备,BIOS会读取硬盘设备的第一个扇区(MBR,512字节),并执行其中的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。 注:在我们的现行系统中,大多关键设备都是连在主板上的。因此主板BIOS提供了一个操作系统(软件)和系统外围关键设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否准备好,以供操作系 “” 统使用。 阶段二、Boot Loader 关于Boot Loader,简单的说就是启动操作系统的程序,如grub,lilo,也可以将boot loader本身看成一个小系统。 The BIOS invokes the boot loader in one of two ways: 1.It pass control to an initial program loader (IPL) installed within a driver's Master Boot Record (MBR) 2.It passes control to another boot loader, which passes control to an IPL installed within a partition's boot sector. In either case, the IPL must exist within a very small space, no larger than 446 bytes. Therefore, the IPL for GRUB is merely a first stage, whose sole task is to locate and load a second stage boot loader, which does most of the work to boot the system. There are two possible ways to configure boot loaders: Primary boot loader: Install the first stage of your Linux boot loader into the MBR. The boot loader must be configure to pass control to any other desired operating systems. Secondary boot loader: Install the first stage of your Linux boot loader into the boot sector of some partition. Another boot loader must be installed into the MBR, and configured to pass control to your Linux boot loader. 假设Boot Loader 为grub (grub-0.97),其引导系统的过程如下: grub 分为stage1 (stage1_5) stage2两个阶段。stage1 可以看成是initial program loaderI(IPL),而stage2则实现了grub 的主要功能,包括对特定文件系统的支持(如ext2,ext3,reiserfs等),grub自己的shell,以及内部程序(如:kernrl,initrd,root )等。

Linux kernel内核升级全过程,教你一次成功

序言 由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。没想到这一弄就花了两天时间( 反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。 网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多 文章在转载过程中命令行都有错误。刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。 现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统 ,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享 ~~! 一、准备工作 首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。 启动Linux系统,并用根用户登录,进入终端模式下。 1、查看Linux内核版本 # uname -a 如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是 2.4.x,那恭喜你,闯关通过,赶快进行下一步。 2、下载2.6内核源码 下载地址:https://www.wendangku.net/doc/9719056110.html,/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 3、下载内核升级工具 (1)下载module-init-tools-3.2.tar.bz2 https://www.wendangku.net/doc/9719056110.html,/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2 (2)下载mkinitrd-4.1.18-2.i386.rpm https://www.wendangku.net/doc/9719056110.html,/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm (3)下载lvm2-2.00.25-1.01.i386.rpm https://www.wendangku.net/doc/9719056110.html,/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm (4)下载device-mapper-1.00.19-2.i386.rpm https://www.wendangku.net/doc/9719056110.html,/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm (2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到https://www.wendangku.net/doc/9719056110.html,/guestbook留下你的邮箱,我给你发过去)

linux内核启动 Android系统启动过程详解

linux内核启动+Android系统启动过程详解 第一部分:汇编部分 Linux启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ head.S分析这段代码是linux boot后执行的第一个程序,完成的主要工作是解压内核,然后跳转到相关执行地址。这部分代码在做驱动开发时不需要改动,但分析其执行流程对是理解android的第一步 开头有一段宏定义这是gnu arm汇编的宏定义。关于GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查询相关GUN汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必须要立即运行的。所谓重定位,比如当编译时某个文件用到外部符号是用动态链接库的方式,那么该文件生成的目标文件将包含重定位信息,在加载时需要重定位该符号,否则执行时将因找不到地址而出错 #ifdef DEBUG//开始是调试用,主要是一些打印输出函数,不用关心 #if defined(CONFIG_DEBUG_ICEDCC)

……具体代码略 #endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr 这个段的段名是 .start,#alloc表示Section contains allocated data, #execinstr表示Section contains executable instructions. 生成最终映像时,这段代码会放在最开头 .align start: .type start,#function /*.type指定start这个符号是函数类型*/ .rept 8 mov r0, r0 //将此命令重复8次,相当于nop,这里是为中断向量保存空间 .endr b 1f .word 0x016f2818 @ Magic numbers to help the loader

ubuntu12.04 升级内核实战

ubuntu12.04 升级内核实战 ubuntu 12.04内核是linux 3.2.0-24,其实升级到最新版本3.3.4也没什么很大意义,主要是集成了一些新的驱动和一些普通用户用不到的功能,所以基本上本文纯属折腾,但不要随便升级当班设备啊!好了,不废话了,我们开始........... 首先是准备条件: ①、有一台装有ubuntu 12.04的机器 ②、先移步到https://www.wendangku.net/doc/9719056110.html,/下载linux稳定版内核 ③、拥有root权限 ④、并将下载好的内核解压到/usr/src下,使用命令如下: #tar jxvf linux-3.3.4.tar.bz2 这样你就可以得到一个名叫linux-3.3.4 好,现在一切都准备好了,接下来就开始配置,编译,安装新内核吧!1,进入刚才的文件夹/usr/src/linux-3.3.4,输入命令:$ make mrproper 该命令的功能在于清除当前目录下残留的.config和.o文件,这些文件一般是以前编译时未清理而残留的。而对于第一次编译的代码来说,不存在这些残留文件,所以可以略过此步,但是如果该源代码以前被编译过,那么强烈建议执行此命令,否则后面可能会出现未知的问题。2,配置编译选项 作为操作系统的内核,其内容和功能必然非常繁杂,包括处理器调

度,内存管理,文件系统管理,进程通讯以及设备管理等等,而对于不同的硬件,其配置选项也不相同,所以在编译源代码之前必须设置编译选项。其实我觉得这一步是升级内核整个过程中最有技术含量的,因为要根据自己的需要正确选择yes or no需要对计算机方方面面的知识都有所了解。但是这里的选项实在是太多了,大概有几百项之多,我以前曾尝试着一项一项的选,但是最后还是放弃了,因为有很多选项不是很明白。 既然这样,难道没有什么简便的方法么?当然有!那就是make menuconfig 或者make xconfig。我使用的是make menuconfig,但是前提条件是要装ncurses。 ncurses 到https://www.wendangku.net/doc/9719056110.html,/pub/gnu/ncurses/下载,可以放到任何目录进行安装: tar zxvf ncurses.tar.gz #解压缩并且释放文件包 cd ncurses #进入解压缩的目录(注意版本) ./configure #按照你的系统环境制作安装配置文件 make #编译源代码并且编译NCURSES库 su root #切换到root用户环境 make install #安装编译好的NCURSES库 另外,在make menuconfig过程中也会有一些选项需要你来设置

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转) linux是如何组成的? 答:linux是由用户空间和内核空间组成的 为什么要划分用户空间和内核空间? 答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的 安全性,比如X86可以有4种模式RING0~RING3 RING0特权模式给LINUX内核空间RING3给用户空间 linux内核是如何组成的? 答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、 VFS(Virtual File Systerm)虚拟文件系统、NS(Network Stack)网络协议栈、DD(Device Drivers)设备驱动 linux 内核源代码 linux内核源代码是如何组成或目录结构? 答:arc目录存放一些与CPU体系结构相关的代码其中第个CPU子目录以分解boot,mm,kerner等子目录 block目录部分块设备驱动代码 crypto目录加密、压缩、CRC校验算法 documentation 内核文档 drivers 设备驱动 fs 存放各种文件系统的实现代码 include 内核所需要的头文件。与平台无关的头文件入在include/linux子目录下,与平台相关的头文件则放在相应的子目录中 init 内核初始化代码 ipc 进程间通信的实现代码 kernel Linux大多数关键的核心功能者是在这个目录实现(程序调度,进程控制,模块化) lib 库文件代码 mm 与平台无关的内存管理,与平台相关的放在相应的arch/CPU目录net 各种网络协议的实现代码,注意而不是驱动 samples 内核编程的范例 scripts 配置内核的脚本 security SElinux的模块 sound 音频设备的驱动程序 usr cpip命令实现程序 virt 内核虚拟机 内核配置与编译 一、清除 make clean 删除编译文件但保留配置文件

redhat5.8升级内核版本培训资料

r e d h a t5.8升级内核 版本

一、升级背景 前段时间公司有个项目用到了短信收发的业务,采购了两台16口的Wavecom USB短信猫设备,服务器操作系统是ReadHat5.4,内核2.6.18,插上设备后,操作系统无法自动识别该设备,原因是没有预装该设备USB转串口的驱动程序,可能是只有这个产品不能识别,因为曾经我用过单口的GSM MODEM短信猫测试,可以自动识别出来。后来从供应商处得到信息,说是他们这个产品比较新,版本低的内核没有预装新的USB转串口驱动程序,但现在2.6.32以上内核都自带了USB转串口的驱动,所以最后通过升级系统内核的方式解决了这个问题。 二、升级测试环境 宿主机:Window xp 虚拟机:VM8.0.2 OS:CentOS 5.8 Final 内核(升级前):2.6.18 所有操作步聚使用root权限 三、升级步聚 1、下载内核 到https://www.wendangku.net/doc/9719056110.html,下载一个新版本内核源码,当前最新稳定版为3.3.4。这里下载的是: https://www.wendangku.net/doc/9719056110.html,/pub/linux/kernel/v2.6/longterm/v2.6.35/linux-2.6.35.13.tar.bz2

2、解压内核文件 将linux-2.6.35.13.tar.bz2上传到/usr/local/src目录下,使用tar -jxvf linux-2.6.35.13.tar.bz2命令解压,得到linux-2.6.35.13目录 3、清除文件 cd linux-2.6.35.13(下面所有操作都是在此目录,除非切换了新的目录) make distclean 清除以前编译内核生成的所有文件(除了清除可执行文件和目标文件外,configure所产生的Makefile也会清除掉) 如果是第一次编译,这步聚可以省略 4、复制配置文件 将系统默认的内核配置文件复制到linux-2.6.35.13目录下,并命名.config cp /boot/config-2.6.18-308.el5 .config 5、内核配置(make menuconfig) 内核配置,有三种方式: a)、make config:基于文本的最为传统的配置界面,不推荐使用 b)、make menuconfig:基于文本选单的配置界面,字符终端下推荐使用。 注意:使用make menuconfig 需要安装ncurses(yum -y install ncurses-devel),如果未安装会报如下错误:

linux grub 引导启动过程详解

linux grub 引导启动过程详解 2008-01-08 17:18 这几天看了很多文档,算是对linux的启动过程有了比较细致的了解. 网上有很多文章谈到这方面的内容,但总觉得没有一篇完全的解析linux启动的 细节,下面是我小弟在学习的过程中总结出来的一些东东.这个是完整的linux启动过程, 不涉及内核,但是我觉得比较详细哦. (由于本人比较懒,这一段是从网上抄的) 机器加电启动后,BIOS开始检测系统参数,如内存的大小,日期和时间,磁盘 设备以及这些磁盘设备用来引导的顺序,通常情况下,BIOS都是被配置成首先检查 软驱或者光驱(或两者都检查),然后再尝试从硬盘引导。如果在这些可移动的设 备中,没有找到可引导的介质,那么BIOS通常是转向第一块硬盘最初的几个扇区, 寻找用于装载操作系统的指令。装载操作系统的这个程序就是boot loader. linux里面的boot loader通常是lilo或者grub,从Red Hat Linux 7.2起,GRUB( GRand Unified Bootloader)取代LILO成为了默认的启动装载程序。那么启动的时候grub是如何被载入的呢 grub有几个重要的文件,stage1,stage2,有的时候需要stage1.5.这些文件一般都 在/boot/grub文件夹下面.grub被载入通常包括以下几个步骤: 1. 装载基本的引导装载程序(stage1),stage1很小,网上说是512字节,但是在我的系统上用du -b /boot/grub/stage1 显示的是1024个字节,不知道是不是grub版本不同的缘故还是我理解有误.stage1通常位于主引导扇区里面,对于硬盘就是MBR了,stage1的主要功能就是装载第二引导程序(stage2).这主要是归结于在主引导扇区中没有足够的空间用于其他东西了,我用的是grub 0.93,stage2文件的大小是107520 bit. 2. 装载第二引导装载程序(stage2),这第二引导装载程序实际上是引出更高级的功能, 以允许用户装载入一个特定的操作系统。在GRUB中,这步是让用户显示一个菜单或是输入命令。由于stage2很大,所以它一般位于文件系统之中(通常是boot所在的根 分区). 上面还提到了stage1.5这个文件,它的作用是什么呢你到/boot/grub目录下看看, fat_stage_1.5 e2fs_stage_1.5 xfs_stage_1.5等等,很容易猜想stage1.5和文件系统 有关系.有时候基本引导装载程序(stage1)不能识别stage2所在的文件系统分区,那么这 时候就需要stage1.5来连接stage1和stage2了.因此对于不同的文件系统就会有不同的stage1.5.但是对于grub 0.93好像stage1.5并不是很重要,因为我试过了,在没有stage1.5 的情况下, 我把stage1安装在软盘的引导扇区内,然后把stage2放在格式化成ext2或者fat格式的软盘内,启动的时候照常引导,并不需要e2fs_stage_1.5或者fat_stage_1.5. 下面是我的试验: #mkfs.ext2 /dev/fd0 #mount -t ext2 /dev/fd0 /mnt/floppy #cd /mnt/floppy #mkdir boot #cd boot #mkdir grub (以上三步可用mkdir -p boot/grub命令完成) #cd grub #cp /boot/grub/{stage1,stage2,grub.conf} ./ #cd; umount /mnt/floppy

RedHat5 内核升级指南

RedHat5.3 升级内核到2.6.33 版本

错误:insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists 编译2.6.31内核后重启出现 insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists 解决方法: 1,解压initrd文件 [root@bogon ~]# cp /boot/initrd-2.6.30.4.img /tmp [root@bogon ~]# cd /tmp/ [root@bogon tmp]# ls initrd-2.6.30.4.img [root@bogon tmp]# mkdir newinitrd [root@bogon tmp]# cd newinitrd/ [root@bogon newinitrd]# zcat ../initrd-2.6.30.4.img |cpio -i 11537 blocks 释放之后看到如下内容 [root@bogon newinitrd]# ls bin dev etc init lib proc sbin sys sysroot 2,ok,下边就是编辑init,删掉其中重复的四行中的两行 echo "Loading dm-region-hash.ko module" insmod /lib/dm-region-hash.ko echo "Loading dm-region-hash.ko module" insmod /lib/dm-region-hash.ko 3,重新打包initrd [root@bogon newinitrd]# find .|cpio -c -o > ../initrd 11538 blocks [root@bogon newinitrd]# cd .. [root@bogon tmp]# gzip -9 < initrd > initrd.img [root@bogon tmp]# ls initrd-2.6.30.4.img initrd initrd.img newinitrd 好了,initrd.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot,更改grub.conf里边的initrd-2.6.30.4.img为initrd.img就可以了, 这样“insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists”就不会有了 其实将init文件的第二行“setquiet”去掉,你就知道initrd文件到底在做什么了

Linux启动过程详解

深入浅出:Linux的启动流程刨析 Linux的启动过程,是一个Linuxer必须要熟练掌握的。通过系统的启动过程,可以更深入的理解Linux,假如Linux系统出问题的话,可以通过启动过程来分析原因,解决问题。而且,在掌握了Linux的启动流程后,还可以借助宿主机来打造自己的Linux。 下面是我画的一张简单的Linux启动流程图 在了解启动流程之前,我们应该先知道系统的几个重要脚本和配置文件,他们对应的路径为: 1、/sbin/init 2、/etc/inittab 3、/etc/rc.d/rc.sysinit 4、/etc/rc.d/rcN.d //这是几个文件夹N代表数字1,2,3,4.. 5、/etc/fstab 1、关于/sbin/init与/etc/inittab 关于/sbin/init ,它是一个二进制可执行文件,为系统的初始化程序,而/etc/inittab是它的配置文件,我们可以通过/etc/inittab来一睹它的功能,里面的内容是一种固定的文本格式,id:runlevels:action:process 我们来通过它的内容来学习它之前,先了解写运行级别的分类(0-6): 0:关机half

1:单用户模式singel user 2:多用户模式multi user ,不提供nfs服务without nfs 3:完全多用户字符模式full multiuser text mod 4:系统预留officially undefined 5:图形登录界面graphical login 6:重启reboot id:3:initdefault: //这里定义linux的启动时的运行级别,可以看到我的主机的启动级别是3 # System initialization. si::sysinit:/etc/rc.d/rc.sysinit //紧接着,运行系统第一个脚本/etc/rc.d/rc/sysinit //它的action:sysyinit指的是定义系统初始化过程 l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 //然后就是加载服务了,他们被定义在/etc/rc.d/rcN.d l3:3:wait:/etc/rc.d/rc 3 //action:waite 这个进程在在对应级别启动一次,知道它结束为止,我的系统启动级别为3,所有执行rc 3对应的服务 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 ca::ctrlaltdel:/sbin/shutdown -t3 -r now //这里定义了一个组合快捷键,熟悉吧,没错就是重启,你可以把它注释掉不用 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"//这里定义了ups电源,powerfail 指的是如果突然断电,它对应的process命令是,提示用户系统电源失效,将要关机,提醒用户把数据都存储好 pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"//这里的action,powerokwaite,指的是系统恢复供电,关机取消...

 1:2345:respawn:/sbin/mingetty tty1 //开启终端,在系统准备工作做好后,就会启动出6个终端,tty1~6 mingetyy就是终端的执行命令 2:2345:respawn:/sbin/mingetty tty2 //可以看到他们对应的级别是2345,你也可以注释

linux内核启动时几个关键地址

linux内核启动时几个关键地址 1、名词解释 ZTEXTADDR 解压代码运行的开始地址。没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。 ZRELADDR 内核启动在RAM中的物理地址。压缩的内核映像被解压到这个地址,然后执行。 This is the address where the decompressed kernel will be written, and eventually executed. The following constraint must be valid: __virt_to_phys(TEXTADDR) == ZRELADDR The initial part of the kernel is carefully coded to be position independent. TEXTADDR 内核启动的虚拟地址,与ZRELADDR相对应。一般内核启动的虚拟地址为RAM的第一个bank地址加上0x8000。 TEXTADDR = PAGE_OFFSET + TEXTOFFST Virtual start address of kernel, normally PAGE_OFFSET + 0x8000.This is where the kernel image ends up. With the latest kernels, it must be located at 32768 bytes into a 128MB region. Previous kernels placed a restriction of 256MB here. TEXT_OFFSET 内核偏移地址,即内核起始位置相对于内存起始位置的偏移,对于相对于物理内存还是相对于虚拟内存都是一样的结果。在arch/arm/makefile中设定。 PHYS_OFFSET RAM第一个bank的物理起始地址,即物理内存的起始地址。 Physical start address of the first bank of RAM. PAGE_OFFSET RAM第一个bank的虚拟起始地址,即内核虚拟地址空间的起始地址。 2、小结 从上面分析可知道,linux内核被bootloader拷贝到RAM后,解压代码从ZTEXTADDR开始运行(这段代码是与位置无关的PIC)。内核被解压缩到ZREALADDR处,也就是内核启动的物理地址处。相应地,内核启动的虚拟地址被设定为TEXTADDR,满足如下条件: TEXTADDR = PAGE_OFFSET + TEXT_OFFSET 内核启动的物理地址和虚拟地址满足入下条件: ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)= virt_to_phys(TEXTADDR) 假定开发板为smdk2410,则有: 内核启动的虚拟地址 TEXTADDR = 0xC0008000 内核启动的物理地址 ZRELADDR = 0x30008000 如果直接从flash中启动还需要设置ZTEXTADDR地址。

Linux如何禁止系统内核Kernel自动升级

Linux如何禁止系统内核Kernel自动升级 Kernel是系统内核,Linux系统在进行升级的时候内核也会跟着更新,有时为了避免不必要的麻烦,不少用户会选择不升级Linux内核,那么要如何禁止Kernel升级呢? 不过在更新其他软件包时,如果依赖最新的内核,那么该软件包是没法更新成功的。 方法如下: 方法1: # vim /etc/yum.conf exclude=kernel* 在 [main]配置段下,追加或修改以上内容。 可通过下面的命令查看是否生效: # yum update | grep -i kernel 方法2: 在yum命令行中加上-x参数,来跳过指定的更新。如: # yum -x ‘kernel*’ update Linux禁止系统内核Kernel升级的方法就介绍到这里了,方法2是通过在yum命令行中加入参数来实现的,相较于方法1简单了很多。 【拓展阅读】Linux 新手容易犯的 7 个错误 7. 选择错误的 Linux 发行版 Linux 有几百个不同的版本,或者按他们的称呼叫做发行版(distribution)。其中许多是专门针对不同的版本或用户的。选择了错误的版本,你与 Linux 的第一次亲密体验将很快变成一个噩梦。 如果你是在朋友的帮助下切换的话,确认他们的建议是适合你,而不是他们。有大量的文章可以帮助到你,你只需要关注前 20 名左右的或者列在 Distrowatch 的即可,就不太可能会搞错。

更好的做法是,在你安装某个发行版之前先试试它的 Live DVD。Live DVD 是在外设 上运行发行版的,这样可以允许你在不对硬盘做任何改动的情况下对其进行测试。事实上,除非你知道怎么让硬盘在 Linux 下可访问,否则你是不会看到你的硬盘的。 6. 期待什么都是一样的 由于经验有限,许多 Windows 用户不知道新的意味着新的程序和新的处理方式。事 实上你的 Windows 程序是无法在 Linux 上运行的,除非你用 WINE 或者 Windows 虚拟机。而且你还不能用 MS Office 或者 PhotoShop ——你必须要学会使用 LibreOffice 和 Krita。 经过这些年,这些应用可能会有和 Windows 上的应用类似的功能,但它们的功能可能具 有不同的名称,并且会从不同的菜单或工具栏获得。 就连很多想当然的都不一样了。Windows 用户会特别容易因为他们有多个桌面环境 可以选择而大吃一惊——至少有一个主要的和很多次要的桌面环境。 5. 安装软件的时候不知所措 在 Windows 上,新软件是作为一个完全独立的程序来安装的。通常它囊括了其它所 需的依赖库。 有两种叫做 Flatpak 和 Snap 的软件包服务目前正在 Linux 上引进类似的安装系统, 但是它们对于移动设备和嵌入式设备来说太大了。更多情况下,Linux 依赖于包管理系统,它会根据已安装的包来判断软件的依赖包是否是必需的,从而提供其它所需的依赖包。 笔记本和工作站上的包管理本质上相当于手机或平板电脑上的 Google Play:它速度 很快,并且不需要用于安装的物理介质。不仅如此,它还可以节省 20%-35% 的硬盘空间,因为依赖包不会重复安装。 4. 假想软件会自动更新好 Linux 用户认为控制权很重要。Linux 提供更新服务,不过默认需要用户手动运行。 例如,大多数发行版会让你知道有可用的软件更新,但是你需要选择安装这些更新。 如果你选择更新的话,你甚至可以单独决定每一个更新。例如,你可能不想更新到新的内核,因为你安装了一些东西需要使用当前的内核。又或者你想要安装所有的安全性更新,但不想把发行版更新到一个新的版本。一切都由你来选择。 3. 忘记密码 许多 Windows 用户因为登录不方便而忘记密码。又或者为了方便起见,经常运行一 个管理账户。

简析linux内核的内核执行流程图

简析linux核的执行流程 ----从bootsect.s到main.c(核版本0.11)Linux启动的第一阶段(从开机到main.c) 3个任务: A、启动BIOS,准备实模式下的中断向量表和中断服务程序。 B、从启动盘加载操作系统程序到存。 C、为执行32的main函数做过渡准备。 存变化如下: ①、0xFE000到0xFFFFF是BIOS启动块,其中上电后第一条指令在0xFFFF0。 ②、而后0x00000到0x003FF总共1KB存放中断向量表,而接下去的地址到0x004FF共256B存放BIOS数据,从0x0E05B 开始的约8KB的存中存放中断服务程序。 ③、利用BIOS中断0x19h把硬盘的第一扇区bootsect.s的代码加载到存中,即0x07c00处,后转到该处执行。 ④、将bootsect.s的代码复制到0x90000处。 ⑤、利用中断0x13h将setup.s程序加载到存0x90200处。 ⑥、再将剩余的约240个扇区的容加载到0x10000~0x2EFFF 处。 ⑦、开始转到setup.s处执行,第一件事就利用BIOS提供的中断服务程序从设备上获取核运行的所需系统数据并存在0x90000的地址处,这时将原来bootsect.s的代码覆盖得只剩2Byte的空间。

⑧、关中断并将系统代码复制到0x00000处,将原来放在这里的中断向量表与BIOS数据区覆盖掉,地址围是 0x00000~0x1EFFF。同时制作两表与两寄存器。 ⑨开地址线A20,寻址空间达到4GB,后对8259重新编程,改变中断号。 ⑩、转到head.s(大小是25K+184B)执行,执行该程序完后是这样的: 0x00000~0x04FFF:页目录与4个页表,每一项是4KB,共20KB;0x05000~0x05400:共1KB的空间是软盘缓冲区; 0x05401~0x054b8:共184B没用; 0x054b9~0x05cb8:共2KB的空间存中断描述符表; 0x05cb9~0x064b8:共2KB的空间存全局描述符表; 之后就是main函数的代码了! 第二阶段、从main.c函数到系统准备完毕阶段。 第一步:创建进程0,并让进程0具备在32位保护模式下载主机中的运算能力。流程是: 复制根设备和硬盘参数表(main.c中的102、110、111行) 物理存规划格局(main.c的112行~126行,其中有 rd_init函数定义在kernel/ramdisk.c中,此函数用于虚拟盘初始化;而mem_init函数是用于存管理结构初始化,定义在mem/memory.c中,该函数页面使用

ubuntu内核升级及卸载

ubuntu内核升级及卸载 ubuntu下内核的升级与卸载 很多用户一般都会选择Windows + Ubuntu的双系统。用得时间久了,随着Ubuntu内核的不断升级,开机启动菜单会变得越来越臃肿。下面简单介绍一下如何删除开机启动菜单多余的内核(旧版本),以及如何调整不同操作系统的启动顺序。 Ubuntu是由grub引导启动的。每当Ubuntu升级到新的版本后,grub会自动调整开机启动菜单的顺序,把新的内核放在启动菜单的开始,同时也不会删除久的内核版本。这样,当Ubuntu的升级次数一多,启动菜单中将变得非常臃肿。而且那些旧版本的内核基本不会用,不如删除之。解决方案如下: 1.找出系统已经安装的内核版本,在终端里输入命令:dpkg --get-selections | grep linux-image 然后会显示系统中已安装的内核,例如: linux-image-2.6.35-22-generic install linux-image-2.6.38-10-generic install

linux-image-2.6.38-11-generic install linux-image-2.6.38-8-generic install linux-image-3.0.0-12-generic install linux-image-generic install 2.卸载旧的内核版本,在终端里输入命令:sudo apt-get remove linux-image-2.6.35-22-generic linux-image-2.6.38-8-generic linux-image-2.6.38-10-generic linux-image-2.6.38-11-generic 上面命令和含义是: dpkg --get-selections [ ...] 把已选中的软件包列表打印到标准输出; grep linux-image 匹配查找; uname -a 查看已安装的linux内核版。 这样,旧的内核版本就删除了。然而,grub修改开机启动菜单,会自动把最新的Ubuntu放在第一位,把Windows放在最后一个。我们经常希望把Windows调整到靠前的位置,可能还会修改默认的启动项和等待时间等。解决方案如下:1.找到grub配置,打开配置文档,在终端里输入命令:sudo gedit /boot/grub/grub.cfg 2.修改grub配置

相关文档
相关文档 最新文档