回 帖 发 新 帖 刷新版面

主题:[讨论]linux内核编译问题  《 新》

各位大虾好。。。我在编译内核前有几个问题希望各位大虾能够指点!!!

            我先谢谢了!!!

      在编译时  选择内核选项时
                 ‘ 空格’是不表示为 [不选]。
                  ‘* ’ 是不表示   [编译到内核]。
                   ‘M ’表示      [编译为模块] 。
      在  make menuconfig 之后应该是对内核的配置,中间应该没有命令了吧!!!  完成配置后会自动出现shell提示符。。
                                      之后输入  #make dep
                                                 #make clean  就行了吧!

                  我用的是grub启动 我开的资料是在
                                                 /etc/grub.conf增加
                                               
                                     title red hat linux(新版本号)
                                     root(hd0,0)
                                     kerenl/vmlinuz-2.4.20 ro root=/dev/hda2
                             之后重起就好了。。。

title red hat linux(新版本号)
  root(hd0,0)
 kerenl/vmlinuz-2.4.20 ro root=/dev/hda2      
上面这三句话 是不是有自己亲自往 屏幕上输的阿。。 还是就有几个选项选的。。

             各位大虾由于我是第一次编译 我需要不每一不考虑清楚,要不肯定失败
也许我的问题比较可笑,,但我还是希望您能为我解决问题!!!!

                         谢谢!

回复列表 (共7个回复)

沙发

我只编译过BSD内核,多试几次,就好啦~~呵呵

板凳

相信很多兄弟都编译过内核,支持CLO的说法多试几次就ok了
但是要找到正确的方法,
我也正在自己试着编译的内核,遗憾的是还没有成功,但是能简单的解答一下楼主的问题,希望有强人支持一下。

从楼主的grub上看,似乎是要编译2.4的内核,那么在make clear之后还应该运行几个命令
make 
make modules
make modules_install

然后再修改grub,之后再重新启动。
建议楼主在网上搜一下资料

3 楼


谢谢各位支持。看来我不是第一个困惑的了。。希望我们共同进步


      呵呵那我再多试几遍。。。。

4 楼

帮个忙啊,我们老师让我们写一篇关于linux的小论文,我们最近学习的就是用socket接口命令吧A文件从A机器copy到B机器下,和用232接口做这件事情……
围绕这里面涉及到的东西,写一篇小论文……
麻烦你给点思路啊……
谢谢啊

5 楼

在grub文件中还要增加initrd目标文件行

编译步骤前面楼的说的很多了,给你总结一下

新下载的内核,不用make clean make dep

make->make modules->make modules_install->make install

给你个grub文件参考:

default=1
timeout=10
splashimage=(hd0,7)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-8)
    root (hd0,7)
    kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ hdd=ide-scsi
    initrd /initrd-2.4.20-8.img
title 你的新内核
           root(hd0, 7)  // 你的内核所在硬盘号
           kernel /vmlinuz-.......  //保持和/boot目录中的镜像名一样
           root = /dev/hdaX   //  X代表从哪个硬盘分区启动
           initrd /initrd....    //保持和/boot目录中的名称一样

title DOS
    rootnoverify (hd0,0)
    chainloader +1

6 楼

下面是我以前编译内核时在网上找来帮助文档:

    linux-2.6.x内核发布后,与2.6.x内核配套的系统程序并没有相应的来得及更新, 升级过程会碰到很多问题。虽然网上已有很多关于升级到2.6.x文章,但总是有些细节没有作很好的总结,因此撰写本文将我的经验与大家分享一下。我是在虚拟机上将Linux系统从Redhat9.0升级到2.6.5内核,虚拟机软件为:VMware Workstation 4.0.5 build-6030。

    准备工作

    1、做好重要数据的备份工作,这是一个好习惯。

    2、下载最新的2.6.x内核源码包

    所有Linux内核的官方版本可以在http://www.kernel.org/ 找到。内核2.6.5 具体的下载地址是:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.5.tar.gz。

    3、升级module-init-tools软件包

    要编译与正常运行新的内核你需要升级一些软件包,这些信息在源码目录下的Documentation/Changes文件中,请根据你的实际情况选择升级。

    特别要说明的是,因为2.4.x下的modutils工具包已经不在适合新的2.6.x内核, 必需将其升级到module-init-tools工具包.,我下载module-init-tools-3.0.tar.gz源码包的地方是:http://www.kernel.org/pub/linux/kernel/people/rusty/modules/module-init-tools-3.0.tar.gz

    接下来, 按照下列步骤安装module-init-tools工具包:

    tar -zxvf module-init-tools-3.0.tar.gz

    在module-init-tools-3.0目录下,

