您的当前位置:首页正文

【LFS】从0构建Linux系统(准备宿主系统与创建新的分区)

2025-01-16 来源:个人技术集锦

本文基于Linux From Scratch的文档创建:
笔者的系统是Ubuntu
从0构建Linux需要在一个Linux系统的基础上完成,我们将需要的Linux系统称为宿主系统。
读者如果使用也是虚拟机,一定要多拍摄快照,防止失败。
本系列长期更新

1. 准备宿主系统

1.1 硬件准备

根据文档的要求,宿主系统最好拥有4核及以上的CPU核最少8GB的内存,当然,不满足以上条件的老旧系统仍然能够完成构建。但是构建软件包所需要的时间可能会比较长。

1.2 软件准备

根据文档的要求,宿主系统必须拥有以下的软件,且版本不能低于以下给出的最低版本。具体的软件和版本就不放出来了,读者运行下面的脚本查看哪些软件没有。文档给出了检查软件是否存在的脚本,运行后根据需要安装就行了。
脚本内容:

#!/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。那么准备阶段就完成了,下面开始创建新的分区

2. 创建新的分区

export LFS=/mnt/lfs

这么多指令还是太吃操作了,笔者收集到了两个脚本可以完成上面的操作,傻瓜式运行就好了。

2.1 运行脚本

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!"


运行结果:

3.总结

LFS 项目存在的一项重要原因是,它能够帮助您学习 Linux 系统的内部是如何运作的。构建 LFS 系统的过程将展示 Linux 系统的工作原理,以及其各组成部分的协作和依赖关系。最棒的是,有了这些经验,您将能够定制 Linux 系统,使其满足您独一无二的需求。
LFS 的另一个关键优势是,它允许您掌控您的系统,而不用依赖于其他人的 Linux 实现。在使用 LFS 时,您就像坐在驾驶座上一样,亲自掌控系统的各个部分。
本系列长期更新
期待你的关注

Top