首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 操作系统 > Linux > 正文
  • 用移动存储设备将Linux随身携带
      2007-2-25  来源:网络资源  编辑:Jsbulo  热度:

    如果想在现有的系统之外使用Linux,却又受到硬盘空间的限制,无法在内部硬盘中安装它该怎么办?

    当然,我们可以选择直接从光盘启动的Linux版本,比如,Knoppix。但是,这种方法不能一劳永逸,而且有许多不足之处,比如,一些数据文件仍然需要固定的硬盘空间来存储;而且很难安装自己的应用软件或对已有的应用软件进行定制。除此之外,光盘版Linux系统的功能也十分有限,它不仅在启动和检测硬件时很缓慢,运行速度也不尽如人意。

    我们还可以选择其它的解决方案,比如,为电脑再增加一块硬盘。但是,电脑很可能没有额外的硬盘槽,尤其是笔记本电脑。有的朋友可能会用一块更大的硬盘替换原有的,但是这样会花费大量的时间和精力,还要重新安装系统并备份数据。

    一种较好的办法是将Linux系统安装在移动存储设备中,这样不需要改变原有硬盘中的数据和应用软件,只要将移动存储设备连接到电脑上就可以使用Linux系统。

    移动存储设备的选择

    可用于安装Linux系统的移动存储设备很多,比如,软盘、闪存、USB或FireWire移动硬盘等。由于空间的限制,安装在软盘或闪存中的Linux系统通常是些功能单一的特殊版本,比如,只用做系统修复等。

    最好的选择是移动硬盘,它可以安装大多数Linux套件。大多数移动硬盘可以通过USB接口或FireWire (IEEE1394)接口与电脑连接。目前,USB接口主要有1.1和2.0两种规格。USB1.1的最大传输速率为12MB/s ,而USB 2.0的最大传输速率可达到480MB/s,建议使用具有USB2.0接口的移动硬盘。同样,FireWire标准也包含多种不同规格,常用的FireWire400传输速率可达400MB/s。

    在选择移动存储设备时,最好选择能同时支持以上两种传输标准的产品。如果电脑没有相应的接口,可以购买USB卡或PCMCIA FireWire卡。

    Linux对移动存储设备的支持

    Linux对移动存储设备的支持十分全面,任何符合串行总线协议标准的存储设备都可以在Linux系统环境下使用。

    支持移动存储设备的内核需要具备下列功能:

    ◆ 支持SCSI功能;

    ◆ 可以进行SCSI模拟;

    ◆ 支持SCSI硬盘。

    此外,根据不同的传输标准,还需要具备下列功能:

    1.对于FireWire标准

    ◆ 支持IEEE1394;

    ◆ 支持OHCI1394;

    ◆ 支持RAW1394;

    ◆ 支持SBP-2。

    2.对于USB标准

    ◆ 支持USB;

    ◆ 支持OHCI;

    ◆ 支持UHCI;

    ◆ 支持USB大容量存储技术。

    在移动存储设备上安装Linux

    移动存储设备装备好后,便可以着手进行系统安装。最简单的方法是将所有的硬件都连接起来,然后使用Linux系统安装盘启动计算机进行安装。

    以Gentoo Linux系统为例,使用最新的“通用”x86安装光盘进行安装。系统启动后,会自动识别移动存储设备,并作为一个硬盘分区显示在/dev/sdx目录下。x代表系统中外部存储设备的位置,不同的SCSI硬盘位置不同,一般是在/dev/sda目录下。如果外部存储设备没有被系统自动识别,就需要检查启动选项是否开启FireWire或PCMCIA功能;或者需要手动为系统加载一些内核模块。

    经系统识别后的外部存储设备与其它内部硬盘并无区别,可以进行任意分区,并且安装Linux系统。但必须注意引导程序(通常是GRUB或LILO)的安装位置,最好将其安装在外部存储设备的根分区中,不要将其安装在原有硬盘的主引导分区(MBR)上,而这正是缺省选项。

    Linux系统安装完毕后,便可以对它进行引导装载。

    引导装载的工作原理

    在启动外部的移动硬盘驱动器之前,需要了解引导装载程序的工作原理。

    一般情况下,引导装载程序安装在第一块硬盘的MBR上,它会列出所有可引导的操作系统供用户选择。操作系统选择选单是从硬盘加载的,为了引导相关的操作系统,引导装载程序需要从硬盘中读取相关的内核文件。这些步骤都必须在操作系统加载前完成,这意味着所有的硬盘读取必须通过BIOS调用来完成。

    由此可见,为了实现从外部存储设备引导Linux系统,BIOS必须支持FireWire或USB连接技术。支持USB技术的BIOS比比皆是,而支持FireWire技术的BIOS就比较少见。如果BIOS恰巧无法直接引导所用的FireWire 移动存储设备,可以通过系统支持的其它设备来完成前期的引导,然后再由移动存储设备继续后面的步骤。这些设备可以是软盘、光盘、USB闪存或硬盘上的一个小分区。在外部存储设备的MBR中安装GRUB后,进入BIOS设置界面,我们会发现启动盘选项中多出一个外部存储设备,将它设置于其它设备之前即可。

    引导的步骤和方法

    引导移动存储设备的方法主要有一步引导法和二步引导法两种。一步引导法是通过内核引导、加载根文件系统,并通过调用初始化程序(通常是/sbin/init)完成初始化进程。二步引导法是通过内核引导、加载一个初始的RAM盘(initrd),进一步进行可定制的初始化,然后再加载根文件系统,通过调用初始化程序完成初始化进程。下面详细介绍一下这两种方法。

    一步引导法

    使用一步引导法的前提是内核必须拥有加载根文件系统所需的所有驱动程序。最好的方法就是建立一个包含大量驱动程序的内核,并且确保其包含SCSI、PCMCIA、IEE1394和SBP等的支持模块,以及其它的一些内置功能。

    这些驱动程序和内置模块可以帮助加载外部根文件系统。除此之外的功能就需要由存储在外部存储设备根分区中的模块来实现了,比如,图形卡和网络设备的初始化等。用一步引导法进行引导时,需要将建立好的内核装入软盘,并安装一个引导程序,然后使用下列命令进行引导:

    root (fd0) 
    kernel (fd0)/boot/bzImage root=/dev/sda1



    如果以上命令无法完成引导,则可能是因为SBP使用的是模拟SCSI。模拟SCSI总线需要二次扫描才能检测到硬盘,并允许将其加载到/dev/sdax。完成二次扫描只需要两个简单的命令,但是,使用一步引导法时,在内核引导完毕之前无法执行任何命令。

    幸运的是Linux 2.4内核的一个补丁可以实现在启动时对SCSI总线进行扫描,通过应用这一补丁,内核可以在引导开始时自动检测到外部存储设备,从而不再需要进行二次扫描。

    另外,内核等待设备检测的时间过短也会造成引导无法完成。大多数情况下,根设备在未被检测或初始化前,内核便开始对其进行加载,导致引导失败。同样有一个补丁可以解决这一问题,该补丁可以使内核在启动时等待一段时间,并且允许在加载根文件系统失败时进行重试,这段时间里系统可以完成对外部移动存储设备的检测和识别。

    由此可见,一步引导法需要给内核打两个补丁。这对于未加任何修改的新内核很容易,但是对于修改后的内核而言,这两个补丁很可能与其它修改发生冲突,这是一个令人头疼的问题。

    二步引导法

    2.0.x版本的内核拥有一项很有趣的功能——它可以使用一个初始RAM盘来进行二步引导。简而言之,内核正常地被引导,但它并没有加载真正的根文件系统,而是先在RAM盘中建立了一个根文件系统的雏型,并加载该系统雏型。

    这样,在加载真正的根文件系统前,加载过程中的各个步骤已在初始环境中完成。开始使用真正的根文件系统后,清除初始的RAM盘即可。

    这种方法适用于各种系统环境,这里利用此方法完成对SCSI总线的二次检测,内核检测到外部移动存储设备后就转至真正的根文件系统中继续进行引导。

    实现这一方法需要建立一个内核和一个initrd镜像。内核需要支持initrd,另外,还需要加载合适的模块来支持外部移动存储设备。如果内核已经能够支指髦滞獠恳贫娲⒓际酰筒恍枰釉馗媚?榱恕?BR>
    initrd则是一个回送文件系统的镜像,它包含根文件系统的雏型。initrd镜像中有一个linuxrc文件,它必须是可执行文件,在initrd加载时执行所要完成的任务。代码如下所示:

    #!/bin/sh
    REAL_ROOT=/dev/sda1
    # mount the /proc filesystem
    mount -t proc none /proc
    
    #for scsi-emulation
    # modprobe sd_mod
    
    
    #for pcmcia
    # modprobe pcmcia_core
    
    #for FireWire
    # modprobe ieee1394
    # modprobe ohci1394
    # modprobe raw1394
    # modprobe sbp2
    
    #for USB
    # modprobe usbcore
    # modprobe ohci-hcd
    # modprobe uhci-hcd
    # modprobe usb-storage
    
    # loop rescanning the scsi bus + rerunning devfsd
    retries=5
    i=1
    until [ -e $REAL_ROOT ]
    do
      if [ $i -gt $retries ]
      then
         echo "Unable to mount real root ($REAL_ROOT) - Giving up!"
         /bin/ash
         exit
      fi
    
      echo "Real root ($REAL_ROOT) not found, retrying ($i)"
      sleep 1
      echo "scsi add-single-device 0 0 0" > /proc/scsi/scsi
      echo "scsi add-single-device 1 0 0" > /proc/scsi/scsi
      echo "scsi add-single-device 2 0 0" > /proc/scsi/scsi
      /bin/devfsd /dev -np
      i=$((i+1))
    done
    
    #umount /proc as it will be remounted by the normal init process
    umount /proc
    
    #now we simply exit, and the normal boot process should continue
    exit 0


    接下来把其它相关的文件也复制到initrd镜像中,注意,确保initrd镜像中包含linuxrc文件、需要的所有命令,以及命令需要的所有库文件等要素。

    将内核(bzImage)和initrd镜像(initrd.gz)复制到软盘中。最后,在软盘中安装一个引导程序,并使用下列命令对内核进行引导:

    kernel bzImage root=/dev/sda1 initrd=initrd.gz.



    使用软盘启动系统将首先加载软盘中的内核,然后将initrd镜像装入RAM盘,接下来将是对SCSI总线进行扫描,直到检测到移动存储设备为止。

    移动存储设备一般显示为/dev/sda1,如果还有其它SCSI设备或模拟SCSI设备,则可能显示为/dev/sdb1。

    如果没有使用外部存储设备的第一个分区进行安装,则显示结果的最后一位数字会有变化,比

    如,/dev/sda2等。

    移动存储设备被识别后继续正常的启动,这时,软盘就没有用了。

    如果电脑没有软驱,也可以使用其它BIOS支持的外部存储设备进行引导,比如,闪存或原有硬盘中的一个小分区等。

    小结

    使用移动存储设备是在原有硬件基础上增加硬盘空间的最优手段,通过上面的介绍,我们知道了它还能在不更换内部硬盘的前提下安装新的Linux系统,让Linux系统也可以“随身携带”。