因爲第一次編譯,花了很多時間,也不知道能不能成功,因此就沒有記筆記,如今從新編譯一次,此次不裝U盤而是裝到個人移動硬盤上面。步驟差很少,由於我感受硬盤的速度會比U盤快。linux
至於LFS的優勢,我就很少說了,相信你只要聽過LFS這個詞,就必定會知道它的優勢的。這裏我用的是最新版的LFS7.4,由於最新版的都會修復一些錯誤,或者編譯方法會更合理一些。c++
下面就是個人安裝之路:bootstrap
1.首先就是分區,創建文件系統,掛載文件系統bash
個人分區以下:ide
/dev/sdb是個人移動硬盤,大概有80G大小吧。上圖中的/dev/sdb1是做爲/boot分區的,有100M左右,/dev/sdb2是做爲/分區的,有10G左右,餘下的是我真正存儲檔案的硬盤。至於怎麼分區,查一下fdisk命令的用法,其實很簡單的。不過記得要把/dev/sdb1標記爲可引導的,也就是咱們的/boot分區。工具
分區完了以後,創建文件系統,也就是格式化爲ext4文件系統。測試
mkfs -v -t ext4 /dev/sdb1
mkfs -v -t ext4 /dev/sdb2
這裏我沒有分swap分區,由於個人宿主系統已經有swap分區了,編譯時就可使用。至於新系統,能夠編譯結束後在新系統中再分swap也同樣。ui
接着就是掛載這些文件系統了。atom
export LFS=/mnt/lfs
mkdir -pv $LFS mount -v -t ext4 /dev/sdb2 $LFS mkdir -pv $LFS/boot mount -v -t ext4 /dev/sdb1 $LFS/boot
2.準備軟件包和一些補丁。spa
mkdir -v $LFS/sources chmod -v a+wt $LFS/sources wget -i wget-list -P $LFS/sources pushd $LFS/sources md5sum -c md5sums popd
3. 最後的準備:
mkdir -v $LFS/tools
ln -sv $LFS/tools /tools #文檔中用的是 ln -sv $LFS/tools / (此爲簡寫形式)
添加用戶:
groupadd lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs passwd lfs chown -v lfs $LFS/sources chown -v lfs $LFS/tools su - lfs
設置用戶lfs的環境變量:
cat > ~/.bash_profile <<EOF exec env -i HOME=$HOME TERM=$TERM /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
PS1="\$? \u@\h \w\$ " export LFS LC_ALL LFS_TGT PATH PS1 EOF
加載剛設置的環境:
source ~/.bash_profile
到此,咱們的環境已經設置好了。export一下應該會是這樣的:
尤爲注意LFS、LFS_TGT、PATH這幾個變量的值。其中,變量PS1咱們使用了一個小技巧,在最前面是$?,這樣咱們執行一個命令的時候,能夠看看前面的值是否是0,若是是0就表示上一步的命令正確執行了,不然的話,就表示上一步出錯了。
若是這些變量正確的話,就繼續。
4. 開始編譯臨時的系統
編譯以前首先肯定LFS變量的值是/mnt/lfs,另外要知足host system的要求
以後,進入$LFS/sources目錄開始編譯。
cd $LFS/sources
Binutils-2.23.2 - Pass 1
tar xvf binutils-2.23.2.tar.bz2 cd binutils-2.23.2 sed -i -e 's/@colophon/@@colophon/' -e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo mkdir -v ../binutils-build cd ../binutils-build ../binutils-2.23.2/configure \ --prefix=/tools \ --with-sysroot=$LFS \ --target=$LFS_TGT \ --with-lib-path=/tools/lib \ --disable-nls \ --disable-werror make make install cd .. rm -rf binutils-build bintuils-2.23.2
GCC-4.8.1 - Pass 1
1 tar xvf gcc-4.8.1.tar.bz2 2 cd gcc-4.8.1 3 tar -Jxf ../mpfr-3.1.2.tar.xz 4 mv -v mpfr-3.1.2 mpfr 5 tar -Jxf ../gmp-5.1.2.tar.xz 6 mv -v gmp-5.1.2 gmp 7 tar -zxf ../mpc-1.0.1.tar.gz 8 mv -v mpc-1.0.1 mpc 9 10 for file in \ 11 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h) 12 do 13 cp -uv $file{,.orig} 14 sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ 15 -e 's@/usr@/tools@g' $file.orig > $file 16 echo ' 17 #undef STANDARD_STARTFILE_PREFIX_1 18 #undef STANDARD_STARTFILE_PREFIX_2 19 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" 20 #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file 21 touch $file.orig 22 done 23 24 sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure 25 mkdir -v ../gcc-build 26 cd ../gcc-build 27 ../gcc-4.8.1/configure \ 28 --prefix=/tools \ 29 --with-sysroot=$LFS \ 30 --target=$LFS_TGT \ 31 --with-newlib \ 32 --without-headers \ 33 --with-local-prefix=/tools \ 34 --with-native-system-header-dir=/tools/include \ 35 --disable-nls \ 36 --disable-shared \ 37 --disable-multilib \ 38 --disable-decimal-float \ 39 --disable-threads \ 40 --disable-libatomic \ 41 --disable-libgomp \ 42 --disable-libitm \ 43 --disable-libmudflap \ 44 --disable-libquadmath \ 45 --disable-libsanitizer \ 46 --disable-libssp \ 47 --disable-libstdc++-v3 \ 48 --enable-languages=c,c++ \ 49 --with-mpfr-include=$(pwd)/../gcc-4.8.1/mpfr/src \ 50 --with-mpfr-lib=$(pwd)/mpfr/src/.libs 51 make 52 make install 53 ln -sv libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'` 54 55 cd .. 56 rm -rf gcc-build gcc-4.8.1
Linux-3.10.10 API Headers
1 tar xvf linux-3.10.10.tar.xz 2 cd linux-3.10.10 3 make mrproper 4 make headers_check 5 make INSTALL_HDR_PATH=dest headers_install 6 cp -rv dest/include/* /tools/include 7 cd .. 8 rm -rf linux-3.10.10
Glibc-2.18
1 tar xvf glibc-2.18.tar.xz 2 cd glibc-2.18 3 if [ ! -r /usr/include/rpc/types.h ]; then 4 su -c 'mkdir -p /usr/include/rpc' 5 su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc' 6 fi 7 sed -i -e 's/static __m128i/inline &/' sysdeps/x86_64/multiarch/strstr.c 8 mkdir -v ../glibc-build 9 cd ../glibc-build 10 ../glibc-2.18/configure \ 11 --prefix=/tools \ 12 --host=$LFS_TGT \ 13 --build=$(../glibc-2.18/scripts/config.guess) \ 14 --disable-profile \ 15 --enable-kernel=2.6.32 \ 16 --with-headers=/tools/include \ 17 libc_cv_forced_unwind=yes \ 18 libc_cv_ctors_header=yes \ 19 libc_cv_c_cleanup=yes 20 make 21 make install 22 cd .. 23 rm -rf glibc-2.18 glibc-build
到這裏須要測試一下:
echo 'main(){}' > dummy.c $LFS_TGT-gcc dummy.c readelf -l a.out | grep interpreter
若是輸出是
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
就能夠繼續了。不然必定要查看是哪裏出了問題並在繼續以前糾正。
rm -v dummy.c a.out
Libstdc++-4.8.1
1 tar xvf gcc-4.8.1.tar.bz2 2 cd gcc-4.8.1 3 mkdir -pv ../gcc-build 4 cd ../gcc-build 5 ../gcc-4.8.1/libstdc++-v3/configure \ 6 --prefix=/tools \ 7 --host=$LFS_TGT \ 8 --disable-multilib \ 9 --disable-shared \ 10 --disable-nls \ 11 --disable-libstdcxx-threads \ 12 --disable-libstdcxx-pch \ 13 --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/4.8.1 14 make 15 make install 16 cd .. 17 rm -rf gcc-4.8.1 gcc-build
Binutils-2.23.2 - Pass 2
1 tar xvf binutils-2.23.2.tar.bz2 2 cd binutils-2.23.2 3 sed -i -e 's/@colophon/@@colophon/' \ 4 -e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo 5 mkdir -v ../binutils-build 6 cd ../binutils-build 7 CC=$LFS_TGT-gcc \ 8 AR=$LFS_TGT-ar \ 9 RANLIB=$LFS_TGT-ranlib \ 10 ../binutils-2.23.2/configure \ 11 --prefix=/tools \ 12 --disable-nls \ 13 --with-lib-path=/tools/lib \ 14 --with-sysroot 15 make 16 make install 17 make -C ld clean 18 make -C ld LIB_PATH=/usr/lib:/lib 19 cp -v ld/ld-new /tools/bin 20 cd .. 21 rm -rf binutils-2.23.2 binutils-build
GCC-4.8.1 - Pass 2
1 tar xvf gcc-4.8.1.tar.bz2 2 cd gcc-4.8.1 3 cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ 4 `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h 5 cp -v gcc/Makefile.in{,.tmp} 6 sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp > gcc/Makefile.in 7 for file in \ 8 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h) 9 do 10 cp -uv $file{,.orig} 11 sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ 12 -e 's@/usr@/tools@g' $file.orig > $file 13 echo ' 14 #undef STANDARD_STARTFILE_PREFIX_1 15 #undef STANDARD_STARTFILE_PREFIX_2 16 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" 17 #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file 18 touch $file.orig 19 done 20 21 tar -Jxf ../mpfr-3.1.2.tar.xz 22 mv -v mpfr-3.1.2 mpfr 23 tar -Jxf ../gmp-5.1.2.tar.xz 24 mv -v gmp-5.1.2 gmp 25 tar -zxf ../mpc-1.0.1.tar.gz 26 mv -v mpc-1.0.1 mpc 27 mkdir -v ../gcc-build 28 cd ../gcc-build 29 30 CC=$LFS_TGT-gcc \ 31 CXX=$LFS_TGT-g++ \ 32 AR=$LFS_TGT-ar \ 33 RANLIB=$LFS_TGT-ranlib \ 34 ../gcc-4.8.1/configure \ 35 --prefix=/tools \ 36 --with-local-prefix=/tools 37 --with-native-system-header-dir=/tools/include \ 38 --enable-clocale-gnu \ 39 --enable-shared \ 40 --enable-threads=posix \ 41 --enable-__cxa_atexit \ 42 --enable-languages=c,c++ \ 43 --disable-libstdcxx-pch \ 44 --disable-multilib \ 45 --disable-bootstrap \ 46 --disable-libgomp \ 47 --with-mpfr-include=$(pwd)/../gcc-4.8.1/mpfr/src \ 48 --with-mpfr-lib=$(pwd)/mpfr/src/.libs 49 make 50 make install 51 ln -sv gcc /tools/bin/cc 52 cd .. 53 rm -rf gcc-4.8.1 gcc-build
到此,還得進一步驗證:
echo 'main(){}' > dummy.c cc dummy.c readelf -l a.out | grep interpreter
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
表示正確。能夠繼續
rm -v dummy.c a.out
Tcl-8.6.0
1 tar xvf tcl8.6.0-src.tar.gz 2 cd tcl8.6.0-src 3 sed -i s/500/5000/ generic/regc_nfa.c 4 cd unix 5 ./configure --prefix=/tools 6 make 7 TZ=UTC make test 8 make install 9 chmod -v u+w /tools/lib/libtcl8.6.so 10 make install-private-headers 11 ln -sv tclsh8.6 /tools/bin/tclsh 12 cd ../..13 rm -rf tcl8.6.0-src
Expect-5.45
1 tar xvf expect5.45.tar.gz 2 cd expect5.45 3 cp -v configure{,.orig} 4 sed 's:/usr/local/bin:/bin:' configure.orig > configure 5 ./configure \ 6 --prefix=/tools \ 7 --with-tcl=/tools/lib \ 8 --with-tclinclude=/tools/include 9 make 10 make test 11 make SCRIPTS="" install 12 cd .. 13 rm -rf expect5.45
DejaGNU-1.5.1
tar xvf dejagnu-1.5.1.tar.gz cd dejagnu-1.5.1 ./configure --prefix=/tools make install make check cd .. rm -rf dejagnu-1.5.1
Check-0.9.10
tar xvf check-0.9.10.tar.gz cd check-0.9.10 ./configure --prefix=/tools make make check make install cd .. rm -rf check-0.9.10
Ncurses-5.9
tar xvf ncurses-5.9.tar.gz cd ncurses-5.9 ./configure \ --prefix=/tools \ --with-shared \ --without-debug \ --without-ada \ --enable-overwrite make make install cd .. rm -rf ncurses-5.9
Bash-4.2
tar xvf bash-4.2.tar.gz cd bash-4.2 patch -Np1 -i ../bash-4.2-fixes-12.patch ./configure --prefix=/tools --without-bash-malloc make make tests make install ln -sv bash /tools/bin/sh cd .. rm -rf bash-4.2
Bzip2-1.0.6
tar xvf bzip2-1.0.6.tar.gz cd bzip2-1.0.6 make make PREFIX=/tools install cd .. rm -rf bzip2-1.0.6
Coreutils-8.21
tar xvf coreutils-8.21.tar.xz cd coreutils-8.21 ./configure --prefix=/tools --enable-install-program=hostname make make RUN_EXPENSIVE_TESTS=yes check make install cd .. rm -rf coreutils-8.21
Diffutils-3.3
tar xvf diffutils-3.3.tar.xz cd diffutils-3.3 ./configure --prefix=/tools make make check make install cd .. rm -rf diffutils-3.3
File-5.14
tar xvf file-5.14.tar.gz cd file-5.14 ./configure --prefix=/tools make make check make install cd .. rm -rf file-5.14
Findutils-4.4.2
tar xvf findutils-4.4.2.tar.gz cd findutils-4.4.2 ./configure --prefix=/tools make make check make install cd .. rm -rf findutils-4.4.2
Gawk-4.1.0
tar xvf gawk-4.1.0.tar.xz cd gawk-4.1.0 ./configure --prefix=/tools make make check make install cd .. rm -rf gawk-4.1.0
Gettext-0.18.3
tar xvf gettext-0.18.3.tar.gz cd gettext-0.18.3 cd gettext-tools EMACS="no" ./configure --prefix=/tools --disable-shared make -C gnulib-lib make -C src msgfmt cp -v src/msgfmt /tools/bin cd ../.. rm -rf gettext-0,18.3
Grep-2.14
tar xvf grep-2.14.tar.xz cd grep-2.14 ./configure --prefix=/tools make make check make install cd .. rm -rf grep-2.14
Gzip-1.6
tar xvf gzip-1.6.tar.xz cd gzip-1.6 ./configure --prefix=/tools make make check make install cd .. rm -rf gzip-1.6
M4-1.4.16
tar xvf m4-1.4.16.tar.bz2 cd m4-1.4.16 sed -i -e '/gets is a/d' lib/stdio.in.h ./configure --prefix=/tools make make check make install cd .. rm -rf m4-1.4.16
Make-3.82
tar xvf make-3.82.tar.bz2 cd make-3.82 ./configure --prefix=/tools make make check make install cd .. rm -rf make-3.82
Patch-2.7.1
tar xvf patch-2.7.1.tar.xz cd patch-2.7.1 ./configure --prefix=/tools make make check make install cd .. rm -rf patch-2.7.1
Perl-5.18.1
1 tar xvf perl-5.18.1.tar.bz2 2 cd perl-5.18.1 3 patch -Np1 -i ../perl-5.18.1-libc-1.patch 4 sh Configure -des -Dprefix=/tools 5 make 6 cp -v perl cpan/podlators/pod2man /tools/bin 7 mkdir -pv /tools/lib/perl5/5.18.1 8 cp -Rv lib/* /tools/lib/perl5/5.18.1 9 cd .. 10 rm -rf perl-5.18.1
Sed-4.2.2
tar xvf sed-4.2.2.tar.bz2 cd sed-4.2.2 ./configure --prefix=/tools make make check make install cd .. rm -rf sed-4.2.2
Tar-1.26
tar xvf tar-1.26.tar.bz2 cd tar-1.26 sed -i -e '/gets is a/d' gnu/stdio.in.h ./configure --prefix=/tools make make check make install cd .. rm -rf tar-1.26
Texinfo-5.1
tar xvf texinfo-5.1.tar.xz cd texinfo-5.1 ./configure --prefix=/tools make make check make install cd .. rm -rf texinfo-5.1
Xz-5.0.5
tar xvf xz-5.0.5.tar.xz cd xz-5.0.5 ./configure --prefix=/tools make make check make install cd .. rm -rf xz-5.0.5
移除調試符號:
strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*
rm -rf /tools/{,share}/{info,man,doc}
餘下部分必須是root用戶操做,再也不須要lfs用戶了。
su -
chown -R root:root $LFS/tools
到此,咱們的臨時系統已經搭建完成,工具鏈也能夠在此備份以便未來使用。