当前版本 v1.0
,仅支持 x86-64
架构。注意,本项目纯粹是写着玩的,很多地方非常不规范。
虽然本脚本已经经过一定测试,但仍然强烈建议在虚拟机中的 Linux 发行版上运行,避免损害主机系统。
本脚本的目的是自动构建 LFS,最终成果是一个虚拟磁盘文件,可以在 QEMU 和 VMware 中挂载运行。
如果希望在本地磁盘上构建 LFS 并实际使用它,可以修改本脚本,改为半自动的形式,同时不要略过测试工作。当然,更推荐按照官方手册手动去构建。
吐槽一下,如果你的目的是实际使用 LFS 系统,而不是简单“玩一下”,我认为该脚本的意义不大,你大概会感觉我写的很烂,然后考虑自己去写一个。
- 每个人的系统环境不同,不保证能正确运行,我也不可能都去测试。
- 默认的并行构建数为
4
。 - 确保脚本所在磁盘有至少
10G
的空闲空间。 - 确保没有设置回环设备,否则它们会被断开。
- 确保系统中没有
lfs
用户及lfs
用户组,否则它们会被删除。 - 确保
/mnt/lfs
目录不存在或为空,否则它会被删除!!! - 对运行该脚本可能产生的一切后果,本人概不负责!!!
对于自动构建 LFS,中途跑测试是很麻烦的,因为测试结果往往在不同主机上有不同的结果,没法用统一的标准去判断。尽管有些软件包的测试是必要的,但我们现在追求的是自动构建,而不是实际使用这个构建的系统(甚至整个构建都是在虚拟磁盘上完成的)。因此这里采取了最简单的办法,跳过所有难以评估的测试。如果自动构建过程失败或者构建完成的 LFS 不正确,那么你可能需要针对你的运行环境执行额外的操作,最好的解决办法是手动构建。
从 Github 上下载压缩包或者使用如下命令下载该项目(需要安装 Git):
git clone https://github.com/FreeFlyingSheep/lfs.git
进入项目目录,以 root
用户的身份执行:
bash run.sh
确认宿主机环境正确配置后,输入 1
继续;反之输入 2
退出,完成环境配置后再次运行该脚本。
确保安装了 QEMU 相关的软件包,并保证磁盘有至少 10G
的空闲空间。
目前的虚拟磁盘是 raw
格式的,不推荐在虚拟机中直接使用。
若想在 QEMU 中加载,运行以下指令将虚拟磁盘转换成 qcow2
格式:
qemu-img convert -p -f raw -O qcow2 lfs.img lfs.qcow2
然后运行以下命令启动 4
核 1G
内存的 QEMU 虚拟机:
qemu-system-x86_64 -smp 4,sockets=1,cores=4 -m 1024 lfs.qcow2
若想在 Vmware 中加载,运行以下指令将虚拟磁盘转换成 vmdk
格式:
qemu-img convert -p -f raw -O vmdk lfs.img lfs.vmdk
在 Vmware 中新建自定义虚拟机,客户端操作系统版本选择“其他 Linux 5.x 或更高版本内核 64 位”,内存建议设置 1G
以上,处理器核数建议 4
核,使用现有虚拟磁盘并选择 lfs.vmdk
,其余配置保持默认。
详细内容可以参考脚本注释及 LFS 官方手册《Linux From Scratch 版本 20200901-systemd,中文翻译版》。
脚本内容按照该手册编排,尽可能按功能划分成了多个小脚本,为了实现全自动构建,修改了少部分指令。
- 打印脚本信息。
- 确保执行脚本的用户为
root
。 - 切换到脚本所在的目录,导出一些环境变量。
- 调用官方的
version-check.sh
脚本,打印宿主系统环境信息,给用户选择是否继续执行。 - 导出
$LFS
环境变量。 - 清理上次的构建(如果存在的话)。
官方手册是相关内容的介绍,脚本什么也不需要做。
创建虚拟磁盘,对其进行分区、格式化然后挂载。
从官方镜像(服务器位于香港)下载 lfs-packages-10.0.tar,然后解包到 $LFS/sources
。
现在源码内容位于 $LFS/sources/10.0
目录,移动目录中的内容到 $LFS/sources
,之后删除空的 10.0
目录。
当然,用户也可以提前下载好软件包,放置到脚本目录。
创建目录布局,添加 lfs
用户,完成相关用户配置,之后切换到该用户并继续执行。
按序构建交叉工具链,具体请参考官方手册。
按序交叉构建临时工具,具体请参考官方手册。
进入 Chroot,按序构建其他临时工具,跳过了创建测试用户以及备份临时系统。
按序构建基本系统软件,跳过了所有难以评估的测试以及移除调试符号。
- 一般网络配置:采用经典网络接口名,网络设备名为
eth0
,使用 DHCP,动态 DNS,主机名为lfs
,FQDN 为lfs.localdomain
(在虚拟机使用 NAT 模式的情况下能联网)。 - 设备和模块管理概述:使用默认配置。
- 管理设备:使用默认配置。
- 配置系统时钟:使用默认配置。
- 配置 Linux 控制台:使用默认配置。
- 配置系统 Locale:设置
LANG=en_US.UTF-8
。 - 创建
/etc/inputrc
文件:使用默认配置。 - 创建
/etc/shells
文件:使用默认配置。 - Systemd 使用和配置:使用默认配置。
- 创建 /etc/fstab 文件:根据虚拟磁盘分区创建
/etc/fstab
文件(只有一个根分区,名称为/dev/sda
)。 - Linux-5.8.5:编译内核,内核配置在默认配置的基础上,添加了官方手册需要的选项,以及在使用 SCSI 控制器的 Vmware 上需要的选项。
- 使用 GRUB 设定引导过程:安装 GRUB 到虚拟磁盘,配置
set root=(hd0,msdos1)
,设置内核参数root=/dev/sda1
。
创建相关版本信息文件(姓名使用 lfs
),退出 Chroot,卸载虚拟磁盘。
本自动构建脚本仅支持 x86-64
架构,检查宿主系统部分需要手动确认,如果有需要的话自行安装相应软件包,并设置好软连接。官方手册也是针对 x86-64
架构的,这里不准备扩展。同时,宿主系统的环境不同,安装相应软件包的方式也不同,显然在自动构建脚本里寻求一个通用的解决方案是不现实的。
在构建时,日志文件被保存在 $LFS/sources/log
下,等相应构建步骤完成后,再移动至 log
。这么做的原因是,在构建时,只有 $LFS
目录是对当前的 root
用户、切换的 lfs
用户以及 Chroot 后的环境都可见的。
构建软件包时,使用 tools
数组存储官方手册的标题,代表构建软件包名,同时使用 dirs
数组存储对应软件包的目录。这么做是因为 shell 脚本中没有二维数组,如果使用字典,那么顺序会被打乱,目前没有想到更好的解决方案。
内核配置文件使用的 chroot/x86_64_config
,如有需要可自行替换。
对于时间的测量,与官方手册的区别在于对于需要应用补丁等额外操作的软件包,这些额外操作也被记入统计的时间,但它们的时间几乎可以忽略不计。
v0.1
:初步完成步骤0 - 3
。v0.2
:完善步骤0 - 3
,初步完成步骤4
。v0.3
:完善步骤4
,初步完成步骤5 - 7
。v0.4
:完善步骤5 - 7
。v0.5
:继续完善步骤5 - 7
。v0.6
:重构部分代码。v0.7
:重构编译软件包部分的代码,增加打印日志功能。v0.8
:初步完成步骤8
。v0.9
:完善步骤8
,初步完成步骤9
。v0.10
:完善步骤9
,初步完成步骤10 - 11
。v0.11
:完善步骤10 - 11
。v0.12
:修复已知问题。v1.0
:正式版,在多个 Linux 发行版上测试通过。