程序员开发实例大全宝库

网站首页 > 编程文章 正文

从头构建Linux系统之二 —— 搭建宿主机系统

zazugpt 2024-09-01 07:56:23 编程文章 21 ℃ 0 评论

本章会描述如何搭建宿主机系统,大致分为以下三个步骤:

  • 首先,宿主机系统需要安装一些特定版本的工具才能正确编译LFS系统。

  • 然后,还需要创建若干个LFS系统专用的磁盘分区。

  • 最后,还需要在这些磁盘分区上创建相应的文件系统,然后再将这些文件系统挂载至宿主机系统。

本章的所有操作都以root用户身份运行!

一、满足宿主机的系统需求

1. 安装宿主机系统的依赖包

从CentOS 6.6的官方镜像源,通过yum安装依赖包和头文件包:

## 安装依赖包
yum install -y bash binutils bison bzip2 coreutils diffutils findutils glibc grep gzip kernel m4 make patch perl sed tar texinfo wget
## 安装头文件包
yum install -y binutils-devel bison-devel bzip2-devel glibc-devel perl-devel kernel-devel kernel-headers

创建指向bison的yacc符号链接:

ln -sv /usr/bin/bison /usr/bin/yacc

由于CentOS官方镜像源提供的gcc、gawk和xz软件包的版本太低,不能满足编译Linux系统的最低版本要求,因此必须下载相应的源码包,然后编译安装gcc、gawk和xz软件包。

2. 编译安装GCC

通过yum安装官方镜像源的GCC,然后才能进行自举编译:

yum -y install gcc gcc-c++

下载gcc-5.2.0的源码包:

cd /root/Downloads/
wget http://mirrors.ustc.edu.cn/gnu/gcc/gcc-5.2.0/gcc-5.2.0.tar.gz

解压缩gcc-5.2.0的源码包:

tar -zxvf gcc-5.2.0.tar.gz

下载编译所需的依赖包:

cd /root/Downloads/gcc-5.2.0
./contrib/download_prerequisites
cd ..

新建目录存放编译结果:

mkdir gcc-build-5.2.0

进入新目录,并执行configure命令,生成makefile文件:

cd gcc-build-5.2.0
../gcc-5.2.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

编译gcc-5.2.0:

make -j2

安装gcc-5.2.0:

make install

更新库文件和符号链接:

cp /root/Downloads/gcc-build-5.2.0/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 /usr/lib64
ln -sf /usr/lib64/libstdc++.so.6.0.21 /usr/lib64/libstdc++.so.6

运行以下命令,检查gcc的版本:

gcc --version

若返回信息如下图所示,则表示编译安装成功:

检查gcc版本

运行以下命令,检查g++的版本:

g++ --version

若返回信息如下图所示,则表示编译安装成功:

检查g++版本

3. 编译安装Gawk

下载gawk-4.1.4的源码包:

cd /root/Downloads
wget http://mirrors.ustc.edu.cn/gnu/gawk/gawk-4.1.4.tar.gz

解压缩源码包:

tar xvzf gawk-4.1.4.tar.gz

配置编译选项:

cd gawk-4.1.4
./configure

编译和安装:

make && make install

更新软链接:

rm -rf /usr/bin/awk
ln -sv /usr/local/bin/gawk /usr/bin/awk

4. 编译安装Xz

下载xz-5.2.3的源码包:

cd /root/Downloads
wget http://tukaani.org/xz/xz-5.2.3.tar.gz

解压缩源码包:

tar xvzf xz-5.2.3.tar.gz

配置编译选项:

cd xz-5.2.3
./configure

编译和安装:

make && make install

5. 检查宿主机软件包的版本

宿主机系统依赖的软件包的名称和最低版本,如下表所示:

名称最低版本注释
Bash3.2/bin/sh应当是指向bash的符号链接
Binutils2.17不推荐使用高于2.27的版本,因为没有经过测试验证
Bison2.3/usr/bin/yacc应当是指向bison的符号链接
Bzip21.0.4-
Coreutils6.9-
Diffutils2.8.1-
Findutils4.2.31-
Gawk4.0.1/usr/bin/awk应当是指向gawk的符号链接
GCC4.7不推荐使用高于6.2.0的版本,因为没有经过测试验证
Glibc2.11不推荐使用高于2.24的版本,因为没有经过测试验证
Grep2.5.1a-
Gzip1.3.12-
Linux Kernel2.6.32-
M41.4.10-
Make3.81-
Patch2.5.4-
Perl5.8.8-
Sed4.1.5-
Tar1.22-
Texinfo4.7-
Xz5.0.0-

本章先前的操作已经在宿主机系统之中安装了合适版本的依赖包。可以创建一个版本检查脚本:

