尚都soho北塔 哪口出:从头打造自己的linux

来源:百度文库 编辑:偶看新闻 时间:2024/05/09 19:39:41
1. 你可能需要一张LFS live CD,或者预装任何一种带GCC的linux来作为开发安装环境,我用的Live CD版本是6.3 R2145,你可以看到,其实你可以用任何一个LFS的live cd,因为我们大部分东西都是从网络上获得,和LFS live cd没多大关系。你也可以从任何一款带有GCC的linux开始这段旅程。

2. Virtual Box,设置为:内存256,硬盘10G,如果你采用linux作为开发环境,则应该设置2个硬盘,每个10G,并在其中之一上安装带gcc的linux。

3. Virtual Box 网络链接通畅。


综述
简单来看,从头创建自己的linux分为三个步骤:
  • 首先利用既有linux系统在目标硬盘上/tools目录下建立一个临时的编译环境。
  • 接着利用chroot在目标硬盘上tools下的编译工具编译出linux内核和基本命令。
  • 最后编译Grub,让它引导以后的硬盘启动,彻底脱离老旧的linux


让我们开始吧.

设置系统从Live CD(或从linux硬盘) 启动,,在启动过程中会出现选择时区等信息,你可以按照实际情况选择,也可以按照默认选择,简单点就是等待一会系统会自动进行选择。这里我选择时区为 Asia/Shanghai,选择本地语言为Chinese (Simplified, UTF-8),其它的都按默认选择了。

假设现在你已经到了linux的shell提示符下了:

一、 创建硬盘分区

我们需要在硬盘上进行编译工作,所以首先要创建硬盘分区:
Shell代码  
  1. cfdisk /dev/hda  
  2. //设置分区大小后  
  3. mkfs.xfs /dev/hda1  
  4. mkswap /dev/hda2  


我将/dev/hda1设置为linux分区,/dev/hda2 设置为swap分区,重启以保证分区能正常使用。

二、 将硬盘分区挂载在/mnt/lfs目录下
Shell代码  
  1. export LFS=/mnt/lfs  
  2. mkdir -pv $LFS  
  3. mount /dev/hda1 $LFS  


三、 创建工作目录: sources和tools
Shell代码  
  1. mkdir -v $LFS/sources  
  2. chmod -v a+wt $LFS/sources  
  3. mkdir -v $LFS/tools  
  4. ln -sv $LFS/tools /  


chmod a+wt是将目录或文件的属性设置为1777,这样任何人都可以对其进行读写,同时创建$LFS/tools的链接,设置为/tools,以方便后面的引用。

四.创建工作组和用户lfs,同时授权
Shell代码  
  1. groupadd lfs  
  2. useradd -s /bin/bash -g lfs -m -k /dev/null lfs  
  3. passwd lfs  
  4. //将工作目录授权于工作用户  
  5. chown -v lfs $LFS/tools  
  6. chown -v lfs $LFS/sources  


五、 登录成lfs用户 'su - lfs',并设置用户环境:
Shell代码  
  1. cat > ~/.bash_profile << "EOF"  
  2. exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash  
  3. EOF  
  4. cat > ~/.bashrc << "EOF"  
  5. set +h  
  6. umask 022  
  7. LFS=/mnt/lfs  
  8. LC_ALL=POSIX  
  9. PATH=/tools/bin:/bin:/usr/bin  
  10. export LFS LC_ALL PATH  
  11. EOF  
  12. source ~/.bash_profile  


这些基本和网上介绍的差不多,每次从live-cd启动,都要重复上述步骤,谁叫咱是从CD启动呢,为了方便起见,你象我一样把这些命令写成shell script。每次调用一下就好。

