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