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

news/2024/5/19 20:16:15 标签: Linux, GCC, vim, Flex, Bash
[b]准备工作:[/b]

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 网络链接通畅。


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

让我们开始吧.

设置系统从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。每次调用一下就好。

[b]创建临时编译环境[/b]
因为我不喜欢用旧版本的东西,所以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,用以下方法可以解决:
[code]
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
[/code]

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

http://www.niftyadmin.cn/n/1703102.html

相关文章

Android OpenGL射线拾取手势旋转(二)

3&#xff09;Renderer&#xff1a;RayPickRenderer.java OpenGL渲染器&#xff0c;比较多的东西都在这里面了。public class RayPickRenderer implements Renderer { private Context mContext; private Cube cube; int texture -1; public float mfAngle…

[LFS] My Own Linux 第二天

总结第一天的工作&#xff0c;其实还是有些问题的&#xff0c;首先binutils是用原有的gcc-4.1.2编译的&#xff0c;而我们的目标是使用gcc-4.3.3的版本&#xff0c;因此后面还需要重新用gcc-4.3.3编译binutils&#xff0c;因此我想对此作出一些改进&#xff0c;完全删除并再次建…

0522 圆形边框

https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/?viewnetframework-4.8 ClipToBounds"True" 可以裁剪超出容器的部分。 <Border HorizontalAlignment"Left" VerticalAlignment"Top" BorderBrush"Black" Borde…

女人会说这九句谎言,一生幸福...

男人们总在抱怨&#xff0c;说女人心&#xff0c;海底针&#xff0c;他们抱怨是因为分不清真假&#xff0c;他们抱怨是因为女人的玩笑或者谎话。完全不必当众翻脸给他难堪&#xff0c;最好的办法是说一句言不由衷的谎言&#xff1a;“我不介意你看别的女人&#xff0c;再找机会…

struts2 笔记03 异常支持、防止页面刷新和后退、方法验证

Struts2对异常支持&#xff08;声明式异常、自动的异常处理&#xff09;, 异常处理&#xff08;运行期异常事务自动回滚&#xff09; 1. 自定义异常类&#xff0c;继承RuntimeException或Exception实现构造方法. 2. 配置异常&#xff1a;全局页面跳转&#xff0c;与全局异常处理…

三层架构及其优缺点

三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为&#xff1a;表现层&#xff08;UI&#xff09;、业务逻辑层&#xff08;BLL&#xff09;、数据访问层&#xff08;DAL&#xff09;。区分层次的目的即为了“高内聚&#xff0c;低耦合"的思想。…

Bean-Query 一个把对象转换为Map的Java工具库

刚开源了一个经过完整測试的Java工具类。地址例如以下&#xff1a;https://github.com/Jimmy-Shi/bean-query使用说明例如以下&#xff1a;Bean-query Click Here for English version. BeanQuery 是一个把对象转换为Map的Java工具库。支持选择Bean中的一些属性&#xff0c;对结…

MS的一些小工具

http://technet.microsoft.com/en-us/sysinternals/bb545046.aspx