编译Linux From Scrach(LFS) --(1)准备编译linux主机环境和磁盘分区

三 06 四月 2022

大概一年多以前看到了一个项目叫做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

输出:

# 输出
bash, version 5.1.16(1)-release
/bin/sh -> /usr/bin/dash
ERROR: /bin/sh does not point to bash
Binutils: (GNU Binutils for Ubuntu) 2.38
bison (GNU Bison) 3.8.2
/usr/bin/yacc -> /usr/bin/bison.yacc
Coreutils:  8.32
diff (GNU diffutils) 3.8
find (GNU findutils) 4.8.0
GNU Awk 5.1.0, API: 3.0 (GNU MPFR 4.1.0, GNU MP 6.2.1)
/usr/bin/awk -> /usr/bin/gawk
gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
g++ (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
grep (GNU grep) 3.7
gzip 1.10
Linux version 5.19.0-38-generic (buildd@lcy02-amd64-001) (x86_64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #39~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 17 21:16:15 UTC 2
m4 (GNU M4) 1.4.18
GNU Make 4.3
GNU patch 2.7.6
Perl version='5.34.0';
Python 3.10.6
sed (GNU sed) 4.8
tar (GNU tar) 1.34
texi2any (GNU texinfo) 6.8
xz (XZ Utils) 5.2.5
g++ compilation OK

3) 为LFS创建磁盘分区

主要需要创建LFS ext4主分区和swap分区, 这里我直接利用了ubuntu的图形分区工具分区了

lfs partition

lfs partition 2

创建lfs并,挂载分区,设置$LFS环境变量:

r341h@uAlienR7:~/LinuxFromScrach$ cat .envrc
export LFS=/mnt/lfs

r341h@uAlienR7:~/LinuxFromScrach$ sudo mkdir -pv $LFS
mkdir: created directory '/mnt/lfs'

r341h@uAlienR7:~/LinuxFromScrach$ sudo mount -v -t ext4 /dev/sda3 $LFS
mount: /dev/sda3 mounted on /mnt/lfs

4) 设置宿主机(ubuntu22.04) 环境变量, 建议root和普通用户都设置

echo "export LFS=/mnt/lfs" > .bashrc

至此宿主机(ubuntu22.04)的安装依赖,和为lfs编译准备的分区创建完毕,也作为我自己规划的第一步。

根据LFS文档下一步需要下载Linux和相关组件的源码并进行编译,将在第二篇中详细记录。

分类: Linux 标签: linux lfs