R=/root/make-3.81/ &&
tar -xf make-3.81.tar.bz2 && cd make-3.81 &&
./configure --prefix=/usr --sbindir=/usr/bin --disable-nls --disable-rpath --enable-largefile --enable-job-server --without-libiconv-prefix --without-libintl-prefix &&
make && make check &&
make install && make install DESTDIR=$R &&
cd $SRC && rm */ &&
echo '29-make' >> $SRC/build.log && sync &&Patch
R=/root/patch-2.5.4/ &&
tar -xf patch-2.5.4.tar.gz && cd patch-2.5.4 &&
sed -r -i 's:/bin/(mkdir|rmdir):\1:g' {mkdir,rmdir}.c &&
./configure --prefix=/usr --sbindir=/usr/bin --enable-largefile &&
make && make install &&
make install prefix=$R/usr/ sbindir=$R/usr/bin/ &&
cd $SRC && rm */ &&
echo '30-patch' >> $SRC/build.log && sync &&Psmisc

因为 Psmisc 默认的 configure 依赖于C++编译器,而实际上编译过程并不需要C++编译器,所以这里要重新生成一个不依赖于C++编译器的 configure 。

R=/root/psmisc-22.6/ &&
tar -xf psmisc-22.6.tar.gz && cd psmisc-22.6 &&
sed -i 's:<curses.h>:<ncurses.h>:' src/pstree.c &&
sed -i -e's/ncurses/ncursesw/g' -e'/AC_PROG_CXX/d' configure.ac &&
autoconf --force &&
./configure --prefix=/usr --sbindir=/usr/bin --disable-selinux --disable-ipv6 --disable-nls --disable-rpath --enable-largefile --without-libiconv-prefix --without-libintl-prefix &&
make &&
make install            && ln -sf killall   /usr/bin/pidof &&
make install DESTDIR=$R && ln -sf killall $R/usr/bin/pidof &&
cd $SRC && rm */ &&
echo '31-psmisc' >> $SRC/build.log && sync &&Tar
R=/root/tar-1.19/ &&
tar -xf tar-1.19.tar.bz2 && cd tar-1.19 &&
sed -i 's:/bin/rmdir:rmdir:g' lib/rmdir.c &&
./configure --prefix=/usr --sbindir=/usr/bin --enable-largefile --disable-rpath --disable-nls --disable-backup-scripts --without-included-regex --without-libiconv-prefix --without-libintl-prefix &&
make && make check &&
make install && make install DESTDIR=$R &&
cd $SRC && rm */ &&
echo '32-tar' >> $SRC/build.log && sync &&Util-linux-ng

SUID_CFLAGS 和 SUID_LDFLAGS 用于定义几个带有 suid 位的程序(chfn, chsh, newgrp, write, mount, umount)的编译选项,出于安全考虑,这里使用了”-fpie”和”-pie”编译选项。这个包硬编码了”/bin/{login,umount}”路径,由于这个硬编码还算合理,因此未作改动,如果你要改动的话,请查看源码树下的 include/pathnames.h 文件。由于本文将使用此包中的 simpleinit 而不是 Sysvinit 中的 init ,因此 /etc/inittab 的语法有所不同。

simpleinit 不但比 init 的配置简洁,而且没有所谓”运行级”的概念。更多细节可以查看simpleinit的手册页。这个包的测试程序不是通过”make check”执行的,而是通过tests子目录中的run.sh脚本执行的,不过这里的测试程序仅供开发者使用,切勿用于生产系统!具体细节请看 tests/README 文件。

