LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: jitio

找救兵,升级后无法启动

[复制链接]
 楼主| 发表于 2006-4-15 04:30:12 | 显示全部楼层
跑去装gentoo,出现同样的错误,
搜索了gentoo那边的,结果可能是:
vmware里装gentoo的时候得把SCSI device support-->SCSI low-level drivers-->BusLogic SCSI support编进内核才能启动。

顺便问下老大:
gentoo的话,是不是没有办法补救了,也就是一定要重新安装整个gentoo来重新编译内核。

这边的话,安装arch的时候,又将如何获得scsi的支持呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-15 04:33:18 | 显示全部楼层
BusLogic SCSI 应该是加载了一个SCSI驱动?
那能不能在什么地方让他启动的时候再加载来达到补救
还是必须是进内核?唉,有点混乱,咳

很奇怪,之前按这种“错误的办法”来安装arch,只要不升级内核就没有问题
还可以上到xfce4

据说内核上到2.6似乎就不再分SCSI版本或者IDE版本,是和内核的新版本有关系吧
回复 支持 反对

使用道具 举报

发表于 2006-4-15 11:21:14 | 显示全部楼层
搞复杂了吧,提示就是没有找到kernel文件:
1、确认你的menu.1st文件中的路径正确。SCSI使用sda(或者sdX),IDE/SATA使用hda(hdX),可以用cfdisk -l查看。
2、为什么没有initrd /boot/initrd26.img这一行呢,新的官方内核使用了ramdisk,必须加上这行。
3、是否同时升级了新的udev和initscripts两个包。
你的grub是安装好的,不用在grub上和kenel上搞来搞去的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-15 15:48:47 | 显示全部楼层
嗯,谢谢老大,我会去按你上面说的来尝试。
但有的地方很是不懂
理论上我那个是虚拟成scsi的
但是除非是自己可以写的地方,才可以让你用sda或者sdx
否则的话,比如在装grub的时候,按tab,他都是显示hda的
这是在叫人困惑。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-15 15:55:31 | 显示全部楼层
在gentoo那边得到的一个答案是:
应该有 livecd 的 iso 吧(就是你安装时用到的那个 iso)?
(以下全在虚拟机中)从光盘启动,chroot /mnt/gentoo /bin/bash,然后再编译内核把要加的东西加进去。
这样应该可以吧?

这个看起来类似于重新安装window,哈哈,比较容易理解,可是这样会比较没趣
linux真是越来越好玩了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-15 20:01:38 | 显示全部楼层
顺藤摸瓜:

home_king说的:
摘录自(贴子有详细说明):[url]http://www.linuxsir.cn/bbs/showthread.php?t=113586/url]

Initrd的作用有三:

1.提高系统的可移植性
把更多的内核功能条目编译成模块,不仅仅是为了减小内核体积,更重要的是面对各种不同的硬件架构,可以使用initrd中的linuxrc按需进行模块加载以驱动硬件,甚至对于CPU类型或者多处理机也可以进行手工选择内核(配合syslinux这类boot loader)

2.LIVECD(光盘上的Linux)必备的部件
现在的可启动光盘都沿用1995年制定的El Torito标准,它的启动原理在于模拟软盘启动映像,这个映像的大小一般被限制在2800KB,也就是两张软盘的大小,它包含了syslinux(也可以用isolinux,它对映像的大小要求更宽松),syslinux的配置文件,initrd.img以及内核。这时候内核的大小就必须要有约束了(当然,也有来自1MB实模式内存空间的约束),把更多的模块压缩进initrd.img中去,可以缩小启动映像的体积。
最重要的是,linuxrc脚本对于硬盘,光驱模块的加载至关重要,因为livecd要适应尽量多的硬件架构,所以它必须能按需加载模块,这时候initrd就派上用场了。比如说,我们在vmware里运行knoppix,knoppix的linuxrc就自动加载BusLogic.o模块(通过轮换insmod来实现)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-15 20:36:38 | 显示全部楼层

ram disk 是什么,它和initrd.img 文件的关系是怎样的

摘录自(该贴子有详细讨论):http://www.linuxsir.cn/bbs/showthread.php?t=184629

