Chinaunix首页 | 论坛 | 博客
  • 博客访问: 615825
  • 博文数量: 90
  • 博客积分: 5111
  • 博客等级: 大校
  • 技术积分: 928
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-29 16:56
文章存档

2011年(15)

2010年(34)

2009年(19)

2008年(22)

我的朋友

分类: LINUX

2008-03-04 16:38:43

1: 下载:

内核下:

2: 理论知识:

重新编译内核指南

Linux
编译内核


3:实践知识:

下面这个网页的 "四、配置内核" "五、编译内核 " "六、编译可加载模块  " "七、启动新内核 ",

前三节似乎没用。

实战linux内核编译


虚拟机内核升级(2.6.92.6.18)笔记 http://blog.csdn.net/rainharder/archive/2007/11/27/1904412.aspx



# make clean

# make mrproper  确保源代码目录下没有不正确的.o文件以及文件的互相依赖。

# make  xconfig  (基于图形窗口模式的配置界面)
或者 #make menuconfig   (基于文本选单的配置界面)
或者 #make oldconfig (如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)

# make  dep    (确保关键文件在正确的位置)

# make  clean  (确保所有有关文件都处于最新版本状态)

#
make zImage    (编译压缩形式的内核)
# make bzImage   (注意大小写)

# make modules    (编译选择的模块)
# make modules_install    (将编译后的模块转移到系统标准位置)

# make install  (安装新内核)

# new-kernel-pkg --mkinitrd --depmod --install 2.6.18

# vi /grub/grub.conf 
进入grub.conf文件,做两处修改:
(1) 将default=1改为default=0(不改的话也可以,只不过重启之后会默认进入2.4内核)
(2) 将kernel行的“LABEL=/”换成根目录所在的分区(df   /对应的就是)
此步很重要,修改错误将可能导致进不去系统
(3)kernel最后加上enforing=0,或vi /etc/selinux/config,改为SELINUX=disabled,否则启动时会报policy什么什么的错

示例:
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.18 ro root=/dev/hda2 enforcing=0
        initrd /initrd-2.6.18.img
title Red Hat Linux (2.6.9)
        root (hd0,0)
        kernel /vmlinuz-2.6.9 ro root=LABEL=/
        initrd /initrd-2.6.9.img






出现问题:

Uncompressing Linux...OK,booting the kernel.
PCI:Cannot allocate resource region 4 of device 0000:00:07.1
audit(1195948811.376:0):initialized
Red Hat nash version 4.2.1.6 starting
    Reading all physical volumes.  This may take a while ...
    No volume groups found
   Unable to find volume group "VolGroup00" (VolGroup00是我分区的逻辑卷)
ERROR:  /bin/lvm exited abnormally!(pid 369)
Mount:  error  6  mounting  ext3
Mount:  error  2  mounting  none
Switchroot: mount  failed: 22
Umount   /initrd/dev failed:  2
Kernel panic  ---  not syncing: Attempted to kill init!

还没有解决~~





内核>2.6.21的一篇文档 :



由于遇到了在vmvare中,从2.6.9到2.6.21升级内核时,出现

Red Hat nash version 4.2.1.8 starting
Reading all physical volumes. This may take a while...
No volume groups found
Volume group “VolGroup00” not found
ERROR: /bin/lvm exited abnormally! (pid 302)
错误,scsi卡为
SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI

本以为google后会有结果,未果,只有自己动手了.(在gentoo下做实验)

首先觉得有必要使用新版的mkinitrd.下了一个,生成
文件: mkinitrd-4.2.17.tar.gz
大小: 85KB
下载: 下载

编译后安装.(此为我修改后的版本)

