科技进步到今天,软驱开始慢慢退出市场,取而代之的是优盘。优盘和软盘相比,不但在容量上要大很多,而且在速度上也快了许多。以往建在软盘上的Linux
由于受限于1.4MB的容量,所以多数被用来做小型路由器、防火墙之类的应用。而今天有了几十MB、几百MB甚至上GB的优盘后,就完全可以提供小型的
HTTP、邮件等需要更大存储空间的服务了。想想看用户只要把这个特制的优盘插入电脑的USB接口,就可以启动一个小型的Linux系统。这个系统已经有了路由、HTTP和邮件等功能,只需快速设置一下IP等参数就可以开始工作了。这就相当于用户随身带着一台Linux服务器,方便极了。
要制作优盘Linux,首先在硬件上要满足以下条件:
1.优盘带有启动功能;
2.主板支持USB设备启动(如USBZip启动)。
有了合适的硬件条件后,用户就可以开始动手制作优盘Linux了。以下所有工作都在Linux环境下完成,笔者的软硬件环境如下:
软件环境:Federa
Linux 1.0,系统采用GRUB做引导程序;
硬件环境:P42.0GHz、主板Intel
845、内存512MB、两个80GB硬盘(hda、hdb)和带启动功能的128MB优盘。
下面就开始介绍优盘Linux的制作过程。
分区和格式化
首先,将已经设置为带启动功能的优盘插入USB接口,使用下面的命令对其进行分区和格式化:
# fdisk /dev/sda
其中/dev/sda设备指用户的优盘。如果用户的机器中还有其它的SCSI设备,那么可能是/dev/sdb等。用户使用“fdisk”删除优盘原来的所有分区,并将128MB的空间都分成一个Linux基本分区。接下来用户要将其格式化为Ext2文件系统,可以使用以下命令:
#
mkfs.ext2 /dev/sda1
安装GRUB
有了已经格式化好的Ext2的文件系统,接下来用户就可以在这个文件系统上安装Linux的引导程序GRUB了。
首先,要将格式化好的优盘上的文件系统挂载到当前的Linux系统中。命令如下:
# mount /dev/sda1 /usb
接着,要建立GRUB所需要的目录,并将当前使用的Linux系统中的GRUB相关文件(/boot/grub/目录下的stage1和stage2)复制到优盘的/usb/boot/grub下。命令如下:
# mkdir /usb # mkdir /usb/boot # mkdir /usb/boot/grub # cp /boot/grub/stage* /usb/boot/grub/ |
然后,使用“grub”命令将GRUB引导程序安装在优盘上。具体可以参考如下:
grub> root (hd2,0) Filesystem type is ext2fs, partition type 0x83
grub> setup (hd2) Checking if “/boot/grub/stage1” exists... yes Checking if“/boot/grub/stage2”exists... yes Checking if“/boot/grub/e2fs_stage1_5”exists... no Running“install /boot/grub/stage1 (hd2) /boot/ grub/stage2 p /boot/grub/grub.conf”... succeeded Done.
grub>quit |
上面操作中的像“(hd2)”这样的参数可能随用户机器的硬盘数量和分布情况的差异会有所不同。在安装完GRUB后,还要对其进行配置。用户在优盘的/usr/boot/grub目录下创建grub.conf文件,命令如下:
#
vi /usb/boot/grub/grub.conf
grub.conf文件的内容如下:
default=0 timeout=10 title My USB Linux root (hd0,0) kernel /vmlinuz |
保存退出,GRUB配置完成。此时可以测试用优盘启动机器,会看到GRUB的启动画面和选项“My
USB Linux”了。
注意在测试优盘启动时,将两个硬盘的电源线都要拔掉,因为在上面的grub.conf中设定的根分区是hd0。
编译内核
首先用户要根据用途考虑使用哪一个版本的内核。比如要使用Iptables来建立防火墙,那就一定要选择2.4以上的版本。但要记住,版本并不是越高越好。选定内核的版本后,从kernel.org上下载对应的源码。在动手配置内核之前,还要对内核的源码做一个小小的修改。从内核的源码树中找到init目录下的do_mounts.c文件,请根据自己的源码版本做类似下面的修改:
* Allow the user to distinguish between failed open * and bad superblock on root device. */ - printk (“VFS: Cannot open root device“%s”or %s”, + printk (“VFS: Cannot open root device“%s”or %s”, retrying in 1 second.", root_device_name, kdevname (ROOT_DEV)); - printk (“Please append a correct “root=”boot option”); - panic(“VFS: Unable to mount root fs on %s”, - kdevname(ROOT_DEV)); + printk (“You may need to append a correct“root=”boot option”); + printk (“or wait for the root device to become ready.”); + + /* wait 1 second and try again, + * allowing time for hubs/devices to become ready */ + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ); + goto retry; ) panic(“VFS: Unable to mount root fs on %s”, kdevname(ROOT_DEV)); |
做这一步修改是考虑到,通常在Linux启动过程中,内核解压运行完成后,会加载root分区,然后执行root分区上的init脚本。当用户使用硬盘时,硬盘的初始化速度很快。在内核运行完成之前,因为硬盘已经准备就绪了,所以内核可以顺利加载硬盘上的root分区。然而优盘初始化速度要比硬盘慢多了。这样就会出现内核启动完成后,因优盘还没有完成初始化而导致root分区无法被加载的现象。所以要想使用优盘启动Linux就需要延长内核加载root分区的等待时间,办法就是对系统内核初始化代码do_mounts.c作类似上面的修改。
当然还有其它的解决办法,比如在内核启动时,先将一个临时的root分区设在RAM
disk上,然后等待几秒钟,在优盘差不多初始化完成后再继续启动。这种方法就要选上对“RAM
disk”的支持,而且还要修改initrd.img文件等。所以除非用户想同时用RAM
disk做一些其它的用途(如运行特定程序或加载其它的驱动),否则就不建议使用这种方法。
在完成源码的修改后,就可以开始配置内核了。在配置过程中将所有需要的功能和驱动都编译进内核中去。注意要将一些不必要的模块去掉,比如声卡和显卡驱动等。还要特别注意对网络方面的支持要广泛一些,要尽量将可能遇到的网卡的驱动编译进内核。
常见的USB芯片类型有EHCI、OHCI和UHCI三种。因为对于常见的PC机主板来说一般使用的是UHCI芯片的USB控制器,所以在USB设备的配置中,要对应的选上对“UHCI
Alternate Driver (JE) support”的支持。另外,还要选上“Preliminary USB device
filesystem”。因为在Linux中,优盘等类似设备都是被模拟成SCSI硬盘而进行访问。以下是执行“make
menuconfig”命令配置内核时关于USB的选项实例,可供参考:
<*> Support for USB [ ] USB verbose debug messages --- Miscellaneous USB options [*] Preliminary USB device filesystem --- USB Host Controller Drivers <*> UHCI Alternate Driver (JE) support < > OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support --- USB Device Class drivers <*> USB Mass Storage support [ ] USB Mass Storage verbose debug [ ] Freecom USB/ATAPI Bridge support [ ] ISD-200 USB/ATA Bridge support [ ] Microtech CompactFlash/SmartMedia support |
细心完成内核配置后,最后就是编译内核了。内核的编译方法大家应该很熟悉了,通常是使用“make
mrproper”、“make menuconfig”、“make dep”、“make clean”和“make bzImage”等指令来编译。
编译完成后,新的内核就是arch/i386/boot/目录中的bzImage文件,将其复制到优盘上,命名如下:
# cp
arch/i386/boot/bzImage /usb/vmlinuz
编译成功的内核通常不会超过1MB。在实际制作优盘Linux的过程中,定制内核是非常关键的。很多人失败在这个地方。通常要多次尝试,才能生成适合的内核。
目录和文件
内核启动后,要加载root文件系统。在Linux中,root文件系统中包含了系统必须的目录、设备文件、可执行文件和配置文件等。
首先创建系统必需的目录,示意如下:
# mkdir bin etc etc/rc.d proc tmp var dev mnt # chmod 755 bin etc etc/rc.d tmp var dev mnt # chmod 555 proc |
接着要用“mknod”命令在dev目录下建立一些基本的设备文件,不可从原系统/dev目录中复制。具体请参考下列实例命令:
# cd dev # mknod tty c 5 0 # mknod console c 5 1 # chmod 666 tty console # mknod tty0 c 4 0 # chmod 666 tty0 # mknod ram0 b 1 0 # chmod 600 ram0 |
然后生成一些常用命令和工具,比如sh、ls、cd和ifconfig等。用户可以使用原来系统中的这些命令,不过要对应地将其所用到的动态连接库也复制到优盘上,或者是重新进行静态编译,然后将二进制文件复制到优盘上。这些过程都不轻松,如果想研究Linux,或者是想在优盘Linux上使用Glibc的话,可以自己动手来做一下。对于大多数人,可以使用BusyBox工具箱来做这件事。BusyBox提供了一个很小的可执行程序busybox。用户通过链接它可以为系统提供ls、rm、cp和init等多种命令。busybox的安装过程很简单。在Fedora
Linux中已经自带,用户也可以自行下载源码来编译安装。安装完后,可以将busybox产生的文件复制到优盘中,具体可以参考其官方网站 http://
上的说明。
最后,还要建立一些配置文件,比如/etc/rc.d/inittab、/etc/rc.d/rc.sysinit和/etc/fstab等。下面是这几个文件的简单实例,仅供参考:
1./etc/rc.d/inittab ::sysinit:/etc/rc.d/rc.sysinit ::askfirst:/bin/sh
2./etc/rc.d/rc.sysinit #!/bin/sh mount -a
3./etc/fstab proc /proc proc defaults 0 0 |
完成上面这些工作之后,就可以测试这个小型的优盘Linux了。
在启动时,先是GRUB引导,接下来就是内核解压和初始化,然后调用/sbin/init,由init来调用/etc/inittab中的各种程序运行(比如加挂各种分区等),最后在console上启动一个Shell程序,这样就完成了启动。如果在启动中遇到问题,还要反复进行修改和测试,这中间的过程就要靠自己去摸索了。
优盘Linux的应用
创建和定制完Linux系统所需的目录结构和文件之后,就已经完成了一个小型的Linux系统了。这个小型的Linux系统主要可以有以下几个方面的应用。
做为应急盘 当Linux系统故障时,可以用这个优盘启动系统,然后将原系统的硬盘挂进文件系统,进行诊断和修复。盘中可以放入一些常用的诊断工具和软件。
提供应用服务 此时这个小型的Linux系统本身已经可以提供路由和防火墙等功能了。不过用户还可以加入其它的应用服务,这要视用户自己的需要而定。比如一个Web开发人员,可以装上MySQL、Apache、PHP和CVS等服务。这些服务可以先在其它的Linux上静态编译好,然后将其复制到优盘上。
其它 优盘还可以有其它的用途,比如作为密匙盘,为Linux的启动或应用程序提供访问控制认证等。(T111)
阅读(1100) | 评论(0) | 转发(0) |