R=/root/util-linux-ng-2.13.1/ && mkdir {,$R}/{bin,etc/init.d} &&
tar -xf util-linux-ng-2.13.1.tar.bz2 && cd util-linux-ng-2.13.1 &&
sed -i 's:/sbin:/bin:g' include/pathnames.h disk-utils/mkfs.c mount/{,u}mount.c login-utils/shutdown.c tests/{,expected}/ts-mount-special &&
sed -i 's:-lncurses:-lncursesw:g' {fdisk,misc-utils,text-utils}/Makefile.{in,am} &&
SUID_CFLAGS="$CFLAGS -fpie" SUID_LDFLAGS="$LDFLAGS -pie"  \
./configure --prefix=/usr --bindir=/usr/bin --sbindir=/usr/bin --enable-largefile --disable-nls --disable-rpath --disable-arch --enable-agetty --disable-cramfs --disable-elvtune --enable-init --disable-kill --enable-last --enable-mesg --disable-partx --disable-raw --enable-rdev --enable-rename --disable-reset --enable-login-utils --enable-schedutils --enable-wall --enable-write --enable-chsh-only-listed --disable-login-chown-vcs --disable-login-stat-mail --enable-pg-bell --enable-require-password --disable-use-tty-group --disable-makeinstall-chown --with-fsprobe=blkid --without-libiconv-prefix --without-libintl-prefix --without-slang --without-pam --without-selinux --without-audit &&
make install usrsbinexecdir=/usr/bin && make install DESTDIR=$R usrsbinexecdir=/usr/bin &&
mv   /usr/bin/{simpleinit,agetty,login,mount,umount,initctl,shutdown}   /bin/ &&
mv $R/usr/bin/{simpleinit,agetty,login,mount,umount,initctl,shutdown} $R/bin/ &&
echo 'bootprog=/etc/init.d/rc
INIT_PATH=/etc/init.d/
tty1:linux:/bin/agetty -iL -l/bin/login tty1 9600
tty2:linux:/bin/agetty -iL -l/bin/login tty2 9600
tty3:linux:/bin/agetty -iL -l/bin/login tty3 9600' | tee {,$R}/etc/inittab &&
echo '#!/bin/bash
/bin/shutdown -r -q now' | tee {,$R}/bin/reboot &&
touch {,$R}/etc/{nologin,securesingle,init.d/rc} &&
chmod +x {,$R}/bin/reboot {,$R}/etc/init.d/rc &&
cd $SRC && rm */ &&
sed -i 's|:/www/bin||' /etc/profile &&
export PATH=/bin:/usr/bin &&
echo '33-util-linux' >> $SRC/build.log && sync &&Linux-Kernel

为了尽可能简单,这个内核不支持initrd也不带任何动态加载模块,甚至禁用了模块加载功能。内核的编译优化参数是直接通过 CC 和 LD 传递的(而不是通常的 CFLAGS 和 LDFLAGS)。建议在修改默认值之前先用 make -qp | egrep ‘^(CC|LD|CFLAGS|LDFLAGS)’ 查看一下默认值[在本文情况下的默认值是:CC='gcc -m32' LD='ld -m elf_i386']。[提示]在 LD 中使用”-s”会导致编译失败;”V=1″将显示详细的命令。此外,由于本文作者觉得默认的”-mtune”不过瘾,所以还修改了 Makefile*.cpu 文件的内容。

更多有关内核编译的信息可以参考内核源码树下 Documentation/kbuild 目录中的内容;对于如何配置内核,可以参考《Linux 2.6.19.x 内核编译配置选项简介》。此外,《Linux Kernel in a Nutshell》也是一本不可多得的好书。[补充说明]patch-o-matic-ng是用于扩展内核Netfilter功能的模块,可以创建更强大的防火墙规则。最新的patch-o-matic-ng可以在这里下载,如果你需要可以打上这个补丁,详细说明请阅读源码树下的 README 文件。

R=/root/linux-2.6.24.2/ && mkdir $R/boot &&
tar -xf linux-2.6.24.2.tar.bz2 && cd linux-2.6.24.2 &&
make distclean &&
cp $SRC/linux-2.6.24-config.txt .config &&
make silentoldconfig ARCH=x86 &&
echo 'cflags-y += -march=athlon-xp' | tee arch/x86/Makefile*.cpu &&
make ARCH=x86 V=0 CC="gcc -m32 $CFLAGS" LD="ld -m elf_i386 $kLDFLAGS" &&
cp arch/x86/boot/bzImage   /boot/ &&
cp arch/x86/boot/bzImage $R/boot/ &&
cd $SRC && rm */ &&
echo '34-linux' >> $SRC/build.log && sync &&Sysklogd

如果你需要使用 klogd 的延时启动功能,可以去掉注释。由于本文不将内核消息转发到 syslogd ,而是由 klogd 直接记录到日志,因此无需延时启动。将”/dev/log”修改为”/dev/shm/log”是因为将来的根文件系统是只读挂载的,而syslogd会在启动的时候删除并重建此socket。有关Sysklogd的更多知识,可以参考《Sysklogd 系统日志记录器》。

