如何建立一个合理的启动盘
我们在这里将制作一个系统恢复盘,好比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 |
这个命令用来检查内核的结束为止并在软盘上写入根文件系统。