【一】从头打造自己的Linux -- 创建临时编译环境

GodLong 2009-03-10

准备工作:

1.你可能需要一张LFSliveCD,或者预装任何一种带GCC的linux来作为开发安装环境,我用的LiveCD版本是6.3R2145,你可以看到,其实你可以用任何一个LFS的livecd,因为我们大部分东西都是从网络上获得,和LFSlivecd没多大关系。你也可以从任何一款带有GCC的linux开始这段旅程。

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

3.VirtualBox网络链接通畅。

综述

简单来看,从头创建自己的linux分为三个步骤:

  • 首先利用既有linux系统在目标硬盘上/tools目录下建立一个临时的编译环境。
  • 接着利用chroot在目标硬盘上tools下的编译工具编译出linux内核和基本命令。
  • 最后编译Grub,让它引导以后的硬盘启动,彻底脱离老旧的linux

让我们开始吧.

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

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

一、创建硬盘分区

我们需要在硬盘上进行编译工作,所以首先要创建硬盘分区:

cfdisk /dev/hda
//设置分区大小后
mkfs.xfs /dev/hda1
mkswap /dev/hda2

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

二、将硬盘分区挂载在/mnt/lfs目录下

export LFS=/mnt/lfs
mkdir -pv $LFS
mount /dev/hda1 $LFS

三、创建工作目录:sources和tools

mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
mkdir -v $LFS/tools
ln -sv $LFS/tools /

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

四.创建工作组和用户lfs,同时授权

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

五、登录成lfs用户'su-lfs',并设置用户环境:

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

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

创建临时编译环境

因为我不喜欢用旧版本的东西,所以LFSCD现在对我就没用处了。我维护了一个简单的脚本,用它可以下载最新的源代码:

wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.65.tar.bz2 
wget http://ftp.gnu.org/gnu/automake/automake-1.11.1.tar.bz2 
wget http://ftp.gnu.org/gnu/bash/bash-4.1.tar.gz 
wget http://ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.bz2 
wget http://ftp.gnu.org/gnu/bison/bison-2.4.1.tar.bz2 
wget http://www.bzip.org/1.0.5/bzip2-1.0.5.tar.gz 
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.4.tar.gz 
wget http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.4.4.tar.gz 
wget http://ftp.gnu.org/gnu/diffutils/diffutils-2.9.tar.gz 
wget http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.41.10.tar.gz 
wget http://expect.nist.gov/src/expect-5.43.0.tar.gz 
wget ftp://ftp.astron.com/pub/file/file-5.04.tar.gz 
wget http://ftp.gnu.org/gnu/findutils/findutils-4.4.2.tar.gz 
wget http://prdownloads.sourceforge.net/flex/flex-2.5.35.tar.bz2 
wget http://ftp.gnu.org/gnu/gawk/gawk-3.1.7.tar.bz2 
wget http://ftp.gnu.org/gnu/gcc/gcc-4.5.0/gcc-4.5.0.tar.bz2 
wget http://ftp.gnu.org/gnu/gdbm/gdbm-1.8.3.tar.gz 
wget http://ftp.gnu.org/gnu/gettext/gettext-0.17.tar.gz 
wget http://ftp.gnu.org/gnu/glibc/glibc-2.11.1.tar.bz2 
wget http://ftp.gnu.org/gnu/gmp/gmp-5.0.1.tar.bz2 
wget http://ftp.gnu.org/gnu/grep/grep-2.5.4.tar.bz2 
wget http://ftp.gnu.org/gnu/groff/groff-1.20.1.tar.gz 
wget ftp://alpha.gnu.org/gnu/grub/grub-1.97.2.tar.gz 
wget http://ftp.gnu.org/gnu/gzip/gzip-1.4.tar.gz 
wget http://sethwklein.net/iana-etc-2.30.tar.bz2 
wget http://ftp.gnu.org/gnu/inetutils/inetutils-1.7.tar.gz 
wget http://developer.osdl.org/dev/iproute2/download/iproute2-2.6.33.tar.bz2 
wget http://ftp.altlinux.com/pub/people/legion/kbd/kbd-1.15.1.tar.gz 
wget http://www.greenwoodsoftware.com/less/less-436.tar.gz 
wget http://www.linuxfromscratch.org/lfs/downloads/development/lfs-bootscripts-20100124.tar.bz2 
wget http://ftp.gnu.org/gnu/libtool/libtool-2.2.6b.tar.gz 
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.tar.bz2 
wget http://ftp.gnu.org/gnu/m4/m4-1.4.14.tar.bz2 
wget http://ftp.gnu.org/gnu/make/make-3.81.tar.bz2 
wget http://download.savannah.gnu.org/releases/man-db/man-db-2.5.7.tar.gz 
wget http://www.kernel.org/pub/linux/docs/manpages/Archive/man-pages-3.24.tar.bz2 
wget http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.11.1.tar.bz2 
wget http://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.bz2 
wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.7.tar.gz 
wget http://ftp.gnu.org/gnu/patch/patch-2.6.1.tar.bz2 
wget http://cpan.org/src/5.0/perl-5.10.1.tar.bz2 
wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.23.tar.gz 
wget http://procps.sourceforge.net/procps-3.2.8.tar.gz 
wget http://prdownloads.sourceforge.net/psmisc/psmisc-22.10.tar.gz 
wget http://ftp.gnu.org/gnu/readline/readline-6.1.tar.gz 
wget http://ftp.gnu.org/gnu/sed/sed-4.2.1.tar.bz2 
wget ftp://pkg-shadow.alioth.debian.org/pub/pkg-shadow/shadow-4.1.4.2.tar.bz2 
wget http://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.tar.gz 
wget ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/sysvinit-2.86.tar.gz 
wget http://ftp.gnu.org/gnu/tar/tar-1.22.tar.bz2 
wget http://prdownloads.sourceforge.net/tcl/tcl8.5.8-src.tar.gz 
wget http://ftp.gnu.org/gnu/texinfo/texinfo-4.13a.tar.gz 
wget http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-151.tar.bz2 
wget http://www.linuxfromscratch.org/lfs/downloads/development/udev-config-20100128.tar.bz2 
wget http://www.kernel.org/pub/linux/utils/util-linux-ng/v2.17/util-linux-ng-2.17.1.tar.bz2 
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.2.tar.bz2 
wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-lang.tar.gz 
wget http://www.zlib.net/zlib-1.2.3.tar.bz2

