LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: dlgy

如何用u盘使用grub启动linux(本地硬盘中)???

[复制链接]
 楼主| 发表于 2006-6-15 11:47:14 | 显示全部楼层
今天总结了一下我制作u盘linux的心得和体会,也总结了这个文档,希望能对没有作过的朋友有所帮助,在这里要感谢d00m3d和终极幻想两位大大的帮助和鼓励,还要特别感谢springwind426的帮助。文档写的比较仓促,如果有错误还请大家多多指正,完善。



                      如何制作U盘FC5系统
硬件,OS配置:               
        1。512M可启动U盘一个。注意有些u盘不支持启动。       
        2。宿主机一台,其上的OS为最小化安装的FC5(为了防止不必要的麻烦,请不要使用selinux)。因为我暂时没想裁减FC5,       
           而是想通过直接拷贝的方式把宿主机的FC5拷贝到U盘中,所以只有最小化安装FC5了。       
        3。Kernel Version:2.6.15       
步骤:               
        一。插入U盘,分区,格式化。假设U盘设备为/dev/sda       
                # fdisk /dev/sda
                我分了2个区sda1和sda2,sda1准备用来挂载根分区,sda2用来挂载swap。
                sda1分了大概440M,其他的分给了swap。也不知道这样合理不,还望指正。
                # mkfs.ext3 /dev/sda1
                # mkswap /dev/sda2
        二。用拷贝(cp)或系统传送(rsync)方式把宿主机的FC5拷贝到U盘的第一个分区。这里我用的是cp直接拷贝。       
                a)首先挂载sda1,假设挂载点为/mnt/sda1
                  # mount /dev/sda1 /mnt/sda1
                b)拷贝文件(连同文件属性,注意cp的参数),注意不要拷贝/sys  /proc目录,因为这是系统启动时要自动挂载的与系统相关的信息。
                  # cp -aRpf /bin /dev /home /root  /var /boot /etc /lib /opt /sbin /srv /usr /mnt/sda1
                  # cd /mnt/sda1
                  # mkdir proc sys mnt tmp selinux media
        三。修改/mnt/sda1/etc/fstab来对应你U盘的正确分区信息。       
                我的fstab内容如下:
                /dev/sda1               /                       ext3    defaults        1 1
                devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
                tmpfs                   /dev/shm                tmpfs   defaults        0 0
                proc                    /proc                   proc    defaults        0 0
                sysfs                   /sys                    sysfs   defaults        0 0
                /dev/sda2               swap                    swap    defaults        0 0
                清空/mnt/sda1/etc/mtab的内容:
                echo > /mnt/sda1/etc/mtab
        四。生成合适的initrd.img内核镜像文件,这步是最重要的,也是问题最多的地方。       
                因为要想成功启动U盘中的linux系统,首先要让内核支持U盘,这里我还不想通过编译内核来支持,
                就通过修改生成合适的initrd.img内核镜像文件来达到目的。如果你还不清楚内核镜像文件的用处,请参考我上面提到的帖子。