创建临时编译环境
因为我不喜欢用旧版本的东西,所以LFS CD现在对我就没用处了。我维护了一个简单的脚本,用它可以下载最新的源代码:
Shell代码  
  1. wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.65.tar.bz2   
  2. wget http://ftp.gnu.org/gnu/automake/automake-1.11.1.tar.bz2   
  3. wget http://ftp.gnu.org/gnu/bash/bash-4.1.tar.gz   
  4. wget http://ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.bz2   
  5. wget http://ftp.gnu.org/gnu/bison/bison-2.4.1.tar.bz2   
  6. wget http://www.bzip.org/1.0.5/bzip2-1.0.5.tar.gz   
  7. wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.4.tar.gz   
  8. wget http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.4.4.tar.gz   
  9. wget http://ftp.gnu.org/gnu/diffutils/diffutils-2.9.tar.gz   
  10. wget http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.41.10.tar.gz   
  11. wget http://expect.nist.gov/src/expect-5.43.0.tar.gz   
  12. wget ftp://ftp.astron.com/pub/file/file-5.04.tar.gz   
  13. wget http://ftp.gnu.org/gnu/findutils/findutils-4.4.2.tar.gz   
  14. wget http://prdownloads.sourceforge.net/flex/flex-2.5.35.tar.bz2   
  15. wget http://ftp.gnu.org/gnu/gawk/gawk-3.1.7.tar.bz2   
  16. wget http://ftp.gnu.org/gnu/gcc/gcc-4.5.0/gcc-4.5.0.tar.bz2   
  17. wget http://ftp.gnu.org/gnu/gdbm/gdbm-1.8.3.tar.gz   
  18. wget http://ftp.gnu.org/gnu/gettext/gettext-0.17.tar.gz   
  19. wget http://ftp.gnu.org/gnu/glibc/glibc-2.11.1.tar.bz2   
  20. wget http://ftp.gnu.org/gnu/gmp/gmp-5.0.1.tar.bz2   
  21. wget http://ftp.gnu.org/gnu/grep/grep-2.5.4.tar.bz2   
  22. wget http://ftp.gnu.org/gnu/groff/groff-1.20.1.tar.gz   
  23. wget ftp://alpha.gnu.org/gnu/grub/grub-1.97.2.tar.gz   
  24. wget http://ftp.gnu.org/gnu/gzip/gzip-1.4.tar.gz   
  25. wget http://sethwklein.net/iana-etc-2.30.tar.bz2   
  26. wget http://ftp.gnu.org/gnu/inetutils/inetutils-1.7.tar.gz   
  27. wget http://developer.osdl.org/dev/iproute2/download/iproute2-2.6.33.tar.bz2   
  28. wget http://ftp.altlinux.com/pub/people/legion/kbd/kbd-1.15.1.tar.gz   
  29. wget http://www.greenwoodsoftware.com/less/less-436.tar.gz   
  30. wget http://www.linuxfromscratch.org/lfs/downloads/development/lfs-bootscripts-20100124.tar.bz2   
  31. wget http://ftp.gnu.org/gnu/libtool/libtool-2.2.6b.tar.gz   
  32. wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.tar.bz2   
  33. wget http://ftp.gnu.org/gnu/m4/m4-1.4.14.tar.bz2   
  34. wget http://ftp.gnu.org/gnu/make/make-3.81.tar.bz2   
  35. wget http://download.savannah.gnu.org/releases/man-db/man-db-2.5.7.tar.gz   
  36. wget http://www.kernel.org/pub/linux/docs/manpages/Archive/man-pages-3.24.tar.bz2   
  37. wget http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.11.1.tar.bz2   
  38. wget http://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.bz2   
  39. wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.7.tar.gz   
  40. wget http://ftp.gnu.org/gnu/patch/patch-2.6.1.tar.bz2   
  41. wget http://cpan.org/src/5.0/perl-5.10.1.tar.bz2   
  42. wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.23.tar.gz   
  43. wget http://procps.sourceforge.net/procps-3.2.8.tar.gz   
  44. wget http://prdownloads.sourceforge.net/psmisc/psmisc-22.10.tar.gz   
  45. wget http://ftp.gnu.org/gnu/readline/readline-6.1.tar.gz   
  46. wget http://ftp.gnu.org/gnu/sed/sed-4.2.1.tar.bz2   
  47. wget ftp://pkg-shadow.alioth.debian.org/pub/pkg-shadow/shadow-4.1.4.2.tar.bz2   
  48. wget http://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.tar.gz   
  49. wget ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/sysvinit-2.86.tar.gz   
  50. wget http://ftp.gnu.org/gnu/tar/tar-1.22.tar.bz2   
  51. wget http://prdownloads.sourceforge.net/tcl/tcl8.5.8-src.tar.gz   
  52. wget http://ftp.gnu.org/gnu/texinfo/texinfo-4.13a.tar.gz   
  53. wget http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-151.tar.bz2   
  54. wget http://www.linuxfromscratch.org/lfs/downloads/development/udev-config-20100128.tar.bz2   
  55. wget http://www.kernel.org/pub/linux/utils/util-linux-ng/v2.17/util-linux-ng-2.17.1.tar.bz2   
  56. wget ftp://ftp.vim.org/pub/vim/unix/vim-7.2.tar.bz2   
  57. wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-lang.tar.gz   
  58. wget http://www.zlib.net/zlib-1.2.3.tar.bz2   