(rickxbx从home_king兄那里理解到的结论摘录:)
home_king:
ramdisk是一种基于内存的虚拟文件系统,通常用于放置内核的中间数据。
而initrd全称为"boot loader initialized RAM disk",也就是由启动加载器所初始化的RamDisk设备,它的作用是完善内核的模块机制,让内核的初始化流程更具弹性;内核以及initrd,都由bootloader在机子启动后被加载至内存的指定位置,主要功能为按需加载模块以及按需改变根文件系统。
更详细的内容,请参阅initrd的man手册,里面阐述了内核开发者对initrd制订的功能标准。
man initrd
......
rickxbx:
你看是不是这样:grub 中的 initrd 指令告诉 grub 可以从 initrd 指定的文件读取,然后将读到的内容拷贝到 ram disk,然后将该 ram disk 挂载到文件系统的根目录,然后执行/linuxrc(如果存在的话),并将真正的根文件系统挂载到vfs的根
如果是这样的话,现在就有一个问题:这个ram disk 怎么确定?也就是上面说的 /dev/ram0 怎么确定?
......
home_king:不是的。
GRUB不参与Linux内核的初始化!它是与内核独立的。
记住,GRUB与Linux内核交互的方式遵循一种协议,目前的协议版本为2.02;GRUB通过"setup head"区域与内核交换数据。
假设内核映像为kernel.img,那么这个img文件里就包含着三截代码段(在编译内核的最后阶段生成),第一段是bootsect.S,就是旧的内核内置启动器,它的地位已经被GRUB替代,所以被丢弃不用;第二段是setup.S,由GRUB负责将其放置到物理地址0x90200上,它的头部就是前面提及的所谓head区,GRUB会把需要告诉内核的信息例如initrd的物理起始地址以及大小,放在这个head区;第三段就是真正的压缩内核映像,视乎其体积类型,如果是大内核,就将这段内核映像放至0x100000。
那么,在初始化页表的时候,内核会搬动head区的数据到合适的位置,里面的数据就会被内核初始化所利用,所以内核就得知了initrd的所有信息。明白了吗?

rickxbx:有点明白了,又有点糊涂了
也就是说,setup.S 前面一段是用来在grub和内核之间传递参数的,是吧?
如果在grub 中设置了 initrd的话,grub会读出该文件的地址以及文件的大小,然后将其写入setup.S的head区的特定地方,待内核启动时使用.
grub引导结束后,应该跳转至setup.S执行

rickxbx:还有最后一个问题,这样的initrd.img文件是被grub载入内存.然后grub告诉内核其内存地址,还是由内核载入内存,grub只告诉内核该文件的硬盘地址?
如果是由grub载入,那么grub怎么知道该加载到什么内存区域才会安全?

home_king:由grub载入内存,然后再将内存中的initrd信息告诉内核,让内核进行初始化。
Linux为它的启动制订了一个标准协议,GRUB或者LILO要启动Linux,就必须遵循这个协议。该协议放在内核源码目录的"Documentation/i386/boot.txt"。
根据这个协议,initrd的位置尽可能地放在内存的高地址,这个高地址的值取决于机器的架构,但为了达到最大的兼容性,一般放在16MB靠后的地方,因为16MB是i286能识别的最大内存。另外,不同的bootloader,对initrd的加载地址可能有点差异,但只要不覆盖内核以及内核初始化可能要用的数据区即可。
---------------------------------------

好了,现在知道genloo为什么给我提出这个思路了,大致的原理稍微了解了,下来就是:怎么实际上来尝试。

如果在win下面,尽管不懂原理也可以尝试,但是linux下面甚至连基本命令都不懂,白痴中的白痴,咳,因为习惯问题,win好象很简单,到dos里面去,要运行什么,要去C盘就去C盘,找什么东西就去找,唉,被洗脑的感觉正历历在目,可见越是用win会越“傻”,继续探索...
回复 支持 反对

使用道具 举报

发表于 2006-4-16 11:38:10 | 显示全部楼层
如果你升级的时候确定initrd26.img是制作好了的(简单的话,就ls /boot 看有没有这个文件),那么随便用什么办法(livecd或Arch安装盘)启动,再mount你的/分区,修改你的/etc/fstab,/boot/grub/menu.1st文件,确保你里面的路径都使用了hdX或sdX的命名,例子如下:
#
# /etc/fstab: static file system information
#
# <file system>        <dir>         <type>    <options>          <dump> <pass>
none                   /dev/pts      devpts    defaults            0      0
none                   /dev/shm      tmpfs     defaults            0      0

/dev/cdrom             /mnt/cd   iso9660   ro,user,noauto,unhide   0      0
/dev/dvd               /mnt/dvd  udf       ro,user,noauto,unhide   0      0
/dev/fd0               /mnt/fl   vfat      user,noauto             0      0

/dev/hdc7 swap swap defaults 0 0
/dev/hdc5 / reiserfs defaults 0 0
# (0) Arch Linux
title  Arch Linux  [/boot/vmlinuz26]
root   (hd0,4)
kernel /boot/vmlinuz26 root=/dev/hdc5 ro
initrd /boot/initrd26.img
重新启动就可以了。如果没有initrd26.img,那就麻烦一点,重新安装或者chroot,使用
mkinitrd auto
产生initrd26.img。

注:如果从0.7ISO安装后升级,极有可能会出现麻烦,升级完毕后需要再次
pacman -S pcre gawk
然后最好再
pacman -S kernel26
这是由于pacman目前不支持软件升级顺序(也怪那个gawk)造成的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-16 11:50:12 | 显示全部楼层
收到,昨晚一直上不来,怪了,
继续捣鼓,多谢老大了~
回复 支持 反对

使用道具 举报

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

本版积分规则

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