|
|
第 1 帖 | |
|
|
标题: [原创]功能单一,体积小巧的LFS完整版(5M大小的Apache服务器) 更新日志
2008年2月13日:修正一条命令(笔误) 2006年9月11日:修正三条命令(笔误) 前言 本文为了制作一个功能单一、体积小巧的LFS系统而写,目的就是建立一个小系统来展示Linux的伸缩性,看本文应该具备一定的编译软件和内核的经验,因此对一些编译过程没有做太多说明,如果有什么不清楚的可参考一下LFS文档。 负章 成品下载 http://www.zdbr.net.cn/download/miniLFS.rar 这是一个已经做好的成品文件,可以下载试用一下效果,文件大小在2.8M左右,文件格式为rar压缩文件,下载后解压缩有形成一个完整的VMWare5的目录,直接使用即可。 第一章 说明和约定 1、磁盘分区名:您使用的分区可能和我在文中使用的分区名不一样,请不要奇怪,为了方便说明,文中使用的是/dev/hda1来做为目标系统的,如果你的和我的不一样,那么使用你自己的分区名,这很重要,所以再没弄清前请不要随意尝试。 2、源代码存放目录:我将源代码放在$LFS/sources目录下,如果你不是那么就使用你自己的目录,为了说明方便,下面我将使用/mnt/lfs/sources做为存放源代码的目录,在进入第六章后将使用/sources做为源代码的目录,实际二者是一个目录。 3、测试:在制作过程中所有的包都没有进行测试工作,如果你想进行测试以确定是否正确可以在其中加入测试命令。 第二章 建立分区 1、选择一个大小的分区 目标系统虽然只有5M大小,但制作的工具链却比较的大,所以应当分配一个稍大一点的分区,否则可能会在制作过程中出现没有足够空间的错误。 2、选择一个合适的文件系统 虽然系统只有5M,但文件系统本身就会占据一定的空间,不同的文件系统占用的空间是不同的,因此文件系统占用的空间没有被算进目标系统的大小中,所以选择什么样的文件系统你可以自己决定。 3、建立分区和文件系统 a) 你可以用cfdisk或者fdisk来建立分区,这一步对磁盘具有破坏性,如果你不是很清楚怎么回事,请弄清楚后再进行,否则可能对你机器上的数据造成破坏。 b) 使用mkfs.xxx来创建文件系统,当然这个文件系统必须让现在的内核以及将来建立的目标系统中的内核都能够进行识别才行,我使用的是xfs,因此我用mkfs.xfs来建立文件系统。 mkfs.xfs /dev/hda1 4、加载分区 mkdir -p /mnt/lfs mount /dev/hda1 /mnt/lfs 第三章 软件包和补丁 1、 软件包 a) 按照LFS中的软件包准备 i. GCC使用4.0.2 ii. Glibc使用2.3.6 2、 补丁 a) LFS中相应补丁 b) http://www.zdbr.net.cn/download/glib...ix-shy-1.patch (注意这个补丁很重要,我花了好长时间才做出来的。) 第四章 用户和环境 1、 建立工具链目录 export LFS=/mnt/lfs mkdir -p $LFS/sources mkdir -p $LFS/tools ln -s $LFS/tools / 2、 建立用户 groupadd lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs passwd lfs chown -v lfs $LFS/tools chown -v lfs $LFS/sources su - lfs 3、 设置用户环境 cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOF cat > ~/.bashrc << "EOF" set +h umask 022 LFS=/mnt/lfs LC_ALL=POSIX PATH=/tools/bin:/bin:/usr/bin export LFS LC_ALL PATH EOF source ~/.bash_profile 第五章 制作工具链 1. 进入源代码目录 cd /mnt/lfs/sources 2. binutils-2.16.1 tar xvf binutils-2.16.1.tar.bz2 mkdir binutils-build cd binutils-build ../binutils-2.16.1/configure --prefix=/tools --disable-nls make make install make -C ld clean make -C ld LIB_PATH=/tools/lib cd .. 3. gcc4.0.2 这里我们只需要C语言的部分就可以了 tar xvf gcc-core-4.0.2.tar.bz2 mkdir gcc-build cd gcc-build ../gcc-4.0.2/configure --prefix=/tools --with-local-prefix=/tools --disable-nls --enable-shared --enable-languages=c make bootstrap make install ln -vs gcc /tools/bin/cc cd .. rm -rf gcc-build rm -rf gcc-4.0.2 4. linux-libc-headers-2.6.12.0 tar xvf linux-libc-headers-2.6.12.0.tar.bz2 cd linux-libc-headers-2.6.12.0 cp -Rv include/asm-i386 /tools/include/asm cp -Rv include/linux /tools/include cd .. rm -rf linux-libc-headers-2.6.12.0 5. glibc-2.3.6 tar xvf glibc-2.3.6.tar.bz2 cd glibc-2.3.6 patch -Np1 -i ../ glibc-2.3.6-static-nss-fix-shy-1.patch mkdir ../glibc-build cd ../glibc-build ../glibc-2.3.6/configure --prefix=/tools --disable-profile --enable-add-ons --enable-kernel=2.6.0 --with-binutils=/tools/bin --without-gd --with-headers=/tools/include --without-selinux --enable-static-nss make mkdir -v /tools/etc touch /tools/etc/ld.so.conf make install cd .. rm -rf glibc-build rm -rf glibc-2.3.6 6. 调整工具链 cd binutils-build make -C ld install cd .. rm -rf binutils-build SPECFILE=`dirname $(gcc -print-libgcc-file-name)`/specs && gcc -dumpspecs > $SPECFILE && sed 's@^/lib/ld-linux.so.2@/tools&@g' $SPECFILE > tempspecfile && mv -vf tempspecfile $SPECFILE && unset SPECFILE 7. gcc第二遍 tar xvf gcc-core-4.0.2.tar.bz2 tar xvf gcc-g++-4.0.2.tar.bz2 cd gcc-4.0.2 cp -v gcc/Makefile.in{,.orig} && sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in cp -v gcc/Makefile.in{,.tmp} && sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp > gcc/Makefile.in patch -Np1 -i ../gcc-4.0.2-specs-1.patch mkdir -v ../gcc-build cd ../gcc-build ../gcc-4.0.2/configure --prefix=/tools \ --with-local-prefix=/tools --enable-clocale=gnu \ --enable-shared --enable-threads=posix \ --enable-__cxa_atexit --enable-languages=c,c++ \ --disable-libstdcxx-pch make make install 8. binutils-2.16.1第二遍 tar xvf binutils-2.16.1.tar.bz2 mkdir binutils-build cd binutils-build ../binutils-2.16.1/configure --prefix=/tools --disable-nls --enable-shared --with-lib-path=/tools/lib make make install make -C ld clean make -C ld LIB_PATH=/usr/lib:/lib cd .. 9. 分支 到此可出现一个分支,你可以选择其中之一进行下去。 i. 分支(一):继续按照LFS中的步骤完成工具链中其它软件包的安装,然后进行目标系统的制作。 ii. 分支(二):不需要继续制作工具链,直接开始目标系统的制作,不需要进行chroot的操作。 这里我们按照分支(一),继续进行工具链的其它软件包的安装,安装过程参照LFS,这里不再说明。 第六章 制作目标系统 1. 加载需要的文件系统 mkdir -pv $LFS/{proc,sys} mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vft tmpfs tmpfs $LFS/dev mount -vft tmpfs tmpfs $LFS/dev/shm mount -vft devpts -o gid=4,mode=620 devpts $LFS/dev/pts 2. 进入工具链系统 chroot "$LFS" /tools/bin/env -i HOME=/root TERM="$TERM" PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin /tools/bin/bash --login +h 3. 设置目录属性 chown -R 0:0 /tools 4. 创建目标系统目录 install -d /{bin,etc,dev,sbin,proc,sys,var/{lib,run},srv/{conf,htdocs,logs},boot/grub,tmp} 5. 建立临时链接 ln -sv /tools/bin/{bash,cat,pwd,stty} /bin ln -sv bash /bin/sh 6. 建立目标系统组和用户 cat > /etc/passwd << "EOF" root:x:0:0:root:/root:/bin/bash nobody:x:100:100:nobody:/home/nobody:/bin/bash EOF cat > /etc/group << "EOF" root:x:0: nobody:x:100: EOF exec /tools/bin/bash --login +h 7. 创建/dev设备文件 mknod -m 600 /dev/console c 5 1 mknod -m 666 /dev/null c 1 3 mknod -m 666 /dev/zero c 1 5 mknod -m 666 /dev/ptmx c 5 2 mknod -m 666 /dev/tty c 5 0 mknod -m 444 /dev/random c 1 8 mknod -m 444 /dev/urandom c 1 9 chown -v root:tty /dev/{console,ptmx,tty} ln -sv /proc/self/fd /dev/fd ln -sv /proc/self/fd/0 /dev/stdin ln -sv /proc/self/fd/1 /dev/stdout ln -sv /proc/self/fd/2 /dev/stderr ln -sv /proc/kcore /dev/core mkdir -v /dev/pts mkdir -v /dev/shm mount -vt devpts -o gid=4,mode=620 none /dev/pts mount -vt tmpfs none /dev/shm 8. 进入源代码目录 cd /sources 9. udev-0.76 tar xvf udev-076.tar.bz2 cd udev-076 make EXTRAS=extras/run_directory ./udevstart cd .. rm -rf udev-076 10. grub-0.97 tar xvf grub-0.97.tar.bz2 cd grub-0.97 ./configure && make cp stage1/stage1 /boot/grub/ cp stage2/xfs_stage1_5 /boot/grub/ cp stage2/stage2 /boot/grub/ grub/grub root (hd0,0) setup (hd0) quit cd .. rm -rf grub-0.97 cat > /boot/grub/menu.lst << “EOF” default 0 timeout 10 color green/black light-green/black title miniLFS root (hd0,0) kernel /boot/bzImage root=/dev/hda1 rw EOF 11. 编译内核 tar xvf linux-2.6.14.3.tar.bz2 cd linux-2.6.14.3 make menuconfig make cp arch/i386/boot/bzImage /boot/ cd .. 12. bash-3.0 tar xvf bash-3.0.tar.bz2 patch -Np1 -i ../bash-3.0-fixes-3.patch patch -Np1 -i ../bash-3.0-avoid_WCONTINUED-1.patch ./configure --prefix=/usr --bindir=/bin --without-bash-malloc make LDFLAGS="-static" rm -rf /bin/bash cp bash /bin/ cd .. rm -rf bash-3.0 13. dhcpcd tar xvf dhcpcd-1.3.22.tar.gz cd dhcpcd-1.3.22 patch -Np1 -i ../dhcpcd-1.3.22-pl4-fhs-1.patch && ./configure --prefix="" --sysconfdir=/var/lib && make LDFLAGS="-static" cp dhcpcd /bin/ cd .. rm -rf dhcpcd-1.3.22 14. Apache-1.3.34 tar xvf apache_1.3.34.tar.Z cd apache_1.3.34 LDFLAGS="-static" ./configure && make cp src/httpd /bin/ cp conf/httpd.conf-dist /etc/httpd.conf cp conf/mime.types /srv/conf/ sed -i ‘s/@@ServerRoot@@/\/srv/’ /etc/httpd.conf sed -I ‘s/^Group \”#-1\”/Group nobody/’ /etc/httpd.conf echo “ServerName localhost” >> /etc/httpd.conf cd .. rm -rf apache_1.3.34 echo “世界,您好!” > /srv/htdocs/index.html 15. INIT cat > /sbin/init << "EOF" /bin/dhcpcd -k /bin/dhcpcd eth0 . /var/lib/dhcpc/dhcpcd-eth0.info echo "http://$IPADDR" /bin/httpd -f /etc/httpd.conf /bin/bash EOF chmod a+x /sbin/init 16. 去除调式符 strip --strip-all /bin/* 17. 空间占用情况 i. bash:1,268,680 ii. dhcpcd:610,008 iii. httpd:1,129,160 iv. grub及其它:数K v. 这样加起来大概3M左右,如果内核大小限制在2M以内(应该比较容易)就可以了,到此这个系统就制作完成了。 18. 重新启动 不知道你能不能成功启动,如果成功就可以通过其它机器上的浏览器来显示,应该可以显示出“世界,您好!”的网页。 第七章 结束语 通过制作这个系统,对了解整个系统的运行非常有帮助,文章过程经过测试,但也难免出现错误,如果出现错误请及时指正,谢谢。 希望通过此文能够起到抛砖引玉的作用,谢谢各位支持。 (转载请保持文章的完整性,请注明作者和出处) 作者:冲天飞豹(youbest) Email:youbest@sina.com 2005年12月6日 更新日志 2006年9月11日: 命令笔误 将 cp stage1/stage1 /mnt/lfs/boot/grub/ cp stage2/xfs_stage1_5 /mnt/lfs/boot/grub/ cp stage2/stage2 /mnt/lfs/boot/grub/ 修正为 cp stage1/stage1 /boot/grub/ cp stage2/xfs_stage1_5 /boot/grub/ cp stage2/stage2 /boot/grub/ 由cublog上的augustusqing发现并报告 2008年2月13日 命令笔误 将 rm -rf gurb-0.97 修正为 rm -rf grub-0.97 由Linuxsir上的357202171发现并报告 如果想做的更小一些,可以看本文的续篇《我们可以做的更小!》 此帖于 08-02-13 17:36 被 youbest 编辑. |
|
|
|
|
|
|
|
第 2 帖 | |
|
|
由于最近有点忙,所以整理文章的时间长了点,本来前两天就可以发上来的,不过为了正确性还是在整理好了后按照文章做了一遍,基本确定是正确的,不过也可能受到环境和软件包的影响,如果出现问题还望指正。
|
|
|
|
|
|
|
|
第 3 帖 | |
|
|
Very good!
|
|
|
|
|
|
|
|
第 4 帖 | |
|
|
好!
回去好好研究.
__________________
了解她愈多,爱她愈深 一切源于她优秀的内在 |
|
|
|
|
|
|
|
第 5 帖 | |
|
|
牛人。有空自己也做一个玩。
|
|
|
|
|
|
|
|
第 6 帖 | |
|
|
我经常有一疑问,究竟ulibc能否代替glibc?:ask
|
|
|
|
|
|
|
|
第 7 帖 | |
|
|
以前拿uclibc编译过LFS,LFS是可以完成的,但进入BLFS后就会有很多软件需要打补丁才能完成编译。uclibc是一个不完整的glibc,所以会有部分软件无法进行编译,所以我觉得非到万不得以,还是用glibc来的好。
|
|
|
|
|
|
|
|
第 8 帖 | |
|
|
谢谢回复,若只从体积上考虑,也许用thttpd代替apache会更少巧呢。
另请教,若不装BLFS,用ulibc能否成功编译apache? |
|
|
|
|
|
|
|
第 9 帖 | |
|
|
十分感谢youbest兄!!
__________________
一个论坛能够支持8年以上,不容易。 |
|
|
|
|
|
|
|
第 10 帖 | |
|
|
兄台请check下你的成品下载是否有问题!
__________________
风之忍者隐于风 |
|
|
|
|
|
|
|
第 11 帖 | ||
|
|
引用:
|
||
|
|
|
||
|
|
第 12 帖 | |
|
|
解压缩出现错误,无论是lin下还是win下
|
|
|
|
|
|
|
|
第 13 帖 | |
|
|
俺试过了,解压正常的,启动只要约7秒:)爽得很啊!
有个问题,咋关机?
__________________
LFS全套中文文档:http://lfs.linuxsir.org(主力) LFS 英文站点镜像:http://lfs.cosoft.org.cn 二笔输入法 for Linux: http://ebf.cosoft.org.cn |
|
|
|
|
|
|
|
第 14 帖 | |||
|
|
引用:
引用:
![]() |
|||
|
|
|
|||
|
|
第 15 帖 | |
|
|
OK,可以了!
|
|
|
|
|
|