另一个脚本则用来下载LFS提供的一些补丁

wget http://www.linuxfromscratch.org/patches/lfs/development/bash-4.1-fixes-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/bison-2.4.2-gcc-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/bzip2-1.0.5-install_docs-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/coreutils-8.4-i18n-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/coreutils-8.4-uname-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/expect-5.43.0-spawn-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/expect-5.43.0-tcl_8.5.5_fix-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/flex-2.5.35-gcc44-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/gcc-4.5.0-startfiles_fix-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/gettext-0.17-upstream_fixes-2.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/glibc-2.11.1-gcc_fix-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/kbd-1.15.2-backspace-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/make-3.81-upstream_fixes-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/patch-2.6.1-test_fix-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/perl-5.12.0-libc-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/procps-3.2.8-watch_unicode-1.patch 
wget http://www.linuxfromscratch.org/patches/lfs/development/tar-1.23-overflow_fix-1.patch

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

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

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

1.Binutils:包括连接器、汇编器和其他处理目标文件(ojb)的工具。

mkdir -v ../binutils-build
cd ../binutils-build
../binutils-2.20.1/configure \
    --target=$LFS_TGT --prefix=/tools \
    --disable-nls --disable-werror
make
case $(uname -m) in
  x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
make install

2.GCC编译器,GCC4.4依赖2个包:gmp和mpfr,而最新的GCC4.5还需要一个mpc,依次下好这些浮点运算包。

继续编译gcc-4.3.3,按照LFS站点的方法总是报错:cannotcomputersuffixoftheobejct,搞得我很苦恼,经过一天的troubleshooting,用以下方法可以解决:

LDFLAGS='-L/tools/lib -R/tools/lib' 或者
LD_RUN_PATH=/tools/lib
LD_LIBRARY_PATH=/tools/lib
export LDFLAGS LD_LIBRARY_PATH LD_RUN_PATH
CC="gcc -B/usr/bin/" ../gcc-4.3.3/configure --prefix=/tools \
    --with-local-prefix=/tools --disable-nls \
    --disable-shared --enable-languages=c,c++ --with-gmp=/tools --with-mpfr=/tools
make bootstrap
make install

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

相关推荐