LinuxSir.cn,穿越时空的Linuxsir!

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

关于在u盘上制作linux

[复制链接]
发表于 2006-12-19 11:19:17 | 显示全部楼层 |阅读模式
我很想知道linux的详细的启动过程,所以我有个想法,在自己的u盘上作一个小的linux系统。我的要求很低,只要能够加载内核,运行到init就行了,后面的以后有时间再研究。可是一开始我就碰到了很大的阻力。在论坛里面搜索了一下,都没有详细的在u盘上制作linux的文章。

     我是这么作的:
     首先我将u盘用fdisk分成了两个区,sda1和sda2,并把sda1设置为可启动。然后对这两个分区用mke2fs格式化为ext2文件系统。然后在sda1下建立了boot目录,拷贝了系统boot目录下的内核和initrd.img两个文件到sda1下的boot目录。在sda1上装好了grub,并修改了menu.lst。现在grub能够正常启动,可是grub在运行到initrd=initrd.img-2.6.15.*** 和savedefault之后,产生一个错误:
error15:file not found
press any key to continue...
     找不到文件?grub找不到哪个文件?是找不到内核还是找不到根文件系统?还有就是难道没有制作根文件系统内核起不来么?我猜这个时候内核应该都还没有解压缩的,到底是谁来给内核解压缩呢?initrd.img这个文件到底是来干什么的?为什么有人说这个文件可以不要呢。一头雾水阿。

     各位如果觉得我的疑问很弱,那就请介绍一下相关的文档吧。
发表于 2006-12-19 17:18:28 | 显示全部楼层
换个启动引导器吧,grub引导U盘不太好,用syslinux或者lilo试试看
回复 支持 反对

使用道具 举报

发表于 2006-12-19 17:20:16 | 显示全部楼层
换个启动引导器吧,grub引导U盘不太好,用syslinux或者lilo试试看
回复 支持 反对

使用道具 举报

发表于 2006-12-19 22:20:04 | 显示全部楼层
嗯, 这个问题不大
可以试试换root
在grub里用find命令查找/boot下面的一个特定文件, 找到才算root设对了.
或者在
kernel /
再按Tab, 会有自动补全的列表选择, 如果没有或者不对, 也要换root

建议看grub的文档.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-20 10:50:42 | 显示全部楼层
谢谢提醒,现在内核可以正常解压了。问题又来了,mount根文件目录的时候又出错了:
cannot read /etc/fstab: No such file or directory
mount:Mountting /root/dev on /dev/.static/dev failed : No such file
...
Target filesystem doesn't have /sbin/init
根目录我用的是busybox作的,而且在编译的时候我也把init编译进去了,怎么提示我说目标文件系统没有init这个文件呢?
我始终不解initrd.img这个文件在扮演一个什么角色,也没有搜索到什么好的资料。我在grub的menu.lst中把initrd这句注释掉,然后就会报kernel panic的错误。不解。。
回复 支持 反对

使用道具 举报

发表于 2006-12-20 12:24:13 | 显示全部楼层
你需要建立fstab文件.
这个文件可以依照已经有的建立, 但要注意设备编号(/dev/hda or /dev/hdb),
可能需要加上single参数启动, 再编辑fstab文件, 再重启, 才会根据建好fstab挂载相应文件系统, 即使所有在一个分区, 也需要指明根分区.
我的fstab供参考.
  1. # /etc/fstab: static file system information.
  2. #
  3. # <file system> <mount point>   <type>  <options>       <dump>  <pass>
  4. proc            /proc           proc    defaults        0       0
  5. /dev/hda3       /               ext3    defaults,errors=remount-ro 0       1
  6. /dev/hda8       none            swap    sw              0       0
  7. /dev/hda7       /home           ext3    defaults        0       1
  8. /dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-20 18:33:20 | 显示全部楼层
initrd.img是内核启动时在内存(/dev/ram0)里面加载的根文件系统,一般在启动完成后再用脚本将内存的根文件系统转到真实的硬盘的文件系统中,当然也可以不用转换,直接使用内存的根文件系统。

必须要使用initrd的原因是,如果内核里面没有嵌入必需的usb驱动,就无法在内核启动时直接加载在u盘上的根文件系统,解决办法就是先使用内存上的根文件系统,然后再加载usb驱动,等初始化好u盘后,再将根文件系统转换到u盘上。

如果内核里面嵌入了必需的usb驱动,就可以不需要initrd了,但要注意因为u盘初始化比较慢,要在启动管理程序(grub/lilo/syslinux等)里加一个参数rootdelay=6传递给内核(对于2.6.11以上版本),这样就可以直接使用u盘上的根文件系统了。

我前面发的那个14M的小linux,是用的initramfs直接将整个系统加载到了内存,根文件系统直接使用的内存上的,这样速度很快 :-)
回复 支持 反对

使用道具 举报

发表于 2006-12-20 19:09:42 | 显示全部楼层
请grub起动时按c键。
在命令提示符输root  (hd    然后用TAB补一下。查看一下,要变的。然后根据变化重写grub.conf文件。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-20 20:30:42 | 显示全部楼层
Post by Sandr0

必须要使用initrd的原因是,如果内核里面没有嵌入必需的usb驱动,就无法在内核启动时直接加载在u盘上的根文件系统,解决办法就是先使用内存上的根文件系统,然后再加载usb驱动,等初始化好u盘后,再将根文件系统转换到u盘上。

如果内核里面嵌入了必需的usb驱动,就可以不需要initrd了,但要注意因为u盘初始化比较慢,要在启动管理程序(grub/lilo/syslinux等)里加一个参数rootdelay=6传递给内核(对于2.6.11以上版本),这样就可以直接使用u盘上的根文件系统了。

grub已经找到内核了,就表明能够从u盘读取文件了。你说的意思是不是说内核要装载特定格式的文件系统(比如ext2),还需要其他的usb驱动来支持?
回复 支持 反对

使用道具 举报

发表于 2006-12-20 20:55:07 | 显示全部楼层
不是的,文件系统驱动和usb驱动没有联系。我上面的话仅仅只是回答你“我始终不解initrd.img这个文件在扮演一个什么角色”的问题。
按照你在5楼所写的,你遇到到问题应该与grub没有关系了,出错的原因应该是initrd.img里面缺少必需文件。
回复 支持 反对

使用道具 举报

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

本版积分规则

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