[构建自己的Linux发行版]LFS 笔记

简介

官网:https://www.linuxfromscratch.org/

一直想知道一个发行版的代码是怎么构成的,这个项目可以带我们自己构建一个Linux发行版,并且可以运行.

下边是我从官方书中摘抄出的简介:

您可能有许多阅读本书的理由。许多人首先会问: “为什么要不辞辛苦地手工从头构建一个 Linux 系统,而不是直接下载并且安装一个现成的?”
LFS 项目存在的一项重要原因是,它能够帮助您学习 Linux 系统的内部是如何运作的。构建 LFS 系统的过程将展示 Linux 系统的工作原理,以及其各组成部分的协作和依赖关系。最棒的是,有了这些经验,您将能够定制 Linux 系统,使其满足您独一无二的需求。
LFS 的另一个关键优势是,它允许您掌控您的系统,而不用依赖于其他人的 Linux 实现。在使用 LFS 时,您就像坐在驾驶座上一样,亲自掌控系统的各个部分。
LFS 允许您创建非常紧凑的 Linux 系统。在安装其他发行版时,您往往不得不安装一大堆永远不会用到或者意义不明的程序。它们会浪费系统资源。您可能以为,有了现代的大容量硬盘和高速 CPU,就不需要考虑资源浪费的问题。然而,在一些情况下,即使不考虑其他问题,仅仅存储空间的约束就十分紧张。典型的代表有可引导 CD,USB 启动盘,以及嵌入式系统。在这些领域中,LFS 是十分有用的。
自行定制的 Linux 系统在安全方面也具有优势。在从源码编译整个系统的过程中,您有机会审核所有的代码,并安装您需要的安全补丁。您不需要像往常那样等待其他人编译一个修复了安全漏洞的二进制包。另外,除非您亲自检查并应用了补丁,您无法保证新的二进制包在编译过程中没有出问题,并且正确修补了安全漏洞。
Linux From Scratch 的目标是构建一个完整并基本可用的系统。如果您不想从零构建您自己的 Linux 系统,那么您可能不会从本书提供的信息中受益。
此外,构建 LFS 系统还有很多好处,这里就不一一列举了。总而言之,学习仍然是最重要的使用 LFS 的原因。在您编译和使用 LFS 的实践过程中,您将学到很多威力巨大的信息和知识。

我参考的是如下中文版网址:https://lfs.xry111.site/zh_CN/12.2/

  1. 可以在这个项目中学到很多关于linux的指令相关的知识
  2. 可以思考到在我们使用一些指令的时候实际上用的是这些开源软件(很多是GNU的开源软件),那么我们在自己进行系统裁剪的时候就知道具体需要什么软件
  3. 明白交叉编译的过程,并且理解更深刻一部,理解编译器是可以编译出特定的编译器的,也就是我构建我自己或者我的孪生
  4. 明白编译优化的重要性,之前一直不理解为什么有的地方有这样一种论调,有的老机器使用新的编译器重新生成软件就可以解决速度问题,这里的多次编译安装刚好可以帮我们解惑
  5. 明白linux内核的选项和相关的驱动选取工作和界面
  6. 可以明白有关于分区和引导相关的一些知识

总而言之,无论是对于我主业的嵌入式开发还是在linux系统中的各种软件开发,都是一个很好的实践机会,比查字典一样去理解那些东西要好得多.尤其是一种设计模式会进入到脑子里,你自己就知道大概这样一个操作的作用,这个隐隐灌输到脑子里的东西也许才是我觉得最重要的部分.

这里只讲了对于我个人而言学习到了什么,因为官方的书籍已经很全面了,对于在VM中安装遇到的问题请直接转到最下边的"遇到的问题"尤其是"虚拟机环境下引导不了"这部分内容.

目的

通过LFS学到一些东西,不求甚解没问题,但是要记下不求甚解的地方.

新学到的知识

manjaro的ip获取

