3.3. 构建

本节使用 ramdisk seven (/dev/ram7) 来构建根镜像。ramdisk seven 并没有什么特别之处,只要它们没有被使用,也可以使用任何其他可用的 ramdisk。

3.3.1. 创建一个 ramdisk

bash# dd if=/dev/zero of=/dev/ram7 bs=1k count=4096
bash# mke2fs -m0 /dev/ram7 4096
bash# mount /dev/ram7 /mnt

3.3.2. 重建 BASH shell

bash# cd /usr/src/bash-3.0
bash# make distclean
bash# export CC="gcc -mcpu=i386"
bash# ./configure --enable-minimal-config --host=i386-pc-linux-gnu
bash# make
bash# strip bash

3.3.3. 确定所需的库

bash# ldd bash

查看 ldd 命令的输出。它应该看起来类似于下面的示例。

bash# ldd bash
  libdl.so.2 => /lib/libdl.so.2 (0x4001d000)
  libc.so.6 => /lib/libc.so.6 (0x40020000)
  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Note

有些系统的库设置可能略有不同。 例如,您可能会看到libc.so.6 => /lib/tls/libc.so.6而不是libc.so.6 => /lib/libc.so.6如示例所示。 如果您的 ldd 输出与示例不符,请在完成下一步时使用您的 ldd 命令给出的路径。

3.3.4. 将 BASH 及其库复制到 ramdisk

bash# mkdir /mnt/bin
bash# cp bash /mnt/bin
bash# ln -s bash /mnt/bin/sh
bash# mkdir /mnt/lib
bash# strip --strip-unneeded -o /mnt/lib/libdl.so.2 /lib/libdl.so.2
bash# strip --strip-unneeded -o /mnt/lib/libc.so.6 /lib/libc.so.6
bash# strip --strip-unneeded -o /mnt/lib/ld-linux.so.2 /lib/ld-linux.so.2
bash# chmod +x /mnt/lib/ld-linux.so.2

Note

使用 strip -o 似乎是一种将库文件从开发系统复制到 ramdisk 的奇怪方式。 它的作用是在文件从源位置传输到目标位置时剥离符号。 这具有剥离 ramdisk 上库的符号的效果,而不会更改开发系统上的库。 不幸的是,以这种方式复制库时会丢失文件权限,这就是之后使用 chmod +x 命令来设置 rootdisk 的动态加载器的执行标志的原因。

3.3.5. 创建一个控制台设备

bash# mkdir /mnt/dev
bash# mknod /mnt/dev/console c 5 1

3.3.6. 压缩 ramdisk 镜像

bash# cd /
bash# umount /dev/ram7
bash# dd if=/dev/ram7 of=~/phase2-image bs=1k count=4096
bash# gzip -9 ~/phase2-image

3.3.7. 将压缩的镜像复制到软盘

将标有“root disk”的软盘插入驱动器 fd0。

bash# dd if=~/phase2-image.gz of=/dev/fd0 bs=1k