`

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

阅读更多
准备工作:

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提示符下了:

一、 创建硬盘分区

我们需要在硬盘上进行编译工作,所以首先要创建硬盘分区:
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 /


chmod a+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启动呢,为了方便起见,你象我一样把这些命令写成shell script。每次调用一下就好。

创建临时编译环境
因为我不喜欢用旧版本的东西,所以LFS CD现在对我就没用处了。我维护了一个简单的脚本,用它可以下载最新的源代码:
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编译器,GCC 4.4依赖2个包:gmp和mpfr,而最新的GCC 4.5还需要一个mpc,依次下好这些浮点运算包。




继续编译gcc-4.3.3,按照LFS站点的方法总是报错:cannot computer suffix of the obejct,搞得我很苦恼,经过一天的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的语言stage 3编译完成大概需要两个半小时,好好享受咖啡的味道吧。
分享到:
评论
9 楼 jjx 2009-03-11  
咖啡伤胃,戒了
8 楼 ntcofe 2009-03-11  
用LINUX很容易伤自尊
7 楼 king_108 2009-03-11  
好漫長的一天      
6 楼 kimmking 2009-03-10  
看不懂,~~

友情赞助下~~


回头学习去了
5 楼 贫嘴男孩 2009-03-10  
看不懂写什么
4 楼 geminiyellow 2009-03-10  
还是技术流的好啊,吹水流啥都做不好。
3 楼 ray_linn 2009-03-10  
seen 写道
>>每次编译成功后清除工作目录是个好习惯

解释一下?



俺原来的目录有gcc-4.1.2的source code,编译gcc-4.3.3的时候发现有config.log里发现call到gcc-4.1.2的东西,所以为了保险起见还是清理到不要的内容为好。
2 楼 seen 2009-03-10  
>>每次编译成功后清除工作目录是个好习惯

解释一下?
1 楼 dogstar 2009-03-10  
继续 搬凳子等着呢.

相关推荐

    ARM Linux 交叉编译环境制作--Crosstool.pdf

    ARM Linux 交叉编译环境制作--Crosstool 交叉编译是指在一种体系结构的计算机上构建适用于另一种体系结构的软件的过程。在本案例中,我们关注的是在Ubuntu 10.04环境下,利用Crosstool构建用于ARM架构的Linux系统的...

    完整的arm-linux-gcc工具.pdf

    文档详细指导了如何从头开始建立`arm-linux-gcc`交叉编译环境,编译适用于EP7312的Linux内核2.4.13,并在开发板上启动Linux。此外,还介绍了如何创建基于NFS的BusyBox根文件系统,从而构建一个完整的嵌入式Linux系统...

    Linux-Kernel官方文档.pdf

    5. Linux内核是什么:Linux是Unix操作系统的一个克隆版本,由Linus Torvalds从头开始编写,并得到了全球网络上一群松散联系的黑客团队的协助。它致力于符合POSIX和Single UNIX Specification的规范。Linux具有现代、...

    OMAPL138编译Linux内核方法

    这条命令将会清除之前的所有编译结果,包括编译过程中的临时文件,确保接下来的编译是从头开始。 **1.1.2 配置内核** 完成清理后,下一步是配置内核。这一步非常重要,因为它决定了哪些功能会被包含在最终的内核中...

    Linux编译内核详解

    编译Linux内核是一项复杂但非常有价值的任务,它不仅可以帮助我们更好地理解操作系统的工作原理,还可以根据自己的需求定制系统行为,提高系统的性能和安全性。随着对Linux内核了解的深入,开发者们可以根据具体的...

    tslib交叉编译好的文件

    同时,编译环境使用的是"arm-linux-gcc-4.3.2.tgz",这是一个针对ARM架构的GNU Compiler Collection (GCC) 工具链,用于将源代码编译为可以在ARM处理器上运行的目标代码。 交叉编译是开发嵌入式系统时常用的一种...

    Debian-Linux-从头开始完整版资料.ppt

    Debian Linux 从头开始完整版资料 Debian Linux 是一个自由的操作系统,它的发展是由它的用户维护的。Debian 的支持是无与伦比的,选择 Debian 您将不会感到孤单。Debian 的安装系统是世界上最好的,安装过程简单...

    从头开始构建一个嵌入式Linux发行版.pdf

    ### 从头开始构建一个嵌入式Linux发行版 #### 目标与概述 本教程旨在展示如何在目标系统上自行构建并安装Linux系统。这一过程并非简单的预装发行版安装,而是通过从零开始的方式,使用户能够在目标设备上运行...

    linux-创建基于ArchLinux的可启动USB驱动器

    创建一个基于Arch Linux的可启动USB驱动器是安装Arch Linux到计算机上的常见方法,尤其是对于那些想要体验Arch Linux或者进行系统救援工作的人来说。这个过程涉及到几个关键步骤,下面将详细介绍如何进行。 首先,...

    srs海思3531d交叉编译.7z

    这意味着用户无需从头开始配置编译环境,可以直接使用这些预处理的源代码和指南来快速构建SRS服务器。 从标签 "srs交叉编译海思3531D" 我们可以推断,这个项目主要关注的是SRS在海思3531D硬件平台上的移植和优化,...

    打造自己的linux操作系统

    打造自己的Linux操作系统是一项涉及深度定制和系统集成的高级技术活动,通常是为了满足特定硬件或应用需求。LinuxFromScratch(LFS)项目提供了一套详细的指导,帮助用户从头开始构建自己的Linux系统。LFS是一种教育...

    从头建立交叉编译工具链

    ### 从头建立交叉编译工具链:详细指南 #### 一、交叉编译基础知识 **交叉编译**是指在一个平台上编译出另一个平台可执行的代码。这通常发生在目标平台资源有限,无法直接在其上进行编译时。在嵌入式开发领域,...

    从头开始搭建 Linux 7.0

    整个《从头开始搭建 Linux 7.0》书籍是一套完整的指南,涵盖了从准备分区、获取软件包、构建临时系统到安装和配置基本系统软件的整个过程。每一个步骤都有详细的解释和操作指南,确保读者能够一步一步建立起自己的...

    matconvnet-1.0-beta25编译成功

    1. **图像分类**:使用 MatConvNet 可以轻松实现图像分类任务,你可以加载预训练的模型(如 VGG 或 AlexNet),或者从头开始训练自己的模型。 2. **目标检测**:通过结合卷积层和区域提议网络(RPN),MatConvNet ...

    All-code-linux-libraries.rar_linux libraries

    "All-code-linux-libraries.rar"这个压缩包似乎包含了Linux系统中广泛使用的各种库的源代码,这对于学习、理解和调试Linux程序是非常有价值的。 首先,我们要了解库的分类。在Linux中,主要有两种类型的库:静态库...

    荔枝派nano-从零开始--跑起linux.pdf

    本文将从头开始指导您如何在荔枝派nano(f1c100s)上跑起linux,并且对整个过程进行了详细的解释。 知识点一:安装交叉编译链 在开始之前,我们需要安装交叉编译链。交叉编译链是用于编译linux内核和u-boot的工具。...

    OK3568-C-Forlinx Desktop 20.04-用户编译手册-V1.0 20220721

    搭建新的 ubuntu 开发环境是指从头开始搭建一个新的 ubuntu 开发环境。这一步骤需要下载 ubuntu 镜像文件,创建虚拟机,安装 ubuntu 操作系统,配置网络设置等。在搭建过程中,需要选择正确的 ubuntu 版本、分配足够...

    linux-用于构建Linux从头开始系统的Docker配置

    用于构建Linux从头开始系统的Docker配置

    LFS book 从头构建自己的linux发行版

    Linux From Scratch(LFS)是一本详尽的指南,用于从头开始构建属于用户自己的Linux发行版。该过程是通过编译和安装基础软件包,构建一个定制的、用户控制的系统环境。本指南覆盖了从最初的准备工作,到设置编译环境...

Global site tag (gtag.js) - Google Analytics