《从LFS到自己的Linux发行版》系列教程:一步到位体验LFS11.0
前言
如果你把从源代码开始编译构建一个操作系统的工作当成厨师做一桌菜的话,Linux From Scratch(简称 LFS )就是一份“菜谱”。 从今天开始我准备写系列教程,一步一步带着大家从开源软件的源代码(大厨的“食料”)开始,基于最新版的 LFS(大厨的最新版“菜谱”)编译出能运行的 Linux 操作系统、构建出能作为桌面日常使用的 Linux 操作系统、打包成可以在电脑上安装的 Linux 操作系统、直至让你做出跟 Deepin Linux 一样好用的 GNU/Linux 发行版。这更是我们一步一步实践的过程,也是我们逐步深入学习的过程。希望在走完这个过程后,我们的技术、能力能达到为 GNU/Linux 操作系统添砖加瓦,甚至走的更远,作为一份子编制出我们自己的操作系统。
下面是我基于 LFS-11.0-systemd(以下简称 LFS11.0 )已经编译构建好的 Linux 系统。完美无瑕,启动了,登录了,甚至可以上网了,你看下图。
你心动了吗? 不急, 跟着我,你只要 2 个小时,不要惊讶、就 2 个小时,你也能编译、构建出能运行的 Linux 操作系统。作为《从LFS到自己的Linux发行版》系列教程的开篇,本篇会以最低难度、最明确步骤为宗旨,跟你一步到位体验基于 LFS11.0 编译、构建出能运行的 Linux 系统,让你对 LFS 有个初步认识;力争带你一次成功,让你树立信心、获得成就感。
第一节:LFS 准备工作
工欲善其事、必先利其器。为了顺利地编译构建你的 Linux 操作系统,我们该做好一些准备工作,免得过程中出问题、从头再来,这样的话 2 小时可是不能完成我们的 LFS 的啊。
-
平台准备:在我们日常使用的装有 windows 操作系统的电脑任意硬盘上,准备不少于 200G 硬盘空间用于存放虚拟机(在这个电脑硬盘讲 TB 的年代,为了将来的编译不出问题,特别是需要一路拍摄快照的情况下,还是多准备点吧)。下载虚拟机软件 VMware Workstation Pro 15.5.0(点此下载)并安装。由于 Windows10 系统的原因,比 VMware Workstation Pro 15.5.0 更早的版本已经不能在 Windows10 系统下使用,如果已经安装更新的版本可跳过此步。另外注意,你的电脑电源管理是否设置了休眠,如果是的话请取消这样的设置。
-
虚拟机准备:我已经配置好了编译构建 Linux 系统所需的虚拟机(即宿主机),并把该虚拟机 Deepin 上传到我的百度网盘。你要做的是,下载该虚拟机(点此下载,提取码 lfse),解压到准备好的硬盘空间。例如下图(不完全一致,下同)。
-
打开虚拟机:用虚拟机软件 VMware Workstation 打开之前下载解压的虚拟机 Deepin(就像用软件 Word 打开 doc 文档一样,一层层目录逐步深入寻找并打开),启动前检查网络连接是否为桥接并把桥接模式设置为“已桥接至<你的物理机用的网卡>”,例如我的虚拟机已经桥接至我的电脑网卡 Intel(R) Centrino(R) Wireless-N 2200。
-
启动虚拟机 :启动虚拟机Deepin并登录,用户名、密码都为 lfser。如果你的电脑内存大于 8G、CPU多于 8 线程,在打开虚拟机 Deepin 前调整虚拟机内存配置到计算机内存的一半、CPU 核数到计算机线程数的一半,以改善虚拟机 Deepin 的使用体验、使其更流畅。
-
在虚拟机 Deepin 中复制必须的文件:把虚拟机 Deepin 桌面上文件夹 LFS-11.0-systemd全家桶 中的硬盘分区脚本 disk-partition.sh、LFS 源代码包 lfs-packages-11.0.tar 和内核配置文件 myconfig-5.13.12 等三个文件复制到 lfser 的 home(即主目录)中。LFS-11.0-systemd全家桶 文件夹中除了这三个文件,LFS11.0 手册、参考文档、LFS11.0 源代码等都收纳其中。
-
虚拟机 Deepin 中打开终端:双击虚拟机 Deepin 桌面底部 Dock 上的图标打开深度终端。在已经打开的深度终端输入代码
sudo su
并根据终端要求输入系统管理员密码 lfser,如下图。
-
打开源代码:从桌面上文件夹 LFS-11.0-systemd全家桶 中找到文件 LFS_code-4.2.0,双击并选“显示”,系统自动加载代码编辑器 sublime 并打开该代码文件。
至此,我们为 LFS11.0 所做的准备工作全部完毕。
第二节:一步完成你的 LFS11.0
这一节,我们通过复制粘贴一步完成 LFS11.0 。我们的基于 LFS11.0 编译构造自己的 Linux 操作系统的工作都将在虚拟机 Deepin 中进行。
- 复制粘贴代码一步完成LFS:在代码编辑器 sublime 打开的代码文件 LFS_code-4.2.0 中复制全部代码并粘贴到之前已经通过输入
sudo su
命令获得管理员权限的深度终端中运行。这一步 :Ctrl+C & Ctrl+V,已经足够、你只须等待,深度终端不断运行输入的代码,直至 LFS 完成、虚拟机关机。有些宿主机,在切换shell时,终端会停止运行,如果停止运行,请从停止处继续复制粘贴后续代码。可能停止处,代码中已经标明此处须等运行完毕再粘贴后续代码
。
深度终端运行这些代码期间,在不断地进行源代码的编译、Linux 系统的构建,你会持续地看到终端出现如下的滚屏。
在此期间,你不要关机(你的电脑、虚拟机 Deepin 都不要关闭),不要在深度终端输入任何字符,也尽量不要在虚拟机 Deepin 中打开其他窗口。你最好是把虚拟机 Deepin 最小化到你电脑的任务栏上,以免由于虚拟机 Deepin 内存不足或者 CPU 高占用而导致出现问题。
为了直观地了解虚拟机 Deepin 在这运行的 2 小时中,深度终端到底做了些什么,把我基于 LFS11.0 并做了适当调整的一部分代码粘贴于下面,本文不做详深度解析(那正是下一篇所要呈现给大家的),如果暂时不想了解,尽管可以路过。
#############################################################
##### LFS,let's go! #####
#############################################################
########## II. Preparing for the Build ##########
########## Chapter 2. Preparing the Host System
# sudo su
# apt-get update
# Deepin15以外的宿主机需要安装的软件根据不同的宿主机确定
# apt-get install bison texinfo g++ -y
# ln -fs /bin/bash /bin/sh
#############################################################
##### 分界线(此处以上代码在准备阶段已经运行完毕) #####
#############################################################
fdisk -l
bash disk-partition.sh
mkfs -v -t ext4 /dev/sdb1
mkswap /dev/sdb2
##########
export LFS=/mnt/lfs
##########
mkdir -pv $LFS
mount -v -t ext4 /dev/sdb1 $LFS
/sbin/swapon -v /dev/sdb2
########## Chapter 3. Packages and Patches
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
# 注意解压后的目录名
tar xvf lfs-packages-11.0.tar
cp -R 11.0/* $LFS/sources
cp myconfig-5.13.12 $LFS/sources
rm -rf 11.0
pushd $LFS/sources
md5sum -c md5sums
popd
########## Chapter 4. Final Preparations
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}
for i in bin lib sbin; do
ln -sv usr/$i $LFS/$i
done
case $(uname -m) in
x86_64) mkdir -pv $LFS/lib64 ;;
esac
mkdir -pv $LFS/tools
##########
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
echo "lfs:lfser" | chpasswd
chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -v lfs $LFS/lib64 ;;
esac
chown -v lfs $LFS/sources
[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE
su - lfs
##########
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF
source ~/.bash_profile
########## III. Building the LFS Cross Toolchain and Temporary Tools mportant Preliminary Material ##########
########## Chapter 5. Compiling a Cross-Toolchain
# 设置4线程编译,具体根据宿主机可用的线程数设置MAKEFLAGS
export MAKEFLAGS='-j4'
cd $LFS/sources
##########
tar xvf binutils-2.37.tar.xz
cd binutils-2.37
mkdir -v build
cd build
../configure --prefix=$LFS/tools \
--with-sysroot=$LFS \
--target=$LFS_TGT \
--disable-nls \
--disable-werror
make
make install -j1
# 退出build目录
cd ..
cd ..
rm -rf binutils-2.37
##########
#
#
#
# 中间省略3000行
#
#
#
##########
grub-install /dev/sdb
cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod ext2
set root=(hd0,1)
menuentry "GNU/Linux, Linux 5.13.12-lfs-11.0-systemd" {
linux /boot/vmlinuz-5.13.12-lfs-11.0-systemd root=/dev/sdb1 ro tsc=reliable pmtmr=0x0
}
EOF
########## Chapter 11. The End
echo 11.0-systemd > /etc/lfs-release
cat > /etc/lsb-release << "EOF"
DISTRIB_ID="Linux From Scratch"
DISTRIB_RELEASE="11.0-systemd"
DISTRIB_CODENAME="KhaKha"
DISTRIB_DESCRIPTION="Linux From Scratch"
EOF
cat > /etc/os-release << "EOF"
NAME="Linux From Scratch"
VERSION="11.0-systemd"
ID=lfs
PRETTY_NAME="Linux From Scratch 11.0-systemd"
VERSION_CODENAME="KhaKha"
EOF
##########
logout
#############################################################
###### Deepin15以外宿主机此处需等运行完毕再粘贴后续代码 #####
#############################################################
umount -Rv $LFS
shutdown now
#############################################################
##### LFS,that's enjoy! #####
#############################################################
# 1、通过增加内核启动参数tsc=reliable pmtmr=0x0,解决了clocksource问题(4.0.2-2021.12.13)
# 2、更改成无人值守版本用于在Deepin 15.5编译(4.1.1-2021.12.16)
# 3、预设的内核配置文件换成myconfig-5.13.12(4.1.2-2021.12.16)
# 4、改正inetutils配置代码错误(4.1.3-2021.12.20)
# 5、改正glibc安装时缺失的两条命令(4.1.3-2021.12.21)
# 6、myconfig-5.13.12增加CONFIG_RANDOM_TRUST_CPU=y (4.1.3-2021.12.22)
# 7、改正了创建/etc/passwd、/etc/group文件命令和gcc安装时切换目录命令的位置(4.1.4-2021.12.25)
# 8、修改了基本网络配置,用可预见的设备命名而不是传统命名来命名网络适配器名字,采用systemd-resolved配置DNS(4.1.5-2021.12.27)
需要复制粘贴到深度终端的全部代码,我已经上传到百度网盘,可以下载(点此下载 ,提取码 lfse)、在下一篇开始前提前阅读一下,并与 LFS11.0 手册做个对比,看有什么不同。注意,无论是在你电脑的 Windows 系统中,还是虚拟机 Deepin 中,打开、编辑代码的最好工具是各种代码编辑器,推荐 sublime;千万不要用 Word、WPS 等文档编辑器去打开、编辑代码;在网页、PDF 文档中复制的代码,也需要粘贴在代码编辑器并加以检查后才能使用。
你的虚拟机在运行 2 小时后,基于 LFS11.0 的 Linux 系统已经构建好,虚拟机 Deepin 会自动关机、并等你开启你的 Linux 系统。(如果你的虚拟机窗口最小化到你电脑的任务栏了,那么双击任务栏上的虚拟机图标)你会看到如下窗口。
第三节:开启你的 LFS 系统
上节,我已经说了,你的电脑(当然是虚拟机 Deepin)在把代码全部复制粘贴到深度终端并运行约 2 小时后,已经完全编译构建好了一个基于 LFS11.0 的 Linux 操作系统。那么,深度终端到底做了些什么、你的电脑到底发生了哪些变化呢?
下面这张图是,我们的虚拟机 Deepin 刚刚开启的时候的系统目录。
可以看出,内置磁盘只有一个:系统盘。
再下面一张图,是基于 LFS11.0 编译构建 Linux 操作系统后的虚拟机 Deepin 的系统目录:
可以看出,内置磁盘有两个:系统盘、48GB 卷(从名字可以看出已经分区、格式化并挂载),多出了一个内置磁盘 48GB 卷。这个多出来的内置磁盘,就是我们通过把代码复制粘贴到深度终端并回车运行,把虚拟机上已经有的第二硬盘进行了分区,并对分区进行了格式化、挂载,形成了可以被电脑所用的硬盘分区。
那么,这个之前刚刚分区、格式化的硬盘分区(即 48GB 卷)现在里面有什么呢?我们再看下图。
哇,里面不再是像刚刚被格式化、空空如也的样子了,里面已经有 bin、boot 和 home 等一系列目录,俨然是一个完整的 Linux 操作系统。对,这就是深度终端在运行 2 小时后编译构建完成的 Linux 系统,只等你开启。
下面,你跟着我一起来开启你的 Linux 系统吧。
-
进入虚拟机 Deepin 的 BIOS 设置状态:我们的虚拟机 Deepin 的 BIOS 默认设置从第一硬盘启动,如果现在马上开机(当然是虚拟机 Deepin),那么所运行的还是第一硬盘所装的 Deepin 操作系统,并不是你所编译构建的 Linux 系统。下面,我们就来设置吧。在虚拟机软件 VMware Workstation 的菜单栏,点启动按钮(红色箭头)右边的向下箭头,即出现启动菜单,在该菜单选“打开电源时进入固件”选项,虚拟机 Deepin 即进入 BIOS 设置状态。
-
设置虚拟机 Deepin 从第二硬盘启动:进入了 BIOS 设置状态、并设置成如下图第二硬盘 Hard Drive (0,1) 在上、第一硬盘 Hard Drive (0,0) 在下的状态,并保存、退出,虚拟机 Deepin 即自动重启。
-
登录你的 Linux 系统:虚拟机 Deepin 的 BIOS 设置完毕、保存退出后,你的电脑 (虚拟机 Deepin)即自动重启,并很快进入你的 Linux 系统登录状态,输入用户名 root(还没创建其他用户,现在只能以 root 用户登录)和密码 lfser(这个密码是我在代码中设置的,你可以在代码中设置任意密码,或者在登陆后输入命令
passwd root
重新设置),你的 Linux 系统真的登录成功了。
-
试用你的Linux系统:在登录成功后,除了登录信息,电脑显示的就是一个黑乎乎的屏幕,她真的能为我们所用吗?能连接网络吗?我们在电脑中输入命令
ping www.baidu.com
来检查一下网络是否连接,看看出现什么情况。噢 ,她已经联网了,ping 出了百度网的网址、已经接收了 4 个信息包(4 packets received),当然她还能接收更多信息包,但我按 Ctrl+C 键人为地停止了这个过程 。
That's Wonderful!这真是令人激动的时刻。
我已经把剥离了宿主机系统的 LFS 11.0 虚拟机导出、上传到百度网盘,欢迎下载试用(点此下载,提取码 lfse)。打开 LFS 11.0 系统后,对比一下系统中 /etc/fstab 和 、/boot/grub/grub.cfg 两个文件与 LFS 时形成的这两个文件的区别,思考一下为什么要做这些改变,为后续的学习做点铺垫。
结语
你跟我一起,一步一步走来,真的从源代码开始,编译构造出了你的 Linux 操作系统 。尽管这个系统还很单薄、功能不是特别多,还不能输入、显示汉字,还没有视窗;你的这个 Linux 操作系统的编译构造过程,是用我配置好的虚拟机 Deepin,把我根据 LFS11.0 手册整理并适当改造了的代码直接粘贴到深度终端,体验了一次编译构造 Linux 系统的过程,你对编译构造的原理还不是很明了。
这正是我以后要跟你们继续做的事情:详细了解从源代码到你的 Linux 系统的编译构造过程,基于 BLFS 构造出能用于工作的功能丰富的 Linux 系统,把你的 Linux 系统装入 U 盘并能在别的电脑(不是虚拟机、也不是限于自己的电脑)、为别人所用,直至最终构造出像 Deepin Linux 一样好用的、有完整的包管理机制的 Linux 操作系统。
这里要顺便表扬一下 Deepin Linux 。在我试用过的 GNU/Linux 操作系统中,这个 Linux 系统是最接地气的,完全开箱即用,中文、输入法及常规软件统统搞定,我用这个系统进行 LFS 时,只做了三项简单设置:一、通过深度软件商店安装了 sublime 这个代码编辑器;二、通过深度终端安装了 g++ 等三个 LFS 编译环境必须的软件;三、通过深度终端对 sh 指向由 dash 改为 bash。这个系统,还特别漂亮,用来有苹果系统的感觉。真不愧是我们自主操作系统的佼佼者!
如果我们一步一步走过了上述的全部过程,我相信对你我都有所裨益,能深刻理解操作系统构造原理,有能力去为 GNU/Linux 这个伟大的自由开源软件添砖加瓦,甚至走的更远,去创造出完全为我们所有的操作系统。等着那一天!