Chinaunix首页 | 论坛 | 博客
  • 博客访问: 62614
  • 博文数量: 16
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-09 17:12
文章分类
文章存档

2010年(10)

2009年(6)

我的朋友

分类: LINUX

2009-12-23 11:26:35

当你无法蛋定的时候,内心的闷骚与情俗的萌动,总是会促使你干一些蛋疼之事,于是生命在折腾中升华。

Gentoo装在移动硬盘上并不是件困难的事,但是菜鸟的生活总是充满着无奈,各种意外都会接踵而至。

以前一直不知道启动时initrd这个参数是干啥用的,也懒得知道,因为哥不要这个也照样运行良好,情绪相当地稳定。

但扯上移动硬盘或U盘之类,就不得不关注一下了。貌似它是为了避免鸡生蛋蛋生鸡之类的事。
这里有两个文章相当不错,有空了得详读一番。
1. Linux2.6 内核的 Initrd 机制解析
2.
还有个看着有点的山寨的,不过文章倒是个不错的参考。

以下是本猫的经历之谈:

1. 顺利在移动硬盘上装好系统,编好kernel,配置Grub。
   但启动后出现无法挂载root的错误。
   估计是因为没使用initrd,此时usb驱动尚未加载完毕,故找到要挂载的root分区。

2. 安装mkinitrd。
   emerge mkinitrd,竟然出现编译错误。
   网上看到有人说把Makefile中的OBJS+=后面那一坨参数去掉即可,试了下果然可以。

3. 制作initrd镜像
   mkinitrd /boot/initrd.img 2.6.31-gentoo-r6
   顺利生成。但启动后错误依然。

4. 动用genkernel,这个程序会自动生成kernel和initramfs镜像文件,并放到/boot下。
   注意的是编译时它默认会先clean,这个就比较痛苦了,而且大多时候都没必要。所以可以加上参数。
   genkernel --no-clean --no-mrproper all
   另外,要配置kernel的编译选项的话,还得再加个参数:
   genkernel --no-clean --no-mrproper --menuconfig all
   好了,这样编译出来的肯定可以启动了。

5. 换台机器,移动硬盘插上去,不能启动。
   因为在的机器上移动硬盘是/dev/sda,而有的是/dev/sdb。
   所以grub.conf和fstab文件中的配置可能与实际情况不符。
   这一刻,我忽然明白UUID是干啥的了。

6. 使用UUID
   在系统中使用blkid命令可以查看各个分区的UUID。
   我的只分了两个,/dev/sda1作为swap,/dev/sda2作为root。
   所以记下这两个分区对应的UUID即可。
   修改/boot/grub/menu.lst:
  

title Gentoo

uuid uuid xxx-xxx-xxx

kernel /boot/kernel root=/dev/ram0 ramdisk=8196 real_root=UUID=xxx-xxx-xxx

initrd /boot/initramfs


  修改/etc/fstab

UUID=xxx-xxx-xxx  /    ext3 noatime 0 1

UUID=xxx-xxx      none swap sw      0 0


7. 再次启动,又出错啦。
   还是找不到root分区之类的错误。
   刚开始以为是敲错了UUID,毕竟是一大串字符,检查了好几遍,确定以及肯定是没错的。这个让我一度很困惑很迷茫。
   后来又仔细看了看错误提示,发现有blkid not found字样,不禁出了一身的冷汗。
   再次编译一把,这次又得再给genkernel加个参数了:
   genkernel --no-clean --no-mrproper --disklabel ramdisk
   注意最后一个参数,因为只需要编译initramfs,没kernel啥事了,所以用ramdisk即可,不需要all了。

8. 系统顺利启动,从此Gentoo和移动硬盘过上了快乐的生活。


不圆满之处: 使用genkernel实在是有违折腾原则,有空了得研究研究initramfs,手动干上一把。
阅读(2144) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-01-14 21:15:08

谢谢大肥猫。 用你的方法试过了,问题解决了。 相比其他的方法,你的方法不但解决了问题,还比较简单

chinaunix网友2010-01-12 09:47:23

谢谢大肥猫的分享。 我安装你的方法做了,顺利的用移动硬盘安装了gentoo。 但是中间出现了问题: 我使用genkernel all 编译内核的,启动的时候出现了无法挂载root的错误,要求重新输入根分区。我grub中设置的root是/dev/sdb2,所以我在这里输入了/dev/sdb2。能成功启动。不知道为什么?是不是因为没有加载完成的错误。我看了网上其他的文章,如果是没有加载完成,需要设置一个等待时间,你这里怎么没有sleep这样的设置呢?