+ -
当前位置:首页 → 问答吧 → [原创]功能单一,体积小巧的LFS完整版(5M大小的Apache服务器)

[原创]功能单一,体积小巧的LFS完整版(5M大小的Apache服务器)

时间:2005-12-06

来源:互联网

更新日志
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:[email protected]
                               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发现并报告


如果想做的更小一些,可以看本文的续篇《我们可以做的更小!》
上传的附件
glibc-2.3.6-static-nss-fix-shy-1.patch.txt (2.2 KB, 383 次查看)

作者: youbest   发布时间: 2005-12-06

  由于最近有点忙,所以整理文章的时间长了点,本来前两天就可以发上来的,不过为了正确性还是在整理好了后按照文章做了一遍,基本确定是正确的,不过也可能受到环境和软件包的影响,如果出现问题还望指正。

作者: youbest   发布时间: 2005-12-06

Very good!

作者: yhyzh   发布时间: 2005-12-06

好!
回去好好研究.

作者: drowsyboy   发布时间: 2005-12-06

牛人。有空自己也做一个玩。

作者: lilyerr   发布时间: 2005-12-06

我经常有一疑问,究竟ulibc能否代替glibc?:ask

作者: d00m3d   发布时间: 2005-12-07

以前拿uclibc编译过LFS,LFS是可以完成的,但进入BLFS后就会有很多软件需要打补丁才能完成编译。uclibc是一个不完整的glibc,所以会有部分软件无法进行编译,所以我觉得非到万不得以,还是用glibc来的好。

作者: youbest   发布时间: 2005-12-07

谢谢回复,若只从体积上考虑,也许用thttpd代替apache会更少巧呢。

另请教,若不装BLFS,用ulibc能否成功编译apache?

作者: d00m3d   发布时间: 2005-12-07

十分感谢youbest兄!!

作者: csyfek   发布时间: 2005-12-07

兄台请check下你的成品下载是否有问题!

作者: demonlj   发布时间: 2005-12-07

引用:
作者: demonlj
兄台请check下你的成品下载是否有问题!
完全正常啊,而且也有人下载过了,不过要VMware5才能使用.

作者: youbest   发布时间: 2005-12-07

解压缩出现错误,无论是lin下还是win下

作者: demonlj   发布时间: 2005-12-07

俺试过了,解压正常的,启动只要约7秒:)爽得很啊!
有个问题,咋关机?

作者: tram   发布时间: 2005-12-07

引用:
作者: d00m3d
谢谢回复,若只从体积上考虑,也许用thttpd代替apache会更少巧呢。

另请教,若不装BLFS,用ulibc能否成功编译apache?
这个还没试过。

引用:
作者: tram
俺试过了,解压正常的,启动只要约7秒:)爽得很啊!
有个问题,咋关机?
直接关!

作者: youbest   发布时间: 2005-12-07

OK,可以了!

作者: demonlj   发布时间: 2005-12-08

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

chroot: cannot run command `/tools/bin/env': No such file or directory

anyone can give me some hints?
what's wrong?

The content of /tools/bin:
addr2line gccbug ld readelf
ar gcov ldd rpcgen
as gencat lddlibc4 size
c++ getconf locale sprof
catchsegv getent localedef strings
cc gprof mtrace strip
c++filt i686-pc-linux-gnu-c++ nm tzselect
cpp i686-pc-linux-gnu-g++ objcopy xtrace
env i686-pc-linux-gnu-gcc objdump
g++ i686-pc-linux-gnu-gcc-3.4.3 pcprofiledump
gcc iconv ranlib

作者: drowsyboy   发布时间: 2005-12-16

youbest I am trying you method and try to understand it
But I have some problems......
first: the patch: http://www.zdbr.net.cn/download/glib...ix-shy-1.patch is not available.
second: tar xvf binutils-2.16.1.tar.bz2 should be-->tar jxvf binutils-2.16.1.tar.bz2

can you give reply my question above-mentioned?

作者: drowsyboy   发布时间: 2005-12-16

引用:
作者: drowsyboy
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

chroot: cannot run command `/tools/bin/env': No such file or directory