法一:
a) 制作usbinitrd.img:
# mkinitrd --fstab=/mnt/sda1/etc/fstab --preload=ehci-hcd --preload=usb-storage --preload=scsi_mod --preload=sd_mod /mnt/sda1/boot/usbinitrd.img `uname -r`
这样就在/mnt/sda1/boot下生成了usbinitrd.img内核镜像文件。
法二:
                合适的内核镜像文件需要在你的U盘系统中生成,但是现在不能启动你的U盘系统,所以我们要通过chroot,并挂载/sys  /proc来达到这个目的。
                a)挂载sys proc到/mnt/sda1/sys和/mnt/sda1/proc
                # mount -t proc /proc /mnt/sda1/proc
                # mount -t sysfs /sys /mnt/sda1/sys
                # chroot /mnt/sda1/
                # mkinitrd --preload=ehci-hcd --preload=usb-storage --preload=scsi_mod --preload=sd_mod /mnt/sda1/boot/usbinitrd.img `uname -r`
                注意这个mkinitrd的参数--preload就是在initrd.img中加入识别U盘所需要的内核模块,并延时几秒让U盘初始化完毕。
                这和你手动修改init文件或者linuxrc文件加入相关模块是一个效果。
                b)卸载proc,sys
                # umount proc
                # umount sys
                b)回到以前的根目录
                # exit
                c)这样就在/mnt/sda1/boot下生成了usbinitrd.img内核镜像文件。
                注意:       
                        1。不同的发行版可能内核镜像文件的制作过程可能不一样,但就是想达到一个目的,让内核识别U盘,并成功挂载根文件系统。
                           上面的那个mkinitrd命令其实就是在initrd.img中的init文件中加入了对U盘的模块支持,并延时8秒,让U盘初始化完毕,
                           这样就可以找到根文件系统,要不然可能会产生kernel panic的经典错误。
                        2。你也可以打开你制作的usbinitrd.img镜像文件,来修改init文件,达到你特定的目的。具体的命令如下:
                           # gunzip -S .img usbinitrd.img
                           # cpio -icvdumBI usbinitrd
                           这样就在当前目录下解开了usbinitrd.img,你可以查看和修改init文件来达到你的目的。
                           在修改init完毕后,可通过下列命令生成新的img:
                           在当前目录下(你的镜像文件解开的所在地)
                           # find . | cpio -c -o > ../newusbinitrd.img
                           # gzip ../newusbinitrd.img
                        3。其实刚才chroot的目的就是想生成和你U盘分区对应的usbinitrd.img文件,你也可以不chroot,
                           而在mkinitrd命令中使用参数--fstab来指定你的fstab所在,具体用法请man mkinitrd。
                        4。由于所用的发行版不同,initrd.img文件的制作有可能不同。
                           而内核镜像文件可以有好几种不同的格式,这里使用的是cpio文件格式。
        五。修改/mnt/sda1/boot/grub/grub.conf和/mnt/sda1/boot/grub/device.map文件,并安装grub到u盘的MBR               
                1。我的grub.conf内容如下:       
                default=0       
                timeout=10       
                splashimage=(hd0,0)/boot/grub/splash.xpm.gz       
                hiddenmenu       
                title Fedora Core (2.6.15-FromUsb)       
                        root (hd0,0)       
                        kernel /boot/vmlinuz-2.6.15 selinux=0 ro root=/dev/sda1
                        initrd /boot/usbinitrd.img       
                注意:       
                        a)如果你对grub硬件的排序方式不了解,请参见d00m3d大大的相关文章。
                        b)请关闭selinux,因为他可能会在你启动阶段给你带来莫名奇妙的错误,
                           我就是因为忽视了selinux而用了一整天的时间才把u盘系统启动起来。
                2。我的device.map内容如下:       
                (hd0)        /dev/sda
                3。安装grub到u盘的MBR
                 #grub
                  grub> root (hd1,0)
                  grub> setup (hd1)
                  grub> quit
                  注意,这里的hd1是你的u盘。
                 4。卸载u盘
                  # umount /mnt/sda1
        六。重启系统,调整BIOS启动顺序       
                # reboot
                把第一启动项改为usb-hdd,如果你的主板不支持u盘启动,那就换一台支持的来试试吧。

参考文档和相关帖子:
http://www.vigla.eclipse.co.uk/usb_install.pdf
http://simonf.com/usb
http://www.linuxsir.cn/bbs/showthread.php?t=211021
http://www.linuxsir.cn/bbs/showthread.php?t=229784
http://www.linuxsir.cn/bbs/showthread.php?t=189080
http://www.linuxsir.cn/bbs/showthread.php?t=184629
http://www.linuxsir.cn/bbs/showthread.php?t=113586
http://52cg.com/Training/system/Linux/200606/54898.html



还有我想问一下阿,我按照http://www.vigla.eclipse.co.uk/usb_install.pdf  
文档所说的方法,像直接用fc5安装光盘把fc5装入u盘,可是怎么还是不行呢?还是找不见u盘,只能识别本地硬盘/dev/hda
回复 支持 反对

使用道具 举报

发表于 2007-5-22 14:30:10 | 显示全部楼层
usb驱动在启动的时候加载比挂载文件系统晚,
kernel 2.4倒是必须这么做。
新的kernel 2.6有个启动参数,“rootdelay”
kernel /boot/vmlinuz-2.6.15 selinux=0 ro root=/dev/sda1 rootdelay=5
延迟5秒就可,我早看到这个帖就好了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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