Manjaro Linux默认使用ip命令来管理和查看网络接口,而不是传统的ifconfig命令。这是因为ip命令是较新的工具,提供了更强大的功能和更一致的语法,它是iproute2软件包的一部分。如果您习惯使用ifconfig,可以通过安装net-tools包来获得它,但推荐您学习使用ip命令。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:e3:6f:66 brd ff:ff:ff:ff:ff:ff
    altname enp2s0
    inet 192.168.220.129/24 brd 192.168.220.255 scope global dynamic noprefixroute ens32
       valid_lft 1015sec preferred_lft 1015sec
    inet6 fe80::6bea:5164:8834:72df/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

接口 lo:

  • lo 是环回(Loopback)接口,它并不是一个物理接口,而是一个虚拟接口,用于本机上的进程之间的通信。
  • <LOOPBACK,UP,LOWER_UP> 表示该接口处于活动状态并且可以使用。
  • mtu 65536 意味着最大传输单元(MTU)设置为65536字节,这是环回接口的默认值,因为数据不需要通过实际网络传输。
  • inet 127.0.0.1/8 显示了IPv4环回地址,也称为本地主机(localhost),子网掩码为8位。
  • inet6 ::1/128 显示了IPv6环回地址,同样用于本地主机。

接口 ens32:

  • ens32 是一个以太网接口,可能是您的VMware虚拟机中配置的网络适配器。
  • <BROADCAST,MULTICAST,UP,LOWER_UP> 表明该接口支持广播和多播,并且目前是活动的。
  • mtu 1500 是标准以太网的最大传输单元。
  • qdisc fq_codel 指的是流量控制队列规则,这里使用的是公平队列和控制延迟元素。
  • link/ether 00:0c:29:e3:6f:66 显示了该接口的MAC地址。
  • altname enp2s0 提供了一个替代名称,根据系统的命名约定。
  • inet 192.168.220.129/24 是分配给此接口的IPv4地址,子网掩码为24位。这应该是您用来通过SSH连接到这台机器的IP地址。
  • brd 192.168.220.255 是广播地址,同一子网内的所有设备都可以接收到发往这个地址的数据包。
  • valid_lft 1015sec preferred_lft 1015sec 表明这是一个动态分配的IP地址,有效期大约为1015秒。
  • inet6 fe80::6bea:5164:8834:72df/64 是接口的IPv6链路本地地址,仅在同一链路上的设备间有效。

获取自己的用户名

whoami

修改密码

sudo passwd 用户名

开滚

sudo pacman -Syu

滚完更新数据库

sudo pacman -Sy

检查系统要求后

因为系统要求中可能有我们没有的软件,那么直接使用:、

sudo pacman -S 包名称

来解决.

分区

~~这里要注意cfdisk的打开是sudo cfdisk,使用sudo cfdisk -z是重新开始分区. ~~

cfdisk(8) — Arch manual pages

这里注意在安装manjaro的时候就选好分区,而不是先分成40G在用cfdisk分成15G+20G+5G

打算把LFS放在/dev/sda2,这里记录一下

在分区上建立文件系统

创建一个ext4文件系统:

mkfs -v -t ext4 /dev/_`<xxx>`_

设置环境变量

export LFS=/mnt/lfs

我挂载点呢?我怎么知道是这个目录?

mkdir -pv $LFS
mount -v -t ext4 /dev/_`<xxx>`_ $LFS

修改目录权限

chmod -v a+wt $LFS/sources

该指令 chmod -v a+wt $LFS/sources 是用来更改文件或目录的权限的。我们可以将其拆解如下:

  1. chmod:这是一个命令,用于更改文件的模式(权限)。
  2. -v:这是一个选项,表示冗长模式(verbose mode)。在执行命令时,系统会显示每个文件或目录权限更改的详细信息。
  3. a+wt:这是权限选项,其中:
    - a 表示所有用户(owner, group, others)。
    - + 表示添加权限。
    - w 表示写权限(write permission)。
    - t 表示粘滞位(sticky bit)。粘滞位通常用于目录,它允许只有文件的所有者(或root用户)才能删除或移动该目录中的文件。
  4. $LFS/sources:这是目标目录的路径,$LFS 是一个环境变量,实际路径取决于该环境变量的值。

