4.3. 施工

与其直接将文件复制到 ramdisk,不如设置一个暂存区来简化操作。暂存区将为我们提供工作空间,而无需担心 ramdisk 的空间限制。它还将提供一种保存工作的方法,并使在项目后续阶段增强 rootdisk 变得更加容易。

暂存过程将如下所示

  1. 按照 FHS 中的定义创建目录结构。

  2. 从第 2 阶段的 root 磁盘复制文件。

  3. 从源代码构建新软件包。

  4. 将文件安装到正确的 FHS 目录中。

  5. 剥离二进制文件以节省空间。

  6. 检查库依赖项。

  7. 将整个目录结构复制到 ramdisk。

  8. 压缩 ramdisk 并将其写入软盘。

4.3.1. 创建暂存区

bash# mkdir ~/staging
bash# cd ~/staging
bash# mkdir bin boot dev etc home lib mnt opt proc root sbin tmp usr var
bash# mkdir var/log var/run

4.3.2. 复制第 2 阶段 root 磁盘的内容

bash# dd if=~/phase2-image.gz | gunzip -c > /dev/ram7
bash# mount /dev/ram7 /mnt
bash# cp -dpR /mnt/* ~/staging
bash# umount /dev/ram7
bash# rmdir ~/staging/lost+found

4.3.3. 从 GNU coreutils 安装二进制文件

ftp://ftp.gnu.org/gnu/coreutils/ 下载最新版本的 coreutils

bash# cd /usr/src/coreutils-5.2.1
bash# export CC="gcc -mcpu=i386"
bash# ./configure --host=i386-pc-linux-gnu
bash# make
bash# cd src
bash# cp cat chgrp chmod chown cp date dd df ~/staging/bin
bash# cp hostname ln ls mkdir mkfifo mknod ~/staging/bin
bash# cp mv rm rmdir stty su sync uname ~/staging/bin

4.3.4. 复制其他库

通过在一些新的二进制文件上使用 ldd 来检查库要求。

bash# ldd ~/staging/bin/cat
bash# ldd ~/staging/bin/ls
bash# ldd ~/staging/bin/su
bash# ls ~/staging/lib

注意所需的库与暂存区中存在的库之间的差异(分别由 ldd 命令和 ls 命令显示),然后将任何缺少的库复制到暂存区。

bash# cp /lib/librt.so.1 ~/staging/lib
bash# cp /lib/libpthread.so.0 ~/staging/lib
bash# cp /lib/libcrypt.so.1 ~/staging/lib

4.3.5. 剥离二进制文件和库

bash# strip ~/staging/bin/*
bash# strip --strip-unneeded ~/staging/lib/*

4.3.6. 创建压缩的 root 磁盘镜像

bash# cd /
bash# dd if=/dev/zero of=/dev/ram7 bs=1k count=4096
bash# mke2fs -m0 /dev/ram7 4096
bash# mount /dev/ram7 /mnt
bash# cp -dpR ~/staging/* /mnt
bash# umount /dev/ram7
bash# dd if=/dev/ram7 of=~/phase3-image bs=1k count=4096
bash# gzip -9 ~/phase3-image

Note

创建压缩的 root 磁盘镜像的过程在剩余的章节中变化很小。编写一个小的脚本来处理此功能可以节省大量时间。

4.3.7. 将 root 磁盘镜像写入软盘

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

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