建立USB启动盘
建立 USB 启动盘
-- 基于 Fedora Core 5
前言:
本文是建立在 <Beyond Linux From Scratch: 版本 20030629> 建立定制的启动盘章节 . 本来是打算在刚做好的 LFS 系统上建立 USB 启动盘 . 后来由于 LFS 缺少一些工具 , 以及为 LFS 定制的 Kernel 中没有选择支持 Initrd 和 Ramdisk. 所以退而求其次在本来的 fedora core 5 上建立 USB 启动盘 .
基于这次的经验和对 LFS 的更多摸索 , 将在以后实现最初的目的 .
目标:
我们将制作一个USB 启动盘, 并且附带一些基本的命令和功能. 在电脑不能正常开机的时候能用这只启动盘开机并做分析和修复.
关键词:
USB 启动盘 ,Fedora Core 5, Initrd, Ramdisk, Cpio, Busybox, SYSLINUX
流程:
Initrd 的类型选择:
2.6 内核支持两种格式的initrd, 分别是image 和cpio. 两种的区别和优缺点将不详细描述. 两者在制造方法上是有些区别的. 由于Fedora Core 5 使用的cpio 格式的, 所以笔者选择了这种格式.
USB Disk 的选择和准备:
我们选择的USB 必须是支持开机的, 大小目前只要能放下Kernel 和Initrd 文件就好了. 如果希望USB 启动盘拥有更多的功能就最好越大越好了.
关于USB Disk 是否支持开机, 笔者的经验是使用”fdisk –l” 命令, 然后看USB 设备 Boot 这个栏位有没有”*” 号.
fdisk –l Device Boot Start End … /dev/sda1 * … |
可以使用fdisk 命令创建删除USB Disk 上的分区, 然后再使用mkfs.vfat 将usb 格式化fat32 格式的.
Mkfs.vfat 在不同的平台上可能有不同的名称. 比如mkdosfs 等.
mkfs.vfat /dev/sda1 mkdosfs –F32 /dev/sda1 |
至此我们就准备好了一枝可以开机的USB Disk. 当然要想实现从USB 开机, 你的电脑BIOS 也要支持才可以. 可以从BIOS 开机顺序里面看看, 是否有USB 相关的东西. 最新的电脑都是能支持的. 笔者就是选择了”usb storage”
准备Initrd:
有许多资料介绍cpio 的initrd 是如何制作的. 由于Fedora Core 5 提供了一个制作initrd 的工具. 叫做mkinitrd. 这个工具其实就是一个script 文档, 作用就是根据你目前系统的环境(kernel, modules 等) 制作一个initrd. mkinitrd 需要指定当前使用的内核版本号.initrd 的本质是一个gzip 的压缩文档, 后缀名是可以随便的.
mkinitrd initrd.img `uname –r` |
关于initrd 的作用原理我这里就不详述了. 使用这个工具, 我们将创建的initrd 是根据当前环境的. 也就是说会设定好根目录( 即开机的分区信息), 安装引导分区需要的modules 等等. 我们制作的usb 启动盘将包含一些用于修复和分析的工具. 所以下面是对自动生成的进行修改的.
解压( 压缩)initrd 文件:
我们需要对生成的initrd 文件进行修改, 首先要将之解压. 我们先基本介绍一些其压缩和解压的过程.
制作一个cpio 的initrd 过程.
cd /tmp/initrd/ |
解压的过程
mkdir initrd mv ../initrd-XXX.img ../initrd-XXX.gz gunzip initrd-XXX.gz |
这样我们就可以把刚才生成的initrd 文件解压出来了. 在目标文档中我们将发现这样一些目录, 文件
bin dev etc init lib proc sbin sys sysroot |
修改initrd:
我们修改initrd 有三个事情需要做:
1. 确保Kernel 中usb 驱动加载完毕并且初始化正确.
好多资料中都将用usb 做启动盘必须要有initrd, 原因就是说什么usb 设备初始化比较慢, 没有initrd, kernel 完了进入rootfs 的时候,usb 设备还没有准备好. 所以我们在initrd 的中加入等待时间, 避免这种情况发生.( 虽然笔者没有加入等待也能正常启动, 可能是两种initrd 的不同吧…)
修改init 文件, 在script 的开始加入:
echo 'wait 3 seconds.....' |
2. 修改默认的init 流程, 不让其mount 硬盘.
分析init 我们知道在其最后将加载ext3 模块, 将根目录切换到硬盘上. 我们可以在这进行修改. 由于我们的目标是启动盘外加基本的功能. 所以我们把所用功能的实现都放在initrd 之中. 在这我们不希望切换rootfs. 当然如果读者需要制作一个usb 的系统, 那么把需要的root file 放入usb 就好了.
当然一定会有其他的动作, 以后也许会做一做.
现在只要将init 中”switch root” 给mark 就好了, 并指定最终使用的shell.
#switchroot /bin/sh |
3. 添加Busybox 和其他的工具.
我们知道initrd 中的nash 包括一些基本的内嵌命令.init 中除了我们后添的, 其余的命令都是由其提供的. 那么我使用的比如sleep 还有sh 就是由Busybox 提供的了.
Busybox 的作用和原理以使用方法我就不说了. 注意点就上一定要选择编译成静态的, 还有能有的命令都选上吧, 反正不大…. 将编译好的busybox 放在bin 下, 那么只要选择进去的命令就都可以调用了.
如果Busybox 中的命令还不够你的需要, 就直接copy 本机环境中的吧, 不过别忘了使用ldd 把对应的动态连接库复制到lib 下.
还有initrd 中modules 的问题, 打开lib 我们发现其中的至少会有ext3 的驱动. 因为笔者的硬盘是ext3 的嘛! 如果你希望你usb 启动盘能支持更多的file system 或则其他硬件设备, 把需要的驱动也复制过来吧. 不过需要在使用的时候自己加载哦! 可能还要自己创建其设备文件. 好像busybox 就有makedev 的哦!
好了, 我们的修改动作就完成的, 再按照压缩的步骤做成initrd.img 的格式吧.
将文件写到USB:
现在我们把系统中的kernel, 刚做好的initrd 复制到U 盘中吧. 注意不要把名字弄的太长, 应为我们使用的Loader 是syslinux, 好像它不怎么支持长文件名哦. 为了符号syslinux, 就都放在usb 的根目录下.
cp /boot/vmlinuz-XXXX /mnt/usb/vmlinuz cp /../initrd-usb.img /mnt/usb/initrd.img |
配置syslinux 的设置档:
在我们这次试验中使用的loader 是syslinux. 我的系统中默认上安装的, 如果你没有就安装一下好了.
配置文档的名字是slinux.cfg 其各个字段的写法如下( 类似与grub,lilo)
DISPLAY xxx.txt
这指定了一个文件名,会在启动的时候显示的内容,该文件甚至可以包含一个 RLE 编码的图形 文件,也就是大家在安装光盘启动时看到的那个;不过这个字段不甚重要,我们就略过了。
DEFAULT linux
指定 label 是 linux 的启动选项为缺省,当然也可以是别的。
LABEL linux
kernel vmlinuz
append initrd=initrd26.gz ramdisk_size=1000000 vga=791
这就是一个启动描述,前面的 label 大家都认识了,之后分别是指定 kernel 和内核参数,其中重要的参数就是 initrd= 指定 initrd 的文件和 ramdisk_size= 指定 initrd 的尺寸上限。其余的内核参数还可能有很多,不过这里的参数我们一般都可以抄过来。这样的启动选项描述是可以有若干个的。
PROMPT=1
这是说,向用户提示输入选择,直接回车就是缺省选项了
TIMEOUT=0
没有时间限制,当然也可以指定一定时间之后自动进入缺省选项。
这个是笔者的配置档, 配置档同样放在usb 的根目录下.
TIMEOUT=5 DEFAULT usb_boot LABEL usb_boot kernel vmlinuz append initrd=initrd.img |
安装 SYSLINUX:
执行下面操作之前,必须 umount U 盘!
安装syslinux, 也就是安装引导区, 可以使用以下的指令:
syslinux /dev/sda1 |
结束:
到此, 我们的usb 启动盘就做好了. 重启一下试试吧. 呵呵, 如果大家有什么意见或则问题都要提出来哦. 我是菜鸟, 上面的文章只是我在试验中的一些记录, 肯定还有很多不足和需要改进的. 大家的回复才是我不断改进的动力!