文件系统使用 UID 记录文件所有者,而宿主系统中普通用户的 UID 在 LFS 中未被分配。因此,这些文件保留到最终的 LFS 系统后,会属于一个没有命名的 UID 。

wget下载文件

wget --input-file=wget-list-sysv --continue --directory-prefix=$LFS/sources

这条命令使用 wget 工具下载文件,并将下载的文件放在指定的目录中。我们可以将其解析如下:

  1. wget:这是一个命令行工具,用于从网络上下载文件。
  2. --input-file=wget-list-sysv:这个选项指定了一个文件名 wget-list-sysv,该文件包含了要下载的文件URL列表。wget 会读取这个文件中的每一行,并下载其中列出的每个文件。
  3. --continue:这个选项告诉 wget 如果目标文件已经存在,则继续下载文件(如果支持断点续传)。这样可以防止重新下载已经部分下载的文件。
  4. --directory-prefix=$LFS/sources:这个选项指定了下载文件的保存目录。$LFS 是一个环境变量,其值与其后面的路径共同决定了下载文件保存的位置。这里,文件将被下载到 $LFS/sources 目录中。

这里最后还是expat-2.6.2.tar.xz没办法下载.

我们手动点进去下载地址进行下载.

这里注意:.asc文件是lic文件不需要下载,而旧版的软件会被重命名为原文件名-RENAMED-VULNERABLE-PLEASE-USE-<最新版本号>-INSTEAD
我们手动下载改名就是了.

创建自己的sh脚本

有时候需要执行一系列的sudo命令,懒得每个都sudo.

首先需要创建文件(一般是.sh文件).

随后为脚本文件增加可执行功能.

chmod +x 脚本.sh

随后使用nano或者vi/vim编辑把内容写入.

然后sudo 脚本.sh.

这里一定要注意,在脚本中$LFS这样的环境变量是不通 的!!!!
那么如果想要在root模式下进行运行,使用su - root来进行!

创建新用户

创建用户组:

groupadd lfs

添加用户到用户组:

useradd -s /bin/bash -g lfs -m -k /dev/null lfs

-s /bin/bash
设置 bash 为用户 lfs 的默认 shell。
-g lfs
添加用户 lfs 到组 lfs
-m
为用户 lfs 创建一个主目录。
-k /dev/null
将模板目录设置为空设备文件,防止从默认模板目录 (/etc/skel) 复制文件到新的主目录。
lfs
这是新用户的名称。

ls显示隐藏文件

用了很多次了,但是有时候还是老用不对.

ls -a

强制读取shell配置文件

众所周知,export一个环境变量其实是是现在shell启动的过程中的,相当于提前约定了环境变量进去,这时候我们自己设置了环境变量,需要重启shell,为了不重启shell有时候需要用这个命令来重新读取配置文件.

source ~/.bash_profile

交叉编译

这样的Build,Host,Target三部分可以这样理解,以第一行为例,在机器A上为机器A构建能够生成机器B的编译器.

这种需要通过编译生成编译器的方式才需要三个部分,编译普通的软件只需要理解比如第三行,在机器B上编译在机器C上运行的软件.

对C语言的理解

C 语言并不仅仅是一个编译器;它还规定了一个标准库。

tar解压

tar -xJvf file.tar.xz
  • tar:这是一个用于创建和解压缩归档文件的工具。
  • -x:表示解压缩(extract)。
  • -J:表示使用 xz 压缩算法进行解压缩。
  • -v:表示冗长模式(verbose mode),在解压缩过程中显示详细信息。
  • -f:表示指定文件名。
  • file.tar.xz:这是要解压缩的文件名。

find命令

