Re:从零开始的LFS编译生活(1)

米娜桑,这里是日見美咲♪初次发文,请多指教♪ 说起来拖入群也有2年时间了各种游走在群里吃瓜围观的日常,也属于没有贡献可言的咸鱼的存在 但在1天宁静的日常刷着B站的时候偶然发现了av62393063认真的看完后感叹tql,sdl,wsl 此时1位正捣鼓着各种发行版接近崩坏接近手造包管理器/发行版的咸鱼退出了群聊(大雾 忽然脑内想到诶?可以给我也整1个啊.JPG,于是乎持续爆肝N天后有了这篇教程供各位Dalao吃瓜围观(前排慢更(捂脸

前言

什么是LFS(理发师)呢?答:Linux From Scratch (LFS) is a project that provides you with step-by-step instructions for building your own custom Linux system, entirely from source code. 说人话就是提供1本说明文档从下载源代码开始最终编译出可在真实机上运行的Linux系统。(诶?别急着关闭网页啊…… 个人使用Linux的经验也只有较短时间的2年,所以这篇教程也会是新人向(本当? 表示真实初编译体验并不像是贴吧描述的那样困难,1次理发成功相当轻松无报错(逃 ↑前置知识只需熟悉基本的终端命令以及有足够的细心和耐心即可完成 ↑理论上复制粘贴无误可实现精确的步骤还原(大雾,愿共同学习进步,若有疏漏之处欢迎Repo (Bug附体之人

说明

这篇教程前置由『Linux 中国 - LCTT - LFS 翻译小组』翻译的理发师8.4简中文档,请务必以此文档为依据参考这篇教程辅助 个人灵活的更改了文档中部分步骤,请无需担心个人已测试编译通过 请注意这篇教程是理发师教程而并非ALFS教程,所以命令输入是100%手动纯人工的,虽然效率极低但完成后的记忆和印象会相当深刻 这篇教程采用理发师公式文档同款CC-BY-NC-SA 2.0协议。为了尽量的高性能编译环境使用真实台式机远程终端连接,CPU是I5-3475S(想必各位Dalao的机能都更好吧(捂脸 ↑思考到保证精确的精确可还原的编译环境软件版本,编译环境使用Oracle Linux 7.9配置本地源 ↑其实RHEL/CentOS 7.9也可以的说,只是个人手边正好有Oracle(乌龟壳)的DVD仅此而已,请保持编译环境的1致 问:为何不使用Debian呢? 答:个人踩坑Debian遇到了旷日持久的满屏幕Bug,已对此表示极其反感的说(如有疑问欢迎板聊 但使用真实PC机就无法获得清晰的图片了,所以前期会使用虚拟机的界面截图辅助,望米娜桑理解。那么接下来让我们开始吧♪

P1 准备构建

理发师简体中文版8.4 SysV 下载链接 http://shouce.gitee.io/lctt-lfs/lfs-sysv/LFS-BOOK.pdf 文件校验MD5 1659ca30edbe7ebefc44eb151185b198 Oracle Linux 7.9 下载链接http://yum.oracle.com/ISOS/OracleLinux/OL7/u9/x86_64/OracleLinux-R7-U9-Server-x86_64-dvd.iso 文件校验SHA256 dc2782bfd92b4c060cf8006fbc6e18036c27f599eebf3584a1a2ac54f008bf2f
LFS_STEP1
光驱放入OL DVD光碟BIOS引导光驱GUI启动安装界面安装OL
LFS_STEP2
安装语言选择"简体中文(中国)"
LFS_STEP3
LFS_STEP4
软件选择"基础设施服务器"附加选项"开发工具"
LFS_STEP5
安装目标位置"我要配置分区"(手动分区)"标准分区"
LFS_STEP6
挂载点期望容量文件系统备注
sda1/250GiBext4硬盘总空间一半
sda2/mnt/lfs200GiBext4剩余硬盘空间
sda3
12GiBswap等于内存容量
注:UP使用的环境是12G内存+500G机械硬盘,但安装实例虚拟机1G内存+12G硬盘,容量并不满足仅作安装展示用,请根据自用设备情况动态调整 ↑分区操作会清空硬盘中全部数据,若有重要文件请务必备份 ↑先添加/再添加swap,最后添加/mnt/lfs会自动正确排序sda2
LFS_STEP7
LFS_STEP8
LFS_STEP9
LFS_STEP10
LFS_STEP11
LFS_STEP12
LFS_STEP13
LFS_STEP14
禁用Kdump
LFS_STEP15
设置root用户 密码root
LFS_STEP16
创建lfs标准用户 密码lfs
LFS_STEP17
安装完成重启(自动弹出光驱不要拿出OL DVD光碟)BIOS引导硬盘启动
LFS_STEP18
本机root用户登录
注:以下命令#开头表示需root权限执行,$开头表示需标准用户执行或标准用户权限可执行,//表示注释。请注意格式以及空格以及当前工作路径
# systemctl stop firewalld.service // 关闭防火墙服务
# systemctl disable firewalld.service //禁用防火墙服务
# cp -bv /etc/selinux/config /etc/selinux/config.backup //备份SELINUX配置文件
LFS_STEP19
# vi /etc/selinux/config // 配置关闭SELINUX

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
LFS_STEP20
# nmtui // 编辑连接eno1选择自动连接确定返回确定(物理网卡和虚拟机网卡存在网卡名不同现象)
LFS_STEP21
# ifconfig -a // 确定eno1 inet已分配IP地址并记录(个人这里案例是192.168.1.100)请根据情况动态确定
LFS_STEP22
# shutdown -r now // 重新启动以配置SELINUX关闭生效

BIOS引导硬盘启动

$ ssh [email protected] // 其他局域网设备打开远程连接工具远程SSH使用之前记录的IP以root用户输入密码登录
LFS_STEP23
注:画风突变警告(以下为全程命令记录,请查阅理发师简中文档理解后参考,理论步骤可严格还原,若配置文件会上下行空行以示区分,请务必细心检查
# vi /etc/profile.d/lfs.sh // 设置LFS环境变量(Make线程数等于CPU总线程数)

export LFS=/mnt/lfs
export MAKEFLAGS='-j 4'

# source /etc/profile // 强制环境变量生效
# mkdir -v $LFS/sources // 创建sources目录
# chmod -v a+wt $LFS/sources // 设置sources目录权限1777
# mkdir -v $LFS/tools //创建tools目录
# ln -sv $LFS/tools / //创建tools目录软链接
# chown -v lfs $LFS/tools // 切换tools目录所有者lfs
# chown -v lfs $LFS/sources // 切换sources目录所有者lfs
# su - lfs // 临时切换lfs用户
$ cat > ~/.bash_profile << "EOF" // 设置lfs用户终端

exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

$ cat > ~/.bashrc << "EOF" // 设置lfs用户编译环境变量(Make线程数等于CPU总线程数)

set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export MAKEFLAGS='-j 4'
export LFS LC_ALL LFS_TGT PATH
EOF

$ exit // 退出lfs用户登录回到root用户
# cd /usr/local/src/
# wget -c http://mirrors.ustc.edu.cn/lfs/lfs-packages/lfs-packages-8.4.tar // 下载LFS软件包源码(文件校验MD5 a2e8f0b3d8fd93904ca3293da50417f6)
# tar -xvf lfs-packages-8.4.tar
# mv -bv 8.4/* $LFS/sources/ // 保留文件属性移动LFS软件包源码到sources目录
# rmdir -v 8.4/ // 删除临时空目录
# wget -c https://mirrors.tuna.tsinghua.edu.cn/gnu/make/make-4.3.tar.gz // 下载Make源码(文件校验MD5 fc7a67ea86ace13195b0bce683fd4469)
# wget -c https://mirrors.tuna.tsinghua.edu.cn/gnu/automake/automake-1.16.3.tar.gz // 下载Automake源码(文件校验MD5 c5d63ea02b6000159671a1720cc91ffe)
# mkdir -v /usr/local/src/gcc/
# cd /usr/local/src/gcc/
# wget -c https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-5.5.0/gcc-5.5.0.tar.gz // 下载GCC源码(文件校验MD5 781bc0195edeb0ceaace8428f63ae63d)
# wget -c https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2 // 下载GCC依赖源码(文件校验MD5 89e59fe665e2b3ad44a6789f40b059a0)
# wget -c https://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2 // 下载GCC依赖源码(文件校验MD5 dd60683d7057917e34630b4a787932e8)
# wget -c https://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz // 下载GCC依赖源码(文件校验MD5 5b34aa804d514cc295414a963aedb6bf)
# wget -c https://gcc.gnu.org/pub/gcc/infrastructure/isl-0.14.tar.bz2 // 下载GCC依赖源码(文件校验MD5 acd347243fca5609e3df37dba47fd0bb)
# mkdir -v /media/sr0/ // 创建镜像挂载点
# mount -v /dev/sr0 /media/sr0/ // 挂载OL DVD光碟
# cd /etc/yum.repos.d/
# mkdir -v backup/
# mv -bv *.repo backup/ // 备份YUM源配置位置
# cp -bv backup/oracle-linux-ol7.repo media-ol7.repo
# vi media-ol7.repo //配置YUM镜像源

[ol7_media]
name=Oracle Linux $releasever media ($basearch)
baseurl=file:///media/sr0/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

# yum repolist // 确认镜像源切换
# cd /usr/bin/
# mv -bv yacc yacc.backup // 备份yacc源文件
# ln -sv bison yacc // 创建yacc软链接
# cd /usr/local/src/gcc/
# tar -xzvf gcc-5.5.0.tar.gz
# tar -xjvf mpfr-2.4.2.tar.bz2
# tar -xjvf gmp-4.3.2.tar.bz2
# tar -xzvf mpc-0.8.1.tar.gz
# tar -xjvf isl-0.14.tar.bz2
# mv -v mpfr-2.4.2/ gcc-5.5.0/mpfr/
# mv -v gmp-4.3.2/ gcc-5.5.0/gmp/
# mv -v mpc-0.8.1/ gcc-5.5.0/mpc/
# mv -v isl-0.14/ gcc-5.5.0/isl/
# cd gcc-5.5.0/
# ./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
# make
# make install // 编译安装GCC
# cd /usr/local/src/
# tar -xzvf make-4.3.tar.gz
# cd make-4.3/
# ./configure
# make
# make install // 编译安装Make
# cd /usr/bin/
# mv -bv make make.backup // 备份Make源文件
# ln -sv /usr/local/bin/make make // 创建Make软链接
# yum install python3 // 安装Python3
# yum install texinfo // 安装Texinfo
# cd /usr/local/src/
# tar -xzvf automake-1.16.3.tar.gz
# cd automake-1.16.3/
# ./configure
# make
# make install //编译安装Automake
# yum install screen // 安装Screen
# umount /dev/sr0 // 卸载OL DVD光碟
# eject /dev/sr0 // 弹出光驱拿出OL DVD光碟
# cd // 回到初始root宿主路径
# 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`
python3 --version
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1 # texinfo version
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 // 宿主系统要求检查
# pushd $LFS/sources
# md5sum -c md5sums // 软件包文件校验
# popd
# screen -S lfs // 新建Screen会话名lfs(此步执行后默认所有操作都在Screen会话中执行)
# su - lfs // 切换lfs用户
P1准备构建部分完(未完待续(笑
点赞
  1. H.M. H.M.说道:
    Google Chrome Windows 8.1
    您才是真正的jvlao
    1. WanAna-kai WanAna-kai说道:
      Google Chrome Windows 10
      是大佬! (ノ°ο°)ノ
  2. 追求i7的孩纸 追求i7的孩纸说道:
    fw前来围观
  3. Zero Zero说道:
    WebView Android 11
    围观群众 :huaji21:
  4. WanAna-kai WanAna-kai说道:
    Google Chrome Windows 10
    看来我真的是废物呢QWQ

发表评论