LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 977|回复: 5

编译内核的问题的问题

[复制链接]
发表于 2005-3-20 17:48:54 | 显示全部楼层 |阅读模式
我想做一个软盘版的linux
按照网上提供的教程做如下步骤I.)编译内核
make mrproper
拷贝../SRC/configs/i386-BOOT(类似文件)到.../SRC/.config
make menuconfig(最好去掉第二项中所有的*以去掉对模块的支持.必需使核心支持RamDisk其余选项自定)
注意:!!完全去掉网络功能可能造成编译失败(2.4.20-8内核即如此),但可部分去掉.)
make dep
make clean
make bzImage
../SRC/arch/i386/boot/bzImage即为内核
编译成功的内核应不超过1M
II.)编译busybox
busybox源程序可在RedHat的网站上(ftp://ftp.redhat.com/pub/redhat/linux/9/en/os/i386/SRPMS)找到
相应的软件包.假设安装后源码目录为/../src/busybox
修改/../src/busybox/Config.h文件,在不用的功能前加//
修改/../src/busybox/Makefile文件,将DOSTATIC=true
执行 make (生成的名为busybox的文件大小应在650K左右)
make PREFIX=/tmp/floppy install(此时在/tmp/floppy目录下即有Linux启动运行所必须的目录和文件了)
III.)创建系统必需的目录和文件
1.在/tmp/floppy目录下
mkdir proc mnt etc dev
在etc目录下创建inittab文件和rc.S文件(用vi)
执行chmod 777 inittab
chmod 777 rc.S
inittab内容为:
::sysinit:/etc/rc.S
::askfirst:/bin/sh
rc.S文件内容为:
#!/bin/sh
mount -t proc /proc /proc
2.在dev目录下创建设备文件
应创建的设备文件有:console,hda,hda1,hda2,hda3...(根据硬盘分区数而
定),hdb,hdc,hdd,tty,tty0,tty1,fd0,null,loop0,ram0,tty5
相应的文件在/dev下都可找到但不能复制,须自己创建:
这里采用mknod命令语法如下:
mknod 文件名 类型 MAJOR MINOR
类型 MAJOR MINOR可用ls -l在/dev下查找.(权限串的前一位即为"类型")
如创建console文件须在/tmp/floppy/dev下执行:mknod console c 5 1
IV.)配置grub并组织软盘.
1.取一张格式化为ext2的空盘.在其上创建boot boot/grub目录
拷贝/boot/grub/stage1和stage2到软盘的boot/grub下
执行:grub
root (fd0)
setup (fd0)
quit
至此grub安装成功!
在软盘的boot/grub目录下创建grub.conf文件
内容为:
default=0
timeout=10
title Linux
root (fd0)
kernel /bzImage
initrd /image.gz
grub配置成功!
拷贝bzImage到软盘根目录下.
2.cd /tmp
dd if=/dev/zero of=image bs=1k count=2048
losetup /dev/loop0 image
mke2fs -m 0 /dev/loop0
mount -t ext2 /dev/loop0 /mnt
cp -R floppy/* /mnt
umount /mnt
losetup -d /dev/loop0
sync
dd if=image|gzip -9>image.gz
拷贝image.gz到软盘根目录下.

但是启动的时候出错
kmod :failed to  exec /sbin/modprobe -s -k block-major-3 error=2

VFS:cannont open root  device " " or 03:08
please append a current "root= " boot option
kernel panic :VFS cannot to mount rootfs on 03:08

在网上找到可能是下面的原因

通常在Linux启动过程中,内核解压运行完成后,会加载root分区,然后执行root分区上的init脚本。当用户使用硬盘时,硬盘的初始化速度很快。在内核运行完成之前,因为硬盘已经准备就绪了,所以内核可以顺利加载硬盘上的root分区。然而软盘初始化速度要比硬盘慢多了。这样就会出现内核启动完成后,因优盘还没有完成初始化而导致root分区无法被加载的现象。所以要想使用软盘启动Linux就需要延长内核加载root分区的等待时间,办法就是对系统内核初始化代码do_mounts.c作类似上面的修改
* Allow the user to distinguish between failed open
* and bad superblock on root device.
*/
-  printk (“VFS: Cannot open root device“%s”or %s”,
+  printk (“VFS: Cannot open root device“%s”or %s”,
retrying in 1 second.", root_device_name, kdevname (ROOT_DEV));
-  printk (“Please append a correct “root=”boot option”);
-  panic(“VFS: Unable to mount root fs on %s”,
-  kdevname(ROOT_DEV));
+  printk (“You may need to append a correct“root=”boot option”);
+  printk (“or wait for the root device to become ready.”);
+
+  /* wait 1 second and try again,
+  * allowing time for hubs/devices to become ready */
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(HZ);
+ goto retry;
      )
panic(“VFS: Unable to mount root fs on %s”, kdevname(ROOT_DEV));


我感觉上面修改的代码有问题
我的c语言不行那位能帮忙?
解决一下  关键是让延长内核加载root分区的等待时间

很感激大家了
发表于 2005-3-20 18:05:38 | 显示全部楼层
这不是内核本身的缘故吧。如果真如你所说的那样,那么linus在1991年发布0.01版本内核时,他就无法让他的用户们从当时唯一廉价的存储设备──软盘上启动linux了。


你在grub的配置文件中没有显式指明根分区的参数(root=<your root device>),这样内核会默认选取你编译内核的那个linux系统上的根分区作为它的缺省值,并尝试挂载;从内核的错误输出可以看出,那个默认值就是"主设备号3次设备号8的设备",也应该就是你硬盘上的/dev/hda8(你硬盘上的linux的根分区是吧:-);
VFS:cannont open root device " " or 03:08
please append a current "root= " boot option
kernel panic :VFS cannot to mount rootfs on 03:08

于是内核错误地去挂载硬盘上的/dev/hda8分区(其实你要的是软盘上的分区),但是你裁减过的内核中没有相应的模块放置在initrd(也就是image.gz)中,
kmod :failed to exec /sbin/modprobe -s -k block-major-3 error=2

所以内核最终报错。

解决方法:
在kernel的grub启动项后面加上"root=/dev/ram0"参数试试看,当然,改变根文件系统也可以在initrd里面的linuxrc或者init来做,我的ibox LiveCD就是这样做的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-20 18:42:00 | 显示全部楼层
您的意思是 修改grub.conf为
default=0
timeout=10
title Linux
root (fd0)
kernel /bzImage  root=/dev/ram0
initrd /image.gz

我以前尝试过的
也不对
报的错误是
kmod :failed to exec /sbin/modprobe -s -k block-major-1 error=2
VFS:cannont open root device "ram0 " or 01:00
please append a current "root= " boot option
kernel panic :VFS cannot to mount rootfs on 01:00
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-20 18:53:30 | 显示全部楼层
不知道用
default=0
timeout=10
title Linux
root (fd0)
kernel /bzImage root=/dev/fd0
initrd /image.gz

报什么错
我试一下



VFS: insert root floppy and press ENTER

我按回车以后
VFS : mounted root (ext2 filesystem) readonly

Freeing unsed kernel memory :92k Frees

warning : unable to open an initial console
kernel panic : no init found  try  passing  init =option to kernel


是不是我编译的内核有问题
回复 支持 反对

使用道具 举报

发表于 2005-3-20 21:09:33 | 显示全部楼层
首先要弄清楚的一件事是,你究竟想以initrd作为根文件系统运行linux,还是以软盘作为根文件系统运行linux。
按你现在这样做,是抛弃了initrd(也就是你的image.gz),而以软盘为根文件系统,但你软盘上没有文件系统啊!所以没有/sbin/init,内核找不到那些默认路径,只好报错,让你用init=指定init程序了。

你的内核编译应该有问题,ramdisk的支持涉及很多内核选项,比如loopback等,都选上了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-20 21:33:10 | 显示全部楼层
多谢版主指点
你能给我发个你编译好的内核吗?
我这里多谢了
本人是新手
希望您多指教 我的mail
3v4d5u@sina.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表