find usr/include -type f ! -name '*.h' -delete
  • find:这是一个用于查找文件和目录的命令。
  • usr/include:这是指定的搜索路径,在这个路径下查找文件。
  • -type f:表示只查找普通文件(不包括目录、链接等)。
  • ! -name '*.h':表示排除所有以 .h 结尾的文件。! 是逻辑非操作符,-name '*.h' 匹配所有以 .h 结尾的文件,因此 ! -name '*.h' 匹配所有不以 .h 结尾的文件。
  • -delete:表示删除找到的文件。

patch打补丁

patch -Np1 -i ../glibc-2.40-fhs-1.patch
  1. patch:这是一个用于应用补丁文件的命令。
  2. -N:表示如果补丁已经被应用过,则跳过该补丁。
  3. -p1:这个选项用于指定从补丁文件中删除的目录层次。-p1 表示删除路径中的第一级目录。例如,如果补丁文件中的路径是 a/b/c/file,那么应用补丁时路径将变成 b/c/file
  4. -i:指定要应用的补丁文件。
  5. ../glibc-2.40-fhs-1.patch:这是补丁文件的路径。这里的路径是相对于当前目录的上一级目录。

sed命令编辑文件

sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
  1. sed:这是一个流编辑器,用于对文本文件进行基本的文本转换。
  2. /RTLDLIST=/:这是一个模式,表示匹配包含字符串 RTLDLIST= 的行。
  3. s@/usr@@g:这是一个替换命令,表示将匹配的 /usr 字符串替换为空字符串。这里使用 @ 作为分隔符,而不是默认的 /,是为了避免与路径中的 / 混淆。g 表示全局替换,即替换行中的所有匹配项。
  4. -i:表示编辑文件时直接修改文件,而不是输出到标准输出。
  5. $LFS/usr/bin/ldd:这是要进行编辑的文件路径。

pushd/popd命令

pushd build
  ../configure
  make -C include
  make -C progs tic
popd
  1. 切换到 build 目录。
  2. 运行上一级目录中的 configure 脚本,配置构建环境。
  3. 在 include 目录中运行 make,编译头文件或库文件。
  4. 在 progs 目录中运行 make tic,编译 tic 程序。
  5. 返回原来的目录。

ln创建软链接

ln -sv libncursesw.so $LFS/usr/lib/libncurses.so
  1. ln:这是一个用于创建链接的命令。
  2. -s:表示创建符号链接(symbolic link)。符号链接类似于快捷方式,指向另一个文件或目录。
  3. -v:表示详细模式(verbose mode),显示正在创建的链接的信息。
  4. libncursesw.so:这是源文件的名称,表示要链接的目标文件。
  5. $LFS/usr/lib/libncurses.so:这是目标链接的路径和名称,表示要创建的符号链接的位置。

用于用户态和内核通信的虚拟文件

如下命令是创建挂载点的,现在看来也是可以明白是dev,proc,sys,run这四个虚拟文件

mkdir -pv $LFS/{dev,proc,sys,run}

mount绑定挂载

mount -v --bind /dev $LFS/dev
  1. mount:这是一个用于挂载文件系统的命令。
  2. -v:表示详细模式(verbose mode),显示挂载过程中的详细信息。
  3. --bind:表示绑定挂载,将一个目录绑定到另一个目录,使其内容在目标目录中可见。
  4. /dev:这是源目录,表示要绑定的原始设备文件目录。
  5. $LFS/dev:这是目标目录,表示在 LFS 构建环境中的设备文件目录。

伪终端系统devpts

mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts
  • mount:用于挂载文件系统的命令。
  • -v:详细模式,显示挂载过程中的详细信息。
  • -t devpts:指定文件系统类型为 devpts
  • devpts:源设备,也可以是文件系统类型。
  • -o gid=5,mode=0620:挂载选项,设置组ID为5(通常是 tty 组),权限为 0620。
  • $LFS/dev/pts:目标挂载点