cd /root/Downloads
vi version-check.sh

version-check.sh脚本的内容如下所示:

#!/bin/bash
# 用于检查关键开发工具的版本号的简单脚本
export LC_ALL=C
# 检查Bash的版本
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
# 检查Binutils和Bison的版本
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
# 检查Bzip2和Coreutils的版本
bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-; echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
# 检查Diffutils的版本
diff --version | head -n1
# 检查Findutils的版本
find --version | head -n1
# 检查Gawk的版本
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的版本
gcc --version | head -n1
g++ --version | head -n1
# 检查Glibc的版本
ldd --version | head -n1 | cut -d" " -f2- # glibc version
# 检查Grep的版本
grep --version | head -n1
# 检查Gzip的版本
gzip --version | head -n1
# 检查Linux Kernel的版本
cat /proc/version
# 检查M4的版本
m4 --version | head -n1
# 检查Make的版本
make --version | head -n1
# 检查Patch的版本
patch --version | head -n1
# 检查Perl的版本
echo Perl `perl -V:version`
# 检查Sed的版本
sed --version | head -n1
# 检查Tar的版本
tar --version | head -n1
# 检查Texinfo的版本
makeinfo --version | head -n1
# 检查Xz的版本
xz --version | head -n1
# 检查GCC是否能正确编译
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

运行version-check.sh脚本,检查宿主机系统的依赖关系:

chmod 755 version-check.sh
./version-check.sh

若脚本输出的结果如下图所示,则表示宿主机系统的依赖关系满足需求:

检查依赖关系版本

6. 检查宿主机库文件的一致性

某些Linux发行版会报告gcc使用的一些库文件可能处于一种不一致的状态,这种状态会妨碍某些LFS软件包的编译。可以在/usr/lib和/usr/lib64目录中检查libgmp.la、libmpfr.la和libmpc.la文件是否存在。这三个文件要么同时都存在,要么同时都不存在,只有这两种状态才能表明gcc的库文件没有不一致的问题。如果宿主机系统出现这种不一致的问题,那么既可以重命名或删除这三个.la文件,也可以安装合适的缺失软件包。可以创建一个库文件检查脚本:

cd /root/Downloads
vi library-check.sh

library-check.sh脚本的内容如下所示:

#!/bin/bash
for lib in lib{gmp,mpfr,mpc}.la; do
 echo $lib: $(if find /usr/lib* -name $lib|
 grep -q $lib;then :;else echo not;fi) found
done
unset lib

运行library-check.sh脚本,检查宿主机系统的库文件一致性:

chmod 755 library-check.sh
./library-check.sh

若脚本输出的结果如下图所示,则表示宿主机系统没有库文件不一致的问题:

检查库文件一致性

二、创建磁盘分区

LFS系统将会安装在专用的磁盘和分区之中,这块磁盘的容量为120GB,系统设备号为sdb。需要为这块专用磁盘划分以下七个分区:

分区类型文件系统容量
/主分区ext420480 MB
swap主分区swap4096 MB
/boot主分区ext4100 MB
/usr/local逻辑分区ext430720 MB
/tmp逻辑分区ext44096 MB
/usr/src逻辑分区ext430720 MB
/home逻辑分区ext4其余所有

运行以下命令,列出所有磁盘的状态:

fdisk -l

上述命令的输出如下图所示:

查看磁盘分区列表

其中,/dev/sda是宿主机的系统磁盘,/dev/sdb是编译安装LFS系统的专用磁盘。

可以创建一个磁盘自动分区脚本:

cd /root/Downloads
vi disk-partition.sh

disk-partition.sh脚本的内容如下所示:

#!/bin/bash

echo "
n
p
1
1
+20480M
n
p
2
2613
+4096M
n
p
3
3136
+100M
n
e
3150
15665
n
3150
+30720M
n
7067
+4096M
n
7590
+30720M
n
11507
15665
t
2
82
w
" | fdisk /dev/sdb

这个脚本每行的作用如下所述:

  • 第4~8行:创建/dev/sdb1分区,这是一个主分区,容量为20480MB,用于挂载/文件系统;

  • 第9~13行:创建/dev/sdb2分区,这是一个主分区,容量为4096MB,用作内存交换区;

  • 第14~18行:创建/dev/sdb3分区,这是一个主分区,容量为100MB,用于挂载/boot文件系统;

  • 第19~22行:创建/dev/sdb4分区,这是一个扩展分区,包含所有的逻辑分区;

  • 第23~25行:创建/dev/sdb5分区,这是一个逻辑分区,容量为30720MB,用于挂载/usr/local文件系统;

  • 第26~28行:创建/dev/sdb6分区,这是一个逻辑分区,容量为4096MB,用于挂载/tmp文件系统;

  • 第29~31行:创建/dev/sdb7分区,这是一个逻辑分区,容量为30720MB,用于挂载/usr/src文件系统;

  • 第32~34行:创建/dev/sdb8分区,这是一个逻辑分区,容量为磁盘剩余的所有空间,用于挂载/home文件系统;

  • 第35~37行:将/dev/sdb2分区的System ID修改为82,也就是“Linux swap / Solaris”分区类型;

  • 第38行:将分区表写入磁盘。