可以做实验了.
1.cp /usr/src/linux/arch/i386/bzImage  /boot/boot.img
2. cd /boot
3. mkinitrid -v --preload mptspi --preload dm-mod -f initrd-2.6.20.4 2.6.20.4
输出检查了一下没有问题.
4. vi grub/grub.conf
加入
title=Gentoo Linux (2.6.20.4)
root (hd0,0)
kernel /boot.img root=/dev/sda3 console=ttyS0,57600 console=tty0
(console=ttyS0,57600是从此虚拟机有一个串口,串口的输出为一个文件,这样可以更详细看到内核启动的问题)
initrd /initrd-2.6.20.4
5.用此项重启.失败
pivot root: pivot_root (/sysroot, /sysroot/initrd) failed:2
说我的/下没有initrd这个目录,看了一下redhat的,是空目录.
6.用正常项启动.
mkdir -p /initrd
7.用实验项重启.
ok,一切正常.

8.好了,比对一下2.6.9与2.6.20.4加载的有关scsi的模块.

2.6.20.4 (加载模块是有顺序的)
insmod /lib/mptbase.ko
insmod /lib/mptscsih.ko
insmod /lib/scsi_transport_spi.ko (此模块要在mptspi前加载,mkinitrd-4.2.1.8默认使用/etc/modprobe.conf文件,/etc/fstab,对于LABEL=的支持不好.)
insmod /lib/mptspi.ko
insmod /lib/dm-mod.ko

其它的不重要了.

9.结论,关于有使用scsi卡并要升级内核或自行编译内核,对于可能出现的kernel panic的解决方法就是.
1)要问是不是没有相关scsi设备驱动模块加载.
2)有相关驱动加载,新内核是不是有新的特性,需要其它模块支持如(scsi_transport_spi.ko)
3)用比较新的mkinitrd生成initrd文件来测试,确定模块依赖关系正确.确定设备能被正常识别.确定加载过程正常.(mkinitrd-5.1.19-1.i386.rpm)
4)在gentoo中使用,不要忘了建/initrd这个空目录.

此文是在翻阅大量相关文档分析mkinitrd和initrd文件后,得出的结论.相关分析命令.
1)老版的initramfs,用以下方法
mv initrd-2.6.20.4 initrd-2.6.20.4.gz
gunzip initrd-2.6.20.4.gz
losetup /dev/loop0 initrd-2.6.20.4
mount /dev/loop0 /mnt/temp

2)使用cpio生成的initrd-2.6.20.4
zcat initrd-2.6.20.4 | cpio -i
zcat initrd-2.6.20.4 | cpio -t | sort

对于新的内核使用的是cpio -H newc -o 方式生成的initrd,而非cpio -c -o要注意,否则无法正常使用.

附:在vmware中如何将ide虚拟盘当做scsi盘使用.
1.新生成一个scsi盘.
2.修改*.vmx文件.
scsi0.present = "TRUE"
scsi0.virtualDev = "lsilogic" (此处定义使用什么scsi设备)
scsi0:0.present = "TRUE"
scsi0:0.fileName = "1.vmdk" (1.vmdk原先定义的是ide,为有内容的盘,在这里被加给scsi0使用)

内核2.6.21使用Fusion MPT 3.04.04有问题,使用3.04.03,如下(至少LSI53C1030可以正常加载)
文件: fusion.tar.gz
大小: 223KB
下载: 下载

另一解决方法.
Edit /usr/src/linux/drivers/message/fusion/mptbase.c to match the following
--- drivers/message/fusion/mptbase.orig.c 2007-07-20 18:47:21.000000000 +0000
+++ drivers/message/fusion/mptbase.c 2007-07-20 11:23:32.000000000 +0000
@@ -2564,6 +2564,10 @@
pfacts->IOCStatus = le16_to_cpu(pfacts->IOCStatus);
pfacts->IOCLogInfo = le32_to_cpu(pfacts->IOCLogInfo);
pfacts->MaxDevices = le16_to_cpu(pfacts->MaxDevices);
+ /* Fix VMware bug */
+ if(pfacts->MaxDevices == 0) {
+ pfacts->MaxDevices = 16;
+ }
pfacts->PortSCSIID = le16_to_cpu(pfacts->PortSCSIID);
pfacts->ProtocolFlags = le16_to_cpu(pfacts->ProtocolFlags);
pfacts->MaxPostedCmdBuffers = le16_to_cpu(pfacts->MaxPostedCmdBuffers);

是VMware的模拟lsi的一个bug.
阅读(3845) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~