zoukankan      html  css  js  c++  java
  • 通过grub-install命令把grub安装到u盘

    通过grub-install命令把grub安装到u盘


    ①准备一个u盘,容量不限,能有1MB都足够了。 
    ②把u盘格式化(我把u盘格式化成FAT格式了,最后证明也是成功的)。
    ③开启linux系统,打开命令行终端,进入root模式,然后输入命令行:
    mount   /dev/sdb3   /tmp/boot
    grub-install --root-directory=/tmp/boot --no-floppy /dev/sdb


    注意:上面/dev/sdb是我的u盘,在linux系统里的盘符吧,那个/dev/sdb3为什么是“3”,这个因不同的实际情况而不同吧。
    总的来说,/dev/sdb就是我的u盘的名字,/dev/sdb3就是我的u盘的一个分区。


    ④这个时候,你会发现,你的u盘,已经多了一个boot目录,里面有一些内容,这个时候,boot目录的路径是/dev/sdb3/boot/。
    ⑤把“/boot/grub/grub.conf”和“/boot/grub/splash.xpm.gz”,复制到“/dev/sdb3/boot/grub/”下面(也就是“u盘/boot/grub/”)。
    ⑥然后把/dev/sdb3/boot/grub/grub.conf修改成以下内容:
    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE:  You do not have a /boot partition.  This means that
             all kernel and initrd paths are relative to /, eg.
             root (hd0,0)
             kernel /boot/vmlinuz-version ro root=/dev/sda1
             initrd /boot/initrd-version.img
    #boot=/dev/sda
    default=-1
    timeout=50
    splashimage=(hd0,3)/boot/grub/splash.xpm.gz

    title Fedora
       root (hd0,3)


    ⑦重启计算机,在BIOS里,设置为从u盘启动,即可。 



    制作步骤:


    先用cfdisk 在U盘中,创建个两个分区,第二个一会儿作为boot分区。


    0:mkfs.ext3 /dev/sdc5
    1:mount /dev/sdc5 /tmp/boot
    2:grub-install --root-directory=/tmp/boot --no-floppy  /dev/sdc(*注意*)


    自己修改一下menu.lst文件吧。这个简单。

    ****************************************************************************
    以上全部推翻重写。需要懂得理论上的知识,才能做出正确的结果。

    ****************************************************************************

    首先理解引导中U盘引导部分的过程。
    1:当BISO通电引导到磁盘时,会检查MBR区域(MBR:446+DPT:64+ENDFLAG:2=512)
    MBR里面必须存在引导程序,通常会是我们熟悉grub,dos,95dos引导等。否则无法引导。
    这里做个简要说明:平常我们将系统安装硬盘上,通常安装都是安装windows,再安装linux,而通常当安装linux时,会提示你是否安装到MBR里面,或者安装到你的某个磁盘分区里面,通常是你的/boot的所在分区。


    安装在MBR,或者某个磁盘分区。这2者之间存在差别。
    a:当安装到MBR时,会将已经存在的Win自己在MBR的引导程序替代,变成GRUB引导。
    b:当安装到某个分区时,会由存在的Win的引导程序,引导到那个分区的Grub,再有Grub引导到各个操作系统。
    这就是2者的差别。win没有为其他系统考虑过,到了自己的磁盘分区之后,对于引导其它系统,没有提供可以直接引导的命令,只能进入后修改它的boot.ini文件。而grub提供命令命令菜单,可以进行手工引导。


    2:grub的制作
    笔者发现win只能自动识别出U盘的第一个分区,而对于第二个分区无动于衷。

    所以做了这样的分区方案。第一个分区用来存储数据,第二个分区用来放置引导信息,这样不至于在使用过程中,自己创建的grub的boot分区,被别人勿删除,或者格式化。

    我的1G U盘分区如下:


    /dev/sdc1  950M   ntfs                                                      用于平时的数据存储
    /dev/sdc5  60M     ext3   (boot标识,可以引导启动,用cfdisk时,很容易修改。) 用于存储引导文件。


    执行命令
    mount /dev/sdc5 /tmp/boot
    grub-install --root-directory=/tmp/boot --no-floppy  /dev/sdc
    此处脚下留神,必须讲grub安装到/dev/sdc,否则目前对于U盘的MBR来讲,没有可以用的引导程序。
    此命令执行后,会在/tmp/boot/目录,也就是/dev/sdc5,下面产生目录/boot/grub.里面有*stage*等文件。

    最后在/boot/grub 目录中建立menu.lst文件。文件内容如下:

    timeout         20
    default         0

    title windows xp
    map (hd0) (hd1)
    map (hd1) (hd0)
    rootnoverify (hd1,0)
    makeactive
    chainloader +1


    讲一下,如果你用U盘引导后,他会把自己标记为hd0。而已经安装在硬盘上的win操作系统认为自己的宿主硬盘是hd0,此时引导win操作系统时就会造成盘符错位。因此我们需要用map进行一下映射转换。

    map 的解释及使用如下:
    map TO_DRIVE   FROM_DRIVE

    映射 驱动器FROM_DRIVE 到TO_DRIVE.

    当你链式引导向dos一样的操作系统,并且该系统没有在第一个驱动器上时,必须进行该映射。

     

     

    that's Ok!



    ****************************************************************************
    随着我的使用的愈加频繁,menu.lst上面的内容多了起来。

    ****************************************************************************


    下面分享一下,里面的内容。首先是目录结构。


    root@kook:~# fdisk -l /dev/sdb

    Disk /dev/sdb: 1010 MB, 1010826752 bytes
    32 heads, 61 sectors/track, 1011 cylinders
    Units = cylinders of 1952 * 512 = 999424 bytes

      Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1               1         951      928145+   6  FAT16
    /dev/sdb2   *         952        1011       58560   83  Linux
    root@kook:~# mount /dev/sdb2 /tmp/boot/
    root@kook:~# tree -d /tmp/boot
    /tmp/boot
    |-- boot
    |   `-- grub
    |-- centos4.4
    |-- centos4.4-64
    |-- lost+found
    `-- ubuntu704

    6 directories



    下面是menu.lst的内容。


    root@kook:~# cat /tmp/boot/boot/grub/menu.lst
    color light-gray/blue
    timeout         20
    default         0

    title           Windows 95/98/NT/2000
    map             (hd0) (hd1)
    map             (hd1) (hd0)
    rootnoverify    (hd1,0)
    makeactive
    chainloader     +1

    title           CentOS 4.4 x86_64 Net Install
    root            (hd0,1)
    kernel          /centos4.4-64/vmlinuz root=/dev/hda2 ro single
    initrd          /centos4.4-64/initrd.img
    boot

    title           CentOS 4.4 i386 Net Install
    root            (hd0,1)
    kernel          /centos4.4/vmlinuz root=/dev/hda2 ro single
    initrd          /centos4.4/initrd.img
    boot

    title           Ubuntu 7.04 AMD 64 Net Install
    root            (hd0,1)
    kernel          /ubuntu704/linux root=/dev/hda2 ro single
    initrd          /ubuntu704/initrd.gz
    boot

     

     

     

    注意:
    1:成功的关键是MBR的内容。可以用dd if=/dev/sdc of=/tmp/mbr.bin bs=446 count=1 提取 出。hexdump -C
    /tmp/mbr.bin 查看
    2:有时候MBR会有问题。用这个命令清零吧。

    dd if=/dev/zero of=/dev/sdc bs=446 count=1 

    因为一个是0.97版(grub-legacy),一个是2.02版(grub2)
    grub-legacy 没有 /boot/grub/grub.cfg 这个文件,而是使用 menu.lst 文件。
    root (hd0,0)
    kernel /boot/vmlinuz-3.10xxx
    initrd /boot/initrd-3.10xxx
    boot
    这个格式是grub格式,或者grub一代


    root (hd0,msdos0)
    linux /boot/vmlinuz-3.10xxx
    initrd /boot/initrd-3.10xxx
    boot
    这是grub2的写法

    rhel6以前都采用grub一代,到rhel7则采用grub2模块化引导管理器

    grub和grub2的异同还请参考官方文档或自行百度!

  • 相关阅读:
    python中的编码与解码
    python中的迭代器
    python中高阶函数与装饰器(3)
    python中高阶函数与装饰器(2)
    python中高阶函数与装饰器
    python中几种常用的数据类型
    python 启航
    Python [习题] 字典排序
    SQL-TSQL
    SQL基础语句
  • 原文地址:https://www.cnblogs.com/mao0504/p/5441219.html
Copyright © 2011-2022 走看看