devpts 是一个伪终端设备文件系统,主要用于管理伪终端设备。伪终端设备(pseudo-terminal devices)是虚拟终端,用于支持终端仿真程序,如 sshscreentmux 等。在 Linux 系统中,伪终端设备通常挂载在 /dev/pts 目录下。
因为这里是虚拟系统,因此是devpts文件系统

mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

这里的道理也是一样的.

chroot

chroot 环境是一种在类 Unix 操作系统中使用的技术,通过更改进程的根目录(通常是 /)来创建一个隔离的文件系统环境。chroot 是 "change root" 的缩写,这个命令可以将进程的根目录更改为指定的新目录,从而使得进程只能访问该新目录及其子目录。这种隔离机制常用于软件测试、系统修复、构建软件包和增强安全性等场景。

  1. 隔离环境chroot 环境将进程及其子进程限制在指定的目录树中,提供了一种简单的隔离机制,防止进程访问真实的系统文件。
  2. 安全性:通过隔离敏感进程,可以防止恶意软件或不可信代码访问和修改系统关键文件。
  3. 软件开发和测试:在隔离环境中构建和测试软件,可以避免对实际系统造成影响。
  4. 系统修复:在系统崩溃或无法正常启动时,可以使用 chroot 从救援系统中挂载文件系统并进行修复操作。
chroot "$LFS" /usr/bin/env -i   \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='(lfs chroot) \u:\w\$ ' \
    PATH=/usr/bin:/usr/sbin     \
    MAKEFLAGS="-j$(nproc)"      \
    TESTSUITEFLAGS="-j$(nproc)" \
    /bin/bash --login
  1. chroot "$LFS"
    • chroot 命令用于更改根目录,这里将 $LFS 目录设置为新的根目录。
    • $LFS 是一个环境变量,通常指向LFS构建环境的根目录。
  2. /usr/bin/env -i
    • env 命令用于运行一个程序时设置环境变量。
    • -i 选项表示清除所有继承的环境变量,只保留指定的环境变量。
  3. 设置环境变量
    • HOME=/root:设置根用户的主目录为 /root
    • TERM="$TERM":传递当前终端类型给 chroot 环境。
    • PS1='(lfs chroot) \u:\w\$ ':设置提示符,显示为 (lfs chroot) 用户名:当前目录$
    • PATH=/usr/bin:/usr/sbin:设置可执行文件路径。
    • MAKEFLAGS="-j$(nproc)":设置 make 命令的并行编译选项,使用所有可用的处理器核心。
    • TESTSUITEFLAGS="-j$(nproc)":设置测试套件的并行运行选项,使用所有可用的处理器核心。
  4. /bin/bash --login
    • 运行一个新的登录shell,会读取 /etc/profile 和用户的 ~/.bash_profile 或 ~/.profile 文件,初始化环境。

mkdir创建父目录

mkdir -p /home/user/projects/myproject

-p 选项的含义:

  • 创建父目录-p 选项表示在需要时创建父目录。如果路径中包含多个尚不存在的父目录,mkdir -p 会一次性创建所有必需的目录。例如,如果你执行 mkdir -p /a/b/c,并且 /a 和 /a/b 目录还不存在,mkdir -p 就会创建 /a 和 /a/b,然后创建 /a/b/c
  • 静默处理已存在的目录:如果目标目录已经存在,-p 选项会让 mkdir 静默处理,而不会报错。这对于脚本和自动化任务特别有用,因为你不需要担心目录是否已经存在。

install命令

install -dv -m 0750 /root
  1. install:这是一个用于复制文件和设置权限的命令,通常用于安装软件。
  2. -d:表示创建目录。如果目录不存在,install 会创建它。
  3. -v:详细模式,显示创建过程中的信息。
  4. -m 0750:设置目录的权限。0750 表示:
    • 所有者有读、写和执行权限 (rwx = 7)。
    • 组用户有读和执行权限 (rx = 5)。
    • 其他用户没有任何权限 (--- = 0)。
  5. /root:目标目录。这里表示创建 /root 目录。