anyone can give me some hints?
what's wrong?

The content of /tools/bin:
addr2line gccbug ld readelf
ar gcov ldd rpcgen
as gencat lddlibc4 size
c++ getconf locale sprof
catchsegv getent localedef strings
cc gprof mtrace strip
c++filt i686-pc-linux-gnu-c++ nm tzselect
cpp i686-pc-linux-gnu-g++ objcopy xtrace
env i686-pc-linux-gnu-gcc objdump
g++ i686-pc-linux-gnu-gcc-3.4.3 pcprofiledump
gcc iconv ranlib
以下是我正文中的内容:

9. 分支
    到此可出现一个分支,你可以选择其中之一进行下去。
    i. 分支(一):继续按照LFS中的步骤完成工具链中其它软件包的安装,然后进行目标系统的制作。
    ii. 分支(二):不需要继续制作工具链,直接开始目标系统的制作,不需要进行chroot的操作。
    这里我们按照分支(一),继续进行工具链的其它软件包的安装,安装过程参照LFS,这里不再说明。
这里特别说明过,由于工具链后面的内容和LFS文档中的内容相同也没有什么特别要声明的地方所以就省略了,如果想制作的话可以参考LFS的做法和使用的软件包,但必须要做,否则无法chroot进入的。


引用:
作者: drowsyboy
youbest I am trying you method and try to understand it
But I have some problems......
first: the patch: http://www.zdbr.net.cn/download/glib...ix-shy-1.patch is not available.
网站正在回复中。

引用:
作者: drowsyboy
second: tar xvf binutils-2.16.1.tar.bz2 should be-->tar jxvf binutils-2.16.1.tar.bz2

can you give reply my question above-mentioned?
这里不好意思,我用的tar可以自动识别类型,如果用老的tar可能需要指定,用tar xvjf 就可以了。

作者: youbest   发布时间: 2005-12-16

谢谢youbest兄的及时回复!
不好意思,我理解不深……

近来闲来无事,想试验一下,呵呵。
再次谢谢,学习ing……

作者: drowsyboy   发布时间: 2005-12-16

引用:
作者: drowsyboy
谢谢youbest兄的及时回复!
不好意思,我理解不深……

近来闲来无事,想试验一下,呵呵。
再次谢谢,学习ing……
不用客气,一起提高,我现在还在继续裁减系统,希望做的更小。

作者: youbest   发布时间: 2005-12-16

顺便问一下,我一开始用glibc-2.3.6(没有打你的补丁),结果好象也出错了

想知道你补丁是怎么做出来的?
我一看到错误就傻,也不会想到做补丁去解决
所以想请教一下这个补丁是怎么做的

-----------------------------
高手比菜鸟厉害的地方,就是知道怎么去解决问题

作者: drowsyboy   发布时间: 2005-12-16

我认为LFS的主要思想:
就是通过使用主系统--->去建立一个临时的工具链———>利用这个临时的工具链去创建目标系统的工具链(不知道对不对)

如果我们按照LFS的方法做小的系统,也就是说第五章是必不可少的

问题是我们能不能避开这个过程呢?
我的意思也就是:我们能不能组装Linux呢---我们把所有的包一个个都在主系统中编译好好,然后再逐个安装到相应的目标系统中目录下,然后通过调整设置(这里有很多问题),然后安装的组件就可以在目标系统中运行了。这样,我们需要什么东西,就直接编译好,然后搬过去就可以了。

嘿嘿,我是不是在异想天开,大家不要见笑呵

作者: drowsyboy   发布时间: 2005-12-16

引用:
作者: drowsyboy
我认为LFS的主要思想:
就是通过使用主系统--->去建立一个临时的工具链———>利用这个临时的工具链去创建目标系统的工具链(不知道对不对)

如果我们按照LFS的方法做小的系统,也就是说第五章是必不可少的

问题是我们能不能避开这个过程呢?
我的意思也就是:我们能不能组装Linux呢---我们把所有的包一个个都在主系统中编译好好,然后再逐个安装到相应的目标系统中目录下,然后通过调整设置(这里有很多问题),然后安装的组件就可以在目标系统中运行了。这样,我们需要什么东西,就直接编译好,然后搬过去就可以了。

