此文是写给新手的教程~!~ 我会尽量写的详细一些。 虚拟机软件:我选的是VirtualBox,版本:4.3.12 r93733。如果用vmware的话,设置方面基本差不多。 缩主机系统:我用的是debian linux系统。(我是在163网站下载的,你也可以去官网上下载live-cd。请尽量用debian9.5.0系统,因为我是按照这个系统写的教程。其实,只是用这个光盘来引导系统,不用安装整个debian。)下载地址: http://mirrors.163.com/debian-cd/9.5.0-live/amd64/iso-hybrid/debian-live-9.5.0-amd64-cinnamon.iso

开始我们的LFS 8.3之旅。 一、建立虚拟机: 1.内存1G 2.硬盘64G 3.CPU 4个(这个根据实际情况设置,我的是8核的,设置了4个) 4.网卡选择:桥接网卡 下面是我虚拟机设置的截图: 现在虚拟机已经建立完成,点击启动。 二、建立缩主机系统: 1.debian系统启动时,在Main Menu的主菜单中,直接回车。进入debian live-cd系统。 2.点击左下角的Menu 菜单选择终端如下图;

3.切换到root用户,在终端中输入:sudo su root

4.更新软件源(有的时候非常慢),输入:apt-get update 5.更改root密码,(相同的密码输入再次)输入:passwd 5.看一下现在虚拟机自动获取的IP地址(inet 后面的是你现在的IP地址,我的是192.168.3.85,将你的IP地址记下来,一会儿要用到。),输入:ifconfg 6.安装ssh-server服务(以后,我们会用ssh客户端登录到虚拟机来完成安装LFS系统。),输入:apt-get install openssh-server 当询问“您是否想继续?”时,输入y回车。 7.配置ssh-server,输入:nano /etc/ssh/sshd_config 8.打开ssh-server的配置文件,向下移动光标,将PermitRootLogin prohibit-password将前面的#号去掉,并且把后面的prohibit-password去掉,换成yes。将PasswordAuthentication yes前面的#号去掉。修改后,先按Ctrl+o然后回车,再按Ctrl+x退出。 9.启动ssh-server服务,输入:/etc/init.d/ssh start 到此,ssh-server配置完成。现在,可以将虚拟机最小化,用ssh客户端软件,输入你刚才用ifconfig查看的IP地址,登录到虚拟机。 三、建立缩主机系统: 1.检测缩主机系统软件版本,编写version-check.sh文件: cat > version-check.sh << "EOF" #!/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 EOF 2.运行version-check.sh脚本,输入: bash version-check.sh 3.输出结果如下图: 4.调整及安装软件,使缩主机适合LFS8.3系统的需求: (1)ln -sf bash /bin/sh //修改bash指向/bin/sh (2)apt-get install bison //安装bison (3)apt-get install g++ //安装g++ (4)apt-get install texinfo //安装texinfo (5)再次执行version-check.sh文件,查看缩主机软件版本: bash version-check.sh 输出如下图: (6)以上结果同下图比较,软件版本全部比官方要求的高。不过,没什么问题。只要不缺少软件就可以。我是用以上软件版本编译通过的。 5.创建分区: (1)我用的是cfdisk命令分区的,如下图: (2)选择gpt:

(3)第一个分区:sda1 大小:2M (用gpt,必须分一个2M的小分区,做为第一分区。) (4)第二个分区:sda2 大小:2048M (交换分区) (5)第三个分区:sda3 大小:剩余全部空间(/分区) (6)分区格式设置:将光标移动到sda1 按键盘上的t键,用光标找到 BIOS boot格式,并回车。再将光标移动到sda2,按键盘上的t键,将光标移动到Linux swap回车。sda3 分区默认。再将光标移动到Write(再最下面),按回车,输入:yes回车,然后按q键退出分区。这样我们的分区就完成了。 5.在分区上创建文件系统(格式化)(sda1分区不用管,那个是给grub准备的。): (1)mkfs -v -t ext4 /dev/sda3 (2)格式化交换分区: mkswap /dev/sda2 6.设置$LFS变量、建立目录、挂载分区: export LFS=/mnt/lfs mkdir -pv $LFS mount -v -t ext4 /dev/sda3 $LFS /sbin/swapon -v /dev/sda2 //交换分区 7.创建源代码目录、设置权限并进入目录: mkdir -v $LFS/sources chmod -v a+wt $LFS/sources cd $LFS/sources 四、软件包、补丁及准备工作: 1.下载源代码(我是在兰州大学开源社区下载的,你也可以在官网上下载,就是速度慢此): wget https://mirror.lzu.edu.cn/lfs/lfs-packages/lfs-packages-8.3.tar 2.解压缩: tar xvf lfs-packages-8.3.tar rm -rf lfs-packages-8.3.tar cd 8.3 mv . ../ cd .. rm -rf 8.3 3.这里最好将wget、ssh-server、blfs-bootscripts-20180105.tar.xz一起全下载下来。要不然,做完LFS系统好,可以上网,但是下载软件和ssh登录不了,就悲剧了。 wget https://ftp.gnu.org/gnu/wget/wget-1.19.5.tar.gz wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.7p1.tar.gz wget http://www.linuxfromscratch.org/patches/blfs/8.3/openssh-7.7p1-openssl-1.1.0-1.patch wget http://anduin.linuxfromscratch.org/BLFS/blfs-bootscripts/blfs-bootscripts-20180105.tar.xz 4.创建工具键目录及链接: mkdir -v $LFS/tools ln -sv $LFS/tools / 5.添加LFS用户 groupadd lfs //创建用户级 useradd -s /bin/bash -g lfs -m -k /dev/null lfs //创建lfs用户 passwd lfs //给lfs用户设置密码 chown -v lfs $LFS/tools //授予lfs用户对$LFS/tools目录的所有权限 chown -v lfs $LFS/sources //授予lfs用户对$LFS/sources目录的所有权限 su - lfs //以lfs用户登录系统 6.设置环境: 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 五、构建临时系统: 1.输入echo $LFS //正常会输出:/mnt/lfs 2.进入源码目录: cd $LFS/sources/

