此文是写给新手的教程~!~ 我会尽量写的详细一些。 虚拟机软件:我选的是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