前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【LFS】从0构建Linux系统(准备宿主系统与创建新的分区)

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

原创
作者头像
Yui_
发布2025-01-15 22:16:02
发布2025-01-15 22:16:02
690
举报
文章被收录于专栏:LFSLFS

本文基于Linux From Scratch的文档创建:lfs

笔者的系统是Ubuntu

从0构建Linux需要在一个Linux系统的基础上完成,我们将需要的Linux系统称为宿主系统。

读者如果使用也是虚拟机,一定要多拍摄快照,防止失败。

本系列长期更新

1. 准备宿主系统

1.1 硬件准备

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

1.2 软件准备

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

脚本内容:

代码语言:shell
复制
#!/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

代码语言:txt
复制
sudo apt update

安装指令:

代码语言:txt
复制
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. 创建新的分区

  1. 创建新的分区 和其他操作系统一样,LFS一般也被安装在一个专有的分区。推荐为LFS选择一个可用的空分区,或者在充足未划分空间的情况下,创建一个新的分区。 要求:一个最小的系统需要大小约为10GB的分区。这足够保存所有源代码压缩包,并且编译所有软件包,但是如果希望LFS作为日常的Linux系统,很可能需要安装额外的软件,这需要更多的空间。一个30GB的分区比较合理。 创建新分区需要用到的指令有:fdisk
  2. 在分区上建立文件系统 分区只是由分区表中记录的边界确定的一段扇区。在操作系统使用分区存储文件之前,必须格式化该分区,以在分区中建立一个文件系统。文件系统通常包含标签,目录块,数据块,用于定位文件的索引结构等。文件系统也帮助操作系统记录分区中的可用空间,在创建文件或增大已有文件的大小时保留需要的扇区,并回收利用已删除的文件的数据空间。一些文件系统还提供数据冗余和错误恢复功能 需要用到的指令有mkfs
  3. 设置环境变量LFS

在文档中,经常使用的环境变量LFS。你应该保证在构建LFS的全过程中,该变量都被定义且设置为你构建的LFS使用的目录。

你应该先创建这个目录,作为后续的挂载点。

然后用这个指令来设置环境变量

代码语言:txt
复制
export LFS=/mnt/lfs

设置该环境变量的好处是,我们可以直接输入书中的命令,在后续创建分区时,我会提供一个运行脚本,只要运行脚本就可以了。

  1. 挂载新的分区 为了从宿主系统访问分区,我们需要把分区挂载到选定的挂载点上。正如前一节所述,本书假设将文件系统挂载到 LFS 环境变量指定的目录中。 需要用到的指令有mount

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

2.1 运行脚本

注意:以下操作你需要先创建一个名为lfs的用户,并以lfs用户进行操作

使用脚本可以帮助用户快速创建新的分区,不在需要一个指令一个指令的输入,读者可以直接复制脚本运行。

以下有两个脚本,一个名为lfs.sh主要功能就是设置环境变量,并创建新分区(另写了一个脚本)并挂载和创建一些需要的目录。

另一个名为setupdisk.sh:主要功能就是创建新的分区然后格式化。

运行脚本是基于Build a LinuxFromScratch System

的视频内容加上一些GPT优化内容。

笔者已添加注释,读者可以脚本中对应的功能。

lfs.sh

代码语言:shell
复制
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

代码语言:shell
复制
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 时,您就像坐在驾驶座上一样,亲自掌控系统的各个部分。

本系列长期更新

期待你的关注

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 准备宿主系统
    • 1.1 硬件准备
    • 1.2 软件准备
  • 2. 创建新的分区
    • 2.1 运行脚本
  • 3.总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档