R=/root/sysklogd-1.5/ && mkdir $R/{etc,bin,/var/log} &&
tar -xf sysklogd-1.5.tar.gz && cd sysklogd-1.5 &&
# sed -i '/DKLOGD_DELAY/s/^#//' Makefile &&
sed -i 's|/dev/log|/dev/shm/log|' syslog*.c &&
make RPM_OPT_FLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" LDFLAGS="$LDFLAGS" &&
make install_exec BINDIR=/bin &&
make install_exec BINDIR=$R/bin &&
echo 'syslog.info   -/var/log/syslog.log
auth,authpriv.info  -/var/log/auth.log
*.info;auth,authpriv,syslog.none    -/var/log/local.log
*.alert root' | tee {,$R}/etc/syslog.conf &&
touch {,$R}/var/log/{syslog,auth,local,kernel}.log &&
cd $SRC && rm */ &&
echo '35-sysklogd' >> $SRC/build.log && sync &&Dcron

Dillon’s Cron 是一种简单、严谨、安全的 cron 实现。此软件包非常简单,可以直接修改 Makefile 和 defs.h 对其进行定制。[注意]Dcron并不使用Sysklogd记录日志,一般的方法是直接将命令的结果重定向到日志文件。有关Dcron的更多知识,可以参考《简单、严谨、安全 —— Dcron 简介》。

R=/root/dcron32/ && mkdir $R/bin/ {,$R}/etc/crontabs $R/var/log &&
tar -xf dcron32.tgz && cd dcron &&
sed -i -e's|/var/spool/cron/crontabs|/etc/crontabs|' -e's|/etc/cron.d|/share/empty|' defs.h &&
make CFLAGS="$CFLAGS $LDFLAGS" &&
install -o 0 -g 0 -m 0500 crond   /bin/crond   &&
install -o 0 -g 0 -m 0500 crond $R/bin/crond   &&
touch {,$R}/etc/crontabs/root {,$R}/var/log/crond-std{out,err}.log &&
cd $SRC && rm */ &&
echo '36-dcron' >> $SRC/build.log && sync &&XFS

这个包并不是典型的”configure && make && make install”风格的软件包,但是这里用一个 sed 来达到模仿的目的,但是仍然要注意的是 configure 的目的不是为了生成 Makefile 文件,而是为了生成 include/{builddefs,platform_defs.h} 文件。要了解更多安装信息,请仔细阅读源码树下的 Makefile include/builddefs.in doc/INSTALL 文件。内核源码树下的 Documentation/filesystems/xfs.txt 文件包含了 XFS 可以使用的挂载选项。

[提示]“–enable-shared=yes”会导致 libxfs.so,libxlog.so 库丢失,不知何故。

R=/root/xfsprogs_2.9.6-1/ && mkdir $R/bin/ &&
tar -xf xfsprogs_2.9.6-1.tar.gz && cd xfsprogs-2.9.6 &&
sed -i '/autoconf$/,/LOCAL_CONFIGURE_OPTIONS$/d' Makefile &&
sed -i 's:/bin/true:true:g' configure aclocal.m4 m4/package_utilies.m4 &&
sed -i -e's|^DEBUG =.*|DEBUG=-DNDEBUG|' -e's|^OPTIMIZER =.*|OPTIMIZER=@CFLAGS@|' include/builddefs.in &&
./configure --prefix=/usr --sbindir=/usr/bin --enable-shared=no --enable-gettext=no --enable-readline=yes --enable-editline=no --enable-termcap=no --enable-lib64=no &&
make install && make install prefix=$R/usr PKG_SBIN_DIR=$R/usr/bin &&
mv   /usr/bin/xfs_repair   /bin/ &&
mv $R/usr/bin/xfs_repair $R/bin/ &&
cd $SRC && rm */ &&
echo '37-xfsprogs' >> $SRC/build.log && sync &&Iptables

建议编译前好好读一读 Makefile 文件,然后按你的需求进行修改[这里编译的是静态版本]。当然,还有 INSTALL 也不要忘记了。此外,如果你升级了内核,那么最好把这个包重新编译一次。由于配置Iptables是一个见仁见智的工作,需要根据实际情况灵活变通,因此本文只示范其安装,而没有涉及其配置。