已挂载文件系统列表

历史上,Linux 曾在 /etc/mtab 维护已经挂载的文件系统的列表。现代内核在内部维护该列表,并通过 /proc 文件系统将它展示给用户。

为了满足一些仍然使用 /etc/mtab 的工具,执行以下命令,创建符号链接:

ln -sv /proc/self/mounts /etc/mtab

zic命令

expect生成伪终端

unset清楚环境变量

unset BUILD_ZLIB BUILD_BZIP2

静态库

如果我们选择静态链接,我们在编译好之后如果不需要静态库,为了减少自己制作的发行版的大小,我们就对它进行删除.

删除所有文件夹

rm -rf */

pip wheel指令

难以理解的地方

第四个问题: 在构建一些软件包时必要的工具。由于已经解决了所有循环依赖问题,现在即可使用“chroot”环境进行构建,它与宿主系统 (除正在运行的内核外) 完全隔离。

chown 修改权限

chown -R tester .

groupdel 删除用户组

groupdel dummy

cat 输入tab

  1. 运行 cat 命令并将输入重定向到一个文件:
    cat > filename
    
  2. 输入内容时,使用 Ctrl+V 然后按 Tab 键,这样可以插入一个实际的Tab字符:
if [ condition ]; then
<Ctrl+V><Tab>echo "Condition is true"
else
<Ctrl+V><Tab>echo "Condition is false"
fi
  1. 按 Ctrl+D 结束输入并保存文件。

系统文件的调试符号

这里可能后续会用上,因为我们做边缘设备部署也用不到本地调试,所以也可以通过去掉调试符号来缩小程序大小.

fstab文件

一些程序使用 /etc/fstab 文件,以确定哪些文件系统是默认挂载的,和它们应该按什么顺序挂载,以及哪些文件系统在挂载前必须被检查 (确定是否有完整性错误)。

/etc/fstab 文件中的 fstab 是 "File Systems Table" 的缩写。

遇到的问题

虚拟机环境下引导不了

编译内核之前一定要执行make defconfig,可以帮你自动配置好很多东西.

出现vfs unable to mount root fs on unknown-block(0 0)

LFS12.1构建 | linux | 制作linux操作系统(二)_linux lfs-CSDN博客

Device Drivers --->
        Misc devices --->
                 <*>VMware VMCI Driver
                <*>VMware Balloon Driver
        SCSI device support--->
                <*>SCSI low-level drivers--->
                        <*>VMware PVSCSI driver support
        Fusion MPT device support-->
                <*>Fusion MPT ScsiHost drivers for SPI

LFS 11.2(Linux From Scratch)构建过程全记录(十): 使 LFS 系统可引导

Device Drivers --->
   Generic Driver Options --->
      [*] Maintain a devtmpfs filesystem to mount at /dev
   [*]Network device support --->
      [*]Ethernet Driver support --->
         [*] AMD PCnet32 PCI support
   [*]Fusion MPT device support --->
      <*> Fusion MPT ScsiHost drivers for SAS
      <*> Fusion MPT misc device (ioctl) driver  
      [*] Fusion MPT logging facility 
   SCSI device support --->
      [*] SCSI low-level drivers
File Systems --->
    [*] Ext3 Journaling file system support

这里的驱动一定要打上,如果虚拟机的驱动没有打上就必GG

本地Glibc编译出问题

