跟着我来一起编译lfs(一) 前期准备

linuxfromscratch (lsf)

http://www.linuxfromscratch.org

具体是什么自行百度吧。

我编译的是7.10的版本(官方教程地址:点这里),其他版本大家可以自己去试,这个教程主要是让大家能够更清楚linux的一些目录,文件及命令。

这个过程是很漫长的,如果要跟着一起编译,要有足够的耐心,每台机器的环境都不一样,每个人所碰到的问题很有可能完全不一样,所以最终还是要靠大家自己去找答案,当然,我在编译的过程出现的问题一定会告之大家,避免碰到弯路。

先说一下我的环境

操作系统:win7

虚拟机:virtualbox

前期准备

1、在virtualbox中安装centos的系统,我用的是CentOS release 6.8,其他版本自行安装

2、添加一块虚拟硬盘,分区,创建目录

3、检测环境及下载源代码


一、安装centos

下载一个centos镜像

virtualbox 新建虚拟电脑,名称为 centos,上图

安装系统

然后启动,具体安装过程不再细说。


二、添加一块虚拟硬盘,分区,创建目录

安装好以后,关闭centos,添加一块虚拟硬盘给lfs用,上图

虚拟硬盘就添加好了。上图

启动系统,先全局更新

yum update

给虚拟硬盘分区

fdisk /dev/sdb

输入 n  (创建分区)

输入 p  (创建主分区)

输入 1  (只有一个分区)

一路回车 (确认分区大小)

最后w (写入分区信息)

环境变量及创建目录,这里命令比较多

export LFS=/mnt/lfs

请注意,以后每次重启或断开等情况都要先执行

echo $LFS

/mnt/lfs

看看目录是否正确,一定要记住

创建根目录

mkdir -pv $LFS

挂载硬盘

mount -v -t ext4 /dev/sdb1 $LFS

创建源码目录

mkdir -v $LFS/sources

添加读写权限

chmod -v a+wt $LFS/sources

创建工具目录

mkdir -v $LFS/tools

链接到根目录

ln -sv $LFS/tools /

添加lfs组

groupadd lfs

添加lfs用户

useradd -s /bin/bash -g lfs -m -k /dev/null lfs

修改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 ~/.bashrc

三、检测环境及下载源代码

cd ~

检测环境
第一个脚本

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
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
bash version-check.sh

看结果,差哪个就安装哪个,这边不说了,有看到什么xxx not found什么的都是缺少的工具,一一补上。

第二个脚本

cat > library-check.sh << "EOF"
#!/bin/bash
for lib in lib{gmp,mpfr,mpc}.la; do
  echo $lib: $(if find /usr/lib* -name $lib|
               grep -q $lib;then :;else echo not;fi) found
done
unset lib
EOF
bash library-check.sh

这里是检测gmp,mpfr,mpc这三个库,结果如果不是以下两种就是有问题
1、都显示没有 (not found)
2、都显示有 (found)

如果有的有,有的没有就有问题

下载源码,这个过程比较漫长,好多包要翻墙

源码列表地址 http://www.linuxfromscratch.org/lfs/view/7.10-systemd/wget-list,下载下来

wget --input-file=wget-list --continue --directory-prefix=$LFS/sources

下载会比较慢,这边给一个百度云盘的链接: http://pan.baidu.com/s/1pKP86t9 密码: dkpa

漫长的等待,那第一篇也结束了。

Leave a Reply

Your email address will not be published.