Coder Social home page Coder Social logo

lfs's Introduction

LFS 自动构建脚本

简介

当前版本 v1.0,仅支持 x86-64 架构。注意,本项目纯粹是写着玩的,很多地方非常不规范。

虽然本脚本已经经过一定测试,但仍然强烈建议在虚拟机中的 Linux 发行版上运行,避免损害主机系统。

本脚本的目的是自动构建 LFS,最终成果是一个虚拟磁盘文件,可以在 QEMU 和 VMware 中挂载运行。

如果希望在本地磁盘上构建 LFS 并实际使用它,可以修改本脚本,改为半自动的形式,同时不要略过测试工作。当然,更推荐按照官方手册手动去构建。

吐槽一下,如果你的目的是实际使用 LFS 系统,而不是简单“玩一下”,我认为该脚本的意义不大,你大概会感觉我写的很烂,然后考虑自己去写一个。

注意事项

  • 每个人的系统环境不同,不保证能正确运行,我也不可能都去测试。
  • 默认的并行构建数为 4
  • 确保脚本所在磁盘有至少 10G 的空闲空间。
  • 确保没有设置回环设备,否则它们会被断开。
  • 确保系统中没有 lfs 用户及 lfs 用户组,否则它们会被删除。
  • 确保 /mnt/lfs 目录不存在或为空,否则它会被删除!!!
  • 对运行该脚本可能产生的一切后果,本人概不负责!!!

对于自动构建 LFS,中途跑测试是很麻烦的,因为测试结果往往在不同主机上有不同的结果,没法用统一的标准去判断。尽管有些软件包的测试是必要的,但我们现在追求的是自动构建,而不是实际使用这个构建的系统(甚至整个构建都是在虚拟磁盘上完成的)。因此这里采取了最简单的办法,跳过所有难以评估的测试。如果自动构建过程失败或者构建完成的 LFS 不正确,那么你可能需要针对你的运行环境执行额外的操作,最好的解决办法是手动构建。

构建 LFS

下载脚本

从 Github 上下载压缩包或者使用如下命令下载该项目(需要安装 Git):

git clone https://github.com/FreeFlyingSheep/lfs.git

运行脚本

进入项目目录,以 root 用户的身份执行:

bash run.sh

确认宿主机环境正确配置后,输入 1 继续;反之输入 2 退出,完成环境配置后再次运行该脚本。

在虚拟机中运行

确保安装了 QEMU 相关的软件包,并保证磁盘有至少 10G 的空闲空间。

目前的虚拟磁盘是 raw 格式的,不推荐在虚拟机中直接使用。

QEMU

若想在 QEMU 中加载,运行以下指令将虚拟磁盘转换成 qcow2 格式:

qemu-img convert -p -f raw -O qcow2 lfs.img lfs.qcow2

然后运行以下命令启动 41G 内存的 QEMU 虚拟机:

qemu-system-x86_64 -smp 4,sockets=1,cores=4 -m 1024 lfs.qcow2

Vmware

若想在 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,中文翻译版》。

脚本内容按照该手册编排,尽可能按功能划分成了多个小脚本,为了实现全自动构建,修改了少部分指令。

0. 准备工作

  • 打印脚本信息。
  • 确保执行脚本的用户为 root
  • 切换到脚本所在的目录,导出一些环境变量。
  • 调用官方的 version-check.sh 脚本,打印宿主系统环境信息,给用户选择是否继续执行。
  • 导出 $LFS 环境变量。
  • 清理上次的构建(如果存在的话)。

1. 引言

官方手册是相关内容的介绍,脚本什么也不需要做。

2. 准备宿主系统

创建虚拟磁盘,对其进行分区、格式化然后挂载。

3. 软件包和补丁

从官方镜像(服务器位于香港)下载 lfs-packages-10.0.tar,然后解包到 $LFS/sources

现在源码内容位于 $LFS/sources/10.0 目录,移动目录中的内容到 $LFS/sources,之后删除空的 10.0 目录。

当然,用户也可以提前下载好软件包,放置到脚本目录。

4. 最后准备工作

创建目录布局,添加 lfs 用户,完成相关用户配置,之后切换到该用户并继续执行。

5. 编译交叉工具链

按序构建交叉工具链,具体请参考官方手册。

6. 交叉编译临时工具

按序交叉构建临时工具,具体请参考官方手册。

7. 进入 Chroot 并构建其他临时工具

进入 Chroot,按序构建其他临时工具,跳过了创建测试用户以及备份临时系统。

8. 安装基本系统软件

按序构建基本系统软件,跳过了所有难以评估的测试以及移除调试符号。

9. 系统配置

  • 一般网络配置:采用经典网络接口名,网络设备名为 eth0,使用 DHCP,动态 DNS,主机名为 lfs,FQDN 为 lfs.localdomain(在虚拟机使用 NAT 模式的情况下能联网)。
  • 设备和模块管理概述:使用默认配置。
  • 管理设备:使用默认配置。
  • 配置系统时钟:使用默认配置。
  • 配置 Linux 控制台:使用默认配置。
  • 配置系统 Locale:设置 LANG=en_US.UTF-8
  • 创建 /etc/inputrc 文件:使用默认配置。
  • 创建 /etc/shells 文件:使用默认配置。
  • Systemd 使用和配置:使用默认配置。

10. 使 LFS 系统可引导

  • 创建 /etc/fstab 文件:根据虚拟磁盘分区创建 /etc/fstab 文件(只有一个根分区,名称为 /dev/sda)。
  • Linux-5.8.5:编译内核,内核配置在默认配置的基础上,添加了官方手册需要的选项,以及在使用 SCSI 控制器的 Vmware 上需要的选项。
  • 使用 GRUB 设定引导过程:安装 GRUB 到虚拟磁盘,配置 set root=(hd0,msdos1),设置内核参数 root=/dev/sda1

11. 尾声

创建相关版本信息文件(姓名使用 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 发行版上测试通过。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.