分类 技术 下的文章

本文章向你介绍了 Shell 脚本的基础知识以及其在日常生活中的重要性。

当我们登录到一个 UNIX/Linux 系统时,我们首先注意到的是闪烁的光标和 $ 符号之间的空格。这就是 Shell(交互界面)。多年来,它一直是一种无处不在(有时甚至是唯一的)与计算机交互的界面。在图形用户界面(GUI)出现和流行之前,终端和 Shell 是唯一的机制,可以让计算机按照我们的意图进行操作。乍一看,我们可能会想知道 Shell 的作用,除了将命令传递给底层操作系统以进行执行之外。我们中的大多数人熟悉像 ls(用于列出目录内容),cd(用于更改当前目录)等命令。通过 Shell,我们可以执行这些命令。Shell 理解我们输入的文本 - 将其转换为标记 - 然后在操作系统上执行这些标记。

不同的 Shell 变种

最初,终端使用了朴素的 Bourne Shell(即 Sh)。多年来,许多不同的 Shell 变种被开发出来和使用。其中一些流行的包括 C Shell(Csh) 和 Korn Shell(Ksh)。Sh 在一段时间内不再受欢迎,但通过其最新的化身 —— Bourne Again Shell(Bash),它再次流行起来。

Shell 实际上是做什么的?

Shell 是操作系统(OS)和用户之间的直接接口。通过使用命令和应用程序来使用计算机上安装的工具,我们可以使计算机按照我们的意愿工作。一些命令是安装在操作系统上的应用程序,而某些命令则是直接内置在 Shell 中的。在 Bash 中内置的一些命令包括 clearcdevalexec,还有 lsmkdir 这样的应用程序。内置在 Shell 中的命令因 Shell 而异。

在本文中,我们将涵盖与 Bash 相关的几个方面。

更多关于 Shell 的内容

我们中的大多数人都用过像 lscdmkdir 这样的命令。当我们在一个目录上运行 ls -l 命令时,该目录中的所有子目录和文件都会在屏幕上列出。如果数量很大,屏幕会滚动。如果终端不支持滚动条(在很多年里都是如此),则无法查看已滚动过的条目。为了克服这个问题,我们使用像 moreless 这样的命令。它们允许我们逐页查看输出。通常使用的命令是:

ls -l | less

在这里 Shell 是在做什么?看起来像是单个命令,实际上是 lsless 两个命令依次执行。管道符(|)将这两个程序连接起来,但连接由 Shell 管理。由于有了管道符,Shell 连接了这两个程序——它将 ls 命令的标准输出连接到 less 的标准输入(stdin)。管道功能使我们能够将任何程序的输出作为另一个程序的输入提供,而无需对程序进行任何更改。这是许多 UNIX/Linux 应用程序的理念——保持应用程序简单,然后将许多应用程序组合在一起以实现最终结果,而不是让一个程序做很多事情。

如果需要,我们可以将 ls 的输出重定向到文件中,然后使用 vi 查看它。为此,我们使用以下命令:

ls -l > /tmp/my_file.txt
vi /tmp/my_file.txt

在这种情况下,ls 的输出被重定向到一个文件中。这由 Shell 进行管理,它理解 > 符号表示重定向。它将其后面的标记视为文件。

使用 Shell 自动化

结合命令的能力是使用 Shell 命令创建自动化脚本的关键要素之一。在我最近的项目中,我们使用集群模式执行 Python/Spark(PySpark)应用程序。每个应用程序执行了许多结构化查询语言(SQL)语句 - SparkSQL。为了跟踪应用程序的进展,我们会打印有关正在执行的 SQL 的详细信息。这样可以让我们保留应用程序中正在发生的情况的日志。由于应用程序在集群模式下执行,要查看日志,我们必须使用以下 yarn 命令:

yarn log –applicationId [application_id]

在大多数情况下,应用程序生成的日志非常大。因此,我们通常将日志导入到 less 中,或将其重定向到一个文件中。我们使用的命令是:

yarn log –aplicationId [application_id] | less

我们的开发团队有 40 人。每个人都必须记住这个命令。为了简化操作,我将这个命令转换成了一个 Bash 脚本。为此,我创建了一个以 .sh 为扩展名的文件。在 UNIX 和 Linux 系统上,文件扩展名并不重要。只要文件是可执行的,它就能工作。扩展名在 MS Windows 上有意义。

需要记住的重要事项

Shell 是一个解释器。这意味着它会逐行读取程序并执行它。这种方法的限制在于错误(如果有)在事先无法被识别。直到解释器读取和执行它们时,错误才会被识别出来。简而言之,假如我们有一个在前 20 行完美执行,但在第 21 行由于语法错误而失败的 Shell 程序。当脚本在第 21 行失败时,Shell 不会回滚/撤销之前的步骤。当发生这样的情况时,我们必须纠正脚本并从第一行开始执行。因此,例如,如果在遇到错误之前删除了几个文件,脚本的执行将停止,而文件将永远消失。

我创建的脚本是:

#!/bin/bash
yarn log –applicationId 123 | less

…其中 123 是应用程序的 ID。

第一行的前两个字符是特殊字符(“释伴”)。它们告诉脚本这是一个可执行文件,并且该行包含要用于执行的程序的名称。脚本的其余行传递给所提到的程序。在这个例子中,我们将执行 Bash。即使包含了第一行,我们仍然必须使用以下命令对文件应用执行权限:

chmod +x my_file.sh

在给文件设置了执行权限之后,我们可以如下执行它:

./my_file.sh

如果我们没有给文件设置执行权限,我们可以使用以下命令执行该脚本:

sh ./my_file.sh

传递参数

你很快就会意识到,这样的脚本很方便,但立即变得无用。每次执行 Python/Spark 应用程序时,都会生成一个新的 ID。因此,对于每次运行,我们都必须编辑文件并添加新的应用程序 ID。这无疑降低了脚本的可用性。为了提高其可用性,我们应该将应用程序 ID 作为参数传递:

#!/bin/bash
yarn –log -applicationId ${1} | less

我们需要这样执行脚本:

./show_log.sh 123

脚本将执行 yarn 命令,获取应用程序的日志并允许我们查看它。

如果我们想将输出重定向到一个文件中怎么办?没问题。我们可以将输出重定向到一个文件而不是发送给 less

#!/bin/bash
ls –l ${1} > ${2}
view ${2}

要运行脚本,我们需要提供两个参数,命令变为:

./my_file.sh /tmp /tmp/listing.txt

当执行时,$1 将绑定到 /tmp$2 将绑定到 /tmp/listing.txt。对于 Shell,参数从一到九命名。这并不意味着我们不能将超过九个参数传递给脚本。我们可以,但这是另一篇文章的主题。你会注意到,我将参数命名为 ${1}${2},而不是 $1$2。将参数名称封闭在花括号中是一个好习惯,因为它使我们能够无歧义地将参数作为较长变量的一部分组合起来。例如,我们可以要求用户将文件名作为参数,并使用它来形成一个更大的文件名。例如,我们可以将 $1 作为参数,创建一个新的文件名为 ${1}_student_names.txt

使脚本更健壮

如果用户忘记提供参数怎么办?Shell 允许我们检查这种情况。我们将脚本修改如下:

