歡迎您光臨本站 註冊首頁

5M大小Apache伺服器LFS完整版

←手機掃碼閱讀     火星人 @ 2014-03-29 , reply:0

前言
  本文為了製作一個功能單一、體積小巧的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 gurb-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. 重新啟動
    不知道你能不能成功啟動,如果成功就可以通過其它機器上的瀏覽器來顯示,應該可以顯示出「世界,您好!」的網頁。
第七章 結束語
  通過製作這個系統,對了解整個系統的運行非常有幫助,文章過程經過測試,但也難免出現錯誤,如果出現錯誤請及時指正,謝謝。
  希望通過此文能夠起到拋磚引玉的作用,謝謝各位支持。

[火星人 ] 5M大小Apache伺服器LFS完整版已經有516次圍觀

http://coctec.com/docs/linux/show-post-203862.html