比别人多一点志气,你就会多一份出息 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

LFS学习整理:第一部分编译准备

linux入门教程 memory 发布于July 30, 2018 标签: Linux

官网:http://www.linuxfromscratch.org/lfs/
母机:Debian 9 amd64 裸机
环境:VirtualBox , 两块磁盘, 一个20G做系统盘,一个40G做安装源码盘。后面将这个40G格式化后挂载/mnt下
版本:LFS 8.2

磁盘分区

fdisk /dev/sdb
mount /dev/sdb1 /mnt

设置LFS变量

vi .bash_profile
export LFS=/mnt/lfs

创建相关目录

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

检查必备组件 version-check.sh

#!/bin/bash
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH

echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found" 
fi

bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1

if [ -h /usr/bin/awk ]; then
  echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
  echo awk is `/usr/bin/awk --version | head -n1`
else 
  echo "awk not found" 
fi

gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-  # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1

echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
  then echo "g++ compilation OK";
  else echo "g++ compilation failed"; fi
rm -f dummy.c dummy

我在要于需要安装一些其它的扩展

apt-get install bison gawk g++ m5 gcc xz-utils coreutils make

全部显示正常即可

bash, version 4.4.12(1)-release
/bin/sh -> /bin/dash
ERROR: /bin/sh does not point to bash
Binutils: (GNU Binutils for Debian) 2.28
bison (GNU Bison) 3.0.4
/usr/bin/yacc -> /usr/bin/bison.yacc
bzip2,  Version 1.0.6, 6-Sept-2010.
Coreutils:  8.26
diff (GNU diffutils) 3.5
find (GNU findutils) 4.7.0-git
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2)
/usr/bin/awk -> /usr/bin/gawk
gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
(Debian GLIBC 2.24-11+deb9u3) 2.24
grep (GNU grep) 2.27
gzip 1.6
Linux version 4.9.0-7-amd64 (debian-kernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.110-1 (2018-07-05)
m4 (GNU M4) 1.4.18
GNU Make 4.1
GNU patch 2.7.5
Perl version='5.24.1';
sed (GNU sed) 4.4
tar (GNU tar) 1.29
texi2any (GNU texinfo) 6.3
xz (XZ Utils) 5.2.2
g++ compilation OK

下载LFS相关的源码包

我比较懒,直接下载了所有的安装包

http://ftp.lfs-matrix.net/pub/lfs/lfs-packages/lfs-packages-8.2.tar

下载到$LFS/sources,解压并将各个包放在此目录下。不要再放下级目录了哟.

创建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
su - lfs

创建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
LFS_TGT=$(uname -m)-lfs-linux-gnu 
PATH=/tools/bin:/bin:/usr/bin 
export LFS LC_ALL LFS_TGT PATH EOF

生效

source ~/.bash_profile

可以自己在命令行输出一下$LFS确认一下

安装Binutils

cd /mnt/lfs/sources
tar -xf binutils-*.tar.bz2 \
  && mv binutils-* binutils \
  && cd binutils \
  && mkdir -v build \
  && cd build \
  && ../configure               \
    --prefix=/tools            \
    --with-sysroot=$LFS        \
    --with-lib-path=/tools/lib \
    --target=$LFS_TGT          \
    --disable-nls              \
    --disable-werror           \
  && make \
  && mkdir -pv /tools/lib \
  && ln -sv lib /tools/lib64 \
  && make install

安装gcc (第一遍)

cd /mnt/lfs/sources
tar -xf gcc-*.tar.xz \
  && mv gcc-* gcc \
  && cd gcc \
  && tar -xf ../mpfr-*.tar.xz \
  && mv -v mpfr-* mpfr \
  && tar -xf ../gmp-*.tar.xz \
  && mv -v gmp-* gmp \
  && tar -xf ../mpc-*.tar.gz \
  && mv -v mpc-* mpc \
  && for file in gcc/config/{linux,i386/linux{,64}}.h; do \
      cp -uv $file{,.orig}; \
      sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' -e 's@/usr@/tools@g' $file.orig > $file; \
      echo -e "#undef STANDARD_STARTFILE_PREFIX_1 \n#undef STANDARD_STARTFILE_PREFIX_2 \n#define STANDARD_STARTFILE_PREFIX_1 \"/tools/lib/\" \n#define STANDARD_STARTFILE_PREFIX_2 \"\"" >> $file; \
      touch $file.orig; \
    done \
  && case $(uname -m) in \
     x86_64) \
       sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64 \
       ;; \
    esac \
  && mkdir -v build \
  && cd build \
  && ../configure                                   \
    --target=$LFS_TGT                              \
    --prefix=/tools                                \
    --with-glibc-version=2.11                      \
    --with-sysroot=$LFS                            \
    --with-newlib                                  \
    --without-headers                              \
    --with-local-prefix=/tools                     \
    --with-native-system-header-dir=/tools/include \
    --disable-nls                                  \
    --disable-shared                               \
    --disable-multilib                             \
    --disable-decimal-float                        \
    --disable-threads                              \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libmpx                               \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --disable-libstdcxx                            \
    --enable-languages=c,c++                       \
  && make \
  && make install

安装 Linux API 头文件

cd /mnt/lfs/sources
tar -xf linux-*.tar.xz \
  && mv linux-* linux \
  && cd linux \
  && make mrproper \
  && make INSTALL_HDR_PATH=dest headers_install \
  && cp -rv dest/include/* /tools/include \

安装 Glibc

cd /mnt/lfs/sources
tar -xf glibc-*.tar.xz \
  && mv glibc-* glibc \
  && cd glibc \
  && mkdir -v build \
  && cd build \
  && ../configure                       \
    --prefix=/tools                    \
    --host=$LFS_TGT                    \
    --build=$(../scripts/config.guess) \
    --enable-kernel=3.2                \
    --with-headers=/tools/include      \
    libc_cv_forced_unwind=yes          \
    libc_cv_c_cleanup=yes              \
  && make \
  && make install

确认新工具链的基本功能(编译和链接)都是像预期的那样正常工作

echo 'int main(){}' > dummy.c \
  && $LFS_TGT-gcc dummy.c \
  && readelf -l a.out | grep ': /tools' \
  && rm -v dummy.c a.out

安装Libstdc++

cd /mnt/lfs/sources/gcc
rm -rf build
mkdir build && cd build

编译

../libstdc++-v3/configure           \
    --host=$LFS_TGT                 \
    --prefix=/tools                 \
    --disable-multilib              \
    --disable-nls                   \
    --disable-libstdcxx-threads     \
    --disable-libstdcxx-pch         \
    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/7.3.0 \
&& make \
&& make install

Binutils 第二遍

cd /mnt/lfs/sources/binutils
rm -rf build
mkdir -v build
cd build

准备

CC=$LFS_TGT-gcc                \
AR=$LFS_TGT-ar                 \
RANLIB=$LFS_TGT-ranlib         \
../configure                   \
    --prefix=/tools            \
    --disable-nls              \
    --disable-werror           \
    --with-lib-path=/tools/lib \
    --with-sysroot

编译

make && make install

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

第二遍GCC

cd /mnt/lfs/sources
rm gcc
tar zxvf gcc-*.tar.gz
mv gcc-* gcc
cd gcc

创建完整的内部文件头

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

再来一遍

for file in gcc/config/{linux,i386/linux{,64}}.h
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

64位系统

sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64

解压

tar -xf ../mpfr-4.0.1.tar.xz
mv -v mpfr-4.0.1 mpfr
tar -xf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz
mv -v mpc-1.1.0 mpc
mkdir -v build && cd build

准备编译 GCC

CC=$LFS_TGT-gcc                                    \
CXX=$LFS_TGT-g++                                   \
AR=$LFS_TGT-ar                                     \
RANLIB=$LFS_TGT-ranlib                             \
../configure                                       \
    --prefix=/tools                                \
    --with-local-prefix=/tools                     \
    --with-native-system-header-dir=/tools/include \
    --enable-languages=c,c++                       \
    --disable-libstdcxx-pch                        \
    --disable-multilib                             \
    --disable-bootstrap                            \
    --disable-libgomp

编译

make && make install
ln -sv gcc /tools/bin/cc

测试

echo 'int main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

安装TCL

cd /mnt/lfs/sources
tar -xf tcl-core*-src.tar.gz\
  && mv tcl* tcl-core \
  && cd tcl-core \
  && cd unix \
  && ./configure --prefix=/tools \
  && make \
  && if [ $LFS_TEST -eq 1 ]; then TZ=UTC make test; fi \
  && make install \
  && chmod -v u+w /tools/lib/libtcl8.6.so \
  && make install-private-headers \
  && ln -sv tclsh8.6 /tools/bin/tclsh \

安装Expect

cd /mnt/lfs/sources
tar -xf expect*.tar.gz\
  && mv expect* expect \
  && cd expect \
  && cp -v configure{,.orig} \
  && sed 's:/usr/local/bin:/bin:' configure.orig > configure \
  && ./configure --prefix=/tools        \
      --with-tcl=/tools/lib            \
      --with-tclinclude=/tools/include \
  && make \
  && make SCRIPTS="" install

安装DejaGNU

cd /mnt/lfs/sources
tar -xf dejagnu-*.tar.gz \
  && mv dejagnu-* dejagnu \
  && cd dejagnu \
  && ./configure --prefix=/tools \
  && make install

安装M4

cd /mnt/lfs/sources
tar -xf check-*.tar.gz\
  && mv check-* check \
  && cd check \
  && ./configure --prefix=/tools \
  && make \
  && make install 

安装 Ncurses

cd /mnt/lfs/sources
tar -xf ncurses-*.tar.gz \
  && mv ncurses-* ncurses \
  && cd ncurses \
  && sed -i s/mawk// configure \
  && ./configure          \
      --prefix=/tools    \
      --with-shared      \
      --without-debug    \
      --without-ada      \
      --enable-widec     \
      --enable-overwrite \
  && make \
  && make install

安装base

cd /mnt/lfs/sources
tar -xf bash-*.tar.gz\
  && mv bash-* bash \
  && cd bash \
  && ./configure --prefix=/tools --without-bash-malloc \
  && make \
  && if [ $LFS_TEST -eq 1 ]; then make tests; fi \
  && make install \
  && ln -sv bash /tools/bin/sh

安装bison

cd /mnt/lfs/sources
tar -xf bison-*.tar.xz\
  && mv bison-* bison \
  && cd bison \
  && ./configure --prefix=/tools \
  && make \
  && make install

安装Bzip2

cd /mnt/lfs/sources
tar -xf bzip2-*.tar.gz\
  && mv bzip2-* bzip2 \
  && cd bzip2 \
  && make \
  && make PREFIX=/tools install

安装 Coreutils

cd /mnt/lfs/sources
tar -xf coreutils-*.tar.xz \
  && mv coreutils-* coreutils \
  && cd coreutils \
  && ./configure --prefix=/tools --enable-install-program=hostname \
  && make \
  && if [ $LFS_TEST -eq 1 ]; then make RUN_EXPENSIVE_TESTS=yes check || true; fi \
  && make install

安装Diffutils

cd /mnt/lfs/sources
tar -xf diffutils-*.tar.xz \
  && mv diffutils-* diffutils \
  && cd diffutils \
  && ./configure --prefix=/tools \
  && make \
  && make install

安装File

cd /mnt/lfs/sources
tar -xf file-*.tar.gz \
  && mv file-* file \
  && cd file \
  && ./configure --prefix=/tools \
  && make \
  && make install

Findutils

cd /mnt/lfs/sources
tar -xf findutils-*.tar.gz \
  && mv findutils-* findutils \
  && cd findutils \
  && ./configure --prefix=/tools \
  && make \
  && make install

安装 Gawk

cd /mnt/lfs/sources
tar -xf gawk-*.tar.xz\
  && mv gawk-* gawk \
  && cd gawk \
  && ./configure --prefix=/tools \
  && make \
  && make install

安装 Gettext

cd /mnt/lfs/sources
tar -xf gettext-*.tar.xz\
  && mv gettext-* gettext \
  && cd gettext \
  && cd gettext-tools \
  && EMACS="no" ./configure --prefix=/tools --disable-shared \
  && make -C gnulib-lib \
  && make -C intl pluralx.c \
  && make -C src msgfmt \
  && make -C src msgmerge \
  && make -C src xgettext \
  && cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin

安装 Grep

cd /mnt/lfs/sources
tar -xf grep-*.tar.xz\
  && mv grep-* grep \
  && cd grep \
  && ./configure --prefix=/tools \
  && make \
  && make install

安装Gzip

cd /mnt/lfs/sources
tar -xf gzip-*.tar.xz\
  && mv gzip-* gzip \
  && cd gzip \
  && ./configure --prefix=/tools \
  && make \
  && make install

安装M4

cd /mnt/lfs/sources
tar -xf m4-*.tar.xz\
  && mv m4-* m4 \
  && cd m4 \
  && ./configure --prefix=/tools \
  && make \
  && make install

安装Make

cd /mnt/lfs/sources
tar -xf make-*.tar.bz2\
 && mv make-* make \
 && cd make \
 && sed -i '211,217 d; 219,229 d; 232 d' glob/glob.c \
 && ./configure --prefix=/tools --without-guile \
 && make \
 && make install

安装 Patch

cd /mnt/lfs/sources
tar -xf patch-*.tar.xz\
  && mv patch-* patch \
  && cd patch \
  && ./configure --prefix=/tools \
  && make \
  && make install 

安装 Perl

cd /mnt/lfs/sources
tar -xf perl-5*.tar.xz\
  && mv perl-* perl \
  && cd perl \
  && sh Configure -des -Dprefix=/tools -Dlibs=-lm \
  && make \
  && cp -v perl cpan/podlators/scripts/pod2man /tools/bin \
  && mkdir -pv /tools/lib/perl5/5.26.1 \
  && cp -Rv lib/* /tools/lib/perl5/5.26.1

安装 Sed

cd /mnt/lfs/sources
tar -xf sed-*.tar.xz\
  && mv sed-* sed \
  && cd sed \
  && ./configure --prefix=/tools \
  && make \
  && make install

安装 Tar

cd /mnt/lfs/sources
tar -xf tar-*.tar.xz \
 && mv tar-* tar \
 && cd tar \
 && ./configure --prefix=/tools \
 && make \
 && make install

安装 Texinfo

cd /mnt/lfs/sources
tar -xf texinfo-*.tar.xz\
  && mv texinfo-* texinfo \
  && cd texinfo \
  && ./configure --prefix=/tools \
  && make \
  && make install

安装 Util-linux

cd /mnt/lfs/sources
tar -xf util-linux-*.tar.xz\
  && mv util-linux-* util-linux \
  && cd util-linux \
  && ./configure --prefix=/tools    \
     --without-python               \
     --disable-makeinstall-chown    \
     --without-systemdsystemunitdir \
     --without-ncurses              \
     PKG_CONFIG=""                  \
  && make \
  && make install

安装xz

cd /mnt/lfs/sources
tar -xf xz-*.tar.xz \
  && mv xz-* xz \
  && cd xz \
  && ./configure --prefix=/tools \
  && make \
  && make install 

切回root准备构建

su root
chown -R root:root $LFS/tools

基本上照着文档可以一路走完.
后面第二部分的就不再麻烦了...照着写吧...

相关推荐

添加新评论

网站状态

  • 栏目分类:49个
  • 发布文章:1550篇
  • 用户评论:820条
  • 开博至今:4282天

正则速查

[abc] 匹配中括号中的单个字符,如a或b或c
[^abc] 匹配除了a、b、c等字符的其他单个字符
[a-z] 匹配一个字符范围,如a到z
[a-zA-Z] 匹配一个字符范围,如a-z 或 A-Z
^ 匹配行的开始
$ 匹配行的结束
\A 匹配一个字符串的开始
\z 匹配一个字符串的结束
. 匹配任意单个字符
\s 匹配空白字符,如空格,TAB
\S 匹配非空白字符
\d 匹配一个数字
\D 匹配非数字
\w 匹配一个字母
\W 匹配非字母
\b 匹配字符边界
(...) 引用所有括号中的内容
(a|b) a或者b
a? 零个或1个a
a* 零个或多个a
a+ 1个或多个a
a{3} 3次重复的a
a{3,} 3次或3次以上重复的a
a{3,6} 3到6次重复的a

修正符

/g 查找所有可能的匹配
/i 不区分大小写
/m 多行匹配
/s 单行匹配
/x 忽略空白模式
/e 可执行模式,PHP专有
/A 强制从目标字符串开头匹配
/D 使用$限制结尾字符,则不允许结尾有换行
/U 只匹配最近的一个字符串;不重复匹配

最新回复

  • 小云: 厉害,实用
  • memory: NND。自己写的看不懂了。。。
  • memory: 服务器上的一个配置.
  • haha: 是在主机端还是从机端设置
  • wu先生: 收藏备用。
  • memory: 哈哈,无所谓了。。。早改了
  • 文小刀: 真的是很标题
  • 进击的巨波: 终于找到一篇真正行的通的安装git文档,写的非常详细,感谢!
  • memory: 可以邮件告知一下具体错误给我。你可以在本地先测试一下。我这样测试...
  • 钛客志: 你好博主,我是按照你的方法设置,但是老是出错,要么站点出问题,不...
  • 小云: 受教了
  • memory: 这是个扩展,安装就有了.
  • andy: $oauth = new OAuth($conskey,$con...
  • 王者上不了: Chew_WGA v0.9可永久激活,亲测过
  • 小云: 打卡
  • 小云: 不错啊,收藏起来先
  • 小云: 收藏,很不错