#!/bin/bash
if [ -z "${2}" ]; then
  echo "file name not provided"
  exit 1
fi
if [ -z "${1}" ]; then
  echo "directory name not provided"
  exit 1
fi
DIR_NAME=${1}
FILE_NAME=${2}
ls -l ${DIR_NAME} > /tmp/${FILE_NAME}
view /tmp/${FILE_NAME}

在这个程序中,我们检查是否传递了正确的参数。如果未传递参数,我们将退出脚本。你会注意到,我以相反的顺序检查参数。如果我们在检查第一个参数存在之前检查第二个参数的存在,如果只传递了一个参数,脚本将进行到下一步。虽然可以按递增顺序检查参数的存在,但我最近意识到,从九到一检查会更好,因为我们可以提供适当的错误消息。你还会注意到,参数已分配给变量。参数一到九是位置参数。将位置参数分配给具名参数可以在出现问题时更容易调试脚本。

自动化备份

我自动化的另一个任务是备份。在开发的初期阶段,我们没有使用版本控制系统。但我们需要有一个机制来定期备份。因此,最好的方法是编写一个 Shell 脚本,在执行时将所有代码文件复制到一个单独的目录中,将它们压缩,并使用日期和时间作为后缀来上传到 HDFS。我知道,这种方法不如使用版本控制系统那样清晰,因为我们存储了完整的文件,查找差异仍然需要使用像 diff 这样的程序;但它总比没有好。尽管我们最终没有删除代码文件,但团队确实删除了存储助手脚本的 bin 目录!!!而且对于这个目录,我没有备份。我别无选择,只能重新创建所有的脚本。

一旦建立了源代码控制系统,我很容易将备份脚本扩展到除了之前上传到 HDFS 的方法之外,还可以将文件上传到版本控制系统。

总结

如今,像 Python、Spark、Scala 和 Java 这样的编程语言很受欢迎,因为它们用于开发与人工智能和机器学习相关的应用程序。尽管与 Shell 相比,这些语言更强大,但“不起眼”的 Shell 提供了一个即用即得的平台,让我们能够创建辅助脚本来简化我们的日常任务。Shell 是相当强大的,尤其是因为我们可以结合操作系统上安装的所有应用程序的功能。正如我在我的项目中发现的那样,即使经过了几十年,Shell 脚本仍然非常强大。我希望我已经说服你尝试一下了。

最后一个例子

Shell 脚本确实非常方便。考虑以下命令:

spark3-submit --queue pyspark --conf "[email protected]" --conf "spark.yarn.keytab=/keytabs/abcd.keytab" --jars /opt/custom_jars/abcd_1.jar --deploy-mode cluster --master yarn $*

我们要求在执行 Python/Spark 应用程序时使用此命令。现在想象一下,这个命令必须每天被一个由 40 个人组成的团队多次使用。大多数人会在记事本中复制这个命令,每次需要使用时,会将其从记事本中复制并粘贴到终端中。如果复制粘贴过程中出现错误怎么办?如果有人错误使用了参数怎么办?我们如何调试使用的是哪个命令?查看历史记录并没有太多帮助。

为了让团队能够简单地执行 Python/Spark 应用程序,我们可以创建一个 Bash Shell 脚本,如下所示:

#!/bin/bash
[email protected]
KEYTAB_PATH=/keytabs/abcd.keytab
MY_JARS=/opt/custom_jars/abcd_1.jar
MAX_RETRIES=128
QUEUE=pyspark
MASTER=yarn
MODE=cluster

spark3-submit --queue ${QUEUE} --conf "spark.yarn.principal=${SERVICE_PRINCIPAL}" --conf "spark.yarn.keytab=${KEYTAB_PATH}" --jars ${MY_JARS} --deploy-mode ${MODE} --master ${MASTER} $*

这展示了一个 Shell 脚本的强大之处,让我们的生活变得简单。根据你的需求,你可以尝试更多的命令和脚本,并进一步探索。

(题图:MJ/f32880e8-0cdc-4897-8a1c-242c131111bf)


via: https://www.opensourceforu.com/2022/05/shell-scripting-is-still-going-strong/

作者:Bipin Patwardhan 选题:lkxed 译者:ChatGPT 校对:wxy

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

在大多数编程语言中,你都会找到字符串数据类型。字符串基本上是一组字符。

但 Bash Shell 有所不同。字符串没有单独的数据类型。这里一切都是变量。

但这并不意味着你不能像在 C 和其他编程语言中那样处理字符串。

在 Bash Shell 中可以查找子字符串、替换子字符串、连接字符串以及更多字符串操作。

在 Bash 基础知识系列的这一部分中,你将学习基本的字符串操作。

在 Bash 中获取字符串长度

让我们从最简单的选项开始。也就是获取字符串的长度。这很简单:

${#string}

让我们在示例中使用它。

Example of getting string length in bash

正如你所看到的,第二个示例中有两个单词,但由于它用引号引起来,因此它被视为单个单词。连空格都算作一个字符。

在 Bash 中连接字符串

用技术术语来说是字符串 连接 concatenation ,这是 Bash 中最简单的字符串操作之一。

你只需像这样一个接一个地使用字符串变量:

str3=$str1$str2

还能比这更简单吗?我觉得不能。

让我们看一个例子。这是我的示例脚本,名为 join.sh

#!/bin/bash

read -p "Enter first string: " str1
read -p "Enter second string: " str2

joined=$str1$str2

echo "The joined string is: $joined"

以下是该脚本的运行示例:

Join two strings in bash

在 Bash 中提取子字符串

假设你有一个包含多个字符的大字符串,并且你想要提取其中的一部分。

要提取子字符串,需要指定主字符串、子字符串的起始位置和子字符串的长度,如下所示:

${string:$pos:$len}
? 和数组一样,字符串中的定位也是从 0 开始。

这是一个例子:

Extracting substring in bash

即使你指定的子字符串长度大于字符串长度,它也只会到达字符串末尾。

替换 Bash 中的子字符串

假设你有一个大字符串,并且你想用另一个字符串替换其中的一部分。

在这种情况下,你可以使用这种语法:

${string/substr1/substr2}
✋ 只有第一次出现的子字符串才会以这种方式替换。如果要替换所有出现的地方,请使用 ${string//substr1/substr2}

这是一个例子:

Replace substring in bash

正如你在上面看到的,“good” 一词被替换为 “best”。我将替换的字符串保存到同一字符串中以更改原始字符串。

? 如果未找到子字符串,则不会替换任何内容。它不会导致错误。

在 Bash 中删除子字符串

我们来谈谈删除子字符串。假设你要删除字符串的一部分。在这种情况下,只需将子字符串提供给主字符串,如下所示:

${string/substring}
✋ 通过这种方式,仅删除第一次出现的子字符串。如果要删除所有出现的内容,请使用 ${string//substr}

如果找到子字符串,则将从字符串中删除它。

让我们通过一个例子来看看。

Delete substring in bash

不用说,如果没有找到子字符串,则不会删除它。它不会导致错误。

?️ 练习时间

现在是你通过简单练习来实践字符串操作的时候了。

练习 1:声明一个字符串 “I am all wet”。现在通过用 “set” 替换单词 “wet” 来更改此字符串。

练习 2:创建一个字符串,以 112-123-1234 格式保存电话号码。现在,你必须删除所有 -

这应该会给你一些在 Bash 中使用字符串的不错的练习。在下一章中,你将学习如何在 Bash 中使用 if-else 语句。敬请关注。

(题图:MJ/aa73b2c9-6d2f-42e2-972d-94fab56d30cc)


via: https://itsfoss.com/bash-strings/

作者:Abhishek Prakash 选题:lkxed 译者:geekpi 校对:wxy

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

下面是使用开源工具来举办一场线上活动的方法。

在 2023 年 1 月举办了首届 创意自由峰会 Creative Freedom Summit 后,Fedora 设计团队 发现使用开源工具来举办线上大会非常有效。

在本文中,我将分享一些关于这场大会的背景信息,为什么对我们来说使用开源工具来举办大会很重要,以及为实现这一目标我们的团队所使用的具体工具和配置。我还会谈谈哪些工作做的很好,在以及我们 2024 年下一届峰会中需要改进的地方。

创意自由峰会

创意自由峰会是 Marie Nordin 在审查了 Fedora 用户与贡献者年度大会(Flock) 的演讲提交后提出的一个想法。在 2022 年 8 月的 Flock 大会上,她收到了大量与开源设计和创意相关的演讲提交,远远超出我们能够接受的数量。由于存在许多关于开源设计的优秀想法,她想知道是否有机会举办一个独立的开源创意大会,专门面向在创作中使用开源工具的创意人士。

Marie 在 2022 年秋季向 Fedora 设计团队提出了这个想法,我们开始筹划这个会议,会议于 2023 年 1 月 17 日至 19 日举行。由于这是我们第一次举办这样一场新的会议,我们决定首先基于 Flock 提交的演讲和我们自己的开源创意人士网络,邀请其中一些人士担任演讲嘉宾。几乎每位我们邀请的演讲者都答应演讲,所以我们没有接受其他人的提交。明年我们需要找到更好的解决办法,所以目前我们还没有开源的投稿管理工具可供介绍。

在开源大会中使用开源工具

自从最初的大流行封锁以来,Fedora 的 Flock 大会一直使用 Hopin 虚拟平台在线举办,尽管 Hopin 不是开源的,但对开源工具很友好。Fedora 几年前开始使用 Hopin,它确实提供了专业的会议体验,包括内置的赞助商展位/博览厅、分会场、大厅聊天对话和管理工具。通过 Hopin 来举办创意自由峰会对我们来说可行,因为作为 Fedora 赞助的活动,我们可以使用 Fedora 的 Hopin 环境。再次强调,Hopin 不是开源的。

作为一个长期(约 20 年)的开源贡献者,我可以告诉你,做出这样的决定总是很困难的。如果你的大会专注于开源,使用专有平台来举办你的活动可能会有些奇怪。然而,随着我们社区和活动的规模和复杂性不断增长,开发一个集成的开源会议系统变得更具挑战性。

并不存在正确或错误的答案。在做出这个决定时,你必须权衡很多因素:

  • 预算
  • 人力资源
  • 基础设施
  • 技术能力
  • 活动的复杂性/正式性/文化

我们没有为这次活动安排任何预算。我们有一支志愿者团队可以投入一些工作时间。我们有 Fedora Matrix 服务器作为可以加入的支持基础设施,并且有一个托管的 WordPress 系统用于网站。我和队友 Madeline Peck 在举办每周的 Fedora 设计团队的 视频会议 方面具有一定的技术能力和经验。我们希望这次活动是低调、单一会场和非正式的,所以对于一些小故障或瑕疵我们有一定的容忍度。我们对尝试使用开源工具组合也有很大的热情。

现在你了解了我们在做出这个决定时的一些考虑因素,这可能有助于你在为自己的活动做决策时参考。

一个开源会议技术栈

以下是会议技术栈的工作方式。

概述

直播组件:

  • 直播流: 我们通过 PeerTube 频道将主舞台和社交活动进行实时直播。会议参与者可以从我们的 PeerTube 频道观看直播。PeerTube 提供了一些注重隐私的分析功能,可以跟踪直播观众和活动后观看次数。
  • 直播舞台 + 社交活动房间: 我们设有一个用于演讲者和主持人的直播舞台,使用 Jitsi 确保只有有权限的人可以上镜。我们额外设有一个 Jitsi 会议室,用于社交活动,允许任何希望参与社交活动的人上镜。
  • 后台: 我们有一个名为“后台”的 Matrix 频道,用于在活动期间与演讲者、主持人和志愿者协调工作。
  • 公告和问答: 我们通过共享的 Etherpad(后来转移到 Hackmd.io)来管理问答和每日议程。
  • 集成和集中化的会议体验: 使用 Matrix 的 Element 客户端,我们将直播视频和 Etherpad 嵌入到一个公共的 Matrix 频道中,供会议使用。我们根据频道中的参与人数来监控整体会议出席情况。我们在整个会议期间设有实时聊天,并从聊天和嵌入的用于问答的 Etherpad 中接受观众提问。
  • 会议网站: 我们有一个由 Ryan Gorley 设计精美的网站,托管在 WordPress 上,网站提供了基本信息和链接,包括如何参加会议、日期/时间和议程。

活动后组件:

  • 活动后调查: 我们使用开源的 LimeSurvey 系统向参会者发送了一份活动后的调查,以了解他们的参会体验。我在这篇文章中使用了该调查的一些数据。
  • 活动后的视频编辑和字幕: 我们的会议没有实时字幕系统,但在我能做到的情况下,我在频道中即时记录了演讲的笔记,与会者对此表示非常感激。活动后,我们使用了 Kdenlive(活动中演讲中展示的工具之一)来编辑视频并生成字幕。
  • 活动录像: PeerTube 会自动将直播录像发布到频道,从而使参会者可以看到他们可能错过的演讲的几乎即时录像。

接下来,我将介绍一些细节。

使用 PeerTube 进行直播

创意自由峰会的 PeerTube 频道截图,显示了标志、事件描述和一组视频缩略图

我们在创意自由峰会的直播中使用了由 LinuxRocks.online 慷慨提供的 LinuxRocks PeerTube 平台。PeerTube 是一个自由开源的去中心化视频平台,也是 联邦宇宙 Fediverse 的一部分。

PeerTube 最好的特点之一(我所了解的其他平台所没有的)是,在直播结束后,你会在 PeerTube 上的频道上获得一个几乎即时的重播录像。我们的聊天室用户将这视为该平台的主要优点。如果某位参与者错过了他们非常感兴趣的一个会议,他们可以在该演讲结束后的几分钟内观看到它。这不需要志愿者组织团队进行手动干预、上传或协调,PeerTube 会自动完成。

以下是使用 PeerTube 进行直播的工作方式:你在频道上创建一个新的直播流,它会给你一个直播流 URL 和一个用于授权流媒体的密钥。这个 URL 和密钥可以反复使用。我们进行配置,使得录像会在直播结束后立即发布到我们创建直播流 URL 的频道上。接下来,在开始直播时将 URL 和密钥复制/粘贴到 Jitsi 中。这意味着你不必为会议期间的每个演讲生成新的 URL 和密钥,组织者管理这些将会带来相当大的工作量。相反,我们可以重复使用相同的 URL 和密钥,将其共享在会议组织者之间的共同文档中(我们每个人都有不同的演讲托管时间段)。团队中任何具有该文档访问权限的人都可以启动直播。

如何生成 PeerTube 中的直播流 URL 和密钥

以下部分逐步介绍了如何在 PeerTube 中生成直播流的 URL 和密钥。

1、创建 PeerTube 上的直播视频

登录到 PeerTube,并点击右上角的 “ 发布 Publish ” 按钮:

PeerTube 发布按钮的截图

2、设置选项

点击 “ 进行直播 Go live ” 选项卡(从左数第四个),并设置以下选项:

  • 频道 Channel :(你希望直播发布在的频道名称)
  • 隐私 Privacy :公开
  • 单选按钮: 普通直播 Normal live

然后选择 “ 进行直播 Go live ” 。 (不用担心,你还不会真正开始直播,还有更多数据需要填写。)

PeerTube 中的 Go Live 按钮的截图

3. 基本信息(暂时不要点击更新按钮)

首先,在 基本信息 Basic info 选项卡中填写信息,然后在下一步选择 高级设置 Advanced settings 选项卡。填写直播流的名称、描述、标签、类别、许可证等。在转码复选框启用后记得发布。

这样一来,一旦直播结束,录制视频将自动发布到你的频道上。

4. 高级设置

你可以上传一个“待机”图像,当观看直播流 URL 并等待开始时,该图像会显示在所有人面前。

PeerTube 高级设置的截图

这是我们在创意自由峰会上使用的待机图像:

创意自由峰会横幅的截图

5. 在 PeerTube 上开始直播

选择右下角的 “ 更新 Update” 按钮。直播流将显示如下,直到你从 Jitsi 开始直播:

在 PeerTube 上开始直播的截图

6. 将直播流的 URL 复制粘贴到 Jitsi

这是 PeerTube 的最后一步。一旦直播流启动,点击视频下方右侧的 “...” 图标:

复制并粘贴 URL

选择 “ 显示直播信息 Display live information ”。你将看到如下对话框:

显示直播信息选项的截图

你需要复制直播的 RTMP URL 和直播流密钥。将它们合并成一个 URL,然后将其复制粘贴到 Jitsi。

以下是我测试运行时的这两个文本块示例,可供复制:

  • 直播的 RTMP URL:rtmp://peertube.linuxrocks.online:1935/live
  • 直播流密钥:8b940f96-c46d-46aa-81a0-701de3c43c8f

你需要将这两个文本块合并,并在它们之间加上 /,如下所示:

rtmp://peertube.linuxrocks.online:1935/live/8b940f96-c46d-46aa-81a0-701de3c43c8f

Jitsi 的直播舞台 + 社交活动室

我们在我们的 “直播舞台” 上使用了自由开源的托管平台 Jitsi Meet 视频会议平台。我们在 https://meet.jit.si 上创建了一个自定义 URL 的 Jitsi 会议室,并只与演讲者和会议组织者共享了该 URL。

我们配置了会议室的等候室(该功能在你加入新创建的会议室后在会议设置中可用),这样演讲者可以在他们的演讲前几分钟加入而不用担心打断前一个演讲。我们的主持人志愿者在前一个会话结束后让他们进入。另一个选项是给会议室添加密码。我们只是配置了一个等候室就行了。在测试时似乎发现,会议室中的管理状态并不是持久的。如果一个管理员离开了会议室,他们似乎会失去管理员状态和设置,比如等候室的设置。我通过让我的电脑保持打开的状态,使 Jitsi 会议室在整个会议期间可用和活动。(在这方面,你的情况可能会有所不同。)

Jitsi 提供了内置的直播选项,你可以将视频服务的 URL 发布到 Jitsi 中,它会将你的视频流式传输到该服务。我们对这种方法有信心,因为这是我们主办和直播每周举行的 Fedora 设计团队会议 的方式。对于创意自由峰会,我们将我们的 Jitsi 直播舞台(用于演讲者和主持人)连接到 Linux Rocks PeerTube 上的一个频道

Jitsi 允许演讲者共享屏幕来展示幻灯片或进行实时演示。

将 Jitsi 直播到 PeerTube

1、加入会议并点击屏幕底部红色挂断按钮旁边的 “...” 图标。

加入 Jitsi 会议

2、从弹出菜单中选择 “ 开始直播 Start live stream ”。

在 Jitsi 中开始直播的截图

3、复制并粘贴 PeerTube 的 URL + 密钥文本

复制并粘贴直播流密钥的截图

4、倾听 Jitsi 机器人朋友的声音

几秒钟后,会出现一个女性声音告诉你,“Live streaming is on.”(直播已开启)。一旦听到这个声音,微笑吧!你正在进行直播。

5、停止直播

这将停止你设置的 PeerTube URL 的工作,所以重复这些步骤可以重新启动直播。

Jitsi 技巧

通过开关 Jitsi 的流来管理录制

我们在会议中认识到,在演讲之间关闭 Jitsi 的直播流会更好,这样你将在 PeerTube 上针对每个演讲发布一个原始录制文件。第一天我们让它一直运行,因此一些录制中包含了多个演讲的视频,这使得那些试图赶上进度的人使用即时回放功能更困难。他们需要在视频中寻找他们想观看的演讲,或者等待我们在几天或几周后发布编辑过的版本。

避免音频回音

我们在活动期间实时发现的另一个问题是音频回音。这在我们的测试中并没有出现,这完全是我的错(对所有参加的人道歉)。我负责设置 Jitsi/PeerTube 的链接、监控流和协助主持活动。尽管我知道一旦直播开始,我需要关闭所有已打开的 PeerTube 浏览器标签,但我可能打开了比我想象中更多的 PeerTube 标签,或者直播会在我可用于监控聊天的 Element 客户端中自动开始播放。我没有很方便地静音 Element 的方法。在我进行的一些演讲者介绍中,你会注意到我知道在音频回音开始之前大约有 30 秒的时间,因此我做的介绍非常匆忙/急促。

我认为有更简单的方法来避免这种情况:

  • 尽量确保主持人/活动主持人不是负责设置/监控流和聊天的同一个人。(根据你每次拥有多少义工人员的情况,这并不总是可能的。)
  • 如果可能,使用一台电脑监控流,另一台电脑担任主持人角色。这样,你在用于监控的电脑上只需按一下静音按钮,简化了你在另一个电脑上的主持体验。

这是一件值得提前练习和完善的事情。

后台:Element

以下是 Element 中显示的三个聊天室列表的截图:Creative Freedom Summit(白色徽标)、Creative Freedom Summit Backstage(黑色徽标)和 Creative Freedom Summit Hosts(橙色徽标)

我们在会议开始前大约一周设置了一个 “后台” 邀请制聊天室,并邀请了所有的演讲者加入。这有助于确保以下几点:

  • 我们的演讲者在活动开始之前就加入了 Element/Matrix,并有机会在注册遇到任何问题时都可以获得帮助(实际上没有人遇到问题)。
  • 在活动开始之前,我们与所有演讲者建立了一个实时的交流渠道,以便我们能够轻松地发送公告和更新。

在活动期间,这个聊天室成为一个有用的地方,用于协调演讲者之间的过渡,提醒日程是否延迟,以及在一个情况下,当我们的演讲者出现紧急情况无法按原定时间发言时,迅速重新安排演讲时间。

我们还为主持人设置了一个房间,但在我们的情况下,它是多余的。我们只是使用后台频道进行协调。我们发现两个频道很容易监控,但三个频道对于方便起见有点太多了。

公告和问答:Etherpad/Hackmd.io

这是一个名为 “General information” 的 Etherpad 的截图,其中包含有关创意自由峰会的一些信息

我们在 Element 主频道中设置了一个固定的小部件,提供有关活动的一般信息,包括每日日程安排、行为准则等。我们还为每个演讲设置了一个问答部分,让与会者可以在其中提出问题,主持人会为演讲者朗读这些问题。

在开始的一两天中,我们发现一些与会者在加载 Etherpad 小部件时遇到问题,因此我们改为在频道中固定一个内嵌的 hackmd.io 文档作为小部件,那似乎效果更好一些。我们并不 100% 确定小部件加载问题的具体原因,但我们可以在频道主题中发布一个原始(非内嵌)链接,这样参与者就可以绕过通过小部件访问时可能遇到的任何问题。

综合和集中的会议体验

在左上角是一个视频直播,右上角是一个 hackmd.io 的公告页面,下方是一个活跃的聊天窗口

通过 Fedora 的 Element 服务器使用 Matrix 是参加会议的关键地方。Element 中的 Matrix 聊天室具有小部件系统,可以将网站嵌入到聊天室中,成为体验的一部分。这个功能对于将我们的 Matrix 聊天室作为集中参会的地方非常重要。

我们将 PeerTube 的直播嵌入到了聊天频道中,在上面的截图中左上角可以看到。会议结束后,我们可以分享未编辑的视频回放的播放列表。现在,我们志愿者项目编辑视频的工作已经完成,该频道中有按顺序排列的编辑演讲的播放列表。

如前一节所讨论的,我们在右上角嵌入了一个 hackmd.io 笔记,用于发布当天的日程安排、公告以及一个用于问答的区域。我本来想设置一个 Matrix 机器人来处理问答,但我在运行时遇到了一些困难。不过,这可能是明年一个很酷的项目。

在会议期间,与会者直接在主要聊天窗口下方进行交流,同时与小部件进行互动。

在将 Matrix/Element 聊天室作为在线会议的中心地点时,有几个要考虑的因素,例如:

  • 在 Element 桌面客户端或桌面系统的 Web 浏览器上会有最佳体验。但是,你也可以在 Element 移动客户端中查看小部件(尽管一些参与者在发现此功能时遇到了困难,其用户界面不太明显)。其他 Matrix 客户端可能无法查看小部件。
  • 如果需要,与会者可以根据自己的喜好自行组合体验。那些不使用 Element 客户端参加会议的用户报告称加入聊天并直接查看 PeerTube 直播 URL 没有问题。我们在频道主题中分享了直播 URL 和 hackmd URL,以便那些不想使用 Element 的用户也可以访问。

网站

Ryan Gorley 使用 WordPress 开发了 创意自由峰会网站。该网站由 WPengine 托管,是一个单页网站,其中嵌入了来自 sched.org 的会议日程安排。在网站顶部,有一个标题为 “Create. Learn. Connect.” 的屏幕截图,背景是蓝色和紫色的渐变效果。

后续活动

后续调查

我们使用开源调查工具 LimeSurvey。在会议结束后的一两周内,我们通过 Element 聊天频道和 PeerTube 视频频道向与会者发送了调查,以了解他们对我们活动的看法。活动组织者们继续定期开会。在这些会议的其中一个议题是共同撰写 hackmd.io 文档,以制定调查问题。以下是我们从活动中学到的一些对你计划自己的开源线上会议可能有兴趣的事项:

  • 绝大多数与会者(共 70% 的受访者)是通过 Mastodon 和 Twitter 得知本次活动的。
  • 33% 的与会者使用 Element 桌面应用程序参加会议,30% 使用 Element 聊天 Web 应用程序。因此,大约有 63% 的与会者使用了集成的 Matrix/Element 体验。其他与会者直接在 PeerTube 上观看或在会后观看了回放。
  • 35% 的与会者表示他们通过聊天与其他创意人建立了联系,因此如果你的目标是促进人际交流和连接,聊天体验对于活动来说非常重要。

字幕

在活动期间,我们收到了与会者的积极反馈,他们对其他与会者在聊天中实时添加的演讲字幕表示赞赏,并希望能够提供实时字幕以提升可访问性。虽然本文未提及实时字幕的相关软件,但有一些开源解决方案可供选择。其中一个工具是 Live Captions,在 Seth Kenlon 撰写的一篇文章《在 Linux 上的开源视频字幕》中进行了介绍。虽然这个工具主要用于本地观看视频内容的与会者,但我们有可能让会议主持人在 Jitsi 中运行它并与直播共享。其中一种方法是使用开源广播工具 OBS,这样每个观看直播的人都能受益于字幕功能。

在会后编辑视频时,我们发现了内置于我们首选的开源视频编辑软件 Kdenlive 中的一项功能,它能够自动生成字幕并自动放置到视频中。在 Kdenlive 手册 中有关于如何使用这个功能的基本说明。Fedora 设计团队成员 Kyle Conway 在协助会后视频编辑时,制作了一份 详细教程(包括视频指导):如何在 Kdenlive 中自动生成并添加字幕。如果你对这个功能感兴趣,阅读和观看这个教程会非常有帮助。

视频编辑志愿者工作

活动结束后,我们在会议的 Element 频道中召集了一组志愿者,共同进行视频编辑工作,包括添加标题卡、片头/片尾音乐以及进行整体清理。我们自动生成的一些重播录像可能会分为两个文件,或者与其他多个演讲合并在一个文件中,因此需要重新组装或裁剪。

我们使用 GitLab Epic 来组织这项工作,其中包含常见问题和寻找按技能组织的志愿者的帮助,每个视频工作都附加有相应的议题。我们为每个视频设置了一系列自定义标签,以明确该视频的状态以及需要何种帮助。所有视频的编辑工作都已完成,其中一些视频需要为其在 创意自由峰会频道 上的描述区域撰写内容。许多视频都有自动生成的字幕,但字幕中可能存在拼写错误和其他常见的自动生成文本错误,还需要进行编辑修正。

GitLab 上需要编辑帮助的视频清单的截图

我们通过让志愿者从创意自由峰会的 PeerTube 主频道的未编辑录像中下载原始视频来传递这些视频文件(由于文件大小可能相当大)。当志愿者准备好分享编辑好的视频时,我们有一个私人的 PeerTube 账户,他们可以将视频上传到该账户。具有主频道账户访问权限的管理员会定期从私人账户中获取视频,并将其上传到主账户中。请注意,PeerTube 并没有一个多个账户访问同一频道的系统,因此我们不得不进行密码共享,这可能有些令人紧张。我们认为这是一个合理的妥协,可以限制掌握主要密码的人数,同时仍然可以让志愿者提交编辑好的视频而不会太过麻烦。

准备尝试一下吗?

我希望这个对于我们如何使用开源工具集来举办创意自由峰会的全面描述能够激发你尝试在你的开源活动中使用这些方法。让我们知道进展如何,并随时联系我们如果你有问题或改进建议!我们的频道链接为:https://matrix.to/#/#creativefreedom:fedora.im

(题图:MJ/cb6a4ea4-95ed-40cb-9e78-85f8676219f2)


via: https://opensource.com/article/23/4/open-source-tools-virtual-conference

作者:Máirín Duffy 选题:lkxed 译者:ChatGPT 校对:wxy

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

跟随这个演示来了解我如何使用 Git 为 Foreman 编写文档。

作为 ATIX 的技术作家,我的任务包括为 Foreman 创建和维护存放在 github.com/theforeman/foreman-documentation 的文档。Git 帮助我跟踪内容的版本,并与开源社区进行协作。它是我存储工作成果、共享和讨论改进的重要工具。我主要使用的工具包括浏览器、用 OpenSSH 连接 Foreman 实例、用 Vim 编辑源文件,以及使用 Git 进行版本控制。

本文重点介绍在开始使用 Git 和为 Foreman 文档做贡献时经常遇到的挑战。适用于中级 Git 用户。

先决条件

  • 你已在系统上安装和配置了 Git。你至少需要设置用户名和电子邮件地址。
  • 你在 github.com 上拥有一个帐户。GitHub 本身并不是一个开源项目,但它是许多开源 Git 存储库的托管站点(包括 Foreman 的文档)。
  • 你已将 foreman-documentation 存储库复刻到你自己的账户或组织(例如,github.com/<My_User_Account>/foreman-documentation,这里 <My_User_Account> 是你的 GitHub 用户名)。有关更多信息,请参阅 Kedar Vijay Kulkarni 的 Kedar Vijay Kulkarni 的 Git 逐步指南
  • 你已将你的 SSH 公钥添加到 GitHub。这是将你的更改推送到 GitHub 所必需的。有关更多信息,请参阅 Nicole C. Baratta 的《GitHub 简单指引》。

对 Foreman 文档做出贡献

Foreman 是一个开源项目,依靠社区的贡献而发展壮大。该项目欢迎所有人的参与,并且只有一些要求才能做出有意义的贡献。这些要求和惯例在 README.mdCONTRIBUTING.md 文件中有详细记录。

以下是在处理 Foreman 文档时最常见的一些任务。

我想开始贡献 Foreman 文档

1、从 github.com 克隆存储库:

$ git clone [email protected]:theforeman/foreman-documentation.git
$ cd foreman-documentation/

2、重命名远程存储库:

$ git remote rename origin upstream

3、可选:确保你的本地主分支跟踪 theforeman 组织的 foreman-documentation 存储库的 master 分支:

$ git status

这将自动将你置于默认分支(本例中为 master)的最新提交上。

4、如果你的账户或组织中尚未有该存储库的 复刻 Fork ,请创建一个。前往 github.com/theforeman/foreman-documentation 并点击 “ 复刻 Fork ” 按钮。

5、将你的复刻添加到你的存储库中:

$ git remote add github [email protected]:<My_User_Account>/foreman-documentation.git

你的本地存储库现在有两个远程存储库:upstreamgithub

我想扩展 Foreman 文档

对于简单的更改,比如修正拼写错误,你可以直接创建一个拉取请求(PR)。

1、创建一个分支,例如 fix_spellinggit switch 命令用于切换当前所在的分支,-c 参数用于创建分支:

$ git switch -c fix_spelling

2、进行你的更改。

3、添加你的更改并进行提交:

$ git add guides/common/modules/abc.adoc
$ git commit -m "Fix spelling of existing"

良好的 Git 提交消息的重要性无需再强调。提交消息告诉贡献者你做了哪些工作,因为它与代码库的其余部分一起保存,所以它在查看代码时起到历史注释的作用,帮助了解代码的演化过程。有关优秀的 Git 提交消息的更多信息,请参阅由 cbeams 撰写的 《创建完美的 Git 提交信息的 7 条规则》。

4、可选但建议的操作:查看并验证与默认分支的差异。foreman-documentation 的默认分支称为 master,但其他项目可能有不同的命名(例如 maindevdevel)。

$ git diff master

5、将分支推送到 GitHub。这将发布你的更改到你的代码库副本:

$ git push --set-upstream github fix_spelling

6、点击终端中 Git 提供的链接来创建一个拉取请求(PR):

remote: Create a pull request for 'fix_spelling' on Github by visiting:
remote:      https://github.com/_My_User_Account_/foreman-documentation/pull/new/fix_spelling

7、在解释中说明社区为什么应该接受你的更改。对于修正拼写错误等简单 PR,这并不是必需的,但对于重大更改则很重要。

我想将我的分支变基到 master

1、确保你的本地 master 分支跟踪的是 github.com/theforeman/foreman-documentationmaster 分支,而不是你自己命名空间下的 foreman-documentation

$ git switch master

此时应该显示 Your branch is up to date with 'upstream/master',其中 upstream 是指向 github.com/theforeman/foreman-documentation 的远程存储库的名称。你可以通过运行 git remote -v 来查看远程存储库设置情况。

2、从远程获取可能的更改。git fetch 命令会从远程下载被跟踪的分支,并且使用 --all 选项可以同时更新所有分支。在使用其他分支时这是必要的。--prune 选项会删除对已不存在的分支的引用。

$ git fetch --all --prune

3、将可能的更改从 upstream/master 拉取到你的本地 master 分支。git pull 命令将跟踪的分支上的提交复制到当前分支。这用于将你的本地 master 分支“更新”为远程(在本例中为 GitHub)master 分支的最新状态。

$ git pull

4、将你的分支 变基 rebase master

$ git switch my_branch
$ git rebase -i master

我在 master 分支上意外地提交了代码

1、创建一个分支来保存你的工作:

$ git switch -c my_feature

2、切换回 master 分支:

$ git switch master

3、回退 master 分支上的最后一次提交:

$ git reset --soft HEAD~1

4、切换回 my_feature 分支并继续工作:

$ git switch my_feature

我想修改我的提交消息

1、如果你的分支只有一次提交,可以使用 git amend 来修改你的最后一次提交:

$ git commit --amend

这假设你没有将其他文件添加到暂存区(即,没有运行过 git add My_File,并且没有进行提交)。

2、使用 --force 选项将你的 “更改” 推送到 GitHub,因为 Git 提交消息是你现有提交的一部分,所以你正在更改分支上的历史记录:

$ git push --force

我想重新整理单个分支上的多个更改

1、可选但强烈推荐:从 GitHub 获取更改。

$ git switch master
$ git fetch
$ git pull

这确保你将其他更改按照它们被合并到 master 中的顺序直接合并到你的分支中。

2、若要重新整理你的工作,请对你的分支进行变基并根据需要进行更改。对于将分支变基到 master,这意味着你需要更改你的分支上第一个提交的父提交:

$ git rebase --interactive master

使用你喜欢的编辑器打开变基交互界面,将第一个单词 pick 替换为你要修改的提交。

  • 使用 e 来对你的提交进行实际更改。这会中断你的变基操作!
  • 使用 f 将一个提交与其父提交合并。
  • 使用 d 完全删除一个提交。
  • 移动行以改变你更改的顺序。

成功进行变基后,你自己的提交将位于 master 上最后一个提交的顶部。

我想从其他分支复制一个提交

1、从稳定分支(例如名为 3.3 的分支)获取提交的 ID,请使用 -n 选项限制提交数量:

$ git log -n 5 3.3

2、通过挑选提交来复制更改到你的分支。-x 选项将提交的 ID 添加到你的提交消息中。这仅建议在从稳定分支挑选提交时使用:

$ git switch My_Branch
$ git cherry-pick -x Commit_ID

更多技巧

在 ATIX,我们运行一个 GitLab 实例,用于内部共享代码、协作以及自动化测试和构建。对于围绕 Foreman 生态系统的开源社区,我们依赖于 GitHub。

我建议你始终将名为 origin 的远程指向你的内部的版本控制系统。这样做可以防止在纯粹凭记忆进行 git push 时向外部服务泄露信息。

此外,我建议使用固定的命名方案来命名远程。我总是将指向自己的 GitLab 实例的远程命名为 origin,将指向开源项目的远程命名为 upstream,将指向我在 Github 上的复刻的远程命名为 github

对于 foreman-documentation,该存储库具有相对较平的历史记录。当处理更复杂结构时,我倾向于以非常可视化的方式思考 Git 存储库,其中节点(提交)指向线上的节点(分支),这些分支可以交织在一起。图形化工具如 gitkGit Cola 可以帮助可视化你的 Git 历史记录。一旦你完全掌握了 Git 的工作原理,如果你更喜欢命令行,可以使用别名。

在进行具有大量预期合并冲突的大型变基之前,我建议创建一个“备份”分支,以便你可以快速查看差异。请注意,要永久删除提交是相当困难的,因此在进行重大更改之前,请在本地 Git 存储库中进行测试。

Git 对技术文档编写者的帮助

Git 对技术文档编写者来说是一个巨大的帮助。不仅可以使用 Git 对文档进行版本控制,还可以与他人积极地进行协作。

(题图:MJ/1fb1dd43-e460-4e76-9ff6-b6ef76570f7e)


via: https://opensource.com/article/22/11/git-tips-technical-writers

作者:Maximilian Kolb 选题:lkxed 译者:ChatGPT 校对:wxy

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

在这篇文章中,我们将向你展示如何在 Kubernetes(k8s)集群中设置动态 NFS 配置。

Kubernetes 中的动态 NFS 存储配置允许你按需自动为 Kubernetes 应用配置和管理 NFS(网络文件系统)卷。它允许创建持久卷(PV)和持久卷声明(PVC),而无需手动干预或预配置存储。

NFS 配置程序负责动态创建 PV 并将其绑定到 PVC。它与 NFS 服务器交互,为每个 PVC 创建目录或卷。

先决条件

  • 预装 Kubernetes 集群
  • 具有 Kubernetes 集群管理员权限的普通用户
  • 互联网连接

事不宜迟,让我们深入探讨步骤:

步骤 1、准备 NFS 服务器

就我而言,我将在 Kubernetes 主节点(Ubuntu 22.04)上安装 NFS 服务器。登录主节点并运行以下命令:

$ sudo apt update
$ sudo apt install nfs-kernel-server -y

创建以下文件夹并使用 NFS 共享它:

$ sudo mkdir /opt/dynamic-storage
$ sudo chown -R nobody:nogroup /opt/dynamic-storage
$ sudo chmod 777 /opt/dynamic-storage

/etc/exports 文件中添加以下条目:

$ sudo vi /etc/exports
/opt/dynamic-storage 192.168.1.0/24(rw,sync,no_subtree_check)

保存并关闭文件。

注意:不要忘记更改导出文件中适合你的部署的网络。

要使上述更改生效,请运行:

$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server
$ sudo systemctl status nfs-kernel-server

NFS-Service-Status-Kubernetes-Master-Ubuntu

在工作节点上,使用以下 apt 命令安装 nfs-common 包。

$ sudo apt install nfs-common -y

步骤 2、安装和配置 NFS 客户端配置程序

NFS 子目录外部配置程序在 Kubernetes 集群中部署 NFS 客户端配置程序。配置程序负责动态创建和管理由 NFS 存储支持的持久卷(PV)和持久卷声明(PVC)。

因此,要安装 NFS 子目录外部配置程序,首先使用以下命令集安装 helm

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

运行以下命令来启用 helm 仓库:

$ helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner

使用以下 helm 命令部署配置程序:

$ helm install -n nfs-provisioning --create-namespace nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.1.139 --set nfs.path=/opt/dynamic-storage

helm-install-nfs-provisioning-kubernetes-cluster

上面的 helm 命令将自动创建 nfs-provisioning 命名空间,并安装 NFS 配置程序的容器荚/部署、名称为 nfs-client 的存储类,并将创建所需的 rbac。

$ kubectl get all -n nfs-provisioning
$ kubectl get sc -n nfs-provisioning

kubectl-get-all-nfs-provisioning-kubernetes-cluster

完美,上面的输出确认了配置程序容器荚和存储类已成功创建。

步骤 3、创建持久卷声明(PVC)

让我们创建 PVC 来为你的容器荚或部署请求存储。PVC 将从存储类 nfs-client 请求特定数量的存储:

$ vi demo-pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: demo-claim
  namespace: nfs-provisioning
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Mi

保存并关闭文件。

PVC-Yaml-Dynamic-NFS-Kubernetes

运行以下 kubectl 命令以使用上面创建的 YML 文件创建 PVC:

$ kubectl create -f demo-pvc.yml

验证 PVC 和 PV 是否创建:

$ kubectl get pv,pvc -n nfs-provisioning

Verify-pv-pvc-dynamic-nfs-kubernetes-cluster

太好了,上面的输出表明 PV 和 PVC 创建成功。

步骤 4、测试并验证动态 NFS 配置

为了测试和验证动态 NFS 配置,请使用以下 YML 文件启动测试容器荚:

$ vi test-pod.yml
kind: Pod
apiVersion: v1
metadata:
  name: test-pod
  namespace: nfs-provisioning
spec:
  containers:
  - name: test-pod
    image: busybox:latest
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "touch /mnt/SUCCESS && sleep 600"
    volumeMounts:
      - name: nfs-pvc
        mountPath: "/mnt"
  restartPolicy: "Never"
  volumes:
    - name: nfs-pvc
      persistentVolumeClaim:
        claimName: demo-claim

Pod-Yml-Dynamic-NFS-kubernetes

使用以下 kubectl 命令部署容器荚:

$ kubectl create -f test-pod.yml

验证 test-pod 的状态:

$ kubectl get pods -n nfs-provisioning

Verify-Test-Pod-Using-NFS-Volume-Kubernetes

登录到容器荚并验证 NFS 卷是否已安装。

$ kubectl exec -it test-pod -n nfs-provisioning /bin/sh

Access-Dynamic-NFS-Inside-Pod-Kubernetes

太棒了,上面容器荚的输出确认了动态 NFS 卷已安装且可访问。

最后删除容器荚和 PVC,查看 PV 是否自动删除。

$ kubectl delete -f test-pod.yml
$ kubectl delete -f demo-pvc.yml
$ kubectl get pv,pvc -n  nfs-provisioning

Delete-Pod-PVC-Dynamic-NFS

这就是这篇文章的全部内容,希望对你有所帮助。请随时在下面的评论部分发表你的疑问和反馈。

(题图:MJ/75dae36f-ff68-4c63-81e8-281e2c239356)


via: https://www.linuxtechi.com/dynamic-nfs-provisioning-kubernetes/

作者:Pradeep Kumar 选题:lkxed 译者:geekpi 校对:wxy

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

关于著名的 Linux Shell - Bash、Zsh 和 Fish 的一些注释和特性。

Linux 之所以强大,是因为它提供了用于与系统进行交互的多功能的命令行界面。在这中情况下,Shell 扮演了用户和 Linux 内核之间的桥梁。本文将探讨三种流行的 Linux Shell - Bash、Zsh 和 Fish,并深入了解它们的独特特性和功能。

理解 Linux Shell

什么是 Shell?

Shell 是一个命令行解释器,允许你通过文本命令与操作系统进行交互。它接收你的输入,处理它,并与 Linux 内核通信以执行所请求的操作。最后,它会给你一个输出。

(LCTT 译注:“Shell” 一词大约取自其“界面”、“外壳”的含义。)

Shell 在 Linux 中起着至关重要的作用,因为它们使用户能够执行各种任务,从简单的文件导航到复杂的系统管理任务。不同的 Shell 提供各种功能,因此选择适合你工作流程的 Shell 至关重要。

Bash

Bash,全称 “Bourne Again SHell”,是 Linux 发行版中最广泛使用的默认 Shell 之一。它以其简洁和兼容性而闻名,是初学者的优秀选择。

Bash 的特点

Bash 具有众多特性,包括:

  • 命令历史:使用箭头键轻松访问先前执行的命令。
  • Tab 键补全:节省时间,让 Bash 为你自动完成文件名和命令。
  • 脚本编写:编写和运行 Shell 脚本以自动化重复任务。从这个角度来看,它也是一个程序。
  • Bash 在大多数 GNU/Linux 系统中默认安装。
  • 配置设置存储在家目录下的 .bashrc 文件中。

和其他 Shell 一样,Bash 有其优点和缺点。使用 Bash 的一些优势包括广泛的使用性、详尽的文档以及庞大的社区支持。然而,Bash 可能缺乏其他 Shell 中存在的一些现代化特性。

Linux 中的 Bash shell

安装

  • 在 Linux 发行版中打开终端。
  • 输入 bash --version 检查是否已安装 Bash。
  • 若尚未安装,使用软件包管理器安装 Bash。例如,在 Ubuntu 上,输入 sudo apt-get install bash
  • 对于 Fedora 和基于 RPM 的 Linux,请使用 sudo dnf install bash

Zsh

Zsh,全称 “Z Shell”,是一种强大且功能丰富的 Shell,深受经验丰富的用户欢迎。它吸取了 Bash 和其他 Shell 的优点,提升了用户体验。

Zsh 的优势

Zsh 提供了几个优势,包括:

  • 高级自动补全:Zsh 在 Bash 的基础上提供了更多上下文感知的建议,超越了简单的 Tab 键补全。
  • 当你按下 Tab 键时,Zsh 会显示可能的值以供选择,同时进行自动补全。
  • 插件支持:通过社区中提供的各种插件,扩展 Zsh 的功能。
  • 这里有一个 庞大的 Zsh 主题集合
  • 你还可以使用 Oh My Zsh 脚本 进行广泛的自定义。

应用 powerlevel10k zsh 主题后的效果

Zsh 的复杂性可能使新手感到不知所措,其丰富的配置选项可能会使初学者感到困惑。

以下是安装 Zsh 的方法:

  • 在 Linux 发行版中打开终端。
  • 输入 zsh --version 检查是否已安装 Zsh。
  • 如果尚未安装,请使用软件包管理器安装 Zsh。
  • 例如,在 Ubuntu 上,输入 sudo apt-get install zsh
  • 对于 Fedora 和基于 RPM 的发行版,输入 sudo dnf install zsh

Fish Shell

Fish,全称 “Friendly Interactive SHell”,着重于用户友好性和易用性。它拥有现代、直观的界面,特别适合新的 Linux 用户。

Fish 的独特特性

Fish 的独特之处在于:

  • 语法高亮:使用彩色标记文本来区分命令、选项和参数。
  • 自动建议:Fish 根据你的历史记录和当前输入智能地建议命令。
  • Fish 被设计为开箱即用的高效工具。但是,你可以通过创建 ~/.config/fish/config.fish 文件并添加自定义配置来进一步个性化它。

虽然 Fish 在用户友好性方面表现出色,但其独特的设计可能并不适合所有人。一些高级用户可能会发现某些功能在高级使用方面有所限制。

Fish Shell

Fish Shell 的安装

  • 在 Linux 发行版中打开终端。
  • 输入 fish --version 检查是否已安装 Fish。
  • 如果尚未安装,请使用软件包管理器安装 Fish。例如,在 Ubuntu 上,输入 sudo apt-get install fish
  • 对于 Fedora 和其他基于 RPM 的发行版,输入 sudo dnf install fish

Bash、Zsh 和 Fish 的比较

为了帮助你决定哪种 Shell 适合你的需求,让我们从各个方面比较这三个流行选择:

性能与速度

Bash 以其速度和高效性而闻名,适用于资源受限的系统。Zsh 虽然稍慢一些,但其广泛的功能和能力弥补了这一点。作为更具交互性的 Shell,Fish Shell 可能会略微降低性能,但提供了愉快的用户体验。

用户界面和体验

Bash 的界面简单明了,非常适合初学者,而 Zsh 和 Fish 提供了更引人注目和交互式的界面。Zsh 的高级自动补全和 Fish 的语法高亮为用户创造了视觉上的吸引力。

可定制性和插件

Zsh 在可定制性方面表现出色,允许用户对其 Shell 环境进行微调。通过庞大的插件集合,Zsh 提供了无与伦比的可扩展性。Fish 则采取了更有主见的方式,专注于开箱即用的可用性,这可能对某些用户有所限制。

选择合适的 Shell

选择合适的 Shell 与你的具体需求和经验水平密切相关。

如果你是 Linux 的新手并且更喜欢简单、无花俏的体验,Bash 是一个极好的起点。它的易用性和详尽的文档使其非常适合初学者。

对于希望更多掌握控制权并愿意花时间进行定制的经验丰富的用户来说,Zsh 强大的功能和插件提供了一个令人兴奋和动态的环境。

如果你对自动化任务和编写复杂的 Shell 脚本感兴趣,Bash 在 Linux 生态系统中的广泛应用和全面支持使其成为一个可靠的选择。

结论

Bash、Zsh 和 Fish 各有其优势,满足不同用户偏好。如果你刚接触 Linux,Bash 的简单性使其成为一个极好的起点。精通用户和那些寻求定制化的用户可能会觉得 Zsh 更吸引人,而 Fish 的用户友好设计则适合寻求直观界面的初学者。最终,选择权在你手中,探索这些 Shell 将带来更高效和愉悦的 Linux 使用体验。

你最喜欢的 Shell 是什么?在下方的评论框中告诉我。

(题图:MJ/b6490b57-63bd-4fdd-bd3f-bf6d4aef1c4a)


via: https://www.debugpoint.com/linux-shells/

作者:Arindam 选题:lkxed 译者:ChatGPT 校对:wxy

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