嘿嘿,我是不是在异想天开,大家不要见笑呵
以下是我正文中的内容:

9. 分支
    到此可出现一个分支,你可以选择其中之一进行下去。
    i. 分支(一):继续按照LFS中的步骤完成工具链中其它软件包的安装,然后进行目标系统的制作。
    ii. 分支(二):不需要继续制作工具链,直接开始目标系统的制作,不需要进行chroot的操作。
    这里我们按照分支(一),继续进行工具链的其它软件包的安装,安装过程参照LFS,这里不再说明。

可以不制作完整的工具链,甚至不制作工具链,这个系统一开始就是在不完整的工具链下做的,只是这种方法做出来的东西和主系统的环境关系比较大,如果不太清楚编译的时候各参与部分的关系比较会容易出问题。但这样做我觉得是可行的,而且也做过,只是条件要比按照LFS制作工具链的方法来的苛刻些。

作者: youbest   发布时间: 2005-12-16

强悍!强悍!强悍!

作者: qeming   发布时间: 2005-12-16

下载不了了。

作者: laven   发布时间: 2005-12-27

哪位兄弟有拿出来分享一下,谢谢了!

作者: laven   发布时间: 2005-12-27

我在原文上加了一个附件。

作者: youbest   发布时间: 2005-12-27

有个小问题想请教一下豹兄,

关于制作工具链时的调整这里,SPECFILE=`dirname $(gcc -print-libgcc-file-name)`/specs

这句代码什么意思??

我编译出来是ambiguous argument

作者: highness   发布时间: 2005-12-27

引用:
作者: youbest
以下是我正文中的内容:

9. 分支
    到此可出现一个分支,你可以选择其中之一进行下去。
    i. 分支(一):继续按照LFS中的步骤完成工具链中其它软件包的安装,然后进行目标系统的制作。
    ii. 分支(二):不需要继续制作工具链,直接开始目标系统的制作,不需要进行chroot的操作。
    这里我们按照分支(一),继续进行工具链的其它软件包的安装,安装过程参照LFS,这里不再说明。

可以不制作完整的工具链,甚至不制作工具链,这个系统一开始就是在不完整的工具链下做的,只是这种方法做出来的东西和主系统的环境关系比较大,如果不太清楚编译的时候各参与部分的关系比较会容易出问题。但这样做我觉得是可行的,而且也做过,只是条件要比按照LFS制作工具链的方法来的苛刻些。
用分支一的话:安装软件包的话,会不会安装在源系统上??而不是目标系统??

是不是在CONFIGURE的时候,用PREFIX来指明目标系统??

作者: highness   发布时间: 2005-12-27

引用:
作者: highness
有个小问题想请教一下豹兄,

关于制作工具链时的调整这里,SPECFILE=`dirname $(gcc -print-libgcc-file-name)`/specs

这句代码什么意思??

我编译出来是ambiguous argument
这句代码的意思是设置一个环境变量,这个环境变量指向gcc安装目录下的默认用于存放specs文件的地方,与编译没什么关系。
还有其它的方法,其中一种可以看《用GCC4.0.1来编译LFS 》这篇文章里面的相关部分。

引用:
作者: highness
用分支一的话:安装软件包的话,会不会安装在源系统上??而不是目标系统??

是不是在CONFIGURE的时候,用PREFIX来指明目标系统??
分支一需要制作工具链,因此和LFS手册的方式是一样的,不会安装到源系统上的,第六章是在chroot后进行安装的,所以不会影响到源系统的。
一般来说./configure中的prefix参数用来指定安装地点,不过也有可能有例外。

作者: youbest   发布时间: 2005-12-27

引用:
作者: youbest
这句代码的意思是设置一个环境变量,这个环境变量指向gcc安装目录下的默认用于存放specs文件的地方,与编译没什么关系。
还有其它的方法,其中一种可以看《用GCC4.0.1来编译LFS 》这篇文章里面的相关部分。