运行磁盘自动分区脚本:

chmod 755 disk-partition.sh
./disk-partition.sh

磁盘分区创建完成之后,运行以下命令:

fdisk -l /dev/sdb

上述命令的返回结果就是LFS系统专用磁盘的分区状态,如下图所示:

查看sdb分区状态

三、创建和挂载文件系统

现在,LFS系统的专用磁盘已经被划分为7个空白分区,接下来将会为每个磁盘分区创建相应的文件系统。LFS系统可以使用Linux内核能够识别的任何文件系统,本文将会使用EXT4文件系统类型(除了sdb2分区之外)。

1. 设置$LFS环境变量

本系列教程会多次使用$LFS环境变量。在LFS系统的整个编译过程中,应当确保这个环境变量始终是可用的,很多目录的路径都会以这个变量作为前缀。本章会将这个环境变量设置为专用于编译LFS系统的目录名,也就是/mnt/lfs目录。运行以下命令,设置$LFS环境变量:

export LFS=/mnt/lfs

检查环境变量是否设置正确:

echo $LFS

若返回信息如下图所示,则表示环境变量设置正确:

检查LFS环境变量

2. 创建和挂载“/”文件系统

这是LFS系统的根文件系统,对应于宿主机系统的$LFS目录。

创建挂载点目录:

mkdir -pv $LFS

为/dev/sdb1创建ext4文件系统:

mkfs -v -t ext4 /dev/sdb1

挂载文件系统:

mount -v -t ext4 /dev/sdb1 $LFS

3. 创建和启用内存交换区

为/dev/sdb2创建内存交换区:

mkswap /dev/sdb2

启用内存交换区:

swapon -v /dev/sdb2

若返回信息如下图所示,则表示内存交换区成功启用:

启用内存交换区

4. 创建和挂载“/boot”文件系统

这是LFS系统的/boot文件系统,对应于宿主机系统的$LFS/boot目录。

创建挂载点目录:

mkdir -pv $LFS/boot

为/dev/sdb3创建ext4文件系统:

mkfs -v -t ext4 /dev/sdb3

挂载文件系统:

mount -v -t ext4 /dev/sdb3 $LFS/boot

5. 创建和挂载“/usr/local”文件系统

这是LFS系统的/usr/local文件系统,对应于宿主机系统的$LFS/usr/local目录。

创建挂载点目录:

mkdir -pv $LFS/usr/local

为/dev/sdb5创建ext4文件系统:

mkfs -v -t ext4 /dev/sdb5

挂载文件系统:

mount -v -t ext4 /dev/sdb5 $LFS/usr/local

6. 创建和挂载“/tmp”文件系统

这是LFS系统的/tmp文件系统,对应于宿主机系统的$LFS/tmp目录。

创建挂载点目录:

mkdir -pv $LFS/tmp

为/dev/sdb6创建ext4文件系统:

mkfs -v -t ext4 /dev/sdb6

挂载文件系统:

mount -v -t ext4 /dev/sdb6 $LFS/tmp

7. 创建和挂载“/usr/src”文件系统

这是LFS系统的/usr/src文件系统,对应于宿主机系统的$LFS/usr/src目录。

创建挂载点目录:

mkdir -pv $LFS/usr/src

为/dev/sdb7创建ext4文件系统:

mkfs -v -t ext4 /dev/sdb7

挂载文件系统:

mount -v -t ext4 /dev/sdb7 $LFS/usr/src

8. 创建和挂载“/home”文件系统

这是LFS系统的/home文件系统,对应于宿主机系统的$LFS/home目录。

创建挂载点目录:

mkdir -pv $LFS/home

为/dev/sdb8创建ext4文件系统:

mkfs -v -t ext4 /dev/sdb8

挂载文件系统:

mount -v -t ext4 /dev/sdb8 $LFS/home

9. 检查文件系统

执行以下命令,检查文件系统是否成功地创建和挂载:

df -lh

若返回信息如下图所示,则表示已经成功地为LFS系统的专用磁盘创建和挂载了文件系统:

检查LFS文件系统

现在,宿主机系统已经能够满足编译LFS系统的基本需求了。下一章将会介绍构成LFS系统的必要的软件包和补丁,以及它们的下载方法。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表