R=/root/iptables-1.4.0/ && mkdir $R/bin &&
tar -xf iptables-1.4.0.tar.bz2 && tar -xf linux-2.6.24.2.tar.bz2 && cd iptables-1.4.0 &&
sed -i -e'/NO_SHARED_LIBS/s/^#//' -e'/DO_IPV6/s/^#//' -e's|^KERNEL_DIR=.*|KERNEL_DIR=/usr|' -e's|^PREFIX:=.*|PREFIX=/usr|' -e's|^LIBDIR:=.*|LIBDIR=/usr/lib|' -e's|^BINDIR:=.*|BINDIR=/usr/bin|' -e's|^DO_IPV6:=.*|DO_IPV6=0|' Makefile &&
make COPT_FLAGS="$CFLAGS" LDFLAGS="$LDFLAGS -static" KERNEL_DIR=$SRC/linux-2.6.24.2 &&
make install            &&
make install DESTDIR=$R &&
cd $SRC && rm */ &&
echo '38-iptables' >> $SRC/build.log && sync &&Bc

如果你不打算运行 OpenSSL 的测试套件就可以不安装它(不建议这么做)。BC的测试程序在遇见错误的时候也不会返回非零的结果,因此这里将测试输出记录在一个文件中。大约有10个左右的测试项目会在最末尾一位出现舍入误差,这是正常的,无需在意。

R=/root/bc-1.06/ &&
tar -xf bc-1.06.tar.gz && cd bc-1.06 &&
sed -i 's/flex -I8/flex -I/' configure &&
sed -i '/_PROTOTYPE.*readline/d' bc/scan.l &&
sed -i 's/program_counter save_adr;/static &/' bc/load.c &&
sed -i '/<stdlib.h>/a #include <string.h>' lib/number.c &&
./configure --prefix=/usr --sbindir=/usr/bin --with-readline --without-editline --without-libedit --without-pkg &&
make && echo quit | ./bc/bc -l Test/checklib.b | tee $SRC/build_bc.log &&
make install && make install DESTDIR=$R &&
cd $SRC && rm */ &&
echo '39-bc' >> $SRC/build.log && sync &&OpenSSL

config 脚本检查系统环境并调用 Configure 完成配置,因此配置选项是通过 config 脚本向 Configure 传递的。事实上 config 脚本的作用相当于 config.guess ,所以如果你想直接调用 Configure 的话就一定要正确指定”操作系统-目标平台”(本文就是这么干的),所有可用的目标机器列表可以使用”./Configure LIST”命令获取。

Configure 脚本除了根据 Makefile.org 生成 Makefile 之外,还在 crypto/opensslconf.h 中定义了许多宏(基于 crypto/opensslconf.h.in)。详细的安装信息位于源码树下的 INSTALL Configure(特别是”PROCESS_ARGS”段) Makefile.shared Makefile.org 文件中。安装后的使用与配置信息位于 doc 目录中, FAQ 文件也可以提供一些参考。

Configure第一行是全局性选项,比如:如果你的CPU是P4/K8以上,那么就可以使用”enable-sse2″。所有可用的”[no-]***”全局选项如下:zlib,zlib-dynamic,threads,shared,asm,sse2,hw,gmp,rfc3779,krb5,ssl(ssl2,ssl3),tls,dso。no-dso仅在no-shared的前提下可用。[提示]为了安装Apache的mod_ssl成功,SSLv2/SSLv3/TLS都必须开启。[TODO]测试”asm,no-asm”的速度差异。

Configure第二行的”no-***”用于禁用crypto目录下相应的子目录,为了保证能够最小安装libcrypto,libssl,openssl,其中的大部分目录都必须保留,实际可选的目录仅有如下这些:md2,md4,mdc2,ripemd,des,rc2,rc4,rc5,idea,bf,cast,camellia,ec,dsa,ecdsa,dh,ecdh,comp,store。如果你禁用了其中的某些子目录,那么在编译前必须执行make depend步骤。[提示]为了安装OpenSSH成功,ripemd,des,rc4,bf,cast,dsa,dh目录不能被禁止。

Configure第三行相当于CPPFLAGS+CFLAGS的内容(DEVRANDOM指定随机设备,SSL_FORBID_ENULL则禁止使用NULL加密算法)。由于无法通过Configure设置LDFLAGS,并且Configure会强制清空Makefile中的LDFLAGS,所以在运行完Configure之后,使用一个sed修改所有Makefile中的LDFLAGS(用于连接openssl)和SHARED_LDFLAGS(用于连接libcrypto,libssl库)。[提示]不能省略find命令内”Makefile*”两边的引号。


相关内容

    暂无相关文章