7 月 23 日下午，由 Linux 中国主办，龙蜥社区联合主办，奇虎 360、图灵社区、Slash Data 支持的 LLUG 2023 上海场活动在上海市 360 大厦成功举办。本次活动分为主题演讲和闪电演讲，来自技术社区、龙蜥社区和 Linux 中国的社区的分享者分享了自己的实践，现场的观众也在闪电演讲环节积极分享，大家热情交流。现场爱好者听分享腾讯云 TVP 肖力老师分享了他自己的成长路径，以及对于 Linux 新手们的建议，帮助大家理解云计算到底是什么以及如何更好的了解、使用云计算；龙蜥社区运营委员蔡佳丽则分享了龙蜥技术认证背后的设计理念和心得，并分享了目前龙蜥技术认证的具体情况；Linux 中国的技术组组长 Bestony 正式发布了 LCTT.Tools ，并进行了现场的演示，邀请更多社区爱好者参与并体验该工具。Linux 中国的创始人老王则远程分享了作为新手，如何更加高效的参与开源。肖力老师的现场分享龙蜥社区运营委员蔡佳丽分享龙蜥社区技术认证老王分享如何高效的参与开源除了主题演讲之外，来自现场爱好者的闪电演讲的分享，也赢得了满堂喝彩，胡张治同学分享了他自己从一个 Linux 小白逐渐成长为 ArchLinuxCN 的维护者的经历，并介绍他自己对于不同发行版的看法；来自大连的孙捂饭同学，则介绍了自己作为一个传统的运维工程师，对于 LLUG 线下活动的感想和体验；李轲韡介绍自己作为一个从事 Linux 发行版工作的软件公司，是如何看待 Anolis OS 的，帮助大家从一个从业者的视角，理解 Anolis OS 的价值；李伟光（a.k.a.地瓜）现场安利了一波 NeoVim，让大家知道了 Vim 的一个有趣的发行版。胡张治分享自己从 GNU/Linux 小白到 ArchLinuxCN 贡献者的旅程李伟光现场介绍 neovim 的使用PPT 及视频下载LLUG 的创办希望帮助 Linux 社区当中的每一个人都可以充分的交流经验和心得，所以我们也将本次活动的视频以及演示文稿开放出来，供大家查看。视频托管在 Bilibili，PPT 文稿则托管在 Github 的 Linux-CN/LLUG-Shares 仓库中，供大家下载。本次活动的 PPT 及视频的汇总在这里，方便大家下载和在线查看。类型活动主题主讲人PPT在线视频主题演讲浅谈云计算架构设计肖力下载地址bilibili主题演讲龙蜥技术认证介绍蔡佳丽下载地址bilibili主题演讲高效开源（个人篇）wxy下载地址暂缺（准备重新录制），文字稿主题演讲LCTT Tools Releasebestony下载地址bilibili闪电演讲从 GNULinux 小白到 archlinuxcn 维护者胡张治无bilibili闪电演讲技术，以人为本。沟通，无处不在孙捂饭无bilibili闪电演讲Neovim的简单介绍李伟光无bilibili闪电演讲浅谈龙蜥系统在千寻的应用和思考李轲韡无bilibili关于深圳，你想聊点什么？北京、上海，下一步，LLUG 将在 8 月份，来到鹏城深圳，和深圳的爱好者们，一起交流。如果你感兴趣，来到 LLUG 现场分享你和 Linux 的故事，欢迎扫描下方二维码，提交你的分享议题～议题提交（题图：MJ/2f6c9c25-86df-48c8-9268-7dd187cbe649）
硬核观察 #1079 GNOME 正在开发新的马赛克窗口管理系统
GNOME 正在开发新的马赛克窗口管理系统GNOME 希望能有更强大的窗口管理系统，除了经典的浮动堆叠模式和平铺模式外，他们设计了一种新的马赛克模式作为默认模式，它结合了平铺和浮动的优点。（不是你想的那个“马赛克”?）当你打开一个窗口，它就会以最适合应用程序的大小在屏幕中央打开。当你打开更多窗口时，现有的窗口会移到一边，为新窗口腾出空间。如果新窗口不合适，例如，因为它想最大化，它就会移动到自己的工作区。如果窗口布局接近填满屏幕，窗口就会自动平铺。但要想让每个人都满意新的窗口管理器，他们必须进行大量的用户研究，并测试无数种方案，可以想象，这可能需要数月甚至数年的时间。消息来源：GNOME老王点评：GNOME 和 KDE 不缺乏创新，并不只是抄袭 Windows 和 macOS，甚至反过来被抄袭。Linux 上的桌面环境缺乏的是精细打磨。目前仍有 10,000 台大型机在使用大型计算机通常被视为像恐龙一样古老的机器，但是，专门用于处理海量数据的大型机在今天仍然非常重要。据估计，目前仍在使用的大型机有一万台。世界上最大的公司几乎都在使用它们，其中包括三分之二的《财富》500 强公司。而这些大型机大多来自 IBM。今天的大型机可以拥有多达 240 个服务器级 CPU、40TB 的纠错 RAM 和多 PB 的冗余闪存二级存储。消息来源：Ars Technica老王点评：一方面，云计算并没有那么可靠，另外一方面，旧的信息基础设施很难迁移，或者说，不敢迁移。抗量子加密技术还需要数年能够破解公钥加密的量子计算机可能还需要几年时间。不幸的是，支持抗量子加密技术的产品也是如此。NIST 上周宣布的第二轮后量子算法评估预计将耗时数年，而 FIPS 产品验证流程也有后顾之忧。新标准一般需要 4 到 6 年的时间，供应商才能开发出执行该标准的专用集成电路，然后，供应商还需要时间来验证产品。由于现在窃取的加密数据可以在稍后解密，因此“现在收获，稍后解密”攻击的可能性“是一个已经存在的量子计算安全问题”。消息来源：E-Security Planet老王点评：如果不能在量子计算机真正发挥作用之前就部署好抗量子加密算法，那几乎可以肯定会面临大量的泄密事件，世界的真相也将更早揭晓。
Fedora Linux 提供了多个变体以满足你的需求。你可以在我之前的文章《Fedora Linux 的各种版本》中找到所有 Fedora Linux 变体的概述。本文将对 Fedora Linux 官方版本进行更详细的介绍。共有五个 版本 Edition ： Fedora Workstation、Fedora Server、Fedora IoT、Fedora CoreOS 和 Fedora Silverblue。Fedora Linux 下载页面目前显示其中三个为 官方 版本，另外两个为 新兴 版本。本文将涵盖所有五个版本。Fedora Workstation如果你是笔记本电脑或台式计算机用户，则 Fedora Workstation 是适合你的操作系统。Fedora Workstation 非常易于使用。你可以用它满足日常工作、教育、爱好等需求。例如，你可以使用它创建文档，制作演示文稿，上网冲浪，处理图像，编辑视频等等。这个 Fedora Linux 版本默认使用 GNOME 桌面环境。你可以使用这种环境舒适地工作和进行各种活动。你还可以根据个人喜好自定义 Fedora Workstation 的外观，让你在使用过程中更加舒适。如果你是 Fedora Workstation 的新用户，你可以阅读我之前的文章 在安装 Fedora Workstation 之后要做的事。通过该文章，你将更容易上手 Fedora Workstation。更多信息请参阅以下链接：Fedora WorkstationFedora Server许多公司需要自己的服务器来支持基础设施。Fedora Server 版操作系统配备了一个强大的基于 Web 的管理界面称为 Cockpit，具有现代化的外观。Cockpit 可以让你轻松查看和监控系统性能和状态。Fedora Server 包含一些开源世界中的最新技术，并得到一个活跃的社区的支持。它非常稳定可靠。然而，并不保证 Fedora 社区中的任何人都能够在你遇到问题时提供帮助。如果你运行的是关键任务的应用程序，并且可能需要技术支持，你可能要考虑使用 Red Hat Enterprise Linux。更多信息请访问以下链接：Fedora ServerFedora IoT为物联网设备专门设计的操作系统越来越受欢迎。Fedora IoT 就是为了应对这一需求而创建的操作系统。Fedora IoT 是一个不可变操作系统，使用 OSTree 技术来进行原子更新。该操作系统专注于物联网设备的安全性，这非常重要。Fedora IoT 支持多种架构。它还配备了一个基于 Web 的配置控制台，因此可以在不需要键盘、鼠标或监视器物理连接到设备的情况下进行远程配置。更多信息请访问以下链接：Fedora IoTFedora CoreOSFedora CoreOS 是一个面向容器的操作系统。该操作系统用于在任何环境中安全可靠地运行应用程序。它设计用于集群，但也可以作为独立系统运行。该操作系统与 Linux 容器配置具有高度兼容性。更多信息请访问以下链接：Fedora CoreOSFedora Silverblue这个版本是 Fedora Workstation 的一个变体，界面并没有太大区别。但是，Fedora Silverblue 是一个不可变的操作系统，采用以容器为中心的工作流程。这意味着每个安装的副本与同一版本的其他副本完全相同。其目标是使其更加稳定，更少出现错误，并更容易进行测试和开发。更多信息请访问以下链接：Fedora Silverblue结论Fedora Linux 的每个版本都有不同的目的。多个版本的可用性可以帮助你获得适合你需求的操作系统。本文讨论的 Fedora Linux 版本是在 Fedora Linux 的主要下载页面上提供的操作系统。你可以在 https://getfedora.org/ 找到下载链接和更完整的文档说明。（题图：MJ/90ffba71-aee2-4429-a846-41f06997792c）via: https://fedoramagazine.org/fedora-linux-editions-part-1-official-editions/作者：Arman Arisman 选题：lkxed 译者：ChatGPT 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
本文章向你介绍了 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 中内置的一些命令包括 clear、cd、eval 和 exec，还有 ls 和 mkdir 这样的应用程序。内置在 Shell 中的命令因 Shell 而异。在本文中，我们将涵盖与 Bash 相关的几个方面。更多关于 Shell 的内容我们中的大多数人都用过像 ls、cd 和 mkdir 这样的命令。当我们在一个目录上运行 ls -l 命令时，该目录中的所有子目录和文件都会在屏幕上列出。如果数量很大，屏幕会滚动。如果终端不支持滚动条（在很多年里都是如此），则无法查看已滚动过的条目。为了克服这个问题，我们使用像 more 和 less 这样的命令。它们允许我们逐页查看输出。通常使用的命令是：ls -l | less 在这里 Shell 是在做什么？看起来像是单个命令，实际上是 ls 和 less 两个命令依次执行。管道符（|）将这两个程序连接起来，但连接由 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 "spark.yarn.principal=abcd@abcd.com" --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 SERVICE_PRINCIPAL=abcd@abcd.com 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中国 荣誉推出
FSF 指谷歌在 WEI 上的做法是“邪恶先锋”自由软件基金会（FSF）的 Greg Farough 批评谷歌提出的网络环境完整性（WEI）是对自由互联网的全面攻击。称该政策文件所强调的使用案例与其真正的使用案例相比，简直是小巫见大巫，因为其真正的使用案例是制定一种方法来完全彻底地限制互联网的自由。借助 WEI，政府将可以利用它来确保只有其官方 “批准”（读作：后门）的浏览器才能访问互联网；Netflix 等公司将利用它来推进数字限制管理（DRM）；谷歌将利用它来拒绝用户访问其服务，除非用户使用的浏览器符合其利润率。最初 WEI 还只是发布在 GitHub 上的一份无伤大雅的 政策文件，但谷歌现在已将其快速发展到 Chromium 浏览器中，WEI 将很快就会出现在我们面前。他说，“曾经有段时间谷歌的理念是‘不作恶’，它如此短时间内就在 WEI 上取得进展，我们可以非常肯定地说，他们现在的政策是要成为邪恶先锋。”消息来源：FSF老王点评：很多人没太理解 WEI 的危害，而这篇文章清晰的分析了其潜在的危害。但是，这种程度的社区抗议恐怕无济于事。谷歌比较忌惮的是其它企业和政府对它的反对。除了支持 Firefox 这类自由的浏览器之外，我们还可以寄希望于在其它的 Chromium 下游版本中去除 WEI。AlmaLinux 向红帽示好，被拒绝了红帽关闭 CentOS，推行 CentOS Stream 成为 RHEL 上游，其中一个理由是希望社区来参与 CentOS Stream/RHEL 的开发，并指责 AlmaLinux 等 RHEL 克隆品只是简单的重建，而没有做出任何贡献。而 AlamLinux 一方面表示将不再寻求 1:1 克隆，将在 RHEL 之外合并补丁，另外一方面“也尝试在 CentOS Stream 中测试和复制问题”，以示好红帽。最近，AlmaLinux 提交了一个 Iperf3 的 CVE 修复到 CentOS Stream。但红帽公司的一位高级软件工程师回复说：“感谢您的贡献。目前，我们不打算在 RHEL 中解决这个问题，不过我们会根据客户需求继续评估。”AlamLinux 不理解“只需合并即可，为什么还要拒绝修复呢？”之前曾经称 AlmaLinux 等“只是简单地重建代码”的红帽公司核心平台（又名 RHEL）副总裁 Mike McGrath 对 AlmaLinux 表示了感谢，但拒绝了这些代码。事后，McGrath 承认错失了对 AlmaLinux 表达善意的机会，并提升了该 CVE 的等级，合并了这些代码。消息来源：ZDNet老王点评：只是说说而已，谁让你真提交代码了，没事就给添乱，你知道你提交了代码，红帽要做作多少回归测试吗。Python 接受可选全局解释器锁提案Python 指导委员会宣布，它计划接受 PEP 703，让全局解释器锁成为可选，即 No-GIL 模式。预计将在 Python 3.13 初步支持该模式。CPython 的全局解释器锁（GIL）阻止了同时多线程执行代码，成为了在多核 CPU 上提高 Python 代码运行效率的一大障碍。Meta 公司承诺为 PEP 703 提案提供 人力支持。Python 指导委员会强调了兼容性的重要性，要避免出现类似 Python 3 的情况，称它不是 Python 4。消息来源：Python 基金会老王点评：不是 Python 4，胜似 Python 4，这一改进对将 Python 应用到重要领域很有意义。
在大多数编程语言中，你都会找到字符串数据类型。字符串基本上是一组字符。但 Bash Shell 有所不同。字符串没有单独的数据类型。这里一切都是变量。但这并不意味着你不能像在 C 和其他编程语言中那样处理字符串。在 Bash Shell 中可以查找子字符串、替换子字符串、连接字符串以及更多字符串操作。在 Bash 基础知识系列的这一部分中，你将学习基本的字符串操作。在 Bash 中获取字符串长度让我们从最简单的选项开始。也就是获取字符串的长度。这很简单：${#string} 让我们在示例中使用它。正如你所看到的，第二个示例中有两个单词，但由于它用引号引起来，因此它被视为单个单词。连空格都算作一个字符。在 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" 以下是该脚本的运行示例：在 Bash 中提取子字符串假设你有一个包含多个字符的大字符串，并且你想要提取其中的一部分。要提取子字符串，需要指定主字符串、子字符串的起始位置和子字符串的长度，如下所示：${string:$pos:$len} ? 和数组一样，字符串中的定位也是从 0 开始。这是一个例子：即使你指定的子字符串长度大于字符串长度，它也只会到达字符串末尾。替换 Bash 中的子字符串假设你有一个大字符串，并且你想用另一个字符串替换其中的一部分。在这种情况下，你可以使用这种语法：${string/substr1/substr2} ✋ 只有第一次出现的子字符串才会以这种方式替换。如果要替换所有出现的地方，请使用 ${string//substr1/substr2}这是一个例子：正如你在上面看到的，“good” 一词被替换为 “best”。我将替换的字符串保存到同一字符串中以更改原始字符串。? 如果未找到子字符串，则不会替换任何内容。它不会导致错误。在 Bash 中删除子字符串我们来谈谈删除子字符串。假设你要删除字符串的一部分。在这种情况下，只需将子字符串提供给主字符串，如下所示：${string/substring} ✋ 通过这种方式，仅删除第一次出现的子字符串。如果要删除所有出现的内容，请使用 ${string//substr}如果找到子字符串，则将从字符串中删除它。让我们通过一个例子来看看。不用说，如果没有找到子字符串，则不会删除它。它不会导致错误。?️ 练习时间现在是你通过简单练习来实践字符串操作的时候了。练习 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 进行直播我们在创意自由峰会的直播中使用了由 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 ” 按钮：2、设置选项点击 “ 进行直播 Go live ” 选项卡（从左数第四个），并设置以下选项： 频道 Channel ：（你希望直播发布在的频道名称） 隐私 Privacy ：公开单选按钮： 普通直播 Normal live 然后选择 “ 进行直播 Go live ” 。 （不用担心，你还不会真正开始直播，还有更多数据需要填写。）3. 基本信息（暂时不要点击更新按钮）首先，在 基本信息 Basic info 选项卡中填写信息，然后在下一步选择 高级设置 Advanced settings 选项卡。填写直播流的名称、描述、标签、类别、许可证等。在转码复选框启用后记得发布。这样一来，一旦直播结束，录制视频将自动发布到你的频道上。4. 高级设置你可以上传一个“待机”图像，当观看直播流 URL 并等待开始时，该图像会显示在所有人面前。这是我们在创意自由峰会上使用的待机图像：5. 在 PeerTube 上开始直播选择右下角的 “ 更新 Update” 按钮。直播流将显示如下，直到你从 Jitsi 开始直播： 6. 将直播流的 URL 复制粘贴到 Jitsi这是 PeerTube 的最后一步。一旦直播流启动，点击视频下方右侧的 “...” 图标：选择 “ 显示直播信息 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 直播到 PeerTube1、加入会议并点击屏幕底部红色挂断按钮旁边的 “...” 图标。2、从弹出菜单中选择 “ 开始直播 Start live stream ”。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/Matrix，并有机会在注册遇到任何问题时都可以获得帮助（实际上没有人遇到问题）。在活动开始之前，我们与所有演讲者建立了一个实时的交流渠道，以便我们能够轻松地发送公告和更新。在活动期间，这个聊天室成为一个有用的地方，用于协调演讲者之间的过渡，提醒日程是否延迟，以及在一个情况下，当我们的演讲者出现紧急情况无法按原定时间发言时，迅速重新安排演讲时间。我们还为主持人设置了一个房间，但在我们的情况下，它是多余的。我们只是使用后台频道进行协调。我们发现两个频道很容易监控，但三个频道对于方便起见有点太多了。公告和问答：Etherpad/Hackmd.io我们在 Element 主频道中设置了一个固定的小部件，提供有关活动的一般信息，包括每日日程安排、行为准则等。我们还为每个演讲设置了一个问答部分，让与会者可以在其中提出问题，主持人会为演讲者朗读这些问题。在开始的一两天中，我们发现一些与会者在加载 Etherpad 小部件时遇到问题，因此我们改为在频道中固定一个内嵌的 hackmd.io 文档作为小部件，那似乎效果更好一些。我们并不 100% 确定小部件加载问题的具体原因，但我们可以在频道主题中发布一个原始（非内嵌）链接，这样参与者就可以绕过通过小部件访问时可能遇到的任何问题。综合和集中的会议体验通过 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 来组织这项工作，其中包含常见问题和寻找按技能组织的志愿者的帮助，每个视频工作都附加有相应的议题。我们为每个视频设置了一系列自定义标签，以明确该视频的状态以及需要何种帮助。所有视频的编辑工作都已完成，其中一些视频需要为其在 创意自由峰会频道 上的描述区域撰写内容。许多视频都有自动生成的字幕，但字幕中可能存在拼写错误和其他常见的自动生成文本错误，还需要进行编辑修正。我们通过让志愿者从创意自由峰会的 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中国 荣誉推出
科学海盗湾 Sci-Hub 创始人获 EFF 年度大奖电子前沿基金会（EFF）将 2023 年度大奖授予了 Sci-Hub 的创始人 Alexandra Elbakyan。Sci-Hub 是她在 2011 年还是一名大学生时创办的，为所有科学知识提供免费不受限制的访问。它在今天发展成为一个包含逾 8830 万篇论文和书籍的数据库，任何人都可以下载和阅读。EFF 称，Sci-Hub 是数百万学生和研究人员的重要资源。一些医学专家甚至认为，该网站有助于挽救生命。Sci-Hub 打破了期刊出版业的垄断机制，因而她成为了众多诉讼和政府行动的目标，但她仍然坚持其信念而不动摇。本次获奖者还有 图书馆自由项目 Library Freedom Project 和 Signal 基金会。Linux 之父 Linus Torvalds 之前也获得过该奖项。消息来源：EFF老王点评：无需多说，就一个字，?昨天是系统管理员日昨天（7 月 28 日）是 “ 系统管理员日 System Administrator Appreciation Day ”，其组织者表示，全世界都应该借此机会 “向那些风雨无阻地预防灾难、保护 IT 安全和扑灭技术火灾的英雄们致敬”。该活动由系统管理员 Ted Kekatos 于 1999 年创立，每年 7 月的最后一个星期五都会举行庆祝活动，以表彰和感谢这些兢兢业业，但往往不被重视的 IT 专业人员所做出的贡献。消息来源：The Register老王点评：国内了解并庆祝该日子的系统管理员们非常少，连我这样一个老系统管理员都是第一次知道。国内往往会庆祝另外一个日子 —— 代表 7X24 运维的 7.24。美国立法禁止汽车制造商在新车中取消调幅广播今年至少有七家汽车制造商在其电动汽车中 取消 了调幅广播，其中包括福特、特斯拉、宝马和大众。迫于压力，福特在今年 5 月改变了取消的做法。美国参议院商业委员会周四批准了一项立法，禁止汽车制造商在新车中取消调幅广播。立法者称，失去调幅广播会破坏向公众提供关键公共安全信息的联邦系统。消息来源：路透社老王点评：虽然调幅广播是很老的技术了，但是它仍然有不可取代的优势。你有多久没有收听过调幅广播了？
跟随这个演示来了解我如何使用 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.md 和 CONTRIBUTING.md 文件中有详细记录。以下是在处理 Foreman 文档时最常见的一些任务。我想开始贡献 Foreman 文档1、从 github.com 克隆存储库：$ git clone git@github.com: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 git@github.com:<My_User_Account>/foreman-documentation.git 你的本地存储库现在有两个远程存储库：upstream 和 github。我想扩展 Foreman 文档对于简单的更改，比如修正拼写错误，你可以直接创建一个拉取请求（PR）。1、创建一个分支，例如 fix_spelling。git 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，但其他项目可能有不同的命名（例如 main、dev 或 devel）。$ 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，这并不是必需的，但对于重大更改则很重要。我想将我的分支变基到 master1、确保你的本地 master 分支跟踪的是 github.com/theforeman/foreman-documentation 的 master 分支，而不是你自己命名空间下的 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 存储库，其中节点（提交）指向线上的节点（分支），这些分支可以交织在一起。图形化工具如 gitk 或 Git 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 在工作节点上，使用以下 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 命令将自动创建 nfs-provisioning 命名空间，并安装 NFS 配置程序的容器荚/部署、名称为 nfs-client 的存储类，并将创建所需的 rbac。$ kubectl get all -n nfs-provisioning $ kubectl get sc -n nfs-provisioning 完美，上面的输出确认了配置程序容器荚和存储类已成功创建。步骤 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 保存并关闭文件。运行以下 kubectl 命令以使用上面创建的 YML 文件创建 PVC：$ kubectl create -f demo-pvc.yml 验证 PVC 和 PV 是否创建：$ kubectl get pv,pvc -n nfs-provisioning 太好了，上面的输出表明 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 使用以下 kubectl 命令部署容器荚：$ kubectl create -f test-pod.yml 验证 test-pod 的状态：$ kubectl get pods -n nfs-provisioning 登录到容器荚并验证 NFS 卷是否已安装。$ kubectl exec -it test-pod -n nfs-provisioning /bin/sh 太棒了，上面容器荚的输出确认了动态 NFS 卷已安装且可访问。最后删除容器荚和 PVC，查看 PV 是否自动删除。$ kubectl delete -f test-pod.yml $ kubectl delete -f demo-pvc.yml $ kubectl get pv,pvc -n nfs-provisioning 这就是这篇文章的全部内容，希望对你有所帮助。请随时在下面的评论部分发表你的疑问和反馈。（题图：MJ/75dae36f-ff68-4c63-81e8-281e2c239356）via: https://www.linuxtechi.com/dynamic-nfs-provisioning-kubernetes/作者：Pradeep Kumar 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出