分支一需要制作工具链,因此和LFS手册的方式是一样的,不会安装到源系统上的,第六章是在chroot后进行安装的,所以不会影响到源系统的。
一般来说./configure中的prefix参数用来指定安装地点,不过也有可能有例外。
说错,应该是分支二。不CHROOT进目标系统的话,有可能会安装在源系统上,这点比较麻烦。
是不是用PREFIX来指定??

作者: highness   发布时间: 2005-12-27

我怎么下载不了啊?
那个附件也不是啊.
打开是一个文本的格式.
哪位有拿出来分享一下好吗?

作者: laven   发布时间: 2005-12-27

引用:
作者: highness
说错,应该是分支二。不CHROOT进目标系统的话,有可能会安装在源系统上,这点比较麻烦。
是不是用PREFIX来指定??
分支二的方式不需要用make install来安装,这样也就不存在安装在源系统的问题,需要什么直接从编译好的目录中拷贝出来用就可以了,prefix有没有无所谓。

引用:
作者: laven
我怎么下载不了啊?
那个附件也不是啊.
打开是一个文本的格式.
哪位有拿出来分享一下好吗?
补丁本来就是文本格式嘛,论坛不允许上传.patch的文件所以只能加了一个.txt的后缀,下载下来改一下后缀名就可以了,不改也行,patch命令无所谓补丁的后缀名。

作者: youbest   发布时间: 2005-12-27

噢.
谢谢回复,我要下载的不是那个补丁文件,我要下载在虚拟机上直接可以运行的那个文件.
http://www.zdbr.net.cn/download/miniLFS.rar
这个链接可能有问题,我下载不了.
或都是否禁止了网通用户下载?
试了多次都没有成功.

作者: laven   发布时间: 2005-12-27

引用:
作者: laven
噢.
谢谢回复,我要下载的不是那个补丁文件,我要下载在虚拟机上直接可以运行的那个文件.
http://www.zdbr.net.cn/download/miniLFS.rar
这个链接可能有问题,我下载不了.
或都是否禁止了网通用户下载?
试了多次都没有成功.
2M多的文件没法传到论坛里,你可以到 http://www.linuxsir.org/bbs/showthread.php?t=236599 里去下载体积更小的.

作者: youbest   发布时间: 2005-12-27

引用:
作者: youbest
分支二的方式不需要用make install来安装,这样也就不存在安装在源系统的问题,需要什么直接从编译好的目录中拷贝出来用就可以了,prefix有没有无所谓。



补丁本来就是文本格式嘛,论坛不允许上传.patch的文件所以只能加了一个.txt的后缀,下载下来改一下后缀名就可以了,不改也行,patch命令无所谓补丁的后缀名。
NOT USING "MAKE INSTALL"?? COPY WHAT'S NEEDED FROM COMPILED FLODER??

SOURCE OS OR OBJECT OS ??

作者: highness   发布时间: 2005-12-27

源码目录下复制到目标系统下.

作者: youbest   发布时间: 2005-12-27

引用:
作者: youbest
源码目录下复制到目标系统下.
i see

x-window can be installed by this method??

作者: highness   发布时间: 2005-12-27

请教豹兄两个问题:
1)在编译glibc时的参数--enable-static-nss是什么意思,如果不加入这个参数编译会怎么样呢?
2)制作这个apache服务器时,不建立临时工具链环境,而直接使用主机的编译环境对所需的apache,dhcp服务器等进行静态编译,在把生成的bin文件copy到目标系统相应的目录下,这样打造目标系统是否可行呢,我现在不明白的就是如果用主机的编译环境进行静态编译的话,生成的bin代码会和主机系统有联系吗?会有什么样的联系呢?
望多多指教,thanks!

作者: redkaoliang   发布时间: 2006-02-28

引用:
作者: redkaoliang
请教豹兄两个问题:
1)在编译glibc时的参数--enable-static-nss是什么意思,如果不加入这个参数编译会怎么样呢?
这个参数不加的话可能会对后面的静态编译产生影响。