FAIL: c++-types-check
FAIL: link-static-libc
UNSUPPORTED: debug/tst-fortify-syslog
FAIL: elf/tst-cpu-features-cpuinfo
FAIL: elf/tst-cpu-features-cpuinfo-static
UNSUPPORTED: elf/tst-dlopen-self-container
UNSUPPORTED: elf/tst-dlopen-tlsmodid-container
UNSUPPORTED: elf/tst-env-setuid
UNSUPPORTED: elf/tst-env-setuid-static
UNSUPPORTED: elf/tst-env-setuid-tunables
UNSUPPORTED: elf/tst-glibc-hwcaps-2-cache
UNSUPPORTED: elf/tst-glibc-hwcaps-cache
UNSUPPORTED: elf/tst-glibc-hwcaps-prepend-cache
UNSUPPORTED: elf/tst-gnu2-tls2-amx
XPASS: elf/tst-ifunc-isa-1
XPASS: elf/tst-ifunc-isa-1-static
XPASS: elf/tst-ifunc-isa-2
XPASS: elf/tst-ifunc-isa-2-static
UNSUPPORTED: elf/tst-ldconfig-bad-aux-cache
UNSUPPORTED: elf/tst-ldconfig-ld_so_conf-update
UNSUPPORTED: elf/tst-ldconfig-p
UNSUPPORTED: elf/tst-pldd
UNSUPPORTED: elf/tst-preload-pthread-libc
UNSUPPORTED: elf/tst-rootdir
UNSUPPORTED: elf/tst-valgrind-smoke
UNSUPPORTED: io/tst-getcwd-smallbuff
FAIL: io/tst-lchmod
UNSUPPORTED: locale/tst-localedef-path-norm
UNSUPPORTED: localedata/tst-localedef-hardlinks
FAIL: math/test-float64x-fpclassify
FAIL: math/test-float64x-isinf
FAIL: math/test-float64x-isnan
FAIL: math/test-ldouble-fpclassify
FAIL: math/test-ldouble-isinf
FAIL: math/test-ldouble-isnan
UNSUPPORTED: math/test-snan
UNSUPPORTED: misc/tst-adjtimex
UNSUPPORTED: misc/tst-clock_adjtime
UNSUPPORTED: misc/tst-ntp_adjtime
UNSUPPORTED: misc/tst-pidfd_getpid
UNSUPPORTED: misc/tst-pkey
UNSUPPORTED: misc/tst-syslog
UNSUPPORTED: misc/tst-syslog-long-progname
UNSUPPORTED: nptl/test-cond-printers
UNSUPPORTED: nptl/test-condattr-printers
UNSUPPORTED: nptl/test-mutex-printers
UNSUPPORTED: nptl/test-mutexattr-printers
UNSUPPORTED: nptl/test-rwlock-printers
UNSUPPORTED: nptl/test-rwlockattr-printers
FAIL: nptl/tst-mutex10
UNSUPPORTED: nptl/tst-pthread-gdb-attach
UNSUPPORTED: nptl/tst-pthread-gdb-attach-static
UNSUPPORTED: nptl/tst-pthread-getattr
UNSUPPORTED: nss/mtrace-tst-nss-gai-hv2-canonname
UNSUPPORTED: nss/tst-initgroups1
UNSUPPORTED: nss/tst-initgroups2
UNSUPPORTED: nss/tst-nss-compat1
UNSUPPORTED: nss/tst-nss-db-endgrent
UNSUPPORTED: nss/tst-nss-db-endpwent
UNSUPPORTED: nss/tst-nss-files-hosts-long
UNSUPPORTED: nss/tst-nss-files-hosts-v4mapped
UNSUPPORTED: nss/tst-nss-gai-actions
UNSUPPORTED: nss/tst-nss-gai-hv2-canonname
UNSUPPORTED: nss/tst-nss-test3
UNSUPPORTED: nss/tst-reload1
UNSUPPORTED: nss/tst-reload2
UNSUPPORTED: posix/bug-ga2
UNSUPPORTED: posix/bug-ga2-mem
UNSUPPORTED: posix/tst-spawn-cgroup
UNSUPPORTED: posix/tst-vfork3
UNSUPPORTED: posix/tst-vfork3-mem
UNSUPPORTED: resolv/mtrace-tst-leaks2
UNSUPPORTED: resolv/tst-leaks2
UNSUPPORTED: resolv/tst-resolv-ai_idn
UNSUPPORTED: resolv/tst-resolv-ai_idn-latin1
UNSUPPORTED: stdio-common/tst-popen3
UNSUPPORTED: stdlib/tst-secure-getenv
UNSUPPORTED: stdlib/tst-system
UNSUPPORTED: string/tst-memchr-rtm
UNSUPPORTED: string/tst-memcmp-rtm
UNSUPPORTED: string/tst-memmove-rtm
UNSUPPORTED: string/tst-memrchr-rtm
UNSUPPORTED: string/tst-memset-rtm
UNSUPPORTED: string/tst-strcasecmp-rtm
UNSUPPORTED: string/tst-strchr-rtm
UNSUPPORTED: string/tst-strcmp-rtm
UNSUPPORTED: string/tst-strcpy-rtm
UNSUPPORTED: string/tst-strerror
UNSUPPORTED: string/tst-strlen-rtm
UNSUPPORTED: string/tst-strncasecmp-rtm
UNSUPPORTED: string/tst-strncmp-rtm
UNSUPPORTED: string/tst-strrchr-rtm
UNSUPPORTED: string/tst-strsignal
UNSUPPORTED: string/tst-wcscmp-rtm
UNSUPPORTED: string/tst-wcsncmp-rtm
UNSUPPORTED: time/tst-clock_settime
UNSUPPORTED: time/tst-settimeofday