另一个脚本则用来下载LFS提供的一些补丁
Shell代码  
  1. wget http://www.linuxfromscratch.org/patches/lfs/development/bash-4.1-fixes-1.patch   
  2. wget http://www.linuxfromscratch.org/patches/lfs/development/bison-2.4.2-gcc-1.patch   
  3. wget http://www.linuxfromscratch.org/patches/lfs/development/bzip2-1.0.5-install_docs-1.patch   
  4. wget http://www.linuxfromscratch.org/patches/lfs/development/coreutils-8.4-i18n-1.patch   
  5. wget http://www.linuxfromscratch.org/patches/lfs/development/coreutils-8.4-uname-1.patch   
  6. wget http://www.linuxfromscratch.org/patches/lfs/development/expect-5.43.0-spawn-1.patch   
  7. wget http://www.linuxfromscratch.org/patches/lfs/development/expect-5.43.0-tcl_8.5.5_fix-1.patch   
  8. wget http://www.linuxfromscratch.org/patches/lfs/development/flex-2.5.35-gcc44-1.patch   
  9. wget http://www.linuxfromscratch.org/patches/lfs/development/gcc-4.5.0-startfiles_fix-1.patch   
  10. wget http://www.linuxfromscratch.org/patches/lfs/development/gettext-0.17-upstream_fixes-2.patch   
  11. wget http://www.linuxfromscratch.org/patches/lfs/development/glibc-2.11.1-gcc_fix-1.patch   
  12. wget http://www.linuxfromscratch.org/patches/lfs/development/kbd-1.15.2-backspace-1.patch   
  13. wget http://www.linuxfromscratch.org/patches/lfs/development/make-3.81-upstream_fixes-1.patch   
  14. wget http://www.linuxfromscratch.org/patches/lfs/development/patch-2.6.1-test_fix-1.patch   
  15. wget http://www.linuxfromscratch.org/patches/lfs/development/perl-5.12.0-libc-1.patch   
  16. wget http://www.linuxfromscratch.org/patches/lfs/development/procps-3.2.8-watch_unicode-1.patch   
  17. wget http://www.linuxfromscratch.org/patches/lfs/development/tar-1.23-overflow_fix-1.patch   


感谢LFS工程师的努力工作,他们不断维护着这些补丁。

接下来我们开始编译我们的临时环境,因为只是为最终的目标作一个过渡,我们不打算对编译过程作任何优化,优化的过程留在真正创建我们的linux时候再做。

下面我们逐一编译所需的编译工具。

1. Binutils:包括连接器、汇编器和其他处理目标文件(ojb)的工具。
Shell代码  
  1. mkdir -v ../binutils-build  
  2. cd ../binutils-build  
  3. ../binutils-2.20.1/configure \  
  4.     --target=$LFS_TGT --prefix=/tools \  
  5.     --disable-nls --disable-werror  
  6. make  
  7. case $(uname -m) in  
  8.   x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;  
  9. esac  
  10. make install  


2.GCC编译器,GCC 4.4依赖2个包:gmp和mpfr,而最新的GCC 4.5还需要一个mpc,依次下好这些浮点运算包。
Shell代码  
  1.   



继续编译gcc-4.3.3,按照LFS站点的方法总是报错:cannot computer suffix of the obejct,搞得我很苦恼,经过一天的troubleshooting,用以下方法可以解决:
Java代码  
  1. LDFLAGS='-L/tools/lib -R/tools/lib' 或者  
  2. LD_RUN_PATH=/tools/lib  
  3. LD_LIBRARY_PATH=/tools/lib  
  4. export LDFLAGS LD_LIBRARY_PATH LD_RUN_PATH  
  5. CC="gcc -B/usr/bin/" ../gcc-4.3.3/configure --prefix=/tools \  
  6.     --with-local-prefix=/tools --disable-nls \  
  7.     --disable-shared --enable-languages=c,c++ --with-gmp=/tools --with-mpfr=/tools  
  8. make bootstrap  
  9. make install  


现在可以去喝咖啡了。。。。全部gcc的语言stage 3编译完成大概需要两个半小时,好好享受咖啡的味道吧。