环境准备:
Centos6.8虚拟机
2G内存 2颗CPU 200G硬盘
分区情况:/ 50G /boot 1G /swap 2G /data 30G
安装时吧开发工具安装上(gcc)
安装手册:
https://linux.cn/lfs/LFS-BOOK-7.7-systemd/
LFS-BOOK-7.7-systemd
软件补丁包准备:
ftp.lfs-matrix.net/pub/lfs/lfs-packages/7.7-systemd下的所有
开始安装LFS前准备
创建一个分区10G
fdisk /dev/sda
格式化分区
mkfs.ext4 /dev/sda6
swap使用宿主主机的,不需要创建
检测swap是否在使用
/sbin/swapon -v /dev/sda5 (/dev/sda5是swap的挂载分区位置,用lsblk可以查看自己的swap的分区位置)
设置环境变量:
export LFS=/mnt/lfs #(把命令添加到/root/.bash_profile配置文档中)
echo $LFS #检查环境变量
挂载文件系统:
mkdir -pv $LFS #创建挂载点
mount -v -t ext4 /dev/sda6 $LFS #将sda6以ext4的格式挂载到/mnt/lfs下($LFS是/mnt/lfs的环境变量)
把下载好的软件包放到系统中:
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources #给软件存放目录设置权限和粘滞模式
创建软件安装目录
mkdir -v $LFS/tools
ln -sv $LFS/tools / #创建符号链接
创建工作用户和组
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
命令行选项的意思:
-s /bin/bash
把 bash 设置为 lfs 用户的默认 shell。
-g lfs
这个选项将用户 lfs 添加到组 lfs 中。
-m
为 lfs 用户创建主目录。
-k /dev/null
这个参数通过改变输入位置为特殊的空(null)设备,以防止可能从一个模版目
录中(默认是 /etc/skel )复制文件。
lfs
这是创建的组和用户的实际名称。
给lfs用户设置密码:
passwd lfs
给lfs用设置文件的访问权限:
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
最后的工作准备:
su – lsf #”- ”指示su启动登录shell,而不是一个非登录shell
配置一个新.bash_profile文件
cat > ~/.bash_profile << “EOF”
exec env -i HOME=$HOME TERM=$TERM PS1=’\u:\w\$ ‘ /bin/bash
EOF
配置一个新.bashrc文件
cat > ~/.bashrc << “EOF”
set +h #关闭bash的哈希功能
umask 022 #设置用户文件新建掩码为022
LFS=/mnt/lfs #选定的挂载点
LC_ALL=POSIX #控制特定程序的本地化
LFS_TGT=$(uname -m)-lfs-linux-gnu #一个编译器非默认的变量,本人也不懂后续再看
PATH=/tols/bin:/bin:/usr/bin #一个外部命令搜索顺序的变量
export LFS LC_ALL LFS_TGT PATH
EOF
启用配置文件
source ~/.bash_profile
构建临时系统:
cd /mnt/lfs/sources
重要:
编译指南假定你已经正确地设置了宿主系统需求和符号链接:
- shell 使用的是 bash 。
- sh 是到 bash 的符号链接。
- /usr/bin/awk 是到 gawk 的符号链接。
- /usr/bin/yacc 是到 bison 的符号链接或者一个执行 bison 的小脚
本。
重要:
再次强调构建过程:
- 把所有源文件和补丁放到 chroot 环境可访问的目录,例如/mnt/lfs/sources/ 。但是 千万不能把源文件放在 /mnt/lfs/tools/中。
- 进入到源文件目录。
- 对于每个软件包:
- 用 tar 程序解压要编译的软件包。在第五章中,确保解压软件包时你使用的是 lfs 用 户。
- 进入到解压后创建的目录中。
- 根据指南说明编译软件包。
- 回退到源文件目录。
- 除非特别说明,删除解压出来的目录和所有编译过程中生成的<package> -build 目录。
安装交叉编译的binutils:
tar xf binutils-2.25.tar.bz2 #解压安装包
cd binutils-2.25 #到解压文件下
mkdir -v ../binutils-build #在上一级目录新建安装路径
cd ../binutils-build/ #到安装路径下
../binutils-2.25/configure \
–prefix=/tools \ #指定安装位置
–with-sysroot=$LFS \ #在$LFS中查找所需的目标系统库
–with-lib-path=/tools/lib \ #指定连接器的库路径
–target=$LFS_TGT \ #告诉configure脚本调整编译系统来编译
–disable-nls \ #禁止国际化(i18n)
–disable-werror #防止警告事件导致的停止编译
make #继续编译
如果是在x86——64上编译,创建符号链接,以确保工具链的完整性:
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
安装软件包:
make install
安装交叉编译的gcc:
cd /mnt/lfs/sources
rm -rf binutils-2.25
tar xf gcc-4.9.2.tar.bz2 #解压gcc
cd gcc-4.9.2
tar xf ../mpfr-3.1.2.tar.xz && mv -v mpfr-3.1.2 mpfr #解压并且更改名称
tar xf ../gmp-6.0.0a.tar.xz && mv -v gmp-6.0.0 gmp
tar xf ../mpc-1.0.2.tar.gz && mv -v mpc-1.0.2 mpc
for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.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 #这一串命令太多我还有点迷糊,所以不想解释
GCC不能正确检测栈保护,这会导致编译Glibc-2.21是出现问题,用一下命令修复:
sed -i ‘/k prot/agcc_cv_libc_provides_ssp=yes’ gcc/configure
mkdir -v gcc-build && cd gcc-build #新建并且进入到目录中
准备编译GCC:
../gcc-4.9.2/configure \
–target=$LFS_TGT \
–prefix=/tools \
–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-libitm \
–disable-libquadmath \
–disable-libsanitizer \
–disable-libssp \
–disable-libvtv \
–disable-libcilkrts \
–disable-libstdc++-v3 \
–enable-languages=c,c++ #不要问我这是啥,我也不知道,大概就是指定了一下目录,禁用了一些模块库什么的吧(一脸懵逼)
运行命令编译GCC
make
安装软件包:
make install
rm -rf gcc-4.9.2
安装LinuxAPI头文件:
tar xf linux-3.19.tar.xz
cd linux-3.19
make mrproper #确认没有陈旧的文件且不依赖于之前的操作
make INSTALL_HDR_PATH=dest headers_install
mkdir /mnt/lfs/tools/include
cp -rv dest/include/* /tools/include #从源代码中提取用户可见的内核头文件,把它们保存到临时文件夹中然后复制到所需的位置
rm -rf linux-3.19
检测头文件是否正确安装:
if [ ! -r /usr/include/rpc/types.h ]; then
su -c ‘mkdir -pv /usr/include/rpc’
su -c ‘cp -v sunrpc/rpc/*.h /usr/include/rpc’
fi #回车后并没有什么提示和报错,应该是没问题的
研究了半天就这点结果,后天继续研究。
未完待续……
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/93721