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 17:43
下一篇 2018-03-29 21:12

相关推荐

  • liunx 基础

    简单命令:如图是

    Linux笔记 2018-04-01
  • 第二周总结

    反向单引号 ` `:执行能力强,可以执行命令 [等价于$()]单引号 ‘ ’:只显示字符双引号 “ ”:识别变量,不识别命令花括号{ }: 里面内容互相组合 打印重复字符串的简化形式echo file{1,3,5} 结果为:file1 file3 file5rm -f file{1,3,5} 删除file1 file3 file5echo file{1..1…

    Linux笔记 2018-07-29
  • Linux用户管理

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

    Linux笔记 2018-07-22
  • 如何制作LINUX服务脚本

    如何制作一个Linux启动服务          Linux在启动的时候都会跑很多系统自带的服务脚本,来控制系统服务的开启和关闭。这些服务是系统自带的,我们可以查看这些服务及其对应的脚本(ls /etc/init.d/)。这些服务有独立服务,也有依赖服务,依赖服务有被依赖服务和依赖别的服务。今天我们就来看看怎么来制作一个系统独立服务,方便我们以后需要自己手动…

    2018-05-10
  • 第四周作业

    1.复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其他用户均没有任何访问权限 [root@localhost ~]# cp -r /etc/skel/ /home/tuser1 [root@localhost ~]# chmod go= /home/tuser1/ -R [root@localhost …

    Linux笔记 2018-06-03
  • cmd > log 2>&1 和 cmd 2>&1 > log的区别

    A cmd > log 2>&1
    B cmd 2>&1 > log
    C cmd &> log
    D cmd 2>log >&2
    哪个与众不同

    Linux笔记 2018-03-31