前言

Linux From Scratch》(LFS)是杰勒德·比克曼斯等人编写的安装Linux的教科书,描述了从源代码编译Linux系统的方法。这本书可以从在Linux From Scratch网站上免费下载到,当前最新的版本为8.3。汉化版本可在这里找到。

本文仅仅是介绍自己在LFS-8.3-systemd安装过程中的心得体会,以及需要注意的地方(我踩过的坑)。本文不会详细介绍每个包的编译过程,那就相当于直接复制教科书了,没什么意义。

我对LFS的感觉是,耗时、费力,整个过程基本是机械的复制、粘贴、等待,相比于Gentoo的安装,我并没有在过程中感到什么快乐,或者学到了什么太多东西。这也是因为我本身技术水平不够罢,很多解释性的东西看不懂,只知道应该这么操作但不知道为什么要这样。不过虽然如此,最后编译系统成功后还是满满的成就感。

准备宿主系统

首先给lfs划分一块硬盘空间,官方建议不少于20G。格式化比较随意,官方用的ext4,我用的f2fs也正常运行。

使用官方提供的脚本进行检测,各个工具的版本不能低于官方要求,即:

  • Bash-3.2(/bin/sh 应该是到 bash 的符号链接或硬链接)
  • Binutils-2.25 (不推荐安装 2.31.1 以上的版本,它们没有经过测试,并不敢保证没有问题)
  • Bison-2.7(/usr/bin/yacc 应该是一个到 bison 的链接或者是一个执行 bison 的小型脚本)
  • Bzip2-1.0.4
  • Coreutils-6.9
  • Diffutils-2.8.1
  • Findutils-4.2.31
  • Gawk-4.0.1(/usr/bin/awk 应该是到 gawk 的链接)
  • GCC-4.9 包括 C++ 编译器、g++(不推荐安装 8.2.0 以上的版本,没有经过测试,不敢保证没有问题)
  • Glibc-2.11(不推荐安装 2.28 以上的版本,没有经过测试,不敢保证没有问题)
  • Grep-2.5.1a
  • Gzip-1.3.12
  • Linux Kernel-3.2
  • M4-1.4.10
  • Make-4.0
  • Patch-2.5.4
  • Perl-5.8.8
  • Sed-4.1.5
  • Tar-1.22
  • Texinfo-4.7
  • Xz-5.0.0

然后,挂载lfs分区,建立lfs用户,创建tools目录(临时系统目录)

每个软件包的构建都是这样的过程:

  1. 把所有源文件和补丁放到/mnt/lfs/sources/。
  2. 进入到源文件目录。
  3. 对每个软件包分别进行下面的操作:
  • 用 tar 程序解压要编译的软件包。在第五章中,确保解压软件包时你使用的是 lfs 用户。(tar xvf XXX)
  • 进入到解压后创建的目录中。(cd XXX)
  • 根据指南说明编译软件包。
  • 回退到源文件目录。(cd ..)
  • 除非特别说明,删除解压出来的目录。(rm -rf XXX)

如果想偷懒不制作临时系统,可以用我制作好的:点这下载。此系统完成了前五章的内容。此临时系统解压到/mnt/lfs/tools后并挂载虚拟内核文件系统即可直接进行第六章的内容,具体方法如下:

export LFS=/mnt/lfs
mkdir $LFS
mount -v /dev/sda6 $LFS
cd $LFS

# 把压缩包复制到这里
tar xvpf lfs-tools.tar.bz2

mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

chroot "$LFS" /tools/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h

临时系统制作好后,chroot到临时系统,使用临时系统构建lfs系统。构建好尚未进行任何配置的系统我这里也有备份:点这下载。此系统完成了前六章的内容,不同的是把原书linux-4.18的头文件换成linux-4.20的,同时没有安装grub(我直接用stub kernel引导)。此系统解压到一个空分区直接进行第七章内容即可,方法如下:

export LFS=/mnt/lfs
mount -v /dev/sda6 $LFS
cd /mnt

# 把压缩包复制到这里
tar xvpf lfs.tar.bz2

mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

chroot $LFS /bin/bash

2 Comments

  1. 我按照lfs手册一步一步操作,然后编译完成后重启后提示
    “`
    Please append a correct “root=” boot option; here are the available partitions:
    0b00 1048575 sr0
    driver: sr
    Kernel panic – not syncing: VFS: Unable to mount root on unknown-block(0,0)
    …………
    “`
    这样的问题,然后就卡住了;我在百度上也搜了一下照做了,还是没有解决,博主知道这是什么问题吗?可否指点一下,万分感谢。

    1. 内核有问题。你是用grub启动吗?如果直接用uefi引导内核需要写kernel command line,详见https://jerryding.site/gentoo-installation-base/里面的内核编译部分。另外看看如果不用ext4文件系统,勾选所需要的文件系统类型了吗?还有,如果使用nvme固态硬盘,选相应的选项了吗?
      我目前就想到这些。如果实在不行可以用别的发行版现成的内核配置来编译,虽然不够简洁,但至少能引导起来。

Leave a Reply

Your email address will not be published. Required fields are marked *