引用:
作者: redkaoliang
2)制作这个apache服务器时,不建立临时工具链环境,而直接使用主机的编译环境对所需的apache,dhcp服务器等进行静态编译,在把生成的bin文件copy到目标系统相应的目录下,这样打造目标系统是否可行呢,我现在不明白的就是如果用主机的编译环境进行静态编译的话,生成的bin代码会和主机系统有联系吗?会有什么样的联系呢?
望多多指教,thanks!
这种方式应该来说是有前提的,也就是host系统与目标主机系统所使用的软件包差别不大的情况下提高效率的方法,我就是在这样的情况下完成的,不过为了比较通用的方式可以用完整编译出目标系统后再做这个Apache服务器的方式。
如果直接开始,那么编译出来的bin代码将会使用host系统中的库,这是必然的。

作者: youbest   发布时间: 2006-02-28

--enable-static-nss
就是那个 /etc/nsswitch.conf 的东西,应该没什么影响的吧?不过我不确定。感觉似乎没什么联系。。

第二个,静态编译的话,用的是主机的库,如果还是按照LFS的方式做一个系统出来,感觉太麻烦了。。。活活。。。

作者: 晨想   发布时间: 2006-02-28

引用:
作者: youbest
如果直接开始,那么编译出来的bin代码将会使用host系统中的库,这是必然的。
用host系统采用静态编译出的bin代码,所需的相应的库文件都静态连接进了bin代码,那么这个bin代码应该就可以独立运行,不与host的库有联系了吧

作者: redkaoliang   发布时间: 2006-02-28

但是还是从host出来的。。。。

作者: 晨想   发布时间: 2006-02-28

我从http://www.gnu.org/software/libc/FAQ.html#s-1找到一个FAQ,说明静态编译的bin文件也有可能要动态连接某些共享库
FAQ2.22. Even statically linked programs need some shared libraries which is not acceptable for me. What can I do?
{AJ} NSS (for details just type `info libc "Name Service Switch"') won't work properly without shared libraries. NSS allows using different services (e.g. NIS, files, db, hesiod) by just changing one configuration file (/etc/nsswitch.conf) without relinking any programs. The only disadvantage is that now static libraries need to access shared libraries. This is handled transparently by the GNU C library.
A solution is to configure glibc with --enable-static-nss. In this case you can create a static binary that will use only the services dns and files (change /etc/nsswitch.conf for this). You need to link explicitly against all these services. For example:


gcc -static test-netdb.c -o test-netdb \
-Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group

The problem with this approach is that you've got to link every static program that uses NSS routines with all those libraries.
{UD} In fact, one cannot say anymore that a libc compiled with this option is using NSS. There is no switch anymore. Therefore it is *highly* recommended *not* to use --enable-static-nss since this makes the behaviour of the programs on the system inconsistent.

作者: redkaoliang   发布时间: 2006-02-28

这样做和LFS有什么关系呢?
功能单一,体积小巧的LFS完整版(5M大小的Apache服务器)
命名不合理,会把大家带到迷途。
功能单一,体积小巧的linux-apache完整版(5M大小的Apache服务器)

在任何一个floopy-linux上安装个apache应该都不会很大的。
大家可能刚刚从LFS过程出来,没有做过floopy-linux,没有用过busybox。对任何可以启动的内核都比较感兴趣,但LFS不是为了做个可以启动的内核!

linux-kernel <1.5M
busybox(shell,httpd)<1M,静态编译
这二者加起来不到2.5M。也称的上体积小巧的linux-http服务器完整版,不过没有意义,至少和LFS是风马牛不相及!

能称的上是LFS-linux,必须有第5章的所有软件。
不然,在你的linux上make 个mpg123出来看看?不行吧。
不行就不能称LFS,小不是LFS,能boot也不是LFS。

我贴的“另一种安装LFS”,之所以失败,就是我的Linux上make不出来任何src!

玩LFS,就是玩的toolchain,玩的依赖关系。任何没有make-toolchain的linux都不能和LFS沾亲。ubuntn就是个典型,居然连GCC都没有。

或许是大家对LFS理解的角度不同,仁者见仁,智者见智!
单从字面上,一个没有toolchain的linux还是不要成为LFS比较好:)

作者: good02xaut   发布时间: 2006-03-01

热门下载

更多