April 6, 2022
编译Linux From Scrach(LFS) --(2)下载LFS相关的源码并从创建目录和用户
按照文档里的链接,每行一个链接的方法,创建wget-list-sysv和needed-patches-list,源码我放在我的github仓库: https://github.com/gccpacman/LFS-ubuntu2204
0) 假设已经完成了LFS(1)的步骤 – 宿主机分区,设置LFS环境变量等
1) 在$LFS/sources/目录下,创建wget-list-sysv,执行以下命令批量下载源代码tar包
# wget-list-sysv
wget --input-file=wget-list-sysv --continue --directory-prefix=$LFS/sources
2)在$LFS/sources/patches目录下,创建needed-patches-list,执行以下命令批量下载源代码tar包
# needed-patches-list
wget --input-file=needed-patches-list --continue --directory-prefix=$LFS/sources/patches
3) 创建基本LFS Linux目录结构
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}
for i in bin lib sbin; do
ln -sv usr/$i $LFS/$i
done
case $(uname -m) in
x86_64) mkdir -pv $LFS/lib64 ;;
esac
mkdir -pv $LFS/tools
4) 创建LFS宿主机用户, 并且将$LFS下的目录chown给lfs用户
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
# enter passwords for lfs user
# grant lfs $LFS directory permission
chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -v lfs $LFS/lib64 ;;
esac
5) 初始化lfs用户的bashrc和bash_profile, 添加LFS, LFS_TGT等环境变量
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=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF
April 6, 2022
编译Linux From Scrach(LFS) --(1)准备编译linux主机环境和磁盘分区
大概一年多以前看到了一个项目叫做Linux From Scrach,大致意思就是现在有无数的Linux发行版,但是最好的发行版就是你自己编译的。我倒是没有打算真的用自己编译的发行版,但是既然有时间就不妨看看能不能编译出来。于是下载了官方指导LFS安装的stable版本的PDF(https://www.linuxfromscratch.org/lfs/downloads/stable/),打算尝试看看。
0) 准备一台linux操作系统的主机
之前已经在自己的一台台式主机上安装了Ubuntu22.04 Desktop,打算以此作为LFS的编译环境。毕竟是裸金属的机器,有i7和固态硬盘加持,编译的效率应该就不用担心了。
1) 在ubuntu22.04主机根据LFS文档安装了缺失的编译依赖环境
sudo apt install qemu-system-x86
sudo apt install binutils
sudo apt install bison
sudo apt install coreutils
sudo apt install findutils
sudo apt install gcc
sudo apt install build-essential
sudo apt install m4
sudo apt install patch
sudo apt install perl
sudo apt install texinfo
sudo apt install xz
sudo apt install gawk
2) 确认是否正确安装所有依赖version_check.sh
#!/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
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
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
输出: