SONiC-vm构建过程的逐依赖包分析
[INFO] Build host debian base system...
第一阶段:构建基础的docker容器系统,按构建时的加入顺序排序
"/"
软件包: base-files
官方的介绍是 Debian 的杂项文件 以下是里面的结构 是不是很眼熟,好像就是Linux的基本系统结构 切换显示为平铺,可以看到所有包含的子文件和文件夹
大概可以理解成,把它解压以后,/
挂载点就已经成形了 但此时,/bin 里面还是空的,我们熟悉的命令此时都没出现 让我们从这里开始
/bin 下面那些重要的东西
bash
不是最好用的shell但是最常见的 常见到没有bash的Linux总感觉怪怪的
bsdutils
包含了 Debian 系统所需的最基础的 BSD 工具:logger、renice、script、scriptlive、scriptreplay 和 wall。 是不用 .sh 文件也可以制作脚本的bsd工具集
coreutils
GNU核心工具包,包含了相当多(或者说大部分人认知中的Linux?)的命令行工具 还有一个著名命令行实现是 Busybox ,两者皆在为Unix风格的命令行工具提供开源实现
arch base64 basename cat chcon chgrp chmod chown chroot cksum comm cp csplit cut date dd df dir dircolors dirname du echo env expand expr factor false flock fmt fold groups head hostid id install join link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup nproc numfmt od paste pathchk pinky pr printenv printf ptx pwd readlink realpath rm rmdir runcon sha*sum seq shred sleep sort split stat stty sum sync tac tail tee test timeout touch tr true truncate tsort tty uname unexpand uniq unlink users vdir wc who whoami yes
备注:Linux 是一个内核,而 GNU/Linux 才是操作系统
Dash
由于它执行脚本比 bash 快,依赖的库少(使得它更稳健,受软硬件故障影响少), Debian 使用它作为默认的系统 shell。(来自: https://packages.debian.org/sid/dash) 虽然我们已经有了Bash, 但是谁介意多来一位呢
debianutils
提供一系列主要用于 Debian 软件包安装脚本的小工具 这些专用工具包括: add-shell installkernel ischroot remove-shell run-parts savelog update-shells which 似乎只有 which 用的比较多
diffutils
diffutils 提供了 diff、diff3、sdiff、cmp 程序。
e2fsprogs
ext2/ext3/ext4 文件系统工具,和 mkfs 一起用的多
findutils
查找实用程序,提供find命令
Gzip
这是标准的 GNU 文件压缩工具,它同时也是 Debian 的默认压缩工具。它通常对以 '. Gz' 结尾的文件进行操作。 这个包也可以解压由 'compress' 压缩、以 '. Z' 结尾的文件。
大部分情况下会以 tar -z 的形式出现 其他压缩依赖在 "压缩文件支持" 部分
Hostname
Hostname 命令可以用于显示或设置当前主机的主机名、系统域名或 NIS 域名。这个名字被很多网络程序用于标识这台主机。
Grep
“grep”是用于在文件中搜索文字的工具,它可能在命令行或脚本中使用。就算您不打算使用它,系统上的其它软件包也可能会用到。 GNU 家族的 grep 工具大概是速度最快的 grep,基于 fast lazy-state deterministic matcher (速度大约是老 Unix grep 的两倍) 和 Boyer-Moore-Gosper 技术,在通过正则表达式搜索一个固定字串时,可以事先淘汰掉不可能匹配上的文字而无须逐字检查。结果通常会比 Unix grep 或 egrep 要快许多倍。然而,当正则表达式包含追溯前段内容 (即 backreferencing) 时会慢很多。
为什么没有把它打包进 coreutils 里面?
libc-bin
包含以下工具
- getconf:查询系统配置变量
- getent:从管理数据库得到条目
- iconv、iconvconfig:在字符编码之间进行转换
- ldd、ldconfig:打印/配置共享链接库依赖
- locale、localedef:显示/生成 locale 定义
- tzselect、zdump、zic:选择/转储/编译时区信息
Login
login
是一个 Unix 和类 Unix 操作系统中的命令,用于用户登录到系统。通常情况下,login
命令在文本终端或控制台上执行,要求用户提供用户名和密码,以验证其身份并允许他们访问系统。login
命令通常不会直接由用户手动执行,而是由系统自动管理用户登录过程。用户通常会在登录屏幕上输入用户名和密码,然后login
命令会验证凭据并启动用户会话。此外,不同的 Unix 系统和发行版可能会使用不同的login
命令实现,但它们都提供了类似的登录和身份验证功能。
logsave
一个用于将命令的输出保存到日志文件的命令行工具。它允许您执行命令并将其标准输出和标准错误输出保存到指定的日志文件中,以便后续查看和分析。
`logsave` 命令的一般用法:
$ logsave [OPTIONS] LOGFILE COMMAND [ARG...]
Util-linux
一套基本的 Linux 工具集,里面提供了这些命令
mount umount fdisk fsck blkid dmesg hwclock losetup kill runuser su script agetty rename more less which whereis
编译支持
# GCC 相关
GCC 是由 GNU 主导的编译器项目,SONiC 在构建的时候用到了这些 GCC版本
gcc-10-base
gcc-9-base
包管理工具
apt 与 dpkg
Apt 用于访问 apt 标准的软件源,并通过用户指定的命令对软件源中存在的包进行相关操作。 Dpkg 是 Debian 的包管理调用,用于管理软件包的安装,卸载,更新等操作。
Debian-archive-keyring
Debian 发行版镜像的钥匙串,下载下来的包会与它里面存的证书对比,防止安装被篡改的包 被篡改的包请使用 dpkg -force-all -i 安装
其他 apt 相关支持库
libapt-pkg-dev libdebconfclient
gpgv
官方: gpgv 实际上是一个简化版的 gnupg,仅能用于验证签名。它比完整的 gnupg 小,并且用不同的(同时也更简单的)方法来检验公钥,以辨别签名是否有效。它没有配置文件,也只接受较少的几个命令行选项。
这个用来和上面的 debian-archive-keyring 一起使用
mount
mount
是一个用于在 Unix 和类 Unix 操作系统中挂载文件系统的命令行工具。其作用是将外部存储设备(如硬盘驱动器、网络共享、CD/DVD-ROM 等)与操作系统的文件系统层次结构连接起来,使文件和目录在文件系统中可访问。
mawk(awk)
Mawk 是一款用于文本处理和文本分析的小型、快速的 AWK 解释器。AWK 是一种用于文本处理的编程语言,通常用于从文本文件中提取、转换和处理数据。Mawk 是 AWK 的一个实现,旨在提供高性能的文本处理能力。
命令行版本的 sscanf ( )
tar
tar
是一个用于在 Unix 和类 Unix 操作系统中创建、查看、提取和压缩归档文件的命令行工具。tar
是 "tape archive" 的缩写,尽管最初设计用于磁带备份,但现在也用于操作文件和目录的归档和压缩。
sed
sed
是一个流编辑器(stream editor)工具,用于处理和转换文本流
passwd
passwd
是一个用于更改用户密码的命令行工具。
perl
perl-base
是Perl编程语言的基本运行时环境的软件包。Perl是一种高级的通用脚本编程语言,广泛用于文本处理、系统管理、网络编程、Web开发和各种自动化任务。
/lib
在 Linux 系统上 /lib 通常用于存放各种支持库
libacl1
包含了 POSIX 1003.1e 草稿标准所规定用于处理访问控制列表的 17 个函数 的实现。
有了它才能愉快的 chmod +x
libattr1
包含使用扩展属性的程序所需要的运行环境。
与 attr 命令行工具的用例
$ attr -g flavor example.txt
Attribute "flavor" had a 9 byte value for example.txt:
chocolate
$ getfattr --name user.flavor example.txt
# file: example.txt
user.flavor="chocolate"
libblkid1
blkid 库可允许系统程序(如 fsck 和 mount)通过文件系统 UUID 或标签 快捷方便地查找块设备。 该包可以让系统管理员避免使用硬编码设备名称而是通过逻辑命名系统来指 定文件系统。
让我看看是谁还在 ls /dev 以后不停的按 tab 键找分区
libbz2
Bz2 压缩格式的支持库
通常以 tar -j 的形式出现
libc6
本软件包包含了系统中几乎所有程序都会用到的标准运行库,包括标准 C 语言共享库和标准数学库,以及许多其它的运行库。、
众所周知删除libc.so以后连cp命令都会报错
libcom-err
libcom-err 通常用于编写和维护错误处理代码,以便在程序发生错误时生成有意义的错误信息并将其呈现给用户。它通常与其他库和工具(如 libkrb5、e2fsprogs 等)一起使用,这些库和工具需要处理错误和错误码。
Crypto
Crypto 是一类库,通常与密码学和加密相关的程序一起使用。它提供了一些支持和相关函数接口,用于在应用程序中进行密码学操作,例如密码散列(hashing)、密码验证和其他加密操作。
其他提供加解密特性的库(功能不再单独枚举):
libcrypt, libnettle, libp11-kit, libhogweed6,libgcrypt,libk5crypto libkrb5support ,
libdb5
libdb5 是 Berkeley DB(数据库),它提供了一个高性能、嵌入式数据库系统,用于在应用程序中存储和管理数据。Berkeley DB 是一个强大而灵活的工具,经常用于存储应用程序的配置信息、日志、会话数据以及其他类型的结构化数据。
libext2fs2
Libext2fs2 是一个库,用于与 ext 2 文件系统进行交互。
libffi
Libffi 是一个用于在程序中调用动态链接库(DLL)或共享库的库,它提供了一种通用的接口,使编程语言能够在运行时调用和执行函数,而无需事先知道函数的签名或参数类型。这对于编写与底层 C 代码互操作的高级编程语言(例如 Python、Ruby、Lua 等)以及一些特定的用途非常有用。
不是 .dll 而是 .so
libgcc
libgcc 是 GNU 编译器集合(GCC)的一部分,它是一个用于支持 C 和 C++编程语言的 C 语言库。
libgcc
包含了许多运行时库函数,这些函数是 GCC 编译器生成的可执行文件所依赖的函数,用于执行底层的数学运算、内存操作、异常处理和其他编程任务。
libgnutls
libgnutls 是 GNU Transport Layer Security(TLS)库的库版本,用于加密通信和保护数据传输的安全性。TLS 协议以前称为 SSL(Secure Sockets Layer),是一种用于加密和身份验证网络通信的协议。libgnutls 提供了实现 TLS/SSL 协议的功能,可以用于开发安全的网络应用程序
libgpg-error
libgpg-error 是 GNU Privacy Guard (GnuPG) 错误处理库的库版本,用于管理和处理 GnuPG 和相关应用程序中的错误和异常情况。
libgmp
libgmp
是 GNU 大整数数学库(GNU Multiple Precision Arithmetic Library)的库版本,用于高精度数学运算。它提供了大整数、大有理数和大浮点数的高效算术运算,可用于处理超过硬件或编程语言原生整数表示范围的数字。
libkeyutils1
libkeyutils1 是 Linux 上的一个库,用于支持 Linux 内核密钥管理机制(Key Management Facility)。这个库允许应用程序在 Linux 上进行密钥的创建、查找、管理和删除等操作,以便于安全存储和检索密钥、证书和其他敏感信息。内核密钥管理机制是 Linux 提供的一种安全性功能,它允许应用程序在内核中安全地存储和管理密钥材料。
libmount
libmount 是 Linux 系统上的一个库,用于处理和操作文件系统挂载点(mount points)以及与挂载点相关的信息。该库通常与 util-linux 套件一起使用,提供了一组函数和工具,用于检索、创建、修改和管理 Linux 文件系统的挂载点。
mount 和 umount 命令需要这个库
libtinfo
libtinfo
是一个库,它提供了对终端信息和控制的抽象接口,用于在文本终端应用程序中实现屏幕输出、控制光标位置、文本颜色和样式等终端相关的操作。libtinfo
通常与ncurses
库一起使用,以便在文本终端上创建复杂的用户界面。
libpcre
libpcre
是 Perl Compatible Regular Expressions(兼容 Perl 正则表达式)的 C 函数库。这个库允许开发人员在应用程序中使用正则表达式来进行字符串匹配、搜索和替换等操作。正则表达式是一种强大的模式匹配工具,用于在文本中查找和处理特定的模式。
PCRE 是跨平台移植中的老熟人了,很多用到正则的 C 程序都会依赖 pcre
libsystemd
libsystemd
是一个用于与 Systemd 系统初始化和管理守护进程的 C 语言库。Systemd 是现代 Linux 系统上常见的初始化系统,用于启动和管理系统上的各种服务和进程。libsystemd
允许开发人员通过程序化方式与 Systemd 进行交互,以管理和监控系统服务。
libseccomp2
libseccomp2
是 Linux 上的一个库,用于实现系统调用过滤和沙箱机制,以增强进程的安全性。该库允许开发人员定义一个策略,以控制哪些系统调用可以由进程执行,从而减少了攻击面,提高了应用程序的安全性。
libsmartcols
libsmartcols
是一个 C 语言库,用于处理和格式化列化的文本输出。它通常与各种命令行工具和命令行界面应用程序一起使用,以便以更结构化和易读的方式呈现数据。libsmartcols
提供了创建表格、列和行的功能,以及在文本输出中对其、对齐和格式化数据的能力。
libssl
libssl
是一个用于加密和安全套接字层协议(SSL,Secure Sockets Layer)的 C 语言库。它是 OpenSSL 项目的一部分,提供了加密通信、数据完整性和身份验证等安全功能,用于保护网络通信和数据传输的机密性。libssl
主要用于创建安全的网络通信通道,使数据在传输过程中不容易受到窃听或篡改。
libunistring
libunistring
是一个 C 语言库,用于处理 Unicode 字符串和字符编码的操作。Unicode 是一种标准字符集,用于表示几乎所有已知的字符,包括各种语言、符号和特殊字符。libunistring
旨在提供一组函数和工具,以便开发人员可以在应用程序中进行 Unicode 字符串的处理、转换和操作。
libuuid
libuuid
是一个用于生成唯一标识符(UUID,Universally Unique Identifier)的 C 语言库。UUID 是一个 128 位的标识符,通常以 32 个十六进制数字的形式表示,用于在分布式系统中唯一标识实体,以防止重复标识。libuuid
允许开发人员在他们的应用程序中生成 UUID,以确保数据的唯一性和标识。
libxxhash
libxxhash
是一个用于高速哈希计算的C语言库。它实现了一种称为"xxHash"的非加密哈希算法,旨在提供非常快速的哈希计算,特别适用于在内存中或磁盘上处理大型数据块时。libxxhash
可用于开发应用程序,这些应用程序需要快速且可靠的哈希功能,例如校验和计算、数据结构实现和数据分析等。
ncurses
ncurses
是一个用于文本终端应用程序开发的库,它提供了一种在文本终端上创建复杂、交互式用户界面(User Interface,UI)的方式。ncurses
允许开发人员在终端中创建菜单、窗口、文本框、按钮和其他交互式控件,以实现更友好的终端应用程序。
文件支持相关
压缩文件支持,这些库通常为特定的压缩格式或者算法提供支持
liblz4 liblzma5 Zlib libzstd
PAM 相关
PAM 是 Pluggable Authentication Module(可插拔认证模块)的缩写,是一种用于管理和配置认证(authentication)和授权(authorization)机制的标准化框架。PAM 是一种模块化的身份验证系统,通常用于类 Unix 操作系统,包括 Linux。它允许系统管理员通过配置认证方式和授权策略,来实现不同级别的系统和应用程序安全性。
libpam-runtime , libpam0g , libpam-modules-bin , libpam-modules
SELinux
SELinux(Security-Enhanced Linux)是一个 Linux 安全子系统,用于提供强大的强制访问控制(Mandatory Access Control,MAC)机制,以增强 Linux 操作系统的安全性。它的目标是提供更细粒度的权限管理,减少潜在的安全漏洞,以及阻止未经授权的访问和恶意操作。
其关联了这些库
libcap-ng
用于实现 POSIX 1e (POSIX Access Control Lists) 标准的功能。允许更细粒度地控制文件和目录的权限,比传统的基于权限位的方式更灵活。
libaudit
用于安全审核的动态库
以下库用于提供非特定的 Selinux 相关功能
libsemanage libselinux
其他系统相关 :
tzdata
tzdata
是一个包含时区数据的软件包,用于在 Linux 和其他类 Unix 操作系统上管理和更新时区信息。该软件包包括世界各地的时区规则、夏令时规则以及相关的时间偏移信息。
UTC+0 警告
lsb-base
是 Linux 标准基础(Linux Standard Base,LSB)的一部分,它是一个用于提高Linux操作系统二进制兼容性的项目。lsb-base
软件包包含了一些用于标准化Linux系统的脚本和初始化文件。
Base-passwd
它会在用户创建后去更新这些文件,保证相关认证过程可以正常进行
master passwd: /usr/share/base-passwd/passwd.master
master group : /usr/share/base-passwd/group.master
system passwd: /etc/passwd
system shadow: /etc/shadow
system group : /etc/group
sysvinit
sysvinit
是一个用于初始化和管理 Linux 系统的初始化系统,它是许多传统的 Linux 发行版(如 Debian、Ubuntu、CentOS 等)中使用的一种初始化系统。sysvinit
负责启动和停止系统中的各种服务和进程,以及管理系统的运行级别(runlevels)。
init-system-helpers
该软件包包含对在 Debian 中不同初始化系统(例如,sysvinit 和 systemd)之间进行切换所需的帮助工具。一个例子是 deb-systemd-helper 工具,一个无需依赖运行中的 systemd 实例便能启用 systemd 单元文件的脚本。 它同时包括了“service”、“invoke-rc. d”和“update-rc. d”脚本,它们提供了按照 Debian 政策为所有支持的 Debian 初始化系统启用、禁用、启动和停止服务的一个抽象。