LFS实验第一次——第一章

环境准备:Centos6.8虚拟机 2G内存 2颗CPU 200G硬盘分区情况:/ 50G  /boot 1G  /swap 2G /data 30G 安装时吧开发工具安装上(gcc)

LFS

环境准备:

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 的小脚

本。

重要:

再次强调构建过程:

  1. 把所有源文件和补丁放到 chroot 环境可访问的目录,例如/mnt/lfs/sources/ 。但是 千万不能把源文件放在 /mnt/lfs/tools/中。
  2. 进入到源文件目录。
  3. 对于每个软件包:
  4. 用 tar 程序解压要编译的软件包。在第五章中,确保解压软件包时你使用的是 lfs 用 户。
  5. 进入到解压后创建的目录中。
  6. 根据指南说明编译软件包。
  7. 回退到源文件目录。
  8. 除非特别说明,删除解压出来的目录和所有编译过程中生成的<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

(1)
老司机丨快上车老司机丨快上车
上一篇 2018-03-29
下一篇 2018-03-29

相关推荐

  • Linux用户组管理及用户权限

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 ]# who | cut -d” ” -f1 | sort -u 2、取出最后登录到当前系统的用户的相关信息。 ]# last | head -1  3、取出当前系统上被用户当作其默认shell的最多的那个shell。 ]# cat /etc/…

    2018-07-05
  • 标准IO和管道

    一.三种I/O设备 标准输入(STDIN) -0   默认接受来自键盘的输入 标准输出(STDOUT) -1  默认输出到终端窗口 标准错误(STDERR) -2   默认输出到终端窗口 程序:指令加数据 每个文件打开都有一个文件描述符(fd) ll /proc/$$/fd      //可以查看文件的描述符 exec 8<>/data/host…

    Linux笔记 2018-04-02
  • linux通配符和正则表达式

    通配符、正则表达式

    2018-04-17
  • Linux第一周小结

    Linux常用命令、链接

    Linux笔记 2018-04-01
  • rpm包管理

    相关知识 接口 API:二进制接口 ABI:应用层接口, 包的组成: 二进制文件;库文件;配置文件;帮助文档 程序包管理器 debian: deb,dpt apt-agt包管理前段工具 rehat:rpm;rpm yum包管理前段工具 fedora dnf包管理前段工具 安装过的rpm包数据库 /var/lib/rpm/* 管理查看二进制程序依赖的库文件 l…

    Linux笔记 2018-04-22