3.Binutils-2.31.1 pass1

tar xvf binutils-2.31.1.tar.xz cd binutils-2.31.1 mkdir -v build cd build ../configure --prefix=/tools
--with-sysroot=$LFS
--with-lib-path=/tools/lib
--target=$LFS_TGT
--disable-nls
--disable-werror make 如果在x86_64上构建,创建符号链接: case $(uname -m) in x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;; esac make install cd ../.. rm -rf binutils-2.31.1

4.gcc-8.2.0 pass1

tar xvf gcc-8.2.0.tar.xz cd gcc-8.2.0 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 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 x86_64主机上,将64位库的默认目录名设置为“ lib ”: 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 cd ../.. rm -rf gcc-8.2.0

5.Linux内核头文件

tar xvf linux-4.18.5.tar.xz cd linux-4.18.5 make mrproper make INSTALL_HDR_PATH=dest headers_install cp -rv dest/include/* /tools/include cd .. rm -rf linux-4.18.5

6.glibc-2.28

tar xvf glibc-2.28.tar.xz cd glibc-2.28 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' 没有问题会输出: [Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2] //64位输出 [Requesting program interpreter: /tools/lib/ld-linux.so.2] //32位输出 如果输出没有如上所示或者根本没有输出,则出现问题。检查之前的软件安装,找出问题并予以纠正。在继续之前必须解决此问题。否则以后的安装将没有意义! cd ../.. rm -rf glibc-2.28

7.Libstdc ++

tar xvf gcc-8.2.0.tar.xz cd gcc-8.2.0 mkdir -v 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++/8.2.0 make && make install cd ../.. rm -rf gcc-8.2.0

8.binutils-pass2

tar xvf binutils-2.31.1.tar.xz cd binutils-2.31.1 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 cd ../.. rm -rf binutils-2.31.1

9.GCC-8.2.0 pass2

tar xvf gcc-8.2.0.tar.xz cd gcc-8.2.0 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位库的缺省目录名更改为“ lib ”: case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/'
-i.orig gcc/config/i386/t-linux64 ;; esac 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 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' 64位显示: [Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2] 32位显示: [Requesting program interpreter: /tools/lib/ld-linux.so.2] 如果输出没有如上所示或者根本没有输出,则出现问题。检查并回顾这些步骤,找出问题所在并予以纠正。在继续之前必须解决此问题,否则继续安装没有意义! echo $PATH 验证/tools/bin是否位于列表的头部。如果不是,则可能意味着您没有以用户身份登录lfs或者环境变量设置错误。 cd ../.. rm -rf gcc-8.2.0

10.TCL-8.6.8

tar xvf tcl8.6.8-src.tar.gz cd tcl8.6.8 cd unix ./configure --prefix=/tools make && make install chmod -v u+w /tools/lib/libtcl8.6.so make install-private-headers ln -sv tclsh8.6 /tools/bin/tclsh cd ../.. rm -rf tcl8.6.8

11.Expect-5.45.4

tar xvf expect5.45.4.tar.gz cd expect5.45.4 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 cd .. rm -rf expect5.45.4

12.DejaGnu-1.6.1

tar xvf dejagnu-1.6.1.tar.gz cd dejagnu-1.6.1 ./configure --prefix=/tools make install cd .. rm -rf dejagnu-1.6.1

13.M4-1.4.18

tar xvf m4-1.4.18.tar.xz cd m4-1.4.18 sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h ./configure --prefix=/tools make && make install cd .. rm -rf m4-1.4.18

14.ncurses的6.1

tar xvf ncurses-6.1.tar.gz cd ncurses-6.1 sed -i s/mawk// configure ./configure --prefix=/tools
--with-shared
--without-debug
--without-ada
--enable-widec
--enable-overwrite make && make install cd .. rm -rf ncurses-6.1

15.bash-4.4.18

tar xvf bash-4.4.18.tar.gz cd bash-4.4.18 ./configure --prefix=/tools --without-bash-malloc make && make install ln -sv bash /tools/bin/sh cd .. rm -rf bash-4.4.18

16.bison-3.0.5

tar xvf bison-3.0.5.tar.xz cd bison-3.0.5 ./configure --prefix=/tools make && make install cd .. rm -rf bison-3.0.5

17.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

18.Coreutils-8.30

tar xvf coreutils-8.30.tar.xz cd coreutils-8.30 ./configure --prefix=/tools --enable-install-program=hostname make && make install cd .. rm -rf coreutils-8.30

19.diffutils-3.6

tar xvf diffutils-3.6.tar.xz cd diffutils-3.6 ./configure --prefix=/tools make && make install cd .. rm -rf diffutils-3.6

20.file-5.34

tar xvf file-5.34.tar.gz cd file-5.34 ./configure --prefix=/tools make && make install cd .. rm -rf file-5.34

21.findutils-4.6.0

tar xvf findutils-4.6.0.tar.gz cd findutils-4.6.0 sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' gl/lib/*.c sed -i '/unistd/a #include <sys/sysmacros.h>' gl/lib/mountlist.c echo "#define _IO_IN_BACKUP 0x100" >> gl/lib/stdio-impl.h ./configure --prefix=/tools make && make install cd .. rm -rf findutils-4.6.0

22.GAWK-4.2.1

tar xvf gawk-4.2.1.tar.xz cd gawk-4.2.1 ./configure --prefix=/tools make && make install cd .. rm -rf gawk-4.2.1

23.Gettext-0.19.8.1

tar -xvf gettext-0.19.8.1.tar.xz cd gettext-0.19.8.1 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 cd ../.. rm -rf gettext-0.19.8.1

24.grep-3.1

tar xvf grep-3.1.tar.xz cd grep-3.1 ./configure --prefix=/tools make && make install cd .. rm -rf grep-3.1

25.gzip-1.9

tar xvf gzip-1.9.tar.xz cd gzip-1.9 sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h ./configure --prefix=/tools make && make install cd .. rm -rf gzip-1.9

26.make-4.2.1

tar xvf make-4.2.1.tar.bz2 cd make-4.2.1 sed -i '211,217 d; 219,229 d; 232 d' glob/glob.c ./configure --prefix=/tools --without-guile make && make install cd .. rm -rf make-4.2.1

27.patch-2.7.6

tar xvf patch-2.7.6.tar.xz cd patch-2.7.6 ./configure --prefix=/tools make && make install cd .. rm -rf patch-2.7.6

28.perl-5.28.0

tar xvf perl-5.28.0.tar.xz cd perl-5.28.0 sh Configure -des -Dprefix=/tools -Dlibs=-lm -Uloclibpth -Ulocincpth make cp -v perl cpan/podlators/scripts/pod2man /tools/bin mkdir -pv /tools/lib/perl5/5.28.0 cp -Rv lib/* /tools/lib/perl5/5.28.0 cd .. rm -rf perl-5.28.0

29.sed-4.5

tar xvf sed-4.5.tar.xz cd sed-4.5 ./configure --prefix=/tools make && make install cd .. rm -rf sed-4.5

30.tar-1.30

tar xvf tar-1.30.tar.xz cd tar-1.30 ./configure --prefix=/tools make && make install cd .. rm -rf tar-1.30

31.Texinfo-6.5

tar xvf texinfo-6.5.tar.xz cd texinfo-6.5 ./configure --prefix=/tools make && make install cd .. rm -rf texinfo-6.5

32.UTIL-Linux-2.32.1

tar xvf util-linux-2.32.1.tar.xz**** cd util-linux-2.32.1 ./configure --prefix=/tools
--without-python
--disable-makeinstall-chown
--without-systemdsystemunitdir
--without-ncurses
PKG_CONFIG="" make && make install cd .. rm -rf util-linux-2.32.1

33.XZ-5.2.4

tar xvf xz-5.2.4.tar.xz cd xz-5.2.4 ./configure --prefix=/tools make && make install cd .. rm -rf xz-5.2.4 34.剥离

strip --strip-debug /tools/lib/* /usr/bin/strip --strip-unneeded /tools/{,s}bin/* rm -rf /tools/{,share}/{info,man,doc} find /tools/{lib,libexec} -name *.la -delete

35.更改tools目录权限 exit chown -R root:root $LFS/tools