本文基于Linux From Scratch的文档创建:
笔者的系统是Ubuntu
从0构建Linux需要在一个Linux系统的基础上完成,我们将需要的Linux系统称为宿主系统。
读者如果使用也是虚拟机,一定要多拍摄快照,防止失败。
本系列长期更新
根据文档的要求,宿主系统最好拥有4核及以上的CPU核最少8GB的内存,当然,不满足以上条件的老旧系统仍然能够完成构建。但是构建软件包所需要的时间可能会比较长。
根据文档的要求,宿主系统必须拥有以下的软件,且版本不能低于以下给出的最低版本。具体的软件和版本就不放出来了,读者运行下面的脚本查看哪些软件没有。文档给出了检查软件是否存在的脚本,运行后根据需要安装就行了。
脚本内容:
#!/bin/bash
# A script to list version numbers of critical development tools
# If you have tools installed in other directories, adjust PATH here AND
# in ~lfs/.bashrc (section 4.4) as well.
LC_ALL=C
PATH=/usr/bin:/bin
bail() { echo "FATAL: $1"; exit 1; }
grep --version > /dev/null 2> /dev/null || bail "grep does not work"
sed '' /dev/null || bail "sed does not work"
sort /dev/null || bail "sort does not work"
ver_check()
{
if ! type -p $2 &>/dev/null
then
echo "ERROR: Cannot find $2 ($1)"; return 1;
fi
v=$($2 --version 2>&1 | grep -E -o '[0-9]+\.[0-9\.]+[a-z]*' | head -n1)
if printf '%s\n' $3 $v | sort --version-sort --check &>/dev/null
then
printf "OK: %-9s %-6s >= $3\n" "$1" "$v"; return 0;
else
printf "ERROR: %-9s is TOO OLD ($3 or later required)\n" "$1";
return 1;
fi
}
ver_kernel()
{
kver=$(uname -r | grep -E -o '^[0-9\.]+')
if printf '%s\n' $1 $kver | sort --version-sort --check &>/dev/null
then
printf "OK: Linux Kernel $kver >= $1\n"; return 0;
else
printf "ERROR: Linux Kernel ($kver) is TOO OLD ($1 or later required)\n" "$kver";
return 1;
fi
}
# Coreutils first because --version-sort needs Coreutils >= 7.0
ver_check Coreutils sort 8.1 || bail "Coreutils too old, stop"
ver_check Bash bash 3.2
ver_check Binutils ld 2.13.1
ver_check Bison bison 2.7
ver_check Diffutils diff 2.8.1
ver_check Findutils find 4.2.31
ver_check Gawk gawk 4.0.1
ver_check GCC gcc 5.2
ver_check "GCC (C++)" g++ 5.2
ver_check Grep grep 2.5.1a
ver_check Gzip gzip 1.3.12
ver_check M4 m4 1.4.10
ver_check Make make 4.0
ver_check Patch patch 2.5.4
ver_check Perl perl 5.8.8
ver_check Python python3 3.4
ver_check Sed sed 4.1.5
ver_check Tar tar 1.22
ver_check Texinfo texi2any 5.0
ver_check Xz xz 5.0.0
ver_kernel 4.19
if mount | grep -q 'devpts on /dev/pts' && [ -e /dev/ptmx ]
then echo "OK: Linux Kernel supports UNIX 98 PTY";
else echo "ERROR: Linux Kernel does NOT support UNIX 98 PTY"; fi
alias_check() {
if $1 --version 2>&1 | grep -qi $2
then printf "OK: %-4s is $2\n" "$1";
else printf "ERROR: %-4s is NOT $2\n" "$1"; fi
}
echo "Aliases:"
alias_check awk GNU
alias_check yacc Bison
alias_check sh Bash
echo "Compiler check:"
if printf "int main(){}" | g++ -x c++ -
then echo "OK: g++ works";
else echo "ERROR: g++ does NOT work"; fi
rm -f a.out
if [ "$(nproc)" = "" ]; then
echo "ERROR: nproc is not available or it produces empty output"
else
echo "OK: nproc reports $(nproc) logical cores are available"
fi
笔者的运行结果:
可以看到有很多错误,了解到错误,我们开始安装必要的软件即可。
在安装前,先更新下APT
sudo apt update
安装指令:
sudo apt -y install gawk bison m4 make texinfo
再次运行脚本便只有一个错误了
这是链接错误,我们在终端输入:ls -l /usr/bin/sh
可以看到sh指向的是dash
,而不是bash
,所以我们需要修改一下。输入指令sudo ln -sf /usr/bin/bash/ /usr/bin/sh
最后一次运行,一切OK。那么准备阶段就完成了,下面开始创建新的分区
export LFS=/mnt/lfs
这么多指令还是太吃操作了,笔者收集到了两个脚本可以完成上面的操作,傻瓜式运行就好了。
export LFS=/mnt/lfs #定义挂载点
export LFS_TGT=x86_64-lfs-linux-gnu #确定目标架构
export LFS_DISK=/dev/sdb #指定用于构建LFS的磁盘设备
#防止重复挂载
if ! grep -q "$LFS" /proc/mounts; then
#检查分区是否存在
if [ ! -b "${LFS_DISK}2" ]; then
echo "Partition ${LFS_DISK}2 does not exist. Running setupdisk.sh..."
source setupdisk.sh "$LFS_DISK"
fi
sudo mount "${LFS_DISK}2" "$LFS" || { echo "Mount failed!"; exit 1; }#挂载分区,失败打印信息并退出脚本
sudo chown -v $USER "$LFS" #更改$LFS的所有者为当前用户
fi
#创建必要的目录结构
mkdir -pv $LFS/sources #源代码存储目录
mkdir -pv $LFS/tools #工具目录
#标准目录
mkdir -pv $LFS/boot
mkdir -pv $LFS/etc
mkdir -pv $LFS/bin
mkdir -pv $LFS/lib
mkdir -pv $LFS/sbin
mkdir -pv $LFS/usr
mkdir -pv $LFS/var
#不必要的操作,判断如果当前机器为64位机器子在创建一个lib64,但是呢现在的机器应该都是64位了
case $(uname -m) in
x86_64) mkdir -pv $LFS/lib64 ;;
esac
setupdisk.sh
LFS_DISK="$1" #接受参数
#检查变量是否为空
if [ -z "$LFS_DISK" ]; then
echo "Usage: $0 <disk>"
exit 1
fi
echo "Partitioning $LFS_DISK..."
#自动分区,第一个分区(100MB,为引导分区)
#第二个分区就是剩余全部空间
sudo fdisk "$LFS_DISK" << EOF
o
n
p
1
+100M
a
n
p
2
p
w
EOF
#检查fdisk是否成功
if [ $? -ne 0 ]; then
echo "Error: fdisk failed on $LFS_DISK."
exit 1
fi
echo "Formatting partitions..."
#格式化分区
sudo mkfs.ext2 "${LFS_DISK}1" || { echo "Failed to format ${LFS_DISK}1."; exit 1; }
sudo mkfs.ext4 "${LFS_DISK}2" || { echo "Failed to format ${LFS_DISK}2."; exit 1; }
echo "Disk setup completed successfully!"
运行结果:
LFS 项目存在的一项重要原因是,它能够帮助您学习 Linux 系统的内部是如何运作的。构建 LFS 系统的过程将展示 Linux 系统的工作原理,以及其各组成部分的协作和依赖关系。最棒的是,有了这些经验,您将能够定制 Linux 系统,使其满足您独一无二的需求。
LFS 的另一个关键优势是,它允许您掌控您的系统,而不用依赖于其他人的 Linux 实现。在使用 LFS 时,您就像坐在驾驶座上一样,亲自掌控系统的各个部分。
本系列长期更新
期待你的关注