# configure --prefix=/
# make moveold
# make all install
# ./generate-modprobe.conf /etc/modprobe.conf

    命令"make moveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等等). NOTE! 这是非常重要的一步, 千万不要省略. 这将使得你可以继续使用原有的linux-2.4.x系统, 因为在2.4.x系统下, 新的module-init-tools工具包实际上是倚赖原来"*.old"程序来加载内核模块. 如果忘记了这一步也不要紧张, 可以先下载并安装原来的modutils程序包, 然后按照上面的步骤重来一遍就可以了.

    新的module-init-tools工具包不再使用原来的/etc/modules.conf配置文件了, 而是使用新的配置文件/etc/modprobe.conf. 因此必需用命令"./generate-modprobe.conf /etc/modprobe.conf"来生成新的配置文件/etc/modprobe.conf.

    如果你使用devfs系统你还需要复制modprobe.devfs 到/etc目录下。

    当你升级完相关软件包之后,准备工作就算完成了,下面我们将进入到编译阶段。

    配置,编译和安装linux-2.6.x内核

    2.6的build系统与2.4有很大的不同,实际上是更加简单与方便了。

    将linux-2.6.5.tar.gz 复制到 /usr/src/ 下

    tar -zxvf linux-2.6.5.tar.gz

    cd linux-2.6.5

    如果是新内核没有编译过,就不需要用make mrproper 把原来编译产生的垃圾删除

    make menuconfig,进入内核选项卡。选择相应的配置时,有三种选择:

  Y--将该功能编译进内核

  N--不将该功能编译进内核

    M--将该功能编译成可以在需要时动态插入到内核中的模块

   在编译内核的过程中,最烦杂的事情就是这步配置工作了,很多新手都不清楚到底该如何选取这些选项。实际上在配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。关于这方面,有很多文章,就不作详细介绍了。

    其中要注意的是:RH9.0使用的是ext3文件系统,要把ext3 fs编译进内核。如果系统是SCSI硬盘,并且root fs在SCSI硬盘上,配置内核时也要把SCSI装置支持编译进内核。总之,升级后的系统需要什么,就要把相应的内容编译进内核。

· make

· make modules

· make modules_install

· make install

    该命令是最近的从2.5.69内核(按照内核发布时间算)开始才有的选项,他可以帮你完成很多东西: (1)把压缩内核映象拷贝到/boot目录下, 并创建相应的System.map符号链接; (2)修改bootloader的配置文件; (3)调用mkinitrd程序创建内核的initrd映象. 对于GRUB而言, 将在/boot/grub/grub.conf配置文件增加如下类似的配置行:

title Red Hat Linux (2.6.5)
root(hd0, 0)
kernel /boot/vmlinuz-2.6.5 ro root=LABEL=/
initrd /boot/initrd-2.6.5.img

    注意:一定要先编译并安装模块,再运行make install;否则可能会出现错误,导致升级失败!

   修改/boot/grub/grub.conf配置文件。新内核并不识别"root=LABEL=/"这个启动参数,如果现在你就重新启动新内核的话, 将发生kernel panic错误。因此,必需把这个" LABEL=/"替换成你真实的根分区,就OK了。

    如何知道你的根目录""在哪个partition上? 命令为: # df

    以下是偶机器的部分输出:

Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda2 3834496 1609188 2030520 45% /
/dev/hda1 101089 15154 80716 16% /boot
none 46548 0 46548 0% /dev/shm

    可见,我的根目录在/dev/hda2上,需要将启动参数改为 "root=/dev/hda2"。

    重启便可以看见kernel-2.6.5了。

7 楼

接着上面的说:

    4、支持Hotplug

当然, 首先要在内核配置时配置了HOTPLUG的支持. 然后, 由于/proc/ksyms改名为/proc/kallsyms, 所以必需修改启动脚本/etc/rc.sysinit. 为了兼容原有的linux-2.4.x系统, 可以加上下面几行:

#
# ----- KERNEL 2.6.x support ------
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
fi

然后, 把rc.sysinit文件中所有出现/proc/ksyms的地方都换成"$KSYMS"变量引用. 配置好后, 还必需下载hotplug的用户态辅助工具包:http://www.kernel.org/pub/linux/uti...4_03_11.tar.gz. 解开这个包以后, 直接"make install"就可以了. 它将产生/etc/hotplug/配置目录.

    5、体验sysfs

首先, 创建目录/sys:

# mkdir /sys

然后, 按照下列步骤修改启动脚本/etc/rc.sysinit文件:

o 找到行: mount -f /proc", 在下面增加:

if [ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi

o 找到行: action $"Mounting proc filesystem: " mount -n -t proc /proc /proc, 在其下面增加这样一行:

#
# Mount /sys for kernel-2.6.x
#
if [ "$KERNELVER" = "2.6" ]; then
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
fi

接下来, 在/etc/fstab文件中, 加入这样一行:

none /sys sysfs defaults 0 0

最后, 修改/etc/init.d/halt脚本中的halt_get_remaining函数:

将:
awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}
改为:
awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}

    6、支持USB设备

linux-2.6.x的USB驱动模块的名字已经改变了, 所以由此引起的问题多多......, 对应于USB-2.0的host控制器的内核模块名字仍然是ehci-hcd, 对应USB-1.1的host控制器的内核模块名字已经从usb-ohci改为ochi-hcd, 对应于通用USB host控制器的内核模块名字已经从usb-uhci该为uhci-hcd.

然而不幸的是, 在安装module-init-tools程序包时生成的/etc/modprobe.conf配置文件却仍然使用usb-ohci这个名字. 例如:

alias usb-controller usb-ohci
alias usb-controller1 ehci-hcd

因此, 要把它改为:

alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd

如果不做这样的修改, 那么使用USB-1.1 host控制器的机器在启动内核的时候将着不到相应的驱动模块.

支持USB键盘的模块名字也从keybdev变为usbkbd, 支持USB鼠标的模块名字也从mousedev改为usbmouse. 因此, 我们必需修改启动脚本/etc/rc.sysinit文件. 同时为了兼容原有的2.4.x系统, 我们在脚本的一开始定义两个变量:

#
# ----- KERNEL 2.6.x support ------
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
KEYBDEV_NAME=usbkbd
MOUSEDEV_NAME=usbmouse
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
KEYBDEV_NAME=keybdev
MOUSEDEV_NAME=mousedev
fi

然后, 把/etc/rc.sysinit脚本文件中出现keybdev和mousedev的地方都改为$KEYBDEV_NAME和$MOUSEDEV_NAME. 把脚本文件/etc/rc.sysinit中的needusbstorage部分从:

needusbstorage=
if [ $usb = "1" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null

action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi

改为:

needusbstorage=
if [ $usb = "1" ]; then
if [ "$KERNELVER" = "2.6" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /sys/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe usbhid 2> /dev/null
else
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep 'hid' /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
fi
action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi

好了, 到此为止, 我们应该可以重新启动机器了, 赶快去体验最新的kernel-2.6.4吧:-)

    7、其它

o 关于在linux-2.6.x系统上不能正常使用RPM命令的问题, 请参阅文档[2]和[6].
o 关于声卡的问题, 可以参阅参考文档[2]和[6].
o 关于在linux-2.6.x系统上运行vmware的问题, 请参阅参考文档[2]和[6].

    8、参考文档

[1] Kernel 2.6.x, the new breed: http://linuxbooks.pananix.com/kernel2.6.html
[2] Upgrading RH9 to 2.6.0-test4: http://www.fearthecow.net/index.pl?...amp;page=kernel
[3] HowTo Upgrade To The 2.6 Kernel: http://kerneltrap.org/node/view/799
[4] Building Linux Kernel 2.6 on Red Hat 8: http://www.sabalsoftware.com/articl...26OnRedhat8.php
[5] Migrating to Linux kernel 2.6 on recent Redhat systems: http://linux-sxs.org/upgrading/migration26.html
[6] Migrating to Linux Kernel 2.6: http://thomer.com/linux/migrate-to-2.6.html

我来回复

您尚未登录,请登录后再回复。点此登录或注册