其中不支持的是:

  1. c++-types-check
  2. link-static-libc
  3. elf/tst-cpu-features-cpuinfo
  4. elf/tst-cpu-features-cpuinfo-static
  5. io/tst-lchmod
  6. math/test-float64x-fpclassify
  7. math/test-float64x-isinf
  8. math/test-float64x-isnan
  9. math/test-ldouble-fpclassify
  10. math/test-ldouble-isinf
  11. math/test-ldouble-isnan
  12. nptl/tst-mutex10

nptl/tst-mutex10是超时失败
io/tst-lchmod是在LFS chroot环境中会失败
elf/tst-cpu-features-cpuinfo是因为发行版版本
elf/tst-cpu-features-cpuinfo-static也是一样

反正我这么安了还没出错,先别管(笑死)

本地的Bison出现问题

## ------------- ##
## Test results. ##
## ------------- ##

ERROR: 712 tests were run,
1 failed unexpectedly.
64 tests were skipped.
## -------------------------- ##
## testsuite.log was created. ##
## -------------------------- ##

Please send `tests/testsuite.log' and all information you think might help:

   To: <bug-bison@gnu.org>
   Subject: [GNU Bison 3.8.2] testsuite: 270 failed

You may investigate any problem if you feel able to do so, in which
case the test suite provides a good starting point.  Its output may
be found below `tests/testsuite.dir'.

fstab 出现疏忽

这里的<fff>没有进行更换!!!!!!!!!!!

cat > /etc/fstab << "EOF"
# Begin /etc/fstab

# 文件系统     挂载点       类型       选项                转储  检查
#                                                                顺序

/dev/sda2    /            <fff>      defaults            1     1
/dev/sda3     swap         swap       pri=1               0     0
proc           /proc          proc     nosuid,noexec,nodev 0     0
sysfs          /sys           sysfs    nosuid,noexec,nodev 0     0
devpts         /dev/pts       devpts   gid=5,mode=620      0     0
tmpfs          /run           tmpfs    defaults            0     0
devtmpfs       /dev           devtmpfs mode=0755,nosuid    0     0
tmpfs          /dev/shm       tmpfs    nosuid,nodev        0     0
cgroup2        /sys/fs/cgroup cgroup2  nosuid,noexec,nodev 0     0

# End /etc/fstab
EOF

注意事项

损坏救砖

vmware 虚拟机损坏后的修复办法_vmware损坏的映像怎么修复-CSDN博客

开一个新的虚拟机就救活了

posted @ 2025-01-05 20:37  winddevil  阅读(621)  评论(0)    收藏  举报