建立定制的启动盘

如何建立一个合理的启动盘

我们在这里将制作一个系统恢复盘,好比windows的启动盘,它将具备足够的linux功能使你可以进行对系统的修复工作。 你将可以进行文件操作,挂载卸载文件系统和其他的一些工作。当然不仅仅是这些,你可以加入任何你想要的并且可以放在一个软盘里面的程序。

启动盘/系统恢复盘

首先我们要建立一个回送(loopback)文件,在此基础上来制作一个恢复盘的磁盘映像。然后我们要在这个映像文件上建立一个文件系统。接着用mount像 挂载普通的磁盘一样将这个文件挂载到一个目录,这样我们就可以在这个映像文件里面读写文件。下面的命令建立了一个4M的映像。

dd if=/dev/zero of=/tmp/rfloppy bs=1k count=4096 &&
mke2fs -m 0 -N 2000 /tmp/rfloppy &&
mount -o loop /tmp/rfloppy /mnt/loop1 &&
rmdir /mnt/loop1/lost+found/

现在我们已经有了一个可以挂载的文件了。然后就要在里面加入我们需要的内容。因为只是一张系统恢复盘,我们只用建立最基本的一些目录。

mkdir /mnt/loop1/{dev,proc,etc,sbin,bin,lib,mnt,usr,var}

然后我们建立设备文件。我在我的系统中使用了devfs,所以接下来的命令工作的很好,因为我指需要我用的设备。如果你用MAKEDEV来建立你的设备文件,你将必须 去掉那些你不会用到的设备,来争取更多的磁盘空间。

cp -dpR /dev/* /mnt/loop1/dev

现在来建立/etc目录。一开始,我们要使用我们建立LFS时静态的chroot环境下的passwd和group文件。同时也要拷贝一些启动脚本过来,还有一些 在启动时候将要用到的文件。

cp -ax /etc/rc* /mnt/loop1/etc
cp -ax /etc/fstab /mnt/loop1/etc
echo "root:x:0:0:root:/root:/bin/bash" > /mnt/loop1/etc/passwd
cat > /mnt/loop1/etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
EOF

为了防止自动加载硬盘分区。注意要确定fstab里面的每一个硬盘条目都被注明noauto。同时加入条目来加载软盘和内存映像。

/dev/ram0       /               ext2    defaults
/dev/fd0        /               ext2    defaults

然后我们要在映像上安装busybox Busybox 是一个将很多*nix操作集于一身的一个很小的可执行文件。

make &&
make PREFIX=/mnt/loop1 install &&
cp -ax /var/utmp /mnt/loop1/var &&
mkdir /mnt/loop1/var/log

然后,在空间允许的情况下拷贝一些你想要的程序和库文件到映像里。使用ldd命令 来查看运行某一程序需要的库文件。

好了,我们已经使用了devfs在软盘上建立设备文件并且节省了宝贵的空间。但是我们需要安装devfsd来帮助busybox找到它需要的设备。

mv GNUmakefile Makefile &&
make &&
make PREFIX=/mnt/loop1 install &&
cp /lib/libc.so.6 /lib/ld-linux.so.2 /lib/libdl.so.2 /tmp &/&
strip --strip-deb /tmp/ld-linux.so.2 /tmp/libc.so.6 /tmp/libdl.so.2 &&
mv /tmp/ld-linux.so.2 /tmp/libc.so.6 /tmp/libdl.so.2 /mnt/loop1/lib/

我们还需要建立一个rc脚本来在启动的时候对devfsd进行操作。在 /mnt/loop1/etc/init.d/rcS中加入:

#!/bin/sh
mount -t devfs devfs /dev
/sbin/devfsd /dev

接下来,建立一个压缩的根(root)文件系统。使用-9参数来让gzip产生尽可能小的压缩映像。

umount /mnt/loop1 && dd if=/tmp/rfloppy bs=1k | gzip -v9 > rootfs.gz
ls -l rootfs.gz 确定它放在磁盘上了。

建立一个体积优化的定制内核。在其中包括所有你恢复系统需要的功能。编译一个支持xfree86 dri的内核是没有意义的,因为几乎所有的恢复工作都是在命令行模式下进行的。

dd if=rescueimg of=/dev/floppy/0 bs=1k
        429+1 records in
        429+1 records out
rdev /dev/floppy/0 /dev/floppy/0
rdev -R /dev/floppy/0 0

在这个例子里面,内核有429+1个块大小。为了执行下一个命令我们要记住这个。紧跟着内核我们要写入根文件系统。16384+429+1= 16814

rdev -r /dev/floppy/0 16814
dd if=rootfs.gz of=/dev/floppy/0 bs=1k seek=430

这个命令用来检查内核的结束为止并在软盘上写入根文件系统。