分类 技术 下的文章

PKGBUILD 文件是为 Arch Linux 及其衍生版(如 Manjaro)构建和创建软件包的方式。

如果你曾经使用过 AUR(即 Arch Linux 的用户维护的 PKGBUILD 存储库),你甚至可能也遇到过它们。

但是,到底是如何从 PKGBUILD 到可安装软件包的呢?这两者之间到底发生了什么,如何把自己的软件制作成软件包呢?你将在这篇文章中了解这些。

PKGBUILD 基础知识

对于那些熟悉 Bash 或其他 shell 的人来说,你可能知道,PKGBUILD 就是一个带有一些变量的 shell 脚本。

PKGBUILD 文件由变量和函数组成,所有这些都是用来定义软件包本身,以及如何构建它。

为了从 PKGBUILD 中创建一个软件包,需要使用 makepkg 命令行工具。在获得 PKGBUILD 文件后,你只需在包含 PKGBUILD 的目录中运行 `makepkg',就可以得到一个可安装的软件包了。

在本教程中,你将会看到我刚刚制作的软件包,它在运行时打印出 “Hello World!”。

准备

为了继续学习本教程,你需要创建几个文件。

首先,你需要创建一个名为 PKGBUILD 的文件,它将作为构建你的软件包的“配方”。

你需要做的另一个文件是一个叫 hello-world.sh 的文件。我稍后会解释它的用途。

你也可以用一个命令来创建这两个文件:

touch PKGBUILD hello-world.sh

你可以用 ls 命令检查这些文件是否被创建。

然后你就可以开始了!

设置你的 PKGBUILD 文件

我不会让你复制粘贴整个文件,而是和你一起键入每一行,这样你就能更好地理解每一行的目的。如果你不喜欢这种学习方式,我强烈推荐 Arch 维基 中为 Arch Linux 创建软件包的文章。

这篇文章也没有介绍 PKGBUILD 中可以设置的每一个选项,只是介绍了一些常用的选项,以便你能尽快上手。

说完了这些,打开你的文本编辑器,让我们直接进入正题吧。

pkgname

首先是 pkgname 变量。这是安装时定义软件包名称的东西,也是 Arch Linux 的软件包管理器 pacman 跟踪软件包的方式。

这个变量(以及其他一些变量)的格式是 variable=value,变量名在左边,变量的值在右边,用等号隔开。

要设置包的名称,请在 PKGBUILD 中输入以下内容:

pkgname="hello-world"
  • 要设置一个不同的软件包名称,用你的软件包的名称替换 hello-world
  • 这并不设置用于运行程序的命令,这将在下面的 package() 部分中处理。

pkgver

正如变量名称本身所述,它设置了你的软件包的版本(即 1.0.0)。这在用户更新他们的系统时很有用,因为设置更高的版本会提示用户升级。

要设置版本号,请在 PKGBUILD 中输入以下内容(在前一行之后):

pkgver="1.0.0"

pkgrel

这与 pkgver 变量有关,通常不需要知道。不过和 pkgver 变量一样,如果它被换到一个更高的数字,就将通知用户进行升级。

它适用于任何需要保持 pkgver 不变的情况下,例如 PKGBUILD 本身发生了变化。如果你为一个你使用的程序创建了一个 PKGBUILD(并希望保持软件包的版本相同),而你需要修复 PKGBUILD 本身的一个错误,这将是非常有用的。

要设置这个变量,请在 PKGBUILD 中输入以下内容:

pkgver="1"

这个变量应该 总是1 开始,然后一次一次地向上移动。当 pkgver 本身向上移动时,这个变量可以(也应该)重置为 1,因为 pkgver 本身会通知用户升级。

pkgdesc

这将设置软件包的描述,用于帮助更好地识别该软件包。

要设置它,只需将描述放在引号内:

pkgdesc="Hello world in your terminal!"

arch

这个变量设置软件包所兼容的 硬件架构。如果你不明白什么是架构,那也没关系,因为在大多数情况下,这个变量几乎是无用的。

无论如何,makepkg 仍然需要设置它,这样它就知道这个软件包与我们的系统是兼容的。

这个变量支持设置多个值,所以 makepkg 需要一个不同的语法,如下所示。

要设置它,请在 PKGBUILD 中输入以下内容:

arch=("x86_64")

如果你要设置多个值,需要用空格和引号分隔每个值,像这样。arch=(“x86_x64" "arm")

depends

这列出了提供了我们的软件包所需功能的所有软件包。与 arch 一样,它也可以包含多个值,因此必须使用括号语法。

由于我们的软件包没有任何依赖关系,所以我们不需要在 PKGBUILD 中输入这个字段。然而,如果我们的软件包有依赖关系,我们就会使用与 arch 相同的语法。

optdepends

这里列出了那些并不是提供所需功能而是额外功能的软件包。

这与 depends 的语法相同。

conflicts

这告诉 pacman 哪些软件包会导致我们的软件包出现问题,或者以我们不希望的方式行事。

这里列出的任何软件包都会在我们的软件包被安装之前被卸载。

这与 depends 的语法相同。

license

这定义了你的程序所采用的 软件许可证。如果你需要帮助你选择一个许可证,Arch 维基 提供了一些信息。如果你不知道该怎么设置,将其设置为 custom 也可以。

这与 archdepends 的语法相同:

license=("custom")

source

这就是 makepkg 如何知道要用什么文件来构建我们的软件包。它可以包含各种不同类型的源,包括本地文件和 URL。

在添加本地文件时,要输入相对于 PKGBUILD 文件的文件路径,比如以下目录布局:

PKGBUILD
file.txt
src/file.sh

如果你想在我们的 PKGBUILD 中包括 file.sh,你需要输入 src/file.sh 作为其名称。

当输入 URL 时,你只需输入完整的 URL,即 https://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png

你的这个软件包只需要 hello-world.sh 文件,由于它和 PKGBUILD 在同一个目录中,你只需输入它的名字作为 source 的值。

这个变量也使用与 archdepends 相同的语法:

source=("hello-world.sh")

sha512sums

这是用来验证 source 中的文件没有被修改或下载错误。如何获得这个值的信息可以在 Arch 维基关于 PKGBUILD 的文章 中找到。

如果你宁愿不设置这个(或者你只是不需要,例如对于本地文件),你可以为 source 变量中的每个文件输入 SKIP

sha512sums=("SKIP")

package()

这是最后一个,也是实际制作我们的包的最重要的部分。在处理这个问题时,知道两个变量很重要。

  • ${srcdir}:这是 makepkg 放置 source 变量中文件的地方。在这个目录中,你可以与这些文件进行交互,并对文件进行任何其他需要的修改。
  • ${pkgdir}:这是我们放置将被安装在系统中的文件的地方。 ${pkgdir} 的文件夹结构是按照实际系统中的情况设置的(例如,使用 pacman 安装时,${pkgdir}/usr/bin/hello-world 会创建文件 /usr/bin/hello-world)。

package() 包含一个用于创建软件包的命令列表。

因此,如果(假设)你需要有个在 /usr/share/motto.txt 写着 “Linux is superior to Windows ”的文件,你会运行这样的东西:

package() {
  mkdir -p "${pkgdir}/usr/share"
  echo "Linux is superior to Windows" | tee "${pkgdir}/usr/share/motto.txt"
}

关于上述命令的一些说明:

  • ${pkgdir} 里面最初是 不包含 目录的。如果你跳过了 mkdir 命令tee 会输出一个错误,说这个目录不存在。
  • 在指定目录时,总是 在它们前面加上 ${pkgdir}${srcdir} 变量。如果输入 /usr/share/motto.txt,就会按照字面意义指向你当前运行的系统中的 /usr/share/motto.txt

对于你的 PKGBUILD,你将把 hello-world.sh 文件放在目标系统的 /usr/bin/hello-world 中。你还将使该文件在运行时说 “Hello to you!”。

要做到这一点,请在 PKGBUILD 中输入以下内容:

package() {
  echo 'Hello to you!' > "${srcdir}/hello-world.sh"
  mkdir -p "${pkgdir}/usr/bin"
  cp "${srcdir}/hello-world.sh" "${pkgdir}/usr/bin/hello-world"
  chmod +x "${pkgdir}/usr/bin/hello-world"
}

然后就完成了!用 makepkg -si 构建和安装软件包,然后在终端运行 hello-world,查看其输出。

总结

就这样,你已经制作了你的第一个 PKGBUILD!你走在了为自己甚至是为 AUR 制作实际的软件包的路上。

有什么问题,或者有什么地方不对吗?请随时在下面的评论区发表。


via: https://itsfoss.com/create-pkgbuild/

作者:Hunter Wittenborn 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

YAML 看起来很简单,为什么它这么难写呢?了解成功使用 YAML 的两个秘诀。

 title=

如果你曾经尝试过写 YAML,你可能一开始会对它看起来很容易感到高兴。乍一看,经常用于配置文件、Ansible 剧本和普通文件数据库的 YAML 看起来就像购物清单一样直观。然而,YAML 的结构中有很多细微的差别,它隐藏着一个危险的秘密:YAML 实际上是一种高度精确、结构化和令人惊讶的严格语言。好消息是,你只需要了解两件事就可以知道 YAML 的工作原理。

关于 YAML 的真相是,YAML 中只有两种数据结构: 序列 sequence 映射 mapping 。这是两个花哨的名字,你会发现它代表了你非常熟悉的概念。这篇文章解释了这两种结构,更重要的是,介绍了它们是如何协同工作,使 YAML 成为表示你所关心的数据的强大方式。

YAML 序列

YAML 序列是一个列表。在其最简单的形式中,每行有一个项目,每行以破折号和空格开始。

下面是一个例子:

---
- Linux
- BSD
- Illumos

不同的语言有不同的方式来表示这种数据。例如,在 Python 中,同一个列表可以写成 ['Linux', 'BSD', 'Illumos']。当你在现实生活中写一个列表时,例如在你去买菜之前,你写的可能近似于 YAML 序列。

YAML 映射

YAML 映射是一个关键术语与该术语的定义相结合。在其他语言中,映射被称为“键值对”或“词典”。

这里有一个例子:

---
Kernel: Linux
CPU: AMD
RAM: '16 GB'

不同的语言有不同的方式来表示这种数据。在 Python 中,例如,同样的数据可以写成 {"Kernel": "Linux", "CPU": "AMD", "RAM": "16 GB"}。在现实生活中,你可能会使用这种结构来计划,例如,与朋友的游戏之夜。一个朋友报名带零食,另一个报名带一副牌,另一个报名带一个棋盘游戏,等等。

组合序列和映射

你现在知道 YAML 的语法了。序列和映射是 YAML 中仅有的两种构件,你想在 YAML 中表示的任何东西都可以放在序列或映射中。

或者同时使用这二者!

是的,序列和映射可以被组合和嵌套,这就是 YAML 看起来很直观,但同时又感觉很复杂的原因之一。不过,只有四种可能的组合,一旦你学会如何看它们,YAML 就会觉得像它看起来一样简单。

序列的映射

当你想让一个键项有许多值时,你可以使用一个序列的映射。也就是说,你从一个映射(键)开始,但是给值一个列表:

---
Linux:
  - Fedora
  - Slackware
BSD:
  - FreeBSD
  - NetBSD

在这个示例代码中,Linux 是第一个键,它的值是一个序列,其中包含 FedoraSlackware。第二个键是 BSD,它的值是一个序列,包含 FreeBSDNetBSD

映射的映射

当你想让一个键项的值中既有键又有值时,你可以使用映射的映射。也就是说,你从一个映射(键)开始,但是给值另一个映射。

这可能有点欺骗性,但它揭示了 YAML 中使用特定术语的原因:因为你只不过是创建了一个映射的列表,并不意味着你创建了一个序列。这里是一个映射的映射:

---
Desktop:
  CPU: RISC-V
  RAM: '32 GB'
Laptop:
  CPU: AMD
  RAM: '16 GB'

对大多数人来说,这看起来像一个列表。而且从技术上讲,它是一个列表。但重要的是要认识到,它不是 YAML 序列。它是一个映射,其中包含映射。作为半个 YAML 专家,你可以从明显缺少破折号的地方看出区别。

在 Ansible 剧本的所有结构中,我发现这个结构最容易欺骗人。作为人类,我们喜欢列表,当我们看到一个数据结构 在字面上 是列表时,大多数人会把它当成 YAML 序列。但是在 YAML 中,虽然序列是列表,但是列表并不总是序列。

序列的序列

就像你可以嵌套映射一样,你可以将一个序列嵌套到一个序列中:

---
- [Linux, FreeBSD, Illumos]
- [YAML, XML, JSON]

这可能是我在 YAML 的实际使用中遇到的最不常见的数据结构,但有时你需要一个列表的列表。

映射的序列

你也可以创建一个包含映射的序列。对于人类排序数据的方式来说,这并不太常见,但对于计算机来说,这可能是一个重要的结构。

这里有一个例子:

---
-
  CPU: AMD
  RAM: '16 GB'
-
  CPU: Intel
  RAM: '16 GB'

对于 YAML,这可能是最不直观的语法。我发现它在 Python 中呈现时更清晰:

[{"CPU": "AMD", "RAM": "16 GB"}, {"CPU": "Intel", "RAM": "16 GB"}]

方括号代表一个列表结构,这个列表包含两个字典。每个字典都包含键值对。

构建更好的 YAML

现在你知道了 YAML 的两个组成部分,以及它们如何被组合起来以表示复杂的数据结构。问题是:你要用 YAML 构建什么?

和很多人一样,我也使用 YAML 来编写 Ansible 剧本。我还用它作为一种简单的配置格式、作为 D&D 的角色表、表示项目组织所需的目录结构,等等。只要你能适应序列和映射的概念,你会发现 YAML 是一种很容易编写、阅读和(如果有合适的库)解析的格式。

如果你发现自己经常使用 YAML,请下载我们的 YAML 速查表,以帮助你直观地了解基本数据结构及其组合,并帮助你记住一些额外的语法约定。通过一点点的练习,你会发现 YAML 真的和它看起来一样简单!


via: https://opensource.com/article/21/9/yaml-cheat-sheet

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

BusyBox 是一个开源(GPL)项目,提供了近 400 个常用命令的简单实现。

 title=

我们很容易认为 Linux 的命令是理所当然的。当你安装 Linux 时,它们与系统捆绑在一起,而我们常常不问为什么它们会在那里。一些基本的命令,如 cdkill 和 echo,并不总是独立的应用程序,而是实际上内置于你的 shell 中。其他如 lsmvcat 是核心工具包(通常是 GNU coreutils)的一部分。但在开源的世界里,总是有一些替代品,其中最有趣的是 BusyBox

Linux 中的 BusyBox 简介

BusyBox 是一个开源(GPL)项目,提供近 400 个常用命令的简单实现,包括 lsmvlnmkdirmorepsgzipbzip2targrep。它还包含了编程语言 awk、流编辑器 sed、文件系统检查工具 fsckrpmdpkg 软件包管理器,当然还有一个可以方便的访问所有这些命令的 shell(sh)。简而言之,它包含了所有 POSIX 系统需要的基本命令,以执行常见的系统维护任务以及许多用户和管理任务。

事实上,它甚至包含一个 init 命令,可以作为 PID 1 启动,以作为所有其它系统服务的父进程。换句话说,BusyBox 可以作为 systemd、OpenRC、sinit、init 和其他初始化系统的替代品。

BusyBox 非常小。作为一个可执行文件,它不到 1MB,所以它在 嵌入式边缘计算物联网 领域很受欢迎,因为这些场景的存储空间是很宝贵的。在容器和云计算的世界里,它作为精简的 Linux 容器镜像的基础镜像也很受欢迎。

极简主义

BusyBox 的部分魅力在于它的极简主义。它的所有命令都被编译到一个二进制文件里(busybox),它的手册只有 81 页(根据我对 man 送到 pr 管道的计算),但它涵盖了近 400 条命令。

作为一个例子的比较,这是 “原版” 的 useradd —help 的输出:

 -b, --base-dir BASE_DIR       base directory for home
 -c, --comment COMMENT         GECOS field of the new account
 -d, --home-dir HOME_DIR       home directory of the new account
 -D, --defaults                print or change the default config
 -e, --expiredate EXPIRE_DATE  expiration date of the new account
 -f, --inactive INACTIVE       password inactivity
 -g, --gid GROUP               name or ID of the primary group
 -G, --groups GROUPS           list of supplementary groups
 -h, --help                    display this help message and exit
 -k, --skel SKEL_DIR           alternative skeleton dir
 -K, --key KEY=VALUE           override /etc/login.defs
 -l, --no-log-init             do not add the user to the lastlog
 -m, --create-home             create the user's home directory
 -M, --no-create-home          do not create the user's home directory
 -N, --no-user-group           do not create a group with the user's name
 -o, --non-unique              allow users with non-unique UIDs
 -p, --password PASSWORD       encrypted password of the new account
 -r, --system                  create a system account
 -R, --root CHROOT_DIR         directory to chroot into
 -s, --shell SHELL             login shell of the new account
 -u, --uid UID                 user ID of the new account
 -U, --user-group              create a group with the same name as a user

而这是是同一命令的 BusyBox 版本:

 -h DIR    Home directory
 -g GECOS  GECOS field
 -s SHELL  Login shell
 -G GRP    Group
 -S            Create a system user
 -D            Don't assign a password
 -H            Don't create home directory
 -u UID    User id
 -k SKEL   Skeleton directory (/etc/skel)

这种差异是一种特性还是一种限制,取决于你是喜欢你的命令拥有 20 个选项还是 10 个选项。对于一些用户和某些用例来说,BusyBox 的极简主义刚刚满足所需。对于其他人来说,它是一个很好的最小化环境,可以作为一个后备工具,或者作为安装更强大的工具的基础,比如 BashZsh、GNU Awk 等等。

安装 BusyBox

在 Linux 上,你可以使用你的软件包管理器安装 BusyBox。例如,在 Fedora 及类似发行版:

$ sudo dnf install busybox

在 Debian 及其衍生版:

$ sudo apt install busybox

在 MacOS 上,可以使用 MacPortsHomebrew。在 Windows 上,可以使用 Chocolatey

你可以将 BusyBox 设置为你的 shell,使用 chsh —shell 命令,然后再加上 BusyBox sh 应用程序的路径。我把 BusyBox 放在 /lib64 中,但它的位置取决于你的发行版的安装位置。

$ which busybox
/lib64/busybox/busybox
$ chsh --shell /lib64/busybox/sh

用 BusyBox 全盘替换所有常见的命令要复杂一些,因为大多数发行版都是“硬接线”,会在特定的软件包寻找特定的命令。换句话说,虽然技术上可以用 BusyBox 的 init 替换系统的 init,但你的软件包管理器可能会拒绝让你删除包含 init 的软件包,以免你担心删除会导致系统无法启动。有一些发行版是建立在 BusyBox 之上的,所以从新环境开始可能是体验 BusyBox 系统的最简单方法。

试试 BusyBox

你不必为了尝试 BusyBox 而将你的 shell 永久改为 BusyBox。你可以从你当前的 shell 中启动一个 BusyBox shell。

$ busybox sh
~ $

不过你的系统仍然有安装的非 BusyBox 版本的命令,所以要体验 BusyBox 的工具,你必须把命令作为参数发给 busybox 可执行文件:

~ $ busybox echo $0
sh
~ $ busybox ls --help
BusyBox vX.YY.Z (2021-08-25 07:31:48 NZST) multi-call binary.

Usage: ls [-1AaCxdLHRFplinshrSXvctu] [-w WIDTH] [FILE]...

List directory contents

 -1  One column output
 -a  Include entries that start with .
 -A  Like -a, but exclude . and ..
 -x  List by lines
[...]

为了获得“完整”的 BusyBox 体验,你可以为每个命令创建一个 busybox 的符号链接。这很容易,只要你使用 for 循环 就行:

$ mkdir bbx
$ for i in $(bbx --list); do \
    ln -s /path/to/busybox bbx/$i \
done

在你的 路径开头 添加这个符号链接目录,并启动 BusyBox:

$ PATH=$(pwd)/bbx:$PATH bbx/sh

用起来

BusyBox 是一个有趣的项目,也是一个可以实现 极简 计算的例子。无论你是把 BusyBox 作为 你唤醒的 古老的计算机 的轻量级环境,还是作为 嵌入式设备 的用户界面,抑或试用一个新的初始化系统,就算是为了好奇,让自己重新认识那些熟悉而又陌生的命令,都会很有意思。


via: https://opensource.com/article/21/8/what-busybox

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这个例子让我们看到了在 Foreman 中管理和配置 CentOS Stream 内容的许多选项。

 title=

2021 年 12 月,CentOS 8 将达到生命终点,被 CentOS Stream 取代。CentOS Stream 和 CentOS 之前的迭代之间的主要变化之一是没有小版本。Centos Stream 采用了一个连续的发布周期。从今年年初开始,Foreman 社区的开发者开始看到 CentOS Stream 由于持续发布而提供的更早的错误检测和补丁的好处。我们不再需要等待下一个版本来利用最新的变化和错误修复。一位资深的 Linux 社区爱好者 指出,此举也使 RHEL 开发者比以往更接近 FOSS 社区。

然而,如果你是一个拥有数百或数千台服务器的管理员,你可能想控制新的软件包何时被添加到特定的服务器。如果你正在寻找一个免费的开源工具,帮助你确保生产服务器的稳定性,同时允许你安全地从 Centos Stream 中拉入最新的变化用于开发和测试,这就是 Foreman 可以帮助你的地方。有了 Foreman,你可以在生命周期环境的各个阶段管理你的 Centos Stream 内容。

Foreman 介绍

Foreman 是一个完整的物理和虚拟服务器的生命周期管理工具。有了 Foreman,系统管理员有能力轻松实现重复性任务的自动化,快速部署应用程序,并主动管理内部或云中的服务器。Foreman 为 配备 provisioning 管理、配置管理和监控提供了企业级解决方案。由于其插件架构,Foreman 可以以无数种方式进行扩展。使用 Katello 插件,你可以把 Foreman 作为一个完整的 内容管理 content management 工具来管理 CentOS Stream,以及其他许多内容类型。

通过 Foreman 和 Katello,你可以准确地定义你希望每个环境包含哪些软件包。例如,生产环境可能使用已被验证为稳定的软件包,而开发环境可能需要最新、最先进的软件包版本。你还可以跨生命周期环境推广 内容视图 content view 。让我们来看看 Foreman 是如何完成这个任务的。

我们在这篇文章中使用了网页用户界面,但 Foreman 也有一个强大的 CLI 和 API。Katello 插件为 Pulp 项目提供了一个工作流和网页用户界面,你可以在 这篇文章 中了解更多。我们在这里也提供了一个简单的工作流程,但是 Foreman 和 Katello 项目提供了许多不同的配置选项来满足你的具体需求。

本文假设 Foreman 和 Katello 已经安装完毕。关于如何安装的更多信息,请参阅 Katello 安装手册

创建一个产品

第一步是在 Foreman 中创建一个 产品 product 。该产品的功能是作为一个内部标签来存储 CentOS Stream 存储库。

  1. 在 Foreman 网页用户界面,导航到“ 内容 Content > 产品 Products ”,并点击“ 创建产品 Create Product ”。
  2. 在“ 名称 Name ”字段中,为产品输入一个名称。Foreman会根据你输入的“ 名称 Name ”自动完成“ 标签 Label ”字段,以后不能再更改。

将 CentOS Stream 存储库添加到产品中

现在你有了一个产品,你可以使用 AppStream 和 BaseOS 存储库的 URL,并将它们添加到你的新产品中。

  1. 在 Foreman 网页用户界面中,导航到 “ 内容 Content > 产品 Products ”,选择你要使用的产品,然后点击 “ 新存储库 New Repository ”。
  2. 在“ 名称 Name ”字段中,为存储库输入一个名称;例如,“Centos8StreamBaseOS”。Foreman 会根据你输入的“ 名称 Name ”,自动完成“ 标签 Label ”字段。
  3. 从“ 类型 Type ”列表中,选择存储库的类型,然后选择“Yum”。
  4. 在 “URL” 字段中,输入 CentOS Stream Baseos 存储库的 URL,作为源: http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/
  5. 选择“ 下载规则 Download Policy ”列表。默认的是“ 按需 On Demand ”,这意味着 Katello 将只下载元数据。如果你想下载所有的软件包,请改成“ 即时 Immediate ”,它可以下载所有的软件包,可能会达到 20-30GB。
  6. 确保“ 与镜像同步 Mirror on Sync ”复选框被选中。这个选项确保在同步过程中,不再是上游存储库的一部分的内容被删除。
  7. 点击“ 保存 Save ”。

重复这些步骤,添加 AppStream 存储库及其 URL,例如,http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os/。确保你使用最近的官方 CentOS 镜像来代替它。

要执行立即同步,在你的产品窗口,点击“ 立即同步 Sync Now ”。最初的同步可能需要一些时间。你可以从“ 内容 Content > 同步状态 Sync Status ”查看同步状态。

同步完成后,你可以在“ 主机 Hosts > 操作系统 Operating System ”中查看新的 CentOS Stream 操作系统。请随意编辑名称和描述以满足你的要求。

如果你打算使用 Ansible 或 Puppet 等配置管理软件,Foreman 会自动创建一个操作系统报告。你可以在“ 管理 Administe > 设置 Settings > 忽略操作系统状况 Ignore facts for operating system ”中关闭这个选项。重命名操作系统以匹配配置管理软件中的名称是一个好主意。例如,对于 Puppet,这将是“CentOS 8”。

定义你的基础设施的生命周期环境

应用程序生命周期是 Foreman 的内容管理功能的一个核心概念。应用程序的生命周期定义了一个特定的系统和它的软件在特定阶段的状况。例如,一个应用程序的生命周期可能很简单,你可能只有一个“开发”阶段和“生产”阶段。Foreman 提供了一些方法来以可控的方式定制每个应用生命周期阶段,以适应你的规范。

在这一点上,你必须创建你的生命周期环境路径。

  1. 在 Foreman 网页用户界面中,导航到“ 内容 Content > 生命周期环境 Lifecycle Environments ”。
  2. 点击“ 新环境路径 New Environment Path ”,开始一个新的应用生命周期。
  3. 在“ 名称 Name ”字段中,为你的环境输入一个名称。
  4. 在“ 描述 Description ”字段中,为你的环境输入一个描述。
  5. 点击“ 保存 Save ”。
  6. 根据你的需要添加尽可能多的环境路径。例如,你可以创建“dev”、“test”、“stage” 和 “production” 环境。要添加这些环境,点击“添加新环境”,完成“ 名称 Name ”和“ 描述 Description ”字段,并从“ 优先环境 Prior Environment* ”列表中选择先前的环境,这样你就可以按照你预期使用的顺序将它们串联起来。

创建和发布一个内容视图

在 Foreman 中,“ 内容视图 Content View ”是你的存储库在某个特定时间点的快照。内容视图提供了隔离软件包版本到你想保留的状态的机制。内容视图有很多可配置的功能,你可以用它来进一步细化。为了本教程的目的,让我们保持简单。

  1. 在 Foreman 网页用户界面中,导航到“ 内容 Content > 内容视图 Content View ”,并点击“ 创建新视图 Create New View ”。
  2. 在“ 名称 Name ”字段中,为视图输入一个名称。Foreman 会根据你输入的名称自动完成“ 标签 Label ”字段。
  3. 在“ 描述 Description ”字段中,输入视图的描述。
  4. 单击“ 保存 Save ”以创建内容视图。
  5. 在新的内容视图中,点击“ Yum 内容 Yum Contents > 添加存储库 Add Repositories ”,在“ 存储库选择 Repository Selection ”区域,点击“ 添加 Add ”。对于 BaseOS 和 Appstream 存储库,选择你想包括的软件包,然后点击“ 添加存储库 Add Repositories ”。
  6. 点击“ 发布新版本 Publish New Version ”,在“ 描述 Description ”区域,输入关于版本的信息以记录变化。
  7. 单击“ 保存 Save ”。

当你点击“ 发布新版本 Publish New Version ”时,你创建了一个你已同步的所有内容的快照。这意味着你订阅此内容视图的每台服务器将只能访问与此生命周期环境相关的内容视图中的软件包版本。

每一个新的内容视图和后续版本都会首先发布到库环境,然后你可以在那里推广到其他环境。

跨生命周期环境推广内容

如果你已经测试了新的软件包,并且确信一切都很稳定,你可以把你的内容视图推广到另一个生命周期环境中。

  1. 导航到“ 内容 Content > 内容视图 Content Views ”,选择你想推广的内容视图。
  2. 点击内容视图的“ 版本 Versions ”标签。
  3. 选择你想推广的版本,并在“ 操作 Action ”栏中,点击“ 推广 Promote ”。
  4. 选择你要推广内容视图的环境,并点击“ 推广版本 Promote Version ”。
  5. 再次点击“ 推广 Promote ”按钮。这次选择生命周期环境,例如,“Test”,然后单击“ 推广版本 Promote Version ”。
  6. 最后,再次点击“ 推广 Promote ”按钮。例如,选择“Production”环境并点击“ 推广版本 Promote Version ”。

被分配到该特定环境的服务器现在可以从一套更新的软件包中提取。

创建一个激活密钥

为了将 CentOS Stream 服务器注册到你在特定生命周期中定义的内容,你必须创建一个激活密钥。激活密钥是一种与服务器共享凭证的安全方法。这使用了一个叫做“ 订阅管理器 subscription-manager 的工具来订阅 CentOS Stream 服务器的内容。

当你创建了激活密钥后,将 CentOS Stream 订阅添加到激活密钥中。

  1. 在 Foreman 网页用户界面中,导航到“ 内容 Content > 激活密钥 Activation keys ”,并点击“ 创建激活密钥 Create Activation Key ”。
  2. 在“ 名称 Name ”栏中,输入激活密钥的名称。
  3. 在“ 描述 Description ”栏中,输入激活密钥的描述。
  4. 从“ 环境 Environment ”列表中,选择要使用的环境。
  5. 从“ 内容视图 Content View ”列表中,选择你刚才创建的内容视图。
  6. 点击“ 保存 Save ”。

从 Foreman 管理的内容中创建一个 CentOS Stream 主机

现在一切都准备好了。随着你创建的内容包含在内容视图中,并在整个生命周期中推广,你现在可以准确地用你想使用的内容来配置主机,并订阅你想让它们接收的更新。

要在 Foreman 中创建一个主机,请导航到“主机 > 创建主机”。

  1. 在“ 名称 Name ”字段中,为主机输入一个名称。
  2. 单击“ 组织 Organization ”和“ 位置 Location ”选项卡,以确保配置环境自动设置为当前环境。
  3. 从“ 部署在 Deploy On ”列表中,选择“ 裸金属 Bare Metal ”。
  4. 单击“ 操作系统 Operating System ”选项卡。
  5. 从“ 架构 Architectures ”列表中,选择“x86\_64”。
  6. 从“ 操作系统 Operating System ”列表中,选择“CentOS\_Stream 8”。
  7. 勾选“ 构建模式 Build Mode ”框。
  8. 对于“ 媒体选择 Media Selection ”,选择“ 同步的内容 Synced Content ”来使用你之前同步的 CentOS Stream 内容。
  9. 从“ 同步的内容 Synced Content ”列表中,确保选择 “CentOS Stream”。
  10. 从“ 分区表 Partition Table ”列表中,对于这个演示,选择默认的 “Kickstart”,但有许多可用的选项。
  11. 在“ Root 密码 Root Password ”栏中,为你的新主机输入一个 root 密码。
  12. 点击“ 接口 Interface ”标签,并点击“ 编辑 Edit ”,并添加一个 “ Mac 地址 Mac address ”。
  13. 点击“ 参数 Parameters ”标签,并确保存在一个提供激活密钥的参数。如果没有,添加一个激活密钥。
  14. 点击“ 提交 Submit ”以保存主机条目。

现在,新的主机处于构建模式,这意味着当你打开它时,它将开始安装操作系统。

如果你导航到“ 主机 Hosts > 内容主机 Content Hosts ”,你可以看到你的主机所订阅的订阅、生命周期环境和内容视图的全部细节。

这个例子只是对你在 Foreman 中管理和配置 CentOS Stream 内容的众多选项的一个小窥视。如果你想了解更多关于如何管理 CentOS Stream 版本,控制你的服务器可以访问的内容,以及控制和保护你的基础设施的稳定性的详细信息,请查看 Foreman 内容管理 文档。当所有 CentOS Stream 内容在你的控制之下时,你可以创建和注册 Centos Stream,只使用你指定的内容。有关配备的更多详细信息,请参见 Foreman 配备 文档。如果你有任何问题、反馈或建议,你可以在 https://community.theforeman.org/ 找到 Foreman 社区。


via: https://opensource.com/article/21/9/centos-stream-foreman

作者:Melanie Corr 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

流行的配置文件格式有若干种,每种都有其自身优势。从中找到最适合你的格式吧!

 title=

计算机上有数以千计的配置文件。你可能永远不会直接与其中的大部分文件打交道,但它们确实散落在你的 /etc 以及 ~/.config~/.local/usr 文件夹中。还有一些可能在 /var,甚至 /opt 文件夹中。如果无意中打开过或更改过它们,你就可能会有疑问:为什么有些配置文件看起来是某一种格式,而另一些则是看起来完全不同的格式?

存储配置是一项很灵活的任务,因为只要开发人员知道他们的代码是如何将数据存入文件的,他们就可以轻松编写代码来根据需要提取数据。然而,科技行业非常青睐有详细文档的标准化事物,因此多年来出现了几种比较普遍的格式用来简化配置任务。

为什么我们需要配置文件

配置文件对于现代计算来说很重要。它们使你能够自定义与应用程序交互的方式,或自定义应用程序与系统内其他程序的交互方式。有了配置文件,每当你启动某个应用程序时,它都会有“记忆”,记录了你喜欢如何去使用该程序。

配置文件的结构可以很简单,而且通常确实也很简单。例如,如果你要编写一个应用程序,程序唯一需要知道的是其用户的偏好名字,那么它的唯一配置文件就可以只包含一个词:用户名。就像下面这样:

Tux

但通常应用程序需要追踪的不仅仅是一条信息,因此配置文件通常会有一个键和一个值:

NAME='Tux'
SPECIES='Penguin'

即使没有编程经验,你也可以想象出代码如何解析这些数据。这里有两个简单的例子,一个使用 awk 命令,另一个使用 grep 命令。两个例子都是只关注包含 NAME “键”的行,并返回出现在等号 (=) 之后的“值”:

$ awk -F'=' '/NAME/ { print $2; }' myconfig.ini
'Tux'
$ grep NAME fake.txt | cut -d'=' -f2
'Tux'

同样的原则适用于任何编程语言和任何配置文件。只要你有统一的数据结构,就可以在需要的时候编写简单的代码来提取和解析它。

选择格式

为了保证普遍有效性,配置文件最重要的一点是它们是一致的和可预测的。你绝对不会想做这样的事:以保存用户首选项的名义,将信息随意存储到文件中,然后花好几天时间逆向工程,来找到最终出现在文件中的随机信息。

流行的配置文件格式有若干种,每种格式都有自己的优势。

INI

INI 文件采用了键值对的格式:

[example]
name=Tux
style=widgety,fidgety
enabled=1

这种简单的配置风格很直观,只要你别选择使用糟糕的键名(比如用 unampref 这样的神秘键名来代替 name)就好。这些键值对很容易解析和编辑。

除了键和值之外,INI 格式还可以分 section 。在下列示例代码中,[example][demo] 就是配置文件中的两个节:

[example]
name=Tux
style=widgety,fidgety
enabled=1

[demo]
name=Beastie
fullscreen=1

这几个配置语句解析起来有点复杂,因为有两个 name 键。想象一下,一个粗心的程序员在这个配置文件中查询 name,结果总是返回 Beastie,因为这是文件中对 name 的最后一个定义值。在解析这样的文件时,开发人员必须加倍小心地在各节中搜索键,这可能会很棘手,具体取决于用来解析该文件的语言。然而,它仍然是一种很流行的格式,大多数语言都会有一个现成的库来帮助程序员解析 INI 文件。

YAML

YAML 文件 是结构化列表,可以包含值或者键值对:

---
Example:
  Name: 'Tux'
  Style:
   - 'widgety'
    - 'fidgety'
  Enabled: 1

YAML 格式很流行,部分原因是它看起来很整洁。数据要放置到相对其上层数据的特定位置,除此之外没有太多其他语法。然而,对于某些人来说的这种特色,在其他人眼中可能就是一个问题。许多开发人员不愿使用 YAML,正是因为它很看重本质上 不存在 的东西。如果你在 YAML 中缩进错误,YAML 解析器可能会将你的文件视为无效文件,即使不视为无效,返回的数据也可能是错误的。

大多数语言都有 YAML 解析器,并且有很好的开源 YAML linters(验证语法的应用程序)来帮你确保 YAML 文件的完整性。

JSON

JSON 文件在技术上来说是 YAML 的子集,因此其数据结构是相同的,尽管其语法完全不同:

{
  "Example": {
    "Name": [
      "Tux"
    ],
    "Style": [
      "widgety",
      "fidgety"
    ],
    "Enabled": 1
  }
}

JSON 在 JavaScript 程序员中很流行,这并不奇怪,因为 JSON 全称为 JavaScript 对象符号 JavaScript Object Notation 。由于与 Web 开发密切相关,JSON 是 Web API 的常见输出格式。大多数编程语言都有解析 JSON 的库。

XML

XML 使用标签作为键,将配置值围绕起来:

<example>
  <name>Tux</name>
  <style priority="user">widgety</style>
  <style priority="fallback">fidgety</style>
  <enabled>1</enabled>
</example>

XML 经常被 Java 程序员使用,Java 有一套丰富的 XML 解析器。虽然 XML 以非常严格而著称,但同时也非常灵活。与有一系列特定标签的 HTML 不同,XML 中可以随意发明自己的标签。只要始终坚持相同的构建规则,并有一个良好的库来解析它,你就可以准确而轻松地提取数据。

有一些很好的开源 linter 可以帮你验证 XML 文件,并且大多数编程语言都提供用于解析 XML 的库。

二进制格式

Linux 以纯文本配置为傲。这样做的优点是可以使用 cat 等基本工具查看配置数据,甚至可以使用你 最喜欢的文本编辑器 来编辑配置。

但是,某些应用程序使用二进制格式配置,就意味着数据以某种非自然语言的格式进行编码。这些文件通常需要一个特殊的应用程序(通常是它们要配置的应用程序)来解释它们的数据。你无法查看这些文件,至少无法以任何有意义的方式查看,并且无法在其宿主应用程序之外编辑它们。选用二进制格式的一些原因如下:

  • 速度: 程序员可以使用自定义符号在二进制配置文件中的某些点注册特定的信息位。提取数据时不涉及搜索,因为所有内容都已标注了索引。
  • 大小: 文本文件可能会变大,如果选择压缩文本文件,实际上是在将其转换为二进制格式。二进制文件可以通过编码技巧变得更小(文本文件也是如此,但在某些时候,你的优化会使数据变得晦涩,以至于文件也成了二进制文件)。
  • 晦涩: 一些程序员甚至不希望人们查看他们的配置文件,因此将它们编码为二进制数据。这通常只会让用户感到沮丧,并不是使用二进制格式的好理由。

如果必须使用二进制格式进行配置,请使用已作为开放标准存在的格式,例如 NetCDF

找到有效的配置格式

配置格式帮助开发人员存储应用程序所需的数据,并帮助用户存储他们希望应用程序如何操作的偏好项。对于应该使用什么格式的问题,可能没有错误的答案,只要你觉得所使用的语言能很好地支持就可以。在开发应用程序时,查看可用格式,用一些样例数据建模,查看和评估你的编程语言提供的库和实用程序,然后选择你觉得最合适的一种格式吧。


via: https://opensource.com/article/21/6/what-config-files

作者:Seth Kenlon 选题:lujun9972 译者:unigeorge 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在生活中,我们都曾使用过多种操作系统。有些好,有些坏。但你能说你使用过由“神”设计的操作系统吗?今天,我想向你介绍 Shrine(圣殿)。

什么是 Shrine?

Shrine 界面

从介绍里,你可能想知道这到底是怎么回事。嗯,这一切都始于一个叫 Terry Davis 的人。在我们进一步介绍之前,我最好提醒你,Terry 在生前患有精神分裂症,而且经常不吃药。正因为如此,他在生活中说过或做过一些不被社会接受的事情。

总之,让我们回到故事的主线。在 21 世纪初,Terry 发布了一个简单的操作系统。多年来,它不停地换了几个名字,有 J Operating System、LoseThos 和 SparrowOS 等等。他最终确定了 TempleOS(神庙系统)这个名字。他选择这个名字是因为这个操作系统将成为“神的圣殿”。因此,“神”给 Terry 的操作系统规定了以下 规格

  • 它将有 640×480 的 16 色图形显示
  • 它将使用 “单声道 8 位带符号的类似 MIDI 的声音采样”
  • 它将追随 Commodore 64,即“一个非网络化的简单机器,编程是目标,而不仅仅是达到目的的手段”
  • 它将只支持一个文件系统(名为 “Red Sea”)
  • 它将被限制在 10 万行代码内,以使它 “整体易于学习”
  • “只支持 Ring-0 级,一切都在内核模式下运行,包括用户应用程序”
  • 字体将被限制为 “一种 8×8 等宽字体”
  • “对一切都可以完全访问。所有的内存、I/O 端口、指令和类似的东西都绝无限制。所有的函数、变量和类成员都是可访问的”
  • 它将只支持一个平台,即 64 位 PC

Terry 用一种他称之为 HolyC(神圣 C 语言)的编程语言编写了这个操作系统。TechRepublic 称其为一种 “C++ 的修改版(‘比 C 多,比 C++ 少’)”。如果你有兴趣了解 HolyC,我推荐 这篇文章RosettaCode 上的 HolyC 条目。

2013 年,Terry 在他的网站上宣布,TempleOS 已经完成。不幸的是,几年后的 2018 年 8 月,Terry 被火车撞死了。当时他无家可归。多年来,许多人通过他在该操作系统上的工作关注着他。大多数人对他在如此小的体积中编写操作系统的能力印象深刻。

现在,你可能想知道这些关于 TempleOS 的讨论与 Shrine 有什么关系。好吧,正如 Shrine 的 GitHub 页面 所说,它是 “一个为异教徒设计的 TempleOS 发行版”。GitHub 用户 minexew 创建了 Shrine,为 TempleOS 添加 Terry 忽略的功能。这些功能包括:

  • 与 TempleOS 程序 99% 的兼容性
  • 带有 Lambda Shell,感觉有点像经典的 Unix 命令解释器
  • TCP/IP 协议栈和开机即可上网
  • 包括一个软件包下载器

minexew 正计划在未来增加更多的功能,但还没有宣布具体会包括什么。他有计划为 Linux 制作一个完整的 TempleOS 环境。

体验

让 Shrine 在虚拟机中运行是相当容易的。你所需要做的就是安装你选择的虚拟化软件。(我的是 VirtualBox)当你为 Shrine 创建一个虚拟机时,确保它是 64 位的,并且至少有 512MB 的内存。

一旦你启动到 Shrine,会询问你是否要安装到你的(虚拟)硬盘上。一旦安装完成(你也可以选择不安装),你会看到一个该操作系统的导览,你可以由此探索。

总结

TempleOS (和 Shrine)显然不是为了取代 Windows 或 Linux。即使 Terry 把它称为 “神之圣殿”,我相信在他比较清醒的时候,他也会承认这更像是一个业余的作业系统。考虑到这一点,已完成的产品相当 令人印象深刻。在 12 年的时间里,Terry 用他自己创造的语言创造了一个稍稍超过 10 万行代码的操作系统。他还编写了自己的编译器、图形库和几个游戏。所有这些都是在与他自己的个人心魔作斗争的时候进行的。


via: https://itsfoss.com/shrine-os/

作者:John Paul 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出