Bash 脚本编程入门

Summary: 初学者们，让我们在这个大型的教程中来认识一下 Bash 脚本编程。

初学者们，让我们在这个大型的教程中来认识一下 Bash 脚本编程。

# Bash 脚本编程入门

>
> 初学者们，让我们在这个大型的教程中来认识一下 Bash 脚本编程。
>
>
>

Shell 是 Linux 的核心部分，它允许你使用各种诸如 `cd`、`ls`、`cat` 等的命令与 Linux 内核进行交互。

Bash 是 Linux 上众多可用的 Shell 中的一个。这些 Shell 主要的语法基本相同，但并非完全一样。Bash 是目前最受欢迎的 Shell，并在大多数 Linux 发行版中被设为默认 Shell。

当你打开一个终端或 SSH 会话时，即使你无法真切地看到它，你其实已经在运行着一个 Shell。

当你输入一个命令，它会被 Shell 解释。如果命令和语法是正确的，它就会被执行，否则你会看到一个错误。

### 当你可以直接运行 Linux 命令时，为什么还需要 Bash 脚本？

你可以直接在终端输入命令，它们就会被执行。

```
$ echo "hello world"
hello world

```

并且，同样的操作也可以在脚本中进行：

```
$ cat >> script.sh
#!/bin/bash

echo "hello world"
$ bash script.sh
hello world

```

那么，为什么我们需要 Shell 脚本呢？因为你不必一遍又一遍地输入同一个命令，你只需运行 Shell 脚本即可。

此外，如果你的脚本中有复杂的逻辑，把所有的命令都输入到终端中可能并不是一个好主意。

例如，如果你输入下面的命令，它会奏效，但这并不容易理解。不断地输入相同的命令（甚至要在 Bash 历史记录中搜索）会造成困扰。

```
if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

```

相反，你可以把命令放进 shell 脚本中，这样就更容易理解并且可以轻松运行了：

```
#!/bin/bash

if [ $(whoami) = 'root' ]; then
    echo "You are root"
else
    echo "You are not root"
fi

```

这还是比较简单的情况。尝试想象一下，一个复杂的脚本可能有五十行或一百行！

### 你将会学到什么？

在这个 Bash 脚本教程中，有九个部分。你将会学到：

* 创建并运行你的第一个 Bash Shell 脚本
* 使用变量
* 在你的 Bash 脚本中传递参数和接受用户输入
* 进行数学计算
* 操作字符串
* 使用条件语句，例如 `if-else`
* 使用 `for`、`while` 和 `until` 循环
* 创建函数

>
> ? 所有的部分都会给你一个简单的例子。如果你愿意，你可以通过访问每个部分的详细章节来更深入地学习。这些章节也都包含了实践练习。
>
>
>

### 这个教程的目标读者是谁？

这个教程适合任何想要开始学习 Bash Shell 脚本的人。

如果你是一名学生，而你的课程里包括了 Shell 脚本，那么这个系列就是为你准备的。

如果你是一个常规的桌面 Linux 用户，这个系列将会帮助你理解在探索各种软件和修复问题时遇到的大多数 Shell 脚本。你也可以使用它来自动化一些常见的、重复的任务。

在这个 Bash 脚本教程结束时，你应该可以编写简单的 Bash 脚本。

>
> ? 希望你已经拥有 Linux 命令行和编程语言的基础知识。
>
>
>

如果你对 Linux 命令行完全不熟悉，我建议你先掌握基础知识。

>
> **[19 个你应该知道的基础而重要的 Linux 终端技巧](https://itsfoss.com/basic-terminal-tips-ubuntu/)**
>
>
>

你应该了解如何在命令行中进入特定的位置。为了做到这一点，你需要理解 Linux 文件系统中的路径是如何工作的。

>
> **[Linux 中的绝对路径和相对路径有什么不同](https://linuxhandbook.com/absolute-vs-relative-path/)**
>
>
>

接下来，这个教程系列会给你介绍目录导航和文件操作的基本知识。

>
> **[终端基础：Linux 终端入门](/article-16104-1.html)**
>
>
>

### 1、编写你的第一个 Bash Shell 脚本

创建一个名为 `hello.sh` 的新文件：

```
nano hello.sh

```

这将在终端中打开 nano 编辑器。在其中输入以下几行代码：

```
#!/bin/bash
echo "Hello World"

```

通过按 `Ctrl+X` 键可以保存并退出 nano 编辑器。

现在，你可以以以下方式运行 Bash Shell 脚本：

```
bash hello.sh

```

你应该可以看到以下的输出：

```
Hello World

```

另一种方式是首先赋予脚本执行权限：

```
chmod u+x hello.sh

```

然后这样运行它：

```
./hello.sh

```

>
> ? 你也可以使用基于图形用户界面的文本编辑器来编写脚本。这可能更适合编写较长的脚本。然而，你需要切换到保存脚本的目录中才能运行它。
>
>
>

恭喜！你刚刚运行了你的第一个 Bash 脚本。

>
> **[Bash 基础知识系列 #1：创建并运行你的第一个 Bash Shell 脚本](/article-15921-1.html)**
>
>
>

### 2、在 Bash 脚本中使用变量

变量的声明方式如下：

```
var=some_value

```

然后可以像这样访问变量：

```
$var

```

>
> ? 在声明变量时，等号（`=`）前后不能有空格。
>
>
>

我们通过添加一个变量来修改前面的脚本。

```
#!/bin/bash
message="Hello World"
echo $message

```

如果运行这个脚本，输出仍然会保持不变。

```
Hello World

```

>
> **[Bash 基础知识系列 #2：在 Bash 中使用变量](/article-15991-1.html)**
>
>
>

### 3、向 Bash 脚本传递参数

你可以在运行 Bash 脚本时以以下方式传递参数：

```
./my_script.sh arg1 arg2

```

在脚本中，你可以使用 `$1` 来代表第 1 个参数，用 `$2` 来代表第 2 个参数，以此类推。`$0` 是一个特殊变量，它代表正在运行的脚本的名字。

现在，创建一个新的 shell 脚本，命名为 `arguments.sh`，并向其中添加以下几行代码：

```
#!/bin/bash

echo "Script name is: $0"
echo "First argument is: $1"
echo "Second argument is: $2"

```

使其可执行并像这样运行它：

```
$ ./argument.sh abhishek prakash
Script name is: ./argument.sh
First argument is: abhishek
Second argument is: prakash

```

让我们快速看一下特殊变量：

| 特殊变量 | 描述 |
| --- | --- |
| `$0` | 脚本名称 |
| `$1`、`$2`...`$9` | 脚本参数 |
| `${n}` | 10 到 255 的脚本参数 |
| `$#` | 参数数量 |
| `$@` | 所有参数一起 |
| `$$` | 当前 shell 的进程 id |
| `$!` | 最后执行命令的进程 id |
| `$?` | 最后执行命令的退出状态 |

你也可以通过接受键盘输入使你的 Bash 脚本变得交互式。

为此，你必须使用 `read` 命令。你还可以使用 `read -p` 命令提示用户进行键盘输入，而不需要 `echo` 命令。

```
#!/bin/bash

echo "What is your name, stranger?"
read name
read -p "What's your full name, $name? " full_name
echo "Welcome, $full_name"

```

现在，如果你运行这个脚本，当系统提示你输入“参数”时，你必须输入。

```
$ ./argument.sh
What is your name, stranger?
abhishek
What's your full name, abhishek? abhishek prakash
Welcome, abhishek prakash

```

>
> **[Bash 基础知识系列 #3：传递参数和接受用户输入](/article-16001-1.html)**
>
>
>

### 4、执行算术运算

在 Bash Shell 中执行算术运算的语法是这样的：

```
$((arithmetic_operation))

```

下面是你可以在 Bash 中执行的算术运算的列表：

| 操作符 | 描述 |
| --- | --- |
| `+` | 加法 |
| `-` | 减法 |
| `*` | 乘法 |
| `/` | 整数除法（没有小数） |
| `%` | 模运算（只余） |
| `**` | 指数（a 的 b 次方） |

以下是在 Bash 脚本中进行加法和减法的示例：

```
#!/bin/bash

read -p "Enter first number: " num1
read -p "Enter second number: " num2

sum=$(($num1+$num2))
sub=$(($num1-$num2))
echo "The summation of $num1 and $num2 is $sum"
echo "The substraction of $num2 from $num1 is $sub"

```

你可以执行 Shell 脚本，使用你选择的任意数字作为参数。

如果你尝试除法，会出现一个大问题。Bash 只使用整数。默认情况下，它没有小数的概念。因此，你会得到 10/3 的结果为3，而不是 3.333。

对于浮点数运算，你需要这样使用 `bc` 命令：

```
#!/bin/bash

num1=50
num2=6

result=$(echo "$num1/$num2" | bc -l)

echo "The result is $result"

```

这个时候，你将看到准确的结果。

```
    The result is 8.33333333333333333333

```

>
> **[Bash 基础知识系列 #4：算术运算](/article-16006-1.html)**
>
>
>

### 5、在 Bash 脚本中使用数组

你可以使用 Bash 中的数组来存储同一类别的值，而不是使用多个变量。

你可以像这样声明一个数组：

```
distros=(Ubuntu Fedora SUSE "Arch Linux" Nix)

```

要访问一个元素，使用：

```
${array_name[N]}

```

像大多数其他的编程语言一样，数组的索引从 0 开始。

你可以像这样显示数组的所有元素：

```
${array[*]}

```

这样获取数组长度：

```
${#array_name[@]}

```

>
> **[Bash 基础知识系列 #5：在 Bash 中使用数组](/article-16016-1.html)**
>
>
>

### 6、Bash 中的基础字符串操作

Bash 能够执行许多字符串操作。

你可以使用这种方式获取字符串长度：

```
${#string}

```

连接两个字符串：

```
str3=$str1$str2

```

提供子字符串的起始位置和长度来提取子字符串：

```
${string:$pos:$len}

```

这里有一个例子：

你也可以替换给定字符串的一部分：

```
${string/substr1/substr2}

```

并且你也可以从给定字符串中删除一个子字符串：

```
    ${string/substring}

```

>
> **[Bash 基础知识系列 #6：处理字符串操作](/article-16047-1.html)**
>
>
>

### 7、在 Bash 中使用条件语句

你可以通过使用 `if` 或 `if-else` 语句为你的 Bash 脚本添加条件逻辑。这些语句以 `fi` 结束。

单个 `if` 语句的语法是：

```
if [ condition ]; then
  your code
fi

```

注意使用 `[ ... ];` 和 `then` 。

`if-else` 语句的语法是：

```
if [ expression ]; then
    ## execute this block if condition is true else go to next
elif [ expression ]; then
    ## execute this block if condition is true else go to next
else
    ## if none of the above conditions are true, execute this block
fi

```

这里有一个使用 `if-else` 语句的 Bash 脚本示例：

```
#!/bin/bash

read -p "Enter the number: " num
mod=$(($num%2))

if [ $mod -eq 0 ]; then
    echo "Number $num is even"
else
    echo "Number $num is odd"
fi

```

运行它，你应该能看到这样的结果：

`-eq` 被称为测试条件或条件操作符。有许多这样的操作符可以给你不同类型的比较：

这些是你可以用来进行数值比较的测试条件操作符：

| 条件 | 当...时，等同于 true |
| --- | --- |
| `$a -lt $b` | `$a < $b` （`$a` 是小于 `$b`） |
| `$a -gt $b` | `$a > $b` （`$a` 是大于 `$b`） |
| `$a -le $b` | `$a <= $b` （`$a` 是小于或等于 `$b`） |
| `$a -ge $b` | `$a >= $b` （`$a` 是大于或等于 `$b`） |
| `$a -eq $b` | `$a == $b` （`$a` 等于 `$b`） |
| `$a -ne $b` | `$a != $b` （`$a` 不等于 `$b`） |

如果你在进行字符串比较，你可以使用以下这些测试条件：

| 条件 | 当...时，等同于 true |
| --- | --- |
| `"$a" = "$b"` | `$a` 等同于 `$b` |
| `"$a" == "$b"` | `$a` 等同于 `$b` |
| `"$a" != "$b"` | `$a` 不同于 `$b` |
| `-z "$a"` | `$a` 是空的 |

还有些条件用于检查文件类型：

| 条件 | 当...时，等同于 true |
| --- | --- |
| `-f $a` | `$a` 是一个文件 |
| `-d $a` | `$a` 是一个目录 |
| `-L $a` | `$a` 是一个链接 |

>
> ? 要特别注意空格。开括号和闭括号、条件之间必须有空格。同样地，条件操作符（`-le`、`==` 等）之前和之后必须有空格。
>
>
>

>
> **[Bash 基础知识系列 #7：If-Else 语句](/article-16083-1.html)**
>
>
>

### 8、使用 Bash 脚本中的循环

Bash 支持三种类型的循环：`for`、`while` 和 `until`。

这是 `for` 循环的一个例子：

```
#!/bin/bash

for num in {1..10}; do
    echo $num
done

```

运行它，你将看到以下输出：

```
1
2
3
4
5
6
7
8
9
10

```

如果你选择使用上面的示例，可以使用 `while` 循环这样重写：

```
#!/bin/bash

num=1
while [ $num -le 10 ]; do
    echo $num
    num=$(($num+1))
done

```

同样，可以使用 `until` 循环来重写：

```
#!/bin/bash

num=1
until [ $num -gt 10 ]; do
    echo $num
    num=$(($num+1))
done

```

>
> ? `while` 循环和 `until` 循环非常相似。区别在于：`while` 循环在条件为真时运行，而 `until` 循环在条件为假时运行。
>
>
>

>
> **[Bash 基础知识系列 #8：For、While 和 Until 循环](/article-16114-1.html)**
>
>
>

### 9、在 Bash 脚本中使用函数

Bash Shell 支持使用函数，这样你不必反复编写相同的代码片段。

这是声明 Bash 函数的通用语法：

```
function_name() {
  commands
}

```

这是一个使用带参数的函数的 Bash 脚本样例：

```
#!/bin/bash

sum() {
    sum=$(($1+$2))
    echo "The sum of $1 and $2 is: $sum"
}

echo "Let's use the sum function"
sum 1 5

```

如果你运行该脚本，你将看到以下输出：

```
Let's use the sum function
The sum of 1 and 5 is: 6

```

>
> **[Bash 基础知识系列 #9：Bash 中的函数](/article-16116-1.html)**
>
>
>

### 接下来呢？

这只是一个初窥。这个 Bash 脚本教程只是一篇引言。Bash 脚本的内容还有很多，你可以慢慢地、逐渐地探索。

GNU Bash 参考是一份优秀的在线资源，可以解答你的 Bash 疑问。

>
> **[GNU Bash 参考](https://www.gnu.org/software/bash/manual/bash.html)**
>
>
>

除此之外，你可以下载这本免费书籍来学习更多在此未涵盖的 Bash 内容：

>
> **[下载 Bash 初学者指南](https://tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf)**
>
>
>

一旦你具有足够的 Bash 基础知识，你可以通过这本免费书籍来学习高级 Bash 脚本：

>
> **[下载高级 Bash 编程指南](https://tldp.org/LDP/abs/abs-guide.pdf)**
>
>
>

这两本书至少都有十年的历史，但你仍然可以使用它们来学习 Bash。

? 希望你喜欢这个作为学习 Bash 脚本起点的教程。请在评论区提供你的反馈。

*（题图：MJ/98f47121-7426-4297-9242-8683ccf0496d）*

---

via: <https://itsfoss.com/bash-scripting-tutorial/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1102 英伟达显卡 BIOS 签名锁被破解

Summary:
? 英伟达显卡 BIOS 签名锁被破解
? 现在可以在 Excel 中使用 Python
? 用人工智能工具将旧的 COBOL 代码转换为 Java
»
»

IT界的圣经：只要能运行就别折腾。

COBOL、VBA这些古董玩意儿早就该扔了

来自广东广州的 Chrome Mobile 90.0|Android 11 用户

# 硬核观察 #1102 英伟达显卡 BIOS 签名锁被破解

### 英伟达显卡 BIOS 签名锁被破解

十年来，英伟达一直利用其显卡的 BIOS 签名检查来提高其设备 vBIOS 和固件的安全性。但这导致开源的 Nouveau 驱动程序受到限制，只能以较低的启动时钟频率运行。以至于 GeForce GTX 700 系列仍然是开源 Nouveau 驱动程序支持最好的系列。现在，TechPowerUP 发布的运行在 Windows 上的工具破解了英伟达 BIOS 签名锁，可以支持 vBIOS 修改和与新一代 GPU 的交叉刷新。这个签名锁的破解是否会对 Nouveau 开发人员产生有意义的影响还不确定，但有可能不会，因为存在法律灰色地带。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/NVIDIA-Lock-Broken)**
>
>
>

>
> 老王点评：如果签名锁的机制被进一步披露，或许开源的英伟达显卡驱动会有质的变化。
>
>
>

### 现在可以在 Excel 中使用 Python

微软发布了 Python in Excel 的公开预览版，无需任何设置就可以在同一工作簿中结合 Python 和 Excel 分析。使用新的 `PY()` 函数，用户可以直接在单元格中输入 Python 代码，Python 计算在微软云中运行，计算结果会返回到工作表中。用户也可以利用 Python 图表库创建各种专业可视化图表，进行机器学习、预测分析、数据清理等工作。Python 之父退休后在微软任职，他帮助定义了 Python in Excel 的架构。他说，“当我三年前加入微软时，我做梦也想不到会有这种可能。”

>
> **[消息来源：微软](https://techcommunity.microsoft.com/t5/excel-blog/announcing-python-in-excel-combining-the-power-of-python-and-the/ba-p/3893439)**
>
>
>

>
> 老王点评：这确实是一种奇妙的组合，两种最常用的数据分析方式结合在一起了。只是，VBA 以后怎么办？
>
>
>

### 用人工智能工具将旧的 COBOL 代码转换为 Java

IBM 称，有数十亿行 COBOL 代码可能需要进行现代化处理，这包括重构 COBOL 中的业务服务，将代码转换为 Java 代码，然后借助自动测试验证结果。IBM 将于 2023 年推出一个生成式人工智能工具，以加快 IBM Z 大型机上 COBOL 到 Java 的翻译速度。它生成的 Java 代码是面向对象的，但仍可以与 COBOL 应用程序的其余部分以及 CICS、IMS、DB2 等关键服务和其他 z/OS 运行时进行互操作。

>
> **[消息来源：The Register](https://www.theregister.com/2023/08/22/ibm_says_genai_can_convert/)**
>
>
>

>
> 老王点评：这样的话，就不用担心当那些 COBOL 程序员逐渐老了甚至去世，没人维护那些几十年前的银行基础设施了。
>
>
>


如何在 GitLab 执行器中使用 Podman

# 如何在 GitLab 执行器中使用 Podman

>
> 使用 Podman 启动 GitLab 执行器有多种方法，我在本文中概述了其中两种。
>
>
>

GitLab <ruby> 执行器 <rt>  Runner </rt></ruby> 是一个与 GitLab CI/CD 配合使用的应用，可在 GitLab 基础设施上的流水线中运行作业。它们通常用于在提交代码后自动编译应用或在代码库上运行测试。你可以将它们视为基于云的 [Git 钩子](https://www.redhat.com/sysadmin/git-hooks?intcmp=7013a000002qLH8AAM)。

主要的公共 [GitLab 实例](https://gitlab.com) 提供了许多易于访问的共享执行器，可供你在 CI 流水线中使用。你可以在 GitLab 上仓库的 <ruby> 设置 <rt>  Settings </rt></ruby> -> CI/CD -> <ruby> 执行器 <rt>  Runners </rt></ruby> 中找到共享执行器的列表。

你可能不想依赖共享执行器，而是选择自己的执行器，原因有很多。例如，控制执行器运行的基础设施以实现额外的安全性和/或隐私、灵活的执行器配置或分配给你的 GitLab 用户帐户的有限 CI 分钟数。

GitLab 执行器依赖于 <ruby>   执行环境  <rt>  executor </rt></ruby> 工具来运行 CI 作业。执行环境有许多选项可用：Docker、Kubernetes、VirtualBox 等。

那么，Podman 作为执行环境呢？

自 [v4.2.0](https://github.com/containers/podman/releases/tag/v4.2.0) 起，Podman 对 GitLab 执行器提供了原生支持。以下是使用 Podman 作为 GitLab 执行器的 [执行环境](https://docs.gitlab.com/runner/executors/docker.html) 的两种方法的快速浏览。

### Docker 执行环境

你可以在 GitLab 执行器中使用 Podman 作为 Docker 的直接替代品。就是这样：

本示例使用 2023 年 2 月的 CentOS Stream 9 环境，使用 Podman v4.4.0。它应该可以在任何具有足够新的 Podman 的 RHEL/CentOS Stream/Fedora 环境中正常工作。查看 [GitLab 文档](https://docs.gitlab.com/runner/executors/docker.html#use-podman-to-run-docker-commands) 了解先决条件。

首先，安装 Podman：

```
$ sudo dnf -y install podman

```

接下来安装 **gitlab-runner** 包：

```
# 添加 GitLab 执行器仓库
$ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash

# 安装 gitlab-runner 包
$ sudo dnf -y install gitlab-runner

```

最后，允许用户在注销后执行任务：

```
$ sudo loginctl enable-linger gitlab-runner

```

#### 配置并注册执行器

使用以下步骤配置 Docker 运行环境。

安装 **gitlab-runner** 包会创建一个 **gitlab-runner** 用户帐户，但你需要 root 访问权限才能操作该用户帐户。**gitlab-runner** 可以在用户模式下运行，但需要一些手动干预来进行构建处理。在此示例中，我使用 `sudo` 在系统模式下运行它。它看起来是这样的：

```
$ sudo gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=7978 revision=d540b510 version=15.9.1
Running in system-mode.

Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.com
Enter the registration token:
xxxxxxxxxxxxxxxxx
Enter a description for the runner:
[lmandvek-c9s-gitlab-runner]:
Enter tags for the runner (comma-separated):

Enter optional maintenance note for the runner:

WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://gitlab.com/gitlab-org/gitlab/-/issues/380872
Registering runner... succeeded                     runner=GR13489419oEPYcJ8
Enter an executor: custom, docker, ssh, docker-ssh+machine, docker-ssh, parallels, shell, virtualbox, docker+machine, instance, kubernetes:
docker
Enter the default Docker image (for example, ruby:2.7):
registry.gitlab.com/rhcontainerbot/pkg-builder
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"

```

你将需要一些额外的配置才能使用 Podman。配置执行器为每个作业创建一个网络。有关更多信息，请参阅 [GitLab 文档](https://docs.gitlab.com/runner/executors/docker.html#create-a-network-for-each-job)。

首先，启用 Podman 系统服务并修改 `/etc/gitlab-runner/config.toml` 中的环境：

```
[[runners]]
    environment = ["FF_NETWORK_PER_BUILD=1"]
    [runners.docker]
        host = "unix:///run/user/1001/podman/podman.sock"

```

重启执行器以实施更改：

```
$ sudo gitlab-runner restart

```

验证新的执行器在 GitLab 项目的 <ruby> 设置 <rt>  Settings </rt></ruby> -> CI/CD -> <ruby> 执行器 <rt>  Runners </rt></ruby> 中可见：

接下来，验证你的 CI 流水线正在使用执行器。你的 CI 任务日志将提及正在使用的执行器的名称以及任何其他配置信息，例如 执行器的执行环境的功能标志和容器镜像。

### Podman-in-Podman（pipglr）

[Chris Evich](https://gitlab.com/cevich) 创建了 [pipglr](https://gitlab.com/qontainers/pipglr)，这是一个 Podman-in-Podman 设置，用于使用免 root 的 Podman 来支持你自己的免 root 的 GitLab 执行器。此方法不需要对 `.gitlab-ci.yaml` 配置进行任何更改，因此你可以继续按原样使用现有设置。

以下是帮助你运行此程序的快速设置指南。

#### 配置步骤

容器镜像是从 [pipglr Containerfile](https://gitlab.com/qontainers/pipglr) 自动构建的，因此将镜像设置为该仓库：

```
$ IMAGE="registry.gitlab.com/qontainers/pipglr:latest"

```

接下来，使用你的 GitLab 注册令牌创建 Podman 密钥：

```
$ echo '<actual registration token>' | podman secret create REGISTRATION_TOKEN -

```

创建一个空白的 `config.toml`，稍后将包含你的所有执行器设置。你必须执行此步骤才能使以下 `podman container register runlabel $IMAGE` 步骤成功：

```
$ touch ./config.toml  # 重要:文件必须存在，即使是空的。

```

注册你的执行器。你可以重复此步骤来注册多个执行器。如果你想使用可能不同的标签或配置选项集并行运行多个 CI 任务，这非常有用。

```
$ podman container runlabel register $IMAGE

```

使用你选择的编辑器编辑 `config.toml`。这是可选的，但通常需要更改用于实际 CI 任务的容器镜像。默认情况下，镜像设置为：`registry.fedoraproject.org/fedora:latest`。

```
$ $EDITOR ./config.toml  # if desired

```

最后，配置对卷的访问。容器卷内使用多个用户，因此你必须专门配置它们以允许访问。再次使用 `runlabel` 来完成：

```
$ podman container runlabel setupstorage $IMAGE

$ podman container runlabel setupcache $IMAGE

```

#### 测试执行器

是时候检查配置了。首先启动 GitLab 执行器容器：

```
$ podman container runlabel run $IMAGE

```

允许执行器用户在注销后运行服务：

```
$ sudo loginctl enable-linger $(id -u)

```

验证你的新执行器在 GitLab 项目的 <ruby> 设置 <rt>  Settings </rt></ruby> -> CI/CD -> <ruby> 执行器 <rt>  Runners </rt></ruby> 中可见：

最后，验证你的 CI 流水线正在使用你的执行器：

### 总结

使用 Podman 启动 GitLab 执行器有多种方法，我在此处概述了其中两种。尝试一下，然后让我知道哪一个最适合你。如果 Docker 执行环境方法有任何问题，请登录并通过 [Podman 上游](https://github.com/containers/podman/issues/new/choose) 或 [GitLab 支持](https://about.gitlab.com/support/#contact-support) 提交问题。如果 pipglr 方法出现问题，请在 pipglr 上游 [提交问题](https://gitlab.com/qontainers/pipglr/-/issues/new)。

GitLab 与 Podman 一起运行愉快 ?

*（题图：MJ/97e0ff4d-b769-4e20-990f-8c1e89e48434）*

---

via: <https://opensource.com/article/23/3/podman-gitlab-runners>

作者：[Lokesh Mandvekar](https://opensource.com/users/lsm5) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


LibreOffice 7.6 发布，下一个版本 24.2

# LibreOffice 7.6 发布，下一个版本 24.2

>
> LibreOffice 7.6 版本已经到来，这个版本为我们带来了众多优秀的改进。
>
>
>

LibreOffice 7.6 是这款优秀的开源办公套件的最新重要升级。

在其上一次的 [LibreOffice 7.5 版本发布](https://news.itsfoss.com/libreoffice-7-5-release/) 中，开发者们发布了新的应用图标和一系列的功能提升。而这一次，它为我们带来了一套全新的功能组合。

>
> ? 从 **2024** 年开始，文档基金会将实行基于日历的版本编号，意即，计划于 2024 年 2 月发布的下一个版本将以 **LibreOffice 24.2** 的形式呈现给大家。
>
>
>

让我们看一下这次发布的新版本有哪些新添的亮点。

### LibreOffice 7.6：有哪些亮点？

保持一贯的预期，所有工具都带来了显著的改良，对 Writer、Calc 和 Impress 的改进更是明显，包括以下几点：

* 对文档主题的全面支持
* 对帮助功能的升级改进
* 在兼容性上进行的改善
* 新的页码向导功能（Writer）
* 幻灯片的导航面板功能（Impress）
* 色彩排序的自动过滤器支持（Calc）

#### 对于 Writer 的优化

此次更新中的主要亮点是提供了对文档主题的支持。简单来说，当需要的时候，你可以为你的文档标题、正文和副标题挑选一套预设的颜色搭配。

你可以通过菜单 “<ruby> 格式 <rt>  Format </rt></ruby> → <ruby> 主题 <rt>  Themes </rt></ruby>” 来找到这项功能。

一个细微但重大的改进是在 “<ruby> 插入 <rt>  Insert </rt></ruby>” 菜单中新增了一个向导，可以使用它在页眉/页脚添加页码。

新增了一个选项，使你能够通过聚光灯功能在文本中高亮显示段落样式或直接格式。

在面向用户体验的改进方面，你在编辑文档时可以从侧边栏方便快捷地找 到 “<ruby> 无障碍检查 <rt>  Accesbility Check </rt></ruby>” 选项。

其他改动包括：

* 依靠段落样式，现可以更加灵活地创建图表了
* 现在能够直接在关联表格中编辑参考文献条目了
* 如果你无意间试图删除文档中的隐藏部分，Writer 会发出警告提醒
* Writer 现在接受用于短语检查的自定义词典了

#### Calc 的改进

新的颜色排序功能使得排序变得更为容易。

除此之外，还有一个用于数据透视表的紧凑的新布局。其他细微和技术层面的改进包括：

* 复制到另一个文件的电子表格保留了用户定义的打印范围
* 可以自定义新注释的默认外观
* 会保存求解器设置
* 如果表格为空，则在删除时不会显示确认
* 超链接格式已经进行改善，使其看起来更为醒目

#### Impress 与 Draw 的改进

现在，当你播放一个演示文稿时，会出现便于快速浏览的导航按钮。这是个小改动，但是应该可以帮助你轻松地在幻灯片之间进行导航。

其他的改进包括：

* 增加了对多图片 tiff 文件的支持
* 可以在导航器中按照从前到后的顺序列出对象

#### 其他变化

除了之前的亮点，你还可以得到一个已有所改进的 “<ruby> 帮助 <rt>  Help </rt></ruby>” 部分。这里将展示关于改变布局或快速完成许多任务所需的命令/快捷键信息。

如果你想深入了解, 可以查阅 [LibreOffice 7.6 发行备注](https://wiki.documentfoundation.org/ReleaseNotes/7.6)。

### 如何升级/安装？

对于大部分用户来说，LibreOffice 可能已经预安装好了。如果是这样的话，你应该等待来自你的系统仓库、LibreOffice 的 PPA，或者 Flathub 的更新。这通常需要几天时间。

>
> ? 你也可以选择从你的系统中卸载 LibreOffice，并通过以下步骤获取新版本。但如果你能等待，我们建议你等待。
>
>
>

如果你还没有安装它并想要获取新版本，只需要根据你的需求（DEB/RPM）简单地 [下载 tar 包](https://www.libreoffice.org/download/download-libreoffice/)。

接下来，解压这个包，并在 `DEBS` 或 `RPMS` 文件夹下找到所有 .deb/.rpm 文件。

当你进入这个文件夹，在终端中使用右键菜单打开它（如图所示）并根据你的包输入以下命令之一（适用于 Fedora 和基于 Debian 的发行版）：

```
sudo dnf install *.rpm
sudo dpkg -i *.deb

```

? 你对最新的 LibreOffice 发行版本有什么想法？请在下方的评论区分享你的看法。

*（题图：MJ/1afe80f6-a7dd-4e9e-ac77-f8581492b08a）*

---

via: <https://news.itsfoss.com/libreoffice-7-6/>

作者：[Ankush Das](https://news.itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1103 谷歌工程师日常：一日一小时工作制

Summary:
? 谷歌工程师日常：一日一小时工作制
? Meta 推出全能 AI 翻译模型：100 种语言，声音和文字互译
? AI 策划的剧本，好莱坞说不
»
»

# 硬核观察 #1103 谷歌工程师日常：一日一小时工作制

### 谷歌工程师日常：一日一小时工作制

化名为 Devon 的谷歌工程师在接受《财富》杂志采访时透露，他的工作制度独树一帜：每天仅需为谷歌工作一小时。他通常在每天 9 点左右起床，完成洗漱和早餐后工作至 11 点，之后他会将精力转向自己的创业公司。尽管工作时长短，但他的年薪却高达 15 万美元。他认为，谷歌更希望能保留这些强大的人才，避免他们向竞争对手转投。在业界，这种被称为“penning”的情况并非罕见。

>
> **[消息来源：《财富》](https://fortune.com/2023/08/20/gen-z-google-one-hour-workday-2/)**
>
>
>

>
> 老王点评：虽然嫉妒让人热泪盈眶，但无论如何，只有那些能被雇主“金屋藏娇”的人才，才能享受如此待遇。
>
>
>

### Meta 推出全能 AI 翻译模型：100 种语言，声音和文字互译

Meta 在大型语言模型与多模态技术领域一直走在前列。过去，Meta 已发布过处理[语音](/article-15839-1.html)、[图像、音乐](/article-15906-1.html)的 AI 模型，还有一款因安全风险过大而无法公开代码的[语音生成](/article-15927-1.html) AI 模型。近日，Meta 又推出一款名为 SeamlessM4T 的全功能多模态 AI 翻译模型。此模型不仅能处理文本和音频翻译，还具备声音和文字的互译能力，并且覆盖近 100 种语言。

>
> **[消息来源：Facebook](https://about.fb.com/news/2023/08/seamlessm4t-ai-translation-model/)**
>
>
>

>
> 老王点评：基于大型语言模型的驱动，加上多模态模型的基础，我们似乎可以预见，在不远的未来或许会出现无法区分人与 AI 的情况。这会让人想起互联网早期的名言：'在网上，无人知道你是不是一只狗。'
>
>
>

### AI 策划的剧本，好莱坞说不

因抵制 AI 带来的威胁，数万名美国编剧工会成员在近几个月发起了罢工，以寻求更高的薪资和更长的合同。代表了 350 多家电影和电视制作公司的美国电影电视制片人联盟为了尽快结束罢工，作出了承诺：他们决不会把 AI 生成的剧本、对话或情节视为文学或原始材料，排除了 AI 获得任何写作荣誉的可能。也就是说，如果编剧对 AI 生成的材料进行修改，这些工作不会被认为是重写，他们可以获得全额报酬和荣誉。

>
> **[消息来源：The Register](https://www.theregister.com/2023/08/24/hollywood_tv_and_film_studios/)**
>
>
>

>
> 老王点评：一旦全篇剧本由 AI 创作，编剧的薪酬便可省下。进一步想象，AI 生成的面部、身体和嗓音可能会取代部分乃至全部演员的角色。看起来，被 AI 完全替代只是时间问题，也许比我们预期的要快。
>
>
>


TransFLAC：将 FLAC 转换为有损格式

# TransFLAC：将 FLAC 转换为有损格式

### FLAC：无损音频压缩格式

自由无损音频编解码器（[FLAC](https://xiph.org/flac/)）是一种无损音频压缩格式，可保留所有原始音频数据。这意味着 FLAC 文件可以解码成与原始音频文件完全相同的副本，而不会有任何质量上的损失。不过，无损压缩通常会比有损压缩的文件大小更大，这就是为什么需要一种将 FLAC 转为有损格式的方法。而这就是 TransFLAC 可以提供帮助的地方。

FLAC 是一种流行的数字音频文件存档格式，也可用于在家用电脑上存储音乐收藏。音乐流媒体服务也越来越普遍地提供 FLAC 作为高品质音频的一种选择。

对于存储空间有限的便携设备，通常使用 MP3、AAC 和 OGG Vorbis 等有损音频格式。这些格式的文件大小比无损格式小得多，但音质仍然很好。

一般来说，FLAC 是对无损音频质量要求较高的应用（如存档、母带制作和 <ruby> 鉴定聆听 <rt>  critical listening </rt></ruby>）的不错选择。对于文件大小更为重要的应用，如在便携设备上存储音乐或通过互联网串流音乐，有损格式是不错的选择。

### TransFLAC：将 FLAC 转换为有损格式

[TransFLAC](https://bitbucket.org/gbcox/transflac/wiki/Home) 是一款命令行应用，可将 FLAC 音频文件转换为指定质量级别的有损格式。它能使 FLAC 和存储有损格式的音乐库保持部分或完全同步。TransFLAC 还能同步目录结构中存储的专辑封面、专辑封底和文件夹文件。你可以在终端窗口中交互式运行 TransFLAC，也可以使用 cron 或 systemd 等应用安排其自动运行。

必须指定以下四个参数：

1. **输入 FLAC 目录**：要递归搜索 FLAC 音频文件的目录。目录名大小写敏感。TransFLAC 会将目录树中的所有 FLAC 音频文件转换为指定的有损编解码格式。程序将解决遇到的任何符号链接，并显示物理路径。
2. **输出有损目录**：有损音频文件的存储目录。目录名大小写敏感。程序将解析遇到的任何符号链接并显示物理路径。
3. **有损编解码器**：用于转换 FLAC 音频文件的编解码器。编解码器名称的大小写并不重要。对于给定的文件大小或比特率，OPUS 通常能提供最佳音质，是推荐的编解码器。有效值为 [opus](https://opus-codec.org/) | [ogg](https://xiph.org/vorbis/) | [aac](https://en.wikipedia.org/wiki/Fraunhofer_FDK_AAC) | [mp3](https://lame.sourceforge.io/)
4. **编解码器质量**： 用于编码有损音频文件的质量预设。质量名称的大小写并不重要。**OPUS STANDARD** 质量提供全带宽、立体声音乐、良好的音频质量和透明度，是推荐的设置。有效值为 低 | 中 | 标准 | 高 | 优质

**TransFLAC** 允许对配置中的某些项目进行 [自定义](https://bitbucket.org/gbcox/transflac/wiki/src-tf-conf-override.sh)。项目 [维基](https://bitbucket.org/gbcox/transflac/wiki/TransFLAC) 提供了更多信息。

在 [Fedora Linux](https://fedoraproject.org/) 上安装：

```
$ sudo dnf install transflac

```

---

via: <https://fedoramagazine.org/transflac-convert-flac-to-lossy-formats/>

作者：[Gerald B. Cox](https://fedoramagazine.org/author/gbcox/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1104 Firefox 实现 Chrome 扩展的无缝接入

Summary:
? Firefox 实现 Chrome 扩展的无缝接入
? 人工智能的训练利用了众多作家的盗版作品
? 瘫痪女性通过 AI 技术“重获语言”，全球首例
»
»

第一个的接入，看支持的扩展，好像本来就是firefox有的，是能真的安装chrome的扩展，还是只是提供了一个在firefox搜索下载的快捷方式，下载的还是firefox版本啊？

安装的对应版本，其实他们的重点在于“导入”。

# 硬核观察 #1104 Firefox 实现 Chrome 扩展的无缝接入

### Firefox 实现 Chrome 扩展的无缝接入

Mozilla 的 Firefox 浏览器引入了 WebExtensions 系统，使得用户可以从 Chrome 等其他浏览器导入所选的扩展程序。用户现在可以在初次启动 Firefox 或随时在设置页面中使用这项集成到浏览器的导入功能。不过，此功能目前只支持 Chrome 浏览器和一部分扩展程序。需要注意的是，Firefox 不会直接导入 Chrome 的扩展，而是会在 Mozilla 自己的扩展商店中安装相应的 Firefox 版本，目前已经支持 73 个扩展。

>
> **[消息来源：ghacks](https://www.ghacks.net/2023/08/23/firefox-users-may-import-chrome-extensions-now/)**
>
>
>

>
> 老王点评：这不失为一个大进步，如果能实现真正无缝的跨扩展商店安装，那就更赞了。
>
>
>

### 人工智能的训练利用了众多作家的盗版作品

Books3 是一个用于构建人工智能工具的数据集，被 Meta、彭博社等公司用来训练他们的大型语言模型。根据对 Books3 的分析，其包含的超过 17 万本书籍中，大部分都是在过去 20 年内出版的，其中约三分之一是小说，约三分之二是非小说类书籍。诸如斯蒂芬·金、扎迪·史密斯、玛格丽特·阿特伍德、村上春树等大量知名作家的版权受保护的作品也在其中。虽然创建 Books3 的独立 AI 开发者 Shawn Presser 对作者们的担忧表示理解，但他强调，他创建这个数据库的目的是让所有人都能够开发生成式人工智能工具，并担心大公司控制这项技术会带来风险。

>
> **[消息来源：卫报](https://www.theguardian.com/books/2023/aug/22/zadie-smith-stephen-king-and-rachel-cusks-pirated-works-used-to-train-ai)**
>
>
>

>
> 老王点评：AI 的诞生，是不是披着窃取人类知识的原罪？或者，我们应该为新生的 AI 打开知识的闸门？这样的困境需要我们共同探索。
>
>
>

### 瘫痪女性通过 AI 技术“重获语言”，全球首例

一名严重瘫痪的女性成功使用一种能将其大脑信号转化为语音和面部表情的技术，实现了通过数字形象进行表达。47 岁的女患者 Ann，因 18 年前的脑干中风失去基本的活动能力，无法进行语言或打字交流。借助这项全新的 AI 技术，她在未来有望从事咨询工作。不过，这一技术还需进步。在一次涉及 500 个短语的试验中，正确率为 72%，脑信号转化为文字的速度为每分钟 78 个单词，与自然对话中约 110-150 个单词的速度相比相对较慢。

>
> **[消息来源：卫报](https://www.theguardian.com/society/2023/aug/23/paralysed-woman-able-to-speak-through-digital-avatar-for-first-time)**
>
>
>

>
> 老王点评：科技的迅进让 “沉默” 的意识终于找到出口，要是霍金在世时就有这样的技术多好。
>
>
>


Roblox 返回 Linux，携手 Wine，欢迎玩家们！

Summary: 现在，所有人都能再次享受 Roblox 了！

现在，所有人都能再次享受 Roblox 了！

# Roblox 返回 Linux，携手 Wine，欢迎玩家们！

>
> 现在，所有人都能再次享受 Roblox 了！
>
>
>

Roblox 即将重新登陆 Linux 平台。

不久前，我们曾 [报道](https://news.itsfoss.com/roblox-linux-end/) Roblox 的新反作弊软件 Hyperion 将默认阻断 [Wine](https://www.winehq.org/?ref=news.itsfoss.com) 的使用，这无疑让人失望。

然而，随着最近的开发进展，这一状况将有所改观。以下是整个情况的介绍。

发生了什么: 你看，早在 5 月，Roblox 推出了新的反作弊软件，成为了默认阻止 Wine 使用的工具，然而 **这一变化并非失误，而是故意为之**。

那时，一名 Roblox 员工在论坛中彻底否定了在 Linux 原生支持或找到变通方法运行 Roblox 的可能。

然而，事情并没有因此结束。

几天前，Roblox 的一名员工回复了论坛上的一篇帖子，称：

>
> 向 Grapejuice 社区大声疾呼 - 这是特别为你们准备的。
>
>
>

随后，他展示了一张截图，揭示了 **Roblox 在 Manjaro Linux 上运行** 的信息。

如果你还不知道，[Grapejuice](https://gitlab.com/brinkervii/grapejuice?ref=news.itsfoss.com) 是一个管理应用程序，可以帮助你在 Linux 上正确设置 Wine 和 Roblox。

尽管新的反作弊软件已经发布，但这显示了 Roblox 也能重新在 Linux 上运行。对我来说，这听起来很棒！

期待何时: 目前来看，这项整合工作仍在进行中，同样的，上文提到的员工表示:

>
> 我们将发布关于 Wine 的非官方支持的正式声明。至于何时，就说在不久之后™。
>
>
>

没错，Linux 上的 Roblox 玩家可能还需要稍作等待。

然而，玩家们现在应该会感到高兴，认识到至少 **Roblox 在 Linux 上的非官方支持即将到来**。

你可以查看 [这里](https://devforum.roblox.com/t/why-did-roblox-stop-supporting-linux-users/2444335/61?u=sirsquiddybob&ref=news.itsfoss.com) 的讨论以获取关于这个实施情况的更多详细信息。（需要登录）。

参考来源：[GamingOnLinux](https://www.gamingonlinux.com/2023/08/roblox-support-is-coming-back-to-wine-on-linux/?ref=news.itsfoss.com)

---

via: <https://news.itsfoss.com/roblox-wine-support-linux/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Bodhi 7.0 版发布，基于 Ubuntu 22.04 LTS

好多Linux发行版的审美怪怪的，配色、图标根本不实用。

图标花里胡稍，外形大小各异。缩小了以后糊成一块。

界面/终端追求颜色统一，结果字一多根本分不清重点。

# Bodhi 7.0 版发布，基于 Ubuntu 22.04 LTS

>
> Bodhi Linux 7.0 版终于发布! 此版本包含了一系列重要的升级和增强措施。
>
>
>

Bodhi Linux 是一款受大众喜爱的 [轻量级发行版](https://itsfoss.com/lightweight-linux-beginners/?ref=news.itsfoss.com)，其特色在于采用了 [Moksha](https://itsfoss.com/bodhi-linux-introduces-moksha-desktop/?ref=news.itsfoss.com) 桌面环境，为用户提供了独一无二的体验。（“Bodhi” 的意思是菩提树。）

其上一个主要版本 [Bodhi Linux 6.0](https://news.itsfoss.com/bodhi-linux-6-release/) 已经是两年多前的事情了，它带来了显著的改进。

Bodhi Linux 7.0 版已经计划很久了，但是因为创建者出现了一些健康问题，开发工作暂时停滞。我们希望开发人员现在情况好转；让我们一起来关注其下一个升级版。

### ? Bodhi Linux 7.0：新功能有哪些？

本次发布的 Bodhi Linux 是基于 [Ubuntu 22.04](https://news.itsfoss.com/ubuntu-22-04-release/) LTS，这提供了一个非常稳定的基础。因此，无论是在硬件支持，还是在性能和安全性增强方面，都有着良好的表现。

Bodhi Linux 7.0 版现在引入了一款全新的默认主题，叫做 MokshaGreen。它包含了一款 **动态背景**、**全新的 Plymouth 引导屏幕**，以及 **全新的登录屏幕主题**。

所以，就算可能不是很多，我们还是可以期待一些视觉上的新鲜体验。

在桌面环境方面，也进行了几次重大的更新。**Moksha 0.4.0** 带来了一系列的改进，包括：

* 重构了一些模块，移除了对一些已经弃用的库的依赖。
* 添加了一个通过 `Super + F1` 访问的 Moksha 基础快捷方式查看器。
* 解决了“应用”语言设置的按钮问题。
* 增加了对贴边窗口的支持。
* 为 MokshaGreen 主题提供了 GTK 主题和图标集。

此外，在**模块**方面，添加了一系列改进，包括：

* 对电池模块的改进带来了更好的充电状态弹窗。
* 修复了浮动菜单段错误。
* 在时钟模块中添加了日期/时间设置。
* 在 iBar 模块中添加了一个应用程序实例菜单。

除此之外，Bodhi Linux 的软件栈也进行了更新，采用了非 Snap 版本的 **Chromium 115**、**Terminology 1.13.1** 以及 **Slick-greeter 1.8.1**。

你可以查阅 [发布备注](https://www.bodhilinux.com/release/7-0-0/?ref=news.itsfoss.com) 和 [公告博客](https://www.bodhilinux.com/2023/08/21/introducing-bodhi-linux-7-0-a-landmark-release/?ref=news.itsfoss.com)，以对这个版本有更详细的了解。

### ? 获取 Bodhi Linux 7.0

对于这个发布版本，可选择三个不同的内核版本：

* 标准 ISO 版本包含 Linux 内核 5.15 LTS，
* 更新增强版的 HWE ISO 提供更近期的 Linux 内核 6.2，
* S76 ISO 版使用 System76 的 6.2.6 版本的 Linux 内核。

你可以从 Bodhi Linux 的 [官方网站](https://www.bodhilinux.com/download/?ref=news.itsfoss.com) 下载。

>
> **[Bodhi 7.0版](https://www.bodhilinux.com/download/?ref=news.itsfoss.com)**
>
>
>

（题图：[freeimages](https://www.freeimages.com/photo/bodhi-leaf-1392651)）

---

via: <https://news.itsfoss.com/bodhi-7-0-0-release/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何使用 VLC 媒体播放器旋转视频

非常好文章，使我视频旋转

smplayer以前有视频旋转功能，现在已经没有了，vlc还是有的

# 如何使用 VLC 媒体播放器旋转视频

>
> 这个多功能的 VLC 媒体播放器还可以旋转视频方向。在桌面上观看智能手机录制的视频相当方便。
>
>
>

有时，你会遇到以显示方向错误的视频。使用智能手机摄像头拍摄的视频很可能会以这种方式出现。

如果你可以将其旋转到方便的方向，那么效果会更好。

功能丰富的 VLC 媒体播放器提供了一种旋转视频的方法。你可以：

* 暂时旋转视频（下次播放时需要再次旋转）
* 永久旋转视频（视频将始终以新方向播放）

让我们看看如何实现这两者之一。

### 在 VLC 中暂时旋转视频

让我们看看如何在 VLC 中临时旋转视频。也就是说，完成该过程后，它不会反映在实际文件上。这对于查看文件或测试文件很有用。

#### 使用预设值旋转视频

在此方法中，你可以将视频旋转 90 度、180 度和 270 度。这是你大多数时候所需要的。

打开 VLC 并选择要旋转的视频。

单击主菜单上的 “<ruby> 工具 <rt>  Tools </rt></ruby>”，然后转到 “<ruby> 效果和滤镜 <rt>  Effects and Filters </rt></ruby>”。你也可以按快捷键 `CTRL + E`。

 Effects and Filters" title="Tools > Effects and Filters">

在 “效果和滤镜” 页面上，选择 “<ruby> 视频效果 <rt>  Video Effects </rt></ruby>” 选项卡，然后进入 “<ruby> 几何 <rt>  Geometry </rt></ruby>”。现在，选中 “<ruby> 变换 <rt>  Transform </rt></ruby>” 复选框。

这将激活一个下拉菜单。从那里，选择你需要的适当旋转，如 90 度、180 度、水平翻转等。你可以在 VLC 窗口中查看变化。

对更改感到满意后，按 “<ruby> 保存 <rt>  Save </rt></ruby>” 按钮以所选方向保存配置。

#### 使用自定义值旋转视频

需要将视频旋转到可用预设以外的方向？ VLC 也有一个选项。

首先，像上一步一样，打开媒体，然后转到 “工具 > 效果和滤镜 > 视频效果 > 几何”。

现在，单击 “<ruby> 旋转 <rt>  Rotate </rt></ruby>” 复选框，你可以看到交互式圆形滑块现已激活。

>
> ? 对于不规则的旋转值（例如 230 度等），某些部分都会从视频中删除。
>
>
>

移动滑块以获得正确的旋转。你可以在 VLC 窗口中看到视频出现的变化。确定更改后，请按 “保存” 按钮保存该配置。

>
> ? 请记住，此配置在此阶段不会永久应用于视频。但是，如果你按 “保存”，方向也会暂时应用于 VLC 中播放的其他视频。
>
>
>

### 永久旋转视频

你知道了如何临时旋转文件。永久保存视频文件更改也需要该步骤。

#### 第 1 步：转换视频

这是前一部分。打开视频文件，然后进行所需的旋转。确认特定视频所需的旋转后，按照上一步中的说明保存该配置。

#### 第 2 步：保存视频

现在，打开 VLC 并单击 “<ruby> 媒体 <rt>  Media </rt></ruby> > <ruby> 转换/保存 <rt>  Convert/Save </rt></ruby>”。这可以在没有打开任何视频文件的情况下进行，因为无论如何我们都不会处理当前打开的视频。

在下一个对话框中，使用 “添加Add” 按钮选择要旋转的文件（在上一步中测试以确认所需旋转的文件）。然后按 “<ruby> 转换并保存 <rt>  Convert and Save </rt></ruby>”。

接下来，选择所需的视频输出，然后单击相邻的设置按钮，如下所示。

出现了配置文件设置窗口。在其上，进入 “<ruby> 视频编解码器 <rt>  Video Codec </rt></ruby>”，然后转到 “<ruby> 过滤器 <rt>  Filters </rt></ruby>” 选项卡。在这里，你必须根据需要应用过滤器。一个是 “<ruby> 旋转视频过滤器 <rt>  Rotate Video Filter </rt></ruby>”，另一个是 “<ruby> 视频转换过滤器 <rt>  Video transformation Filter </rt></ruby>”。

如果你已使用 “变换” 按钮对视频应用固定变换，请选择 “<ruby> 视频变换过滤器 <rt>  Video transformation Filter </rt></ruby>”。另一方面，如果你对视频进行了一些不规则的旋转，请选择 “旋转视频过滤器”。

检查后，按 “保存”按钮。

现在，选择输出文件位置，我们要在其中保存转换后的文件。

应给出一个新的文件名，这可以通过进入你选择的目录并只需在顶部栏上输入你选择的名称来完成。

>
> ? 建议提供一个新的唯一名称，以避免文件覆盖和数据丢失。
>
>
>

按 “<ruby> 开始 <rt>  Start </rt></ruby>” 开始转换。

转换将需要一些时间，具体取决于你的视频。完成后，你将获得旋转的视频，可以在任何视频播放器上查看。

>
> ? 转换视频后（无论是永久的还是临时的），最好在 “工具 > 效果和滤镜 > 视频效果 > 几何” 中关闭应用的旋转。否则，以后使用 VLC 播放的视频将出现旋转。
>
>
>

我希望你喜欢这个 VLC 技巧。欢迎你提出建议和反馈。

同时，你还可以学习这个很酷的 VLC 自动下载字幕的技巧。

>
> **[在 VLC 中自动下载字幕](https://itsfoss.com/download-subtitles-automatically-vlc-media-player-ubuntu/)**
>
>
>

*（题图：MJ/b604f181-660a-4f05-bdd2-49b5b6da0bae）*

---

via: <https://itsfoss.com/rotate-video-vlc/>

作者：[Sreenath](https://itsfoss.com/author/sreenath/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


更好地利用 Xfce 的 Thunar 文件管理器的 7 个技巧

使用习惯：pcmanfm > thunar > caja > konqueror ,nautilus3.6之后坚决不用，没有左侧树形列表

spacefm试过么如何

你需要nemo

来自广东广州的 Chrome Mobile 116.0|Android 10 用户

# 更好地利用 Xfce 的 Thunar 文件管理器的 7 个技巧

>
> Thunar 是 Xfce 提供的一款优秀文件管理器，通过这些技巧和调整，你的使用体验可以得到提升。
>
>
>

Thunar 是 Xfce 桌面环境的默认文件管理器，它实现了轻量级与优秀的用户体验的完美平衡。

但是，像其他任何尚未深入探索的工具一样，你对 Thunar 的掌握会在你深入了解它之后变得更多。

我大胆地说，一系列的特性将会改善你的 Linux 体验。

在这个指南中，我会分享可以让 Thunar 体验更上一层楼的以下技巧：

* Thunar 的通用快捷键
* 添加 Thunar 插件
* 从你上次离开的地方继续
* 使用图标进行更好的识别
* 高亮显示文件/文件夹
* 在双窗口模式下轻松复制或移动文件
* 自定义操作

那就让我们从第一条开始吧。

### 1、利用键盘快捷键

毫无疑问，利用键盘快捷键可以提升你的工作效率。

以下是一些在 Thunar 中使用的简单快捷键，可以帮助减少鼠标点击操作：

| 快捷键 | 描述 |
| --- | --- |
| `Ctrl + T` | 新加标签页 |
| `Ctrl + N` | 新建窗口 |
| `F3` | 切换至双窗格模式 |
| `Alt + ←` | 后退 |
| `Alt + →` | 前进 |
| `Ctrl + F` | 搜索文件 |
| `Ctrl + S` | 按模式选取文件 |
| `Ctrl + H` | 显示隐藏文件 |
| `Ctrl + E` | 侧边栏启用树视图 |
| `Alt + ↑` | 打开父目录 |
| `Alt + Home` | 前往主目录 |

虽然看似简单，但请相信我，这些快捷键一旦融入你的日常工作流，你就会离不开它。

### 2、从你离开的地方重新打开 Thunar

>
> ? 此功能只在 Thunar 4.18 或更高版本中可用。
>
>
>

打开文件管理器时，默认打开上次关闭时的所有标签页，这是一个令人振奋的功能。

我就是那种喜欢深入 Linux 目录进行探索的人，所以从我离开的地方重新打开 Thunar 是一项重要功能。

若要启用此功能，只需遵循以下三个简单的步骤：

* 点击 “<ruby> 编辑 <rt>  Edit </rt></ruby>” 菜单并选择 “<ruby> 偏好设定 <rt>  Preferences </rt></ruby>”
* 切换至 “<ruby> 行为 <rt>  Behavior </rt></ruby>” 标签页
* 勾选 “<ruby> 启动时还原标签 <rt>  Restore tabs on startup </rt></ruby>” 选项

### 3、为文件或文件夹添加徽章

你可以把徽章看作是一个特殊标记，它可以帮助你更快地识别出特定的文件或文件夹。

另外，你也可以通过添加徽章使目录名更加直观。例如，将一个 “▶” 徽章添加到“视频”目录上。

要添加徽章，遵循下面的步骤：

* 右键点击需要添加徽章的文件/文件夹，从上下文菜单中选择 “<ruby> 属性 <rt>  Properties </rt></ruby>”
* 进入 “<ruby> 徽章 <rt>  Emblem </rt></ruby>” 标签页，为选定项选择一个或多个徽章

我添加徽章后的样子就像这样：

### 4、使用突出颜色高亮文件/文件夹

>
> ? 这项功能只在 Thunar 4.18 及更高版本中可用。
>
>
>

如果仅通过添加徽章仍无法使文件/文件夹在众多文件中突显出来，你可以改变它的背景或前景颜色。

**注意：改变前景颜色只会改变选定项目的字体颜色。**

要突出高亮一个文件或文件夹，你需要按照以下步骤操作：

* 将鼠标悬停在需要高亮的项目上，右键并选择 “属性”。
* 进入 “<ruby> 高亮 <rt>  Highlight </rt></ruby>” 部分，选择改变前景或背景（或两者都选，但要一次进行一项操作）。
* 接着，选择你想要的颜色，它会展示结果。如果满意，点击 “<ruby> 应用 <rt>  Apply </rt></ruby>” 按钮，不满意就通过 “<ruby> 重置 <rt>  Reset </rt></ruby>” 按钮恢复默认设置。

### 5、探索 Thunar 插件

不同于那些知名的文件管理器，Thunar 的插件相对较少，因为很多操作都可以通过自定义动作实现，其他的功能如内置一样与生俱来。

但是，也有一些实用的插件供你选择。

如要了解更多，你可以 [访问官方网站](https://goodies.xfce.org/projects/thunar-plugins/start?ref=itsfoss.com) 查看详情。

在这里，我将向你展示如何添加一个归档插件，让你可直接在右键菜单中创建和解压归档文件：

在 Ubuntu 中安装 Thunar 归档插件，可以使用以下命令：

```
sudo apt install thunar-archive-plugin

```

在 Fedora 中安装：

```
sudo dnf install thunar-archive-plugin

```

在 Arch Linux 中安装：

```
sudo pacman -S thunar-archive-plugin

```

### 6、利用双窗格特性进行文件传输

这是几乎所有的文件管理器都具备、而又被大多数人所忽视的一个重要特性。

那为什么我要将此特性列为 Thunar 的优化建议呢？答案很简单。因为 Thunar 的双窗格特性非常好用，它使得文件的复制和移动变得轻而易举。

#### 移动文件

接下来我们看一下如何将文件从一个目录动态一个目录：

* 首先，按下 `F3` 键开启双窗格模式。
* 打开两边窗格中的目录。一边导航到需要被移动的文件所在，另一边则打开目标位置。
* 接着，选中需要移动的项目。
* 移动文件很简单，只需选中它们，并拖动到另一侧窗格中（即你已打开的目标位置）。

#### 复制文件

复制文件的操作非常类似移动文件，只是在拖曳并释放文件时需要按下 `Ctrl` 键。

* 使用 `F3` 键切换到双窗格模式。
* 打开两边窗格中的源文件和目标位置。
* 选中需要复制的文件，然后按下 `Ctrl` 键，将它们拖到第二窗格中，释放鼠标后再放开 `Ctrl` 键。

如果你仔细看，会发现在移动文件时，鼠标指针呈现一个箭头 “↗”，而在复制文件时，它会显示一个加号 “➕”。

### 7、在 Thunar 中使用自定义操作（针对进阶用户）

到现在为止，Thunar 中最实用的功能无疑是你能创建属于自己的行为，比如使选定的文件变为可执行文件，以 root 用户身份打开 Thunar 等等。

因此，这也意味着这将是本教程中最详细的一节！

首先，点击 “编辑” 菜单，你会找到一个 “<ruby> 配置自定义操作 <rt>  configure custom actions </rt></ruby>” 的选项，这是倒数第二个：

如你所见，所有可用的操作都在列表中显示。

要添加操作，点击加号 “➕” 按钮，你会看到多个选项：

这些选项包括：

* “<ruby> 名称 <rt>  Name </rt></ruby>”：为自定义操作命名。
* “<ruby> 描述 <rt>  Description </rt></ruby>”：该操作的信息说明（以帮助用户理解该操作的功能）。
* “<ruby> 子菜单 <rt>  Submenu </rt></ruby>”：用于将多个操作整合到一起。
* “<ruby> 命令 <rt>  Command </rt></ruby>”：关键的一步，你需要为这个操作分配一条命令使其可以工作。

如果你仔细看，你会发现还有另一个名为 “<ruby> 出现条件 <rt>  Appearance Conditions </rt></ruby>” 的选项卡，在这里你可以指定在哪些文件（以及目录）类型的右键菜单中这个动作会出现。

例如，如果一个动作只应在所选文件是文本文件时才显示，那么你就需要勾选 “文本文件Text Files” 选项：

接下来，我要向你展示如何设置一个以 root 身份打开 Thunar 的自定义动作。

#### 创建自定义操作以 root 身份打开 Thunar

你一定经历过这种情况：你想操作一个文件，但是只有 root 用户能够访问。于是你打开终端，执行命令以 root 身份启动文件管理器。

但如果用这个自定义操作，只需轻点一下鼠标就可以了。

具体方法是，在 “<ruby> 基本 <rt>  Basic </rt></ruby>” 选项卡的数据区域输入以下内容：

* 名称：以 root 身份打开 Thunar
* 命令：`pkexec thunar %F`

你能选择任何相关的图标，我在这里选择了一个简单的终端图标。

接着，在 “出现条件” 区域，输入如下内容：

* 如果所选内容包含：<ruby> 目录 <rt>  Directories </rt></ruby>

完成后，数据区域会如下所示：

看一下最后的结果：

看起来很酷，对吧？

以下是一些其他可能有用的自定义操作：

#### 创建创建符号链接的自定义操作

[创建符号链接](https://linuxhandbook.com/symbolic-link-linux/?ref=itsfoss.com) 是访问深度嵌套在文件系统中的文件的一种简便手段。它同时也被用来重定向到特定的包的路径。

要创建一个创建符号链接的自定义操作，你可以输入以下指令：

* 名称：创建链接
* 描述：创建一个符号链接
* 命令：`ln -s %f 'Link to %n'`
* 若选择包含：框全部都要勾选

#### 直接查找文件

点击一个目录，选择搜索，输入你想要查找的内容。

这是在目录内搜索文件最为手边的方式了。

首先，在你的系统中安装 `catfish`，如果你是 Ubuntu/Debian 系的用户，可以使用如下命令：

```
sudo apt install catfish

```

然后，创建一个自定义操作，输入以下信息：

* 名称：在该目录中查找文件
* 描述：在选中的目录中搜索文件
* 命令：`catfish %f`
* 若选择包含：仅勾选 “目录”。

#### 一键安装多个图像转换的自定义操作

在我写作的过程中，我找到了一款令人惊艳的包，着包中包含了以下几种自定义操作：

* 旋转图像
* 缩小图像
* 图像灰度处理
* 将图像转换为 PDF
* 将图像转换为任意格式
* [合并 PDF 文件](https://itsfoss.com/merge-pdf-linux/)
* 缩小 PDF 文件的大小
* 创建符号链接
* 显示校验和
* 往图像的透明区域填充颜色
* 加密/解密文件

首先，在你的系统中安装以下软件包：

```
sudo apt install make imagemagick gnupg2 m4 build-essential pandoc gettext python3-lxml ubuntu-dev-tools git

```

接着，克隆这个库并切换到这个新的目录：

```
git clone https://gitlab.com/nobodyinperson/thunar-custom-actions.git && cd thunar-custom-actions

```

然后，运行以下命令来确认所有的依赖项都已就绪：

```
./configure --prefix=$HOME/.local PASSWDFILE=/etc/passwd

```

如果提示你缺少某个包，那你可能需要手动安装它（但大部分情况下不需要）。

接着，运行以下命令从源代码建立这个包：

```
make

```

然后，运行以下命令安装这个包：

```
sudo make install

```

要将更改合并进 Thunar，使用以下命令：

```
uca-apply update

```

完成以上操作后，**记得登出并重新登录以使改变生效。**

这样你就会看到系统中增加了多种新的自定义操作：

如果你觉得这些太多了，你也可以通过选择它并点击减号按钮来去除不需要的操作。

只要你有足够的想象力，你就可以创造出无数的自定义操作。欢迎你分享你最喜欢的（和命令），这样新用户也能受益。

### 进一步自定义 Xfce

有人可能觉得 Xfce 显示得有些传统。实际上，你完全可以为它带来现代化的感受。

>
> **[使 Xfce 看起来现代化和漂亮的四种方法](https://itsfoss.com/customize-xfce/)**
>
>
>

进行主题设计是最主要的自定义方式。这里有一些 [Xfce 主题建议](https://itsfoss.com/best-xfce-themes/) 你可以参考。

>
> **[使 Xfce 看起来现代化和漂亮的 11 个主题](https://itsfoss.com/best-xfce-themes/)**
>
>
>

我希望你觉得这些关于 Thunar 的改进很有用。

你能在 Linux 桌面上尝试到更多的乐趣，不妨开始你的探索之旅吧 ?

*（题图：MJ/0bd19051-a95f-41f8-839a-47c1ce84ac83）*

---

via: <https://itsfoss.com/thunar-tweaks/>

作者：[Sagar Sharma](https://itsfoss.com/author/sagar/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1105 Ubuntu 桌面用户已超 600 万

Summary:
? Ubuntu 桌面用户已超 600 万
? Gitlab 将支持跨实例订阅和合并请求
? 开放游戏《星际公民》众筹突破六亿美元
»
»

作为一名ubuntu用户，就是各个大厂没有经行linux战略。看看微软的edge发展，说实话，该软件在linux性能和体验，是看得见的改善。

来自江西南昌的 Chrome Mobile 115.0|Android 10 用户

自从ubuntu强制使用snap软件包，已经有一部分用户从ubuntu转向debian

微软在Linux、mac的开发都很上心，除了自家的Windows

如果一个用户完全使用Linux，那巨硬无法获得这个用户的数据/隐私。

# 硬核观察 #1105 Ubuntu 桌面用户已超 600 万

### Ubuntu 桌面用户已超 600 万

Canonical 公布了一系列 Ubuntu 桌面数据：其桌面用户已超过 600 万。这一数字基于检查桌面更新的设备，不包括安装了企业防火墙或代理服务器的设备。另外，根据 Stack Overflow 的调查，Ubuntu 桌面占到 Linux 开发者桌面市场的 27%，是迄今为止最受开发者欢迎的 Linux 发行版；在 Steam 平台的 Linux 玩家中，Ubuntu 是游戏用户使用最多的桌面 Linux 发行版。

>
> **[消息来源：Ubuntu](https://ubuntu.com/blog/ubuntu-desktop-charting-a-course-for-the-future)**
>
>
>

>
> 老王点评：Ubuntu 是最流行的发行版，这一点应该没有争议吧。但是 600 万这个数据还是让我第一次有了直观感受。
>
>
>

### Gitlab 将支持跨实例订阅和合并请求

ActivityPub 是一个 W3C 标准，其最知名的实现是 Mastodon 以及 Lemmy。Gitlab 称它将逐步实现 ActivityPub 的功能。Gitlab 允许用户创建各自的实例，通过支持 ActivityPub 可以跨 Gitlab 实例进行订阅、搜索、创建分支、递交合并请求，以及展开讨论和合并代码。

>
> **[消息来源：gitlab](https://gitlab.com/groups/gitlab-org/-/epics/11247)**
>
>
>

>
> 老王点评：这真是一种非常好的结合，既发挥了 Gitlab 多实例、去中心化的特点，又能形成像 GitHub 那样的广泛的代码库社区。我觉得这才是真正补上了分布式版本控制系统 Git 的最后一块砖头。
>
>
>

### 开放游戏《星际公民》众筹突破六亿美元

《星际公民》是一款太空模拟飞行游戏，它允许玩家在宇宙空间内探险、交易和战斗。它于 2012 年在 Kickstarter 上成功众筹，原计划在 2014 年交付。但众筹成功后，其开发团队继续以销售游戏内的虚拟物品（如各种型号的飞船）的方式进行募资。到 2018 年它筹集到了 2 亿美元，并继去年突破 [5 亿美元](/article-15059-1.html) 后，今年再次募资 1 亿。它是至今为止开发费用最昂贵的游戏，远超《赛博朋克 2077》、《侠盗猎车 V》等游戏。但这款游戏何时才能正式发布仍然是未知数。

>
> **[消息来源：Player Auctions](https://blog.playerauctions.com/star-citizen/star-citizen-has-passed-600-million-in-backer-funding/)**
>
>
>

>
> 老王点评：我看它是不会有正式发布的那一天了，这或许就是我们所期待的“无尽的”游戏。?
>
>
>


如何解决服务器存储 inode 耗尽的问题

Summary: 明明硬盘只用了 30% 左右的空间，但是却无法写入文件。

我推荐换xfs

我有一块1T固态，用了F2FS，放了几套安卓ROM源码，用着用着inode耗光了

运行 df -i 简直要跪，这么大一块硬盘，inode数竟然比110多G的F2FS主分区还小！关键是，还没办法调整（F2FS的管理工具压根不支持调节inode容量）！

代码树庞大的存储，还是老老实实用Ext4、XFS吧。为了性能而硬上F2FS，得不偿失

来自111.55.10.201的 Chrome Mobile 115.0|Android 10 用户

明明硬盘只用了 30% 左右的空间，但是却无法写入文件。

# 如何解决服务器存储 inode 耗尽的问题

<img src="content_image/album_202308_27_113344y7f14v4gvbd014g0.jpg" alt="" title="">

今天群里一朋友遇到这样一个问题，明明硬盘只用了 30% 左右的空间，但是却无法写入文件。使用 `df -iT` 命令查看文件系统使用情况时，发现根目录的 inode 使用率竟然是 100%。后来通过聊天得知，原来他的服务器主要用于存储 1KB 左右的小文件，这一下就破案了。

inode 主要用来记录文件的属性，及此文件的数据所在的块编号。每一个文件会占用一个 inode，因此如果都是小文件的话，那么就会出现 inode 已经耗尽，但文件系统还有很大的空闲空间，从而无法写入新文件。

### 如何获得更多的 inode

其实在创建 ext4 文件系统时，我们可以使用 `-T small` 参数来获得更多的 inode，从而优化对小文件的存储。接下来我们通过一个示例来看看效果。

这是两块相同大小的硬盘：

```
root@debian:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0    1G  0 disk
└─sdb1   8:17   0 1023M  0 part
sdc      8:32   0    1G  0 disk
└─sdc1   8:33   0 1023M  0 part

```

首先使用默认参数给 `/dev/sdb1` 创建文件系统：

```
root@debian:~# /sbin/mkfs.ext4 /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 261888 4k blocks and 65536 inodes
Filesystem UUID: 8935c902-df71-4808-b547-c85b6fd37a46
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

```

从输出中可见，该文件系统有 261888 个 4KB 大小的块和 65536 个 inode。

然后使用 `-T` 参数对 `/dev/sdc1` 创建文件系统：

```
root@debian:~# /sbin/mkfs.ext4 -T small /dev/sdc1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 1047552 1k blocks and 262144 inodes
Filesystem UUID: f521096d-a5a1-41c9-bbf7-e6102e74e87a
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409, 663553,
        1024001

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

```

从输出中可见，该文件系统有 1047552 个 1KB 大小的块和 262144 个 inode。

也可以通过以下方式对比两个文件系统的 inode 数量：

```
root@debian:~# mkdir default small
root@debian:~# mount /dev/sdb1 default/
root@debian:~# mount /dev/sdc1 small/
root@debian:~# df -iT
Filesystem     Type      Inodes IUsed   IFree IUse% Mounted on
/dev/sdb1      ext4       65536    11   65525    1% /root/default
/dev/sdc1      ext4      262144    11  262133    1% /root/small

```

从以上示例中我们可以看出，在使用 `-T small` 参数后，inode 数量多了近 20 万个！

**注意：** 这样做也是有代价的。在使用默认参数创建 ext4 文件系统时，默认数据块大小为 4KB，而使用 `-T small` 参数后，数据块大小为 1KB。这就意味着我们存储一个同样大小的文件，使用 `-T small` 参数创建的文件系统存储该数据时，占用的数据块更多，数据更分散，如果文件较大，会直接影响文件的读取速度

>
> `mke2fs`（`mkfs.ext4`）的 `-T` 参数指定了如何使用该文件系统，以便 `mke2fs` 可以为该用途选择最佳的文件系统参数，其支持的使用类型在配置文件 `/etc/mke2fs.conf` 中定义，可以使用逗号分隔指定一个或多个使用类型
>
>
>

### inode 不足的解决方法

当你已有的文件系统上出现 inode 不足的问题时，除了备份数据、重建分区并恢复分区数据外，还有两种临时解决方案：

1、删除文件大小为 0 的空文件，可以使用如下命令查找：

```
find PATH -name "*" -type f -size 0c

```

**注意：** 使用 `-size` 参数时，不要用 `-size 1k`，这个表示占用空间为 1KB，而不是文件大小为 1KB，应该使用 `-size 1024c` 才表示文件大小为 1KB。

2、可以定期对历史小文件进行打包、归档，以减少文件数量。

---

作者简介：一个喜欢瞎折腾的 IT 技术人员，懂得不多，但是喜欢和有共同兴趣爱好的朋友交流、学习

*（题图：MJ/9a66155a-772e-41f1-b29d-c3d4161f7853）*

---

via: <http://www.yanjun.pro/?p=128> 作者：[老颜随笔](http://www.yanjun.pro) 编辑：[wxy](https://github.com/wxy)

本文由贡献者投稿至 [Linux 中国公开投稿计划](https://github.com/LCTT/Articles/)，采用 [CC-BY-SA 协议](https://creativecommons.org/licenses/by-sa/4.0/deed.zh) 发布，[Linux中国](https://linux.cn/) 荣誉推出


如何在 Linux 中注释 PDF

# 如何在 Linux 中注释 PDF

>
> 你不需要专门的 PDF 编辑器来添加注释和高亮文本。下面介绍如何在 Linux 中使用 GNOME 的文档查看器来注释 PDF。
>
>
>

阅读一些 PDF 格式的有趣内容，并觉得需要添加评论或高亮显示某些文本？也许你在 PDF 文档上留一些反馈？

[Linux 用户可以使用多种 PDF 编辑器](https://itsfoss.com/pdf-editors-linux/)。但你不需要专门的 PDF 编辑器来完成这个简单的任务。

大多数 PDF 阅读器都具有内置注释功能，你可以使用它来快速轻松地高亮显示文本并添加注释。

我最近在审阅 O'Reilly 即将出版的第四版 [《Linux Pocket Guide》一书](https://www.oreilly.com/library/view/linux-pocket-guide/9780596806347/?ref=itsfoss.com)时“发现”了它。出版商请求对 PDF 文件本身提出建议。

让我分享一下如何在 Linux 中使用 Evince（GNOME 中的默认 PDF 阅读器）对 PDF 进行注释。使用 Okular（KDE 中默认的 PDF 阅读器）也可以实现同样的效果。

大多数 Linux 发行版都应该附带上述工具之一。如果没有，你可以轻松安装它们。我不会介绍安装过程。请在你的发行版的软件管理器中查找它们。

### 使用 Evince 文档查看器注释 PDF

使用 Evince（在 GNOME 中也称为“<ruby> 文档查看器 <rt>  Document Viewer </rt></ruby>”）打开所需的 PDF 文件。

你将在文档查看器的左上角看到一个“编辑”选项。点击它会出现以下两个选项：

* 备注文本（用于添加评论）
* 高亮显示文本（用于高亮显示选定的文本）

让我详细介绍这是如何工作的。

#### 在 PDF 中添加注释

要添加评论，单击 “<ruby> 注释文本 <rt>  Note text </rt></ruby>” 选项。

你会注意到光标变成了 “+” 号。你可以单击文档中的任意位置，它会立即添加注释图标并打开另一个窗口以添加注释。

我建议单击该行的末尾，以便注释图标位于空白区域，并且不会遮挡文件的实际文本。

添加所需注释后，你可以 **单击注释区域的 “X” 按钮来关闭** 注释文本窗口。

>
> ? 你可以通过在屏幕上拖动注释图标来移动注释图标。
>
>
>

#### 在 PDF 中高亮显示文本

同样，你可以选择 “<ruby> 高亮显示文本 <rt>  Highlight text </rt></ruby>” 选项来高亮显示 PDF 文件中的特定文本。

之后，只需选择要高亮显示的文本即可。当你开始移动光标，它就会开始高亮显示。

>
> ? 你还可以在高亮显示的文本上添加注释，以提供有关高亮显示的一些上下文。要添加文本，请单击高亮显示的文本（现在它可点击了）。
>
>
>

#### 保存带注释的文件

你可能已在 PDF 上添加注释，但更改尚未保存。

保存更改很简单。按 `Ctrl+S` 键，你可以选择保存文件的位置。

你可以覆盖现有 PDF 文件或将其另存为新文件。

>
> ? 注释、评论和高亮被附加到 PDF 文件中，即使你使用其他可以读取注释的工具打开 PDF 文件，它们也应该可以看到。
>
>
>

#### 阅读注释

要阅读文本注释或评论，只需将鼠标悬停在注释图标或高亮显示的文本上即可。它将立即显示注释。

不要单击图标来阅读文本。单击将打开它进行编辑。

#### 编辑现有注释

假设你注意到需要向现有笔记添加更多详细信息。你所要做的就是单击“注释”图标。

它将打开添加的文本。你可以阅读它，如果你愿意，也可以编辑它。对于高亮显示的文本部分中的注释也是如此。

但是，编辑高亮显示的文本时它不是很完善。如果你认为必须高亮显示现有文本周围的更多文本，那么它会起作用。但如果你想缩短高亮显示的文本，那就不行了。

为此，你必须删除高亮显示并再次添加。

#### 删除现有注释

删除注释非常简单，只需右键单击注释并选择 “<ruby> 删除注释 <rt>  Remove Annotation </rt></ruby>” 选项即可。

这对于高亮显示的文本也同样有效。

#### 修改注释的外观

不喜欢默认的黄色或注释图标？这一切都是可以改变的。

右键单击现有注释并选择 “<ruby> 注释属性 <rt>  Annotation Properties... </rt></ruby>” 选项。

你可以更改评论的作者、注释的颜色和不透明度。你还可以更改注释的图标和高亮显示的标记类型（删除线、下划线等）。

这仅适用于现有注释。我找不到一种方法来更改所有未来注释的默认属性。

### 更多 PDF 编辑选项

如果你需要的不仅仅是简单的文本注释和高亮显示，可以使用专门的 PDF 编辑器。

>
> **[11 最好的 Linux 上的 PDF 编辑器](https://itsfoss.com/pdf-editors-linux/)**
>
>
>

这些工具可能允许你重新排列或合并 PDF 文件。

>
> **[如何在 Linux 上合并 PDF 文件](https://itsfoss.com/merge-pdf-linux/)**
>
>
>

如果需要，你还可以 [压缩 PDF 文件](https://itsfoss.com/compress-pdf-linux/)。

>
> **[如何在 Linux 上压缩 PDF 文件](https://itsfoss.com/compress-pdf-linux/)**
>
>
>

PDF 编辑永无止境。我希望你喜欢这篇有关 Linux 中 PDF 注释的初学者技巧。

KDE 的 Okular 还提供 PDF 注释选项。也许我可以写一篇关于 Okul 的类似文章。

请在评论栏留下你的反馈。

*（题图：MJ/a5318540-0b82-4ef6-a0bb-532505a17458）*

---

via: <https://itsfoss.com/annotate-pdf-linux/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary:
? Amazon Linux 2023 仍然没有交付虚拟机镜像
? 科学家发现让人不睡觉的机制
? Chrome 无用的阅读模式将有朗读功能
»
»

# 硬核观察 #1106 Amazon Linux 2023 仍然没有交付虚拟机镜像

### Amazon Linux 2023 仍然没有交付虚拟机镜像

Amazon Linux 2023 于 3 月 15 日发布时，本应以虚拟机镜像的形式提供，让企业可以在自己的服务器上运行。这是 Amazon 曾经承诺过的，但后来它删除了这一承诺，并且没有给出任何理由。从去年发布的功能请求开始，到一年后的类似请求，在过去的 18 个月里，用户一直希望 Amazon 澄清该情况，但没有任何解释。上周，Amazon 标记了该功能请求，并将其添加到 Amazon Linux 2023 功能积压列表中，但也没有给出具体的承诺或时间表。

>
> **[消息来源：The Register](https://www.theregister.com/2023/08/25/amazon_linux_2023_vm/)**
>
>
>

>
> 老王点评：就这样的 Amazon Linux，怎么和其它的企业级 Linux 竞争啊？是已经躺平了么？
>
>
>

### 科学家发现让人不睡觉的机制

华盛顿州立大学的研究人员发表论文，他们使用遗传和化学技术可逆的改变小鼠基底前脑中星形胶质细胞的活性，能让小鼠连续几个小时保持清醒，没有表现出任何睡意的迹象。研究人员表示，这项研究或有助于创造出能长时间让人保持清醒的药物，比如轮班工人不会昏昏欲睡，宇航员、飞行员、士兵、医疗人员、急救人员可以在较长时间内无需睡眠。

>
> **[消息来源：medicalxpress](https://medicalxpress.com/news/2023-08-astrocytes-basal-forebrain-mice-sleepiness.html)**
>
>
>

>
> 老王点评：我看到这一条时，第一反应就是程序员们可以 7X24 了……
>
>
>

### Chrome 无用的阅读模式将有朗读功能

谷歌正在积极为其 Chrome 浏览器的阅读模式增加新的功能，在 Canary 频道开始测试朗读选项。该功能可以将整篇文章朗读出来，就像你在听有声读物一样。一些主流浏览器和应用程序（如 Pocket）已经具备了这项功能，但谷歌 Chrome 浏览器现在才开始测试，并且，语音输出听起来非常机械，就像早期的 TTS 转换一样。这对于拥有一些听起来最自然的语音模型的谷歌来说尤其讽刺。

>
> **[消息来源：Android Police](https://www.androidpolice.com/google-chrome-canary-read-aloud/)**
>
>
>

>
> 老王点评：最近，微信公众号也开始有朗读模式了，但是似乎很快就没啥人用了。
>
>
>


Kali Linux 2023.3 版本：技术革新与新工具的全新结合

# Kali Linux 2023.3 版本：技术革新与新工具的全新结合

>
> 最新发行的 Kali Linux 版本，注重于底层技术更迭和部分全新工具的推出。
>
>
>

作为全球渗透测试人员的优选，Kali Linux 作为 [注重于渗透测试的](https://itsfoss.com/linux-hacking-penetration-testing/) 发行版，为各种使用情景提供了丰富的工具库。

就在 [几个月之前](https://news.itsfoss.com/kali-linux-2023-2-release/)，我们介绍过 Kali Linux 2023.2 版本，该版本中包含一系列显著改进。

现如今，我们迎来了 **Kali Linux 2023.3** 的更新发布，这一版本在更大程度上 **关注了后端技术**。

让我们详细探索此次更新中的新亮点。

? Kali Linux 2023.3：有哪些新鲜事？
---------------------------

借助 [Linux 内核 6.3](https://news.itsfoss.com/linux-kernel-6-3/)，Kali Linux 2023.3 版本作为一次高度专注的发布，聚焦于几项关键更新。主要亮点包括：

* 全新的打包工具
* 内部基础设施优化
* 新增加网络工具

### 全新的打包工具

Kali Linux 已经添加了新功能、各项生活质量改良以及新脚本，全面扩充了他们开放的 [自制脚本库](https://gitlab.com/kalilinux/tools/packaging)。

打包工具中包含：

* [Britney2](http://repo.kali.org/britney)
* [Build-Logs](http://repo.kali.org/build-logs/)
* [Package Tracker](https://pkg.kali.org/)
* [AutoPkgTest](https://autopkgtest.kali.org/)
* 以及其他工具。

### 内部基础设施优化

得益于最近发布的 Debian 12，Kali Linux 的开发者得以全面改造、重新设计自己的基础设施。

这是一项宏大的工程，通过采用单一的软件处理 Kali Linux 的重要组成部分，**使得他们得以简化自己的软件栈**。

因此，**以 Debian 12 为基础**，使用 [Cloudflare](https://www.cloudflare.com/) 作为 CDN / WAF，Web 服务器服务采用 [Nginx](https://www.nginx.com/)，并且选用了 [Ansible](https://www.ansible.com/) 作为 <ruby> 基础设施即代码 <rt>  Infrastructure as Code </rt></ruby>的工具。

更多的优化将会在即将推出的更新中进行。

### 新增网络工具

伴随着 **Linux 内核的升级至 6.3.7**，Kali Linux 2023.3 版本 **推出了一系列专门针对网络操作的新工具**，这些新工具已经在网络仓库中对用户开放。

新工具包括：

* [kustomize](https://www.kali.org/tools/kustomize/) - Kubernetes YAML 配置的定制工具。
* [Rekono](https://www.kali.org/tools/rekono-kbx/) - 完整的渗透测试过程自动化平台。
* [rz-ghidra](https://www.kali.org/tools/rz-ghidra/) - 用于 rizin 的深度 ghidra 反编译器以及 sleigh 反汇编器的集成工具。
* [Calico](https://www.kali.org/tools/calico/) - 云原生网络和网络安全解决方案。
* [ImHex](https://www.kali.org/tools/imhex/) - 适应各种使用场景的 Hex 编辑器。
* [Villain](https://www.kali.org/tools/villain/) - 可以处理多个反向 Shell 的 C2 框架。

### ? 其它变动与提升

除了以上提及的要点，还有一些显著的变动值得注意：

* 两个包 [king-phisher](https://www.kali.org/tools/king-phisher/) 和 [plecost](https://www.kali.org/tools/plecost/) 已经舍弃，转而选择其他代替方案。
* 当在增强会话模式下使用 Hyper-V 时，引入了 PipeWire 的支持。
* 对 Kali Purple 进行了多项改进。

你可以阅读 [官方发布说明](https://www.kali.org/blog/kali-linux-2023-3-release/) 以获取这次版本更新的更细致信息。

? 获取 Kali Linux 2023.3
----------------------

你可以在官方网站获取 Kali Linux 的最新发布版本。

>
> **[Kali Linux 2023.3](https://www.kali.org/get-kali/)**
>
>
>

对于现有用户，你可以运行以下命令进行更新到最新版本：

```
sudo apt update && sudo apt full-upgrade

```

? 你是否打算在新版本中尝试新的工具？欢迎在评论区中分享你的想法。

*（题图：MJ/6539fac3-8d3d-47b8-8566-a9ce376b53d3）*

---

via: <https://news.itsfoss.com/kali-linux-2023-3-release/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[译者ID](https://github.com/%E8%AF%91%E8%80%85ID) 校对：[校对者ID](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 RHEL 上配置网络绑定（成组）

Summary: 它让我们可以将多个网络接口聚合为一个专有的虚拟网络接口

它让我们可以将多个网络接口聚合为一个专有的虚拟网络接口

# 在 RHEL 上配置网络绑定（成组）

网络 <ruby>   绑定  <rt>  Bonding </rt></ruby>（<ruby> 成组 <rt>  Teaming </rt></ruby>） 是 Linux 的一项内核特性，它让我们可以将多个网络接口（例如 `ens192`、`ens224`）聚合为一个专有的虚拟网络接口，被称为通道绑定（`bond0`）。这样做能够提升吞吐量并增加冗余备份。

网络绑定一共支持 7 种模式，你可以根据实际需求进行设置。<ruby> 链接聚合控制协议 <rt>  Link Aggregation Control Protocol </rt></ruby>（LACP）， 即模式 4（802.3ad）因其支持链接聚合与冗余而被广泛应用。

在本篇文章中，我们将引导你学习如何在 RHEL 系统中配置网卡（网络）绑定。

### LACP 绑定的前置条件

* 网络团队需要在网络交换机的端口上开启 LACP（802.3ad）来实现链接的聚合。
* 一个 Linux 系统应该配备至少两个网络接口。
* 对于物理服务器，我们推荐在板载接口与 PCI 接口间进行绑定配置，以避免在主机端的网络卡出现单点故障。

### Bonding 模块

你可以使用 `lsmod` 命令来确认你的 Linux 系统是否已经加载了 `bonding` 模块。

```
lsmod | grep -i bonding
bonding               12451  0

```

系统应该默认已加载。如果未看到，可以运用 `modprobe` 命令进行加载。

```
modprobe bonding

```

### 创建绑定接口

在 `/etc/sysconfig/network-scripts/` 路径下，创建一个名为 `ifcfg-bond0` 的绑定接口文件。依据你的网络情况，你可能需要修改诸如 `IP`、`MASK` 以及 `GATEWAY` 等值。

```
vi /etc/sysconfig/network-scripts/ifcfg-bond0

```

```
TYPE=Bond
DEVICE=bond0
NAME=bond0
BONDING_MASTER=yes
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
BONDING_OPTS="mode=4 miimon=100 lacp_rate=1"

```

| 参数 | 描述 |
| --- | --- |
| `BONDING_MASTER=yes` | 表示设备是一个绑定主设备。 |
| `mode=4` | 绑定模式是 IEEE 802.3ad 动态链接聚合（LACP）。 |
| `miimon=100` | 定义以毫秒单位的 MII 链路监测频率，这决定了多久检查每个从属链路的状态一次以寻找失败的链路。`0` 值将禁用 MII 链路监测。`100` 是个不错的初始值。 |
| `lacp_rate=1` | 一个设置项，规定我们将以何种频率要求我们的链路伙伴每秒钟发送 LACPDU。默认为慢，即 `0`。 |

### 配置第一个子接口

修改你希望添加到绑定中的第一个子接口。请根据你的实际环境使用合适的接口名。

```
vi /etc/sysconfig/network-scripts/ifcfg-ens192

```

```
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens192
ONBOOT=yes
MASTER=bond0
SLAVE=yes

```

### 配置第二个子接口

修改你希望添加到绑定中的第二个子接口。请根据你的实际环境使用合适的接口名。

```
vi /etc/sysconfig/network-scripts/ifcfg-ens224

```

```
TYPE=Ethernet
BOOTPROTO=none
DEVICE=ens224
ONBOOT=yes
MASTER=bond0
SLAVE=yes

```

### 重启网络服务

重启网络服务以激活绑定接口。

```
systemctl restart network

```

### 验证绑定配置

你可以借助 [ip 命令](https://www.2daygeek.com/linux-ip-command-configure-network-interface/) 来查看绑定接口以及其子接口的情况。可以看到，`bond0` 现在已启动并在运行。

### 查阅绑定接口状态

检查以下文件，你可以看到绑定接口及其子接口的详细信息。输出结果应该看起来很不错，我们能看到诸如绑定模式，MII 状态，MII 轮询间隔，LACP 速率，端口数量等信息。

```
cat /proc/net/bonding/bond0

```

```
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

802.3ad info
LACP rate: fast
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: c8:5b:76:4d:d4:5c
Active Aggregator Info:
        Aggregator ID: 1
        Number of ports: 2
        Actor Key: 15
        Partner Key: 32773
        Partner Mac Address: e4:a7:a0:32:fc:e9

Slave Interface: ens192
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: c8:5b:76:4d:d4:5c
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: none
Actor Churned State: 0
Partner Churned State: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: c8:5b:76:4d:d4:5c
    port key: 15
    port priority: 255
    port number: 1
    port state: 63
details Partner lacp pdu:
    system priority: 32667
    system mac address: e4:a7:a0:32:fc:e9
    oper key: 32773
    port priority: 32768
    port number: 290
    port state: 61

Slave Interface: ens224
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: e4:a7:a0:32:fc:e9
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: none
Actor Churned State: 0
Partner Churned State: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: e4:a7:a0:32:fc:e9
    port key: 15
    port priority: 255
    port number: 2
    port state: 63
details Partner lacp pdu:
    system priority: 32667
    system mac address: c8:5b:76:4d:d4:5c
    oper key: 32773
    port priority: 32768
    port number: 16674
    port state: 61

```

### 容错/冗余测试

为了验证容错性和连接速度，你可以逐个断开接口，然后检查服务器是否仍旧可达。

* 测试用例-1：当两个子接口都启动并运行时，使用 [ethtool 命令](https://www.2daygeek.com/view-change-ethernet-adapter-settings-nic-card-linux/) 检查链路速度。
* 测试用例-2：断开第一个子接口，然后尝试访问系统。
* 测试用例-3：断开第二个子接口，然后尝试访问系统。

#### 测试用例-1：

如果你想检测下连接速度：没错，我在 `bond0` 上看到了 `20 Gbps` 的速度，因为每个子接口支持 10 Gbps。

```
ethtool bond0

```

```
Settings for bond0:
        Supported ports: [ ]
        Supported link modes:   Not reported
        Supported pause frame use: No
        Supports auto-negotiation: No
        Supported FEC modes: Not reported
        Advertised link modes:  Not reported
        Advertised pause frame use: No
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: 20000Mb/s
        Duplex: Full
        Port: Other
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: off
        Link detected: yes

```

#### 测试用例-2：

现在我们将关闭第一个子接口。

```
ifdown ens192

```

```
Device 'ens192' successfully disconnected.

```

通过 `ssh` 尝试访问系统。没问题，系统现在是可以访问的。

```
ssh [email protected]

```

由于已经有一个子接口关闭，你现在在 `bond0` 上只能看到 10 Gbps 的速度。

```
ethtool bond0 | grep -i speed

```

```
            Speed: 10000Mb/s

```

现在，我们再次查看绑定接口的状态。可以看出，只有一个子接口处于活跃状态。

```
cat /proc/net/bonding/bond0

```

#### 测试用例-3：

我们来关闭第二个子接口，并进行类似测试用例-2 的测试：

```
ifdown ens224

```

```
Device 'ens224' successfully disconnected.

```

### 结语

我希望你已经掌握了在 RHEL 上配置 LACP 绑定的方法。

在本教程中，我们为你展示了在 RHEL 系统配置网络绑定或网卡聚合的最简单方式。

如果你有任何疑问或者反馈，欢迎在下面留言。

*（题图：MJ/939f6ba6-eb46-480d-8879-3a422c7425d2）*

---

via: <https://www.2daygeek.com/configure-network-bonding-nic-teaming-rhel/>

作者：[Jayabal Thiyagarajan](https://www.2daygeek.com/author/jayabal/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1107 埃隆·马斯克的 Twitter/X 关注者水分严重

Summary:
? 埃隆·马斯克的 Twitter/X 关注者水分严重
? OpenTF 宣布创建 Terraform 分支
? 调查发现业界对 Rust 应用的担忧减少了 21%
»
»

# 硬核观察 #1107 埃隆·马斯克的 Twitter/X 关注者水分严重

### 埃隆·马斯克的 Twitter/X 关注者水分严重

埃隆·马斯克是 Twitter/X 上关注者最多的用户，高达 1.53 亿。有研究对他的关注者进行了分析，发现其中，

* 42%（约 6530 万）的用户没有任何关注者；
* 72%（1.12 亿）的用户其关注数量不足 10 人，全部 1.53 亿用户的关注者数量的中位数仅为 1 个；
* 超过 40%（6250 万）的关注者没有发过任何推文或删除了全部推文，超过 1 亿的关注者发表的推文不足 10 条；
* 超过 25%（3890 万）的关注者是在他收购 Twitter 后才创建的账号；
* 而他的关注者中仅仅只有 0.3%（45 万）的用户是每月 8 美元的付费订阅用户（付费订阅用户总数据估计约为 83 万）。

>
> **[消息来源：Mashable](https://mashable.com/article/elon-musk-x-twitter-follower-data)**
>
>
>

>
> 老王点评：如果说，马斯克给自己弄了很多假粉，那这是自己演给自己玩吗？
>
>
>

### OpenTF 宣布创建 Terraform 分支

HashiCorp 公司创建的基础设施即代码软件 Terraform 最初于 2014 年在 MPL 2.0 许可证下开源。但在 8 月 10 日，HashiCorp 突然将 Terraform 的许可证从 MPL 切换到了非开源的商业源代码许可证（BSL）。为了保持 Terraform 的开源性，Terraform 社区发布了 OpenTF 宣言，宣布创建 Terraform 的分支，并成立了 OpenTF 基金会。OpenTF 基金会表示，已经有四家公司承诺为该项目提供 14 名全职工程师，并预计未来几周将至少增加一倍。而且，它指出过去两年 HashiCorp 公司只提供了大约 5 名全职工程师去维护 Terraform。

>
> **[消息来源：OpenTF](https://opentf.org/announcement)**
>
>
>

>
> 老王点评：当企业需要时它开源，当企业不满时它闭源。当开源时社区来了，当闭源时社区分叉了。这样的戏码我们已经见过很多次了，难道这是企业开源的宿命吗？
>
>
>

### 调查发现业界对 Rust 应用的担忧减少了 21%

Rust 项目连续第六年对 Rust 编程语言进行了调查，共有 9,433 人完成了调查。根据调查数据，

* 超过 90% 的调查对象认为自己是 Rust 用户，其中 47% 的人每天都在使用 Rust；
* 27% 的受访者可以编写可投入生产的代码；
* 在放弃 Rust 用户中，30% 认为困难是放弃的主要原因；
* 29.7% 的受访者表示，他们在工作场所的大部分编码工作都使用 Rust，这比上一年增加了 51.8%；
* 使用 Rust 的最主要原因包括编写无错误软件的能力（86%）、Rust 的性能特点（84%）以及 Rust 的安全保障（69%）；
* 39% 的受访者表示学习过程具有挑战性，9% 的受访者表示在工作中采用 Rust 拖慢了他们团队的速度；不过，60% 的生产型用户认为，总体而言，采用 Rust 的成本是值得的；
* 26% 的人担心 Rust 背后的开发者和维护者得不到适当的支持，这比去年的调查结果减少了 30% 以上。

>
> **[消息来源：Rust](https://blog.rust-lang.org/2023/08/07/Rust-Survey-2023-Results.html)**
>
>
>

>
> 老王点评：Rust 是颇受追捧，但是我其实认为 Rust 的最大风险可能是项目方瞎折腾。
>
>
>


Linux 下“Hello World”的幕后发生了什么

干货满满

# Linux 下“Hello World”的幕后发生了什么

<img src="content_image/album_202308_29_143604o5o22os0h20d4lz5.jpg" alt="" title="">

今天我在想 —— 当你在 Linux 上运行一个简单的 “Hello World” Python 程序时，发生了什么，就像下面这个？

```
print("hello world")

```

这就是在命令行下的情况：

```
$ python3 hello.py
hello world

```

但是在幕后，实际上有更多的事情在发生。我将描述一些发生的情况，并且（更重要的是）解释一些你可以用来查看幕后情况的工具。我们将用 `readelf`、`strace`、`ldd`、`debugfs`、`/proc`、`ltrace`、`dd` 和 `stat`。我不会讨论任何只针对 Python 的部分 —— 只研究一下当你运行任何动态链接的可执行文件时发生的事情。

### 0、在执行 execve 之前

要启动 Python 解释器，很多步骤都需要先行完成。那么，我们究竟在运行哪一个可执行文件呢？它在何处呢？

### 1、解析 python3 [hello.py](http://hello.py)

Shell 将 `python3 hello.py` 解析成一条命令和一组参数：`python3` 和 `['hello.py']`。

在此过程中，可能会进行一些如全局扩展等操作。举例来说，如果你执行 `python3 *.py` ，Shell 会将其扩展到 `python3 hello.py`。

### 2、确认 python3 的完整路径

现在，我们了解到需要执行 `python3`。但是，这个二进制文件的完整路径是什么呢？解决办法是使用一个名为 `PATH` 的特殊环境变量。

**自行验证**：在你的 Shell 中执行 `echo $PATH`。对我来说，它的输出如下：

```
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

```

当执行一个命令时，Shell 将会依序在 `PATH` 列表中的每个目录里搜索匹配的文件。

对于 `fish`（我的 Shell），你可以在 [这里](https://github.com/fish-shell/fish-shell/blob/900a0487443f10caa6539634ca8c49fb6e3ce5ba/src/path.cpp#L31-L45) 查看路径解析的逻辑。它使用 `stat` 系统调用去检验是否存在文件。

**自行验证**：执行 `strace -e stat bash`，然后运行像 `python3` 这样的命令。你应该会看到如下输出：

```
stat("/usr/local/sbin/python3", 0x7ffcdd871f40) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/python3", 0x7ffcdd871f40) = -1 ENOENT (No such file or directory)
stat("/usr/sbin/python3", 0x7ffcdd871f40) = -1 ENOENT (No such file or directory)
stat("/usr/bin/python3", {st_mode=S_IFREG|0755, st_size=5479736, ...}) = 0

```

你可以观察到，一旦在 `/usr/bin/python3` 找到了二进制文件，搜索就会立即终止：它不会继续去 `/sbin` 或 `/bin` 中查找。

#### 对 execvp 的补充说明

如果你想要不用自己重新实现，而运行和 Shell 同样的 `PATH` 搜索逻辑，你可以使用 libc 函数 `execvp`（或其它一些函数名中含有 `p` 的 `exec*` 函数）。

### 3、stat 的背后运作机制

你可能在思考，Julia，`stat` 到底做了什么？当你的操作系统要打开一个文件时，主要分为两个步骤：

1. 它将 **文件名** 映射到一个包含该文件元数据的 **inode**
2. 它利用这个 **inode** 来获取文件的实际内容

`stat` 系统调用只是返回文件的 inode 内容 —— 它并不读取任何的文件内容。好处在于这样做速度非常快。接下来让我们一起来快速了解一下 inode。（在 Dmitry Mazin 的这篇精彩文章 《[磁盘就是一堆比特](https://www.cyberdemon.org/2023/07/19/bunch-of-bits.html)》中有更多的详细内容）

```
$ stat /usr/bin/python3
  File: /usr/bin/python3 -> python3.9
  Size: 9           Blocks: 0          IO Block: 4096   symbolic link
Device: fe01h/65025d    Inode: 6206        Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2023-08-03 14:17:28.890364214 +0000
Modify: 2021-04-05 12:00:48.000000000 +0000
Change: 2021-06-22 04:22:50.936969560 +0000
 Birth: 2021-06-22 04:22:50.924969237 +0000

```

**自行验证**：我们来实际查看一下硬盘上 inode 的确切位置。

首先，我们需要找出硬盘的设备名称：

```
$ df
...
tmpfs             100016      604     99412   1% /run
/dev/vda1       25630792 14488736  10062712  60% /
...

```

看起来它是 `/dev/vda1`。接着，让我们寻找 `/usr/bin/python3` 的 inode 在我们硬盘上的确切位置（在 debugfs 提示符下输入 `imap` 命令）：

```
$ sudo debugfs /dev/vda1
debugfs 1.46.2 (28-Feb-2021)
debugfs:  imap /usr/bin/python3
Inode 6206 is part of block group 0
    located at block 658, offset 0x0d00

```

我不清楚 `debugfs` 是如何确定文件名对应的 inode 的位置，但我们暂时不需要深入研究这个。

现在，我们需要计算硬盘中 “块 658，偏移量 0x0d00” 处是多少个字节，这个大的字节数组就是你的硬盘。每个块有 4096 个字节，所以我们需要到 `4096 * 658 + 0x0d00` 字节。使用计算器可以得到，这个值是 `2698496`。

```
$ sudo dd if=/dev/vda1 bs=1 skip=2698496 count=256 2>/dev/null | hexdump -C
00000000  ff a1 00 00 09 00 00 00  f8 b6 cb 64 9a 65 d1 60  |...........d.e.`|
00000010  f0 fb 6a 60 00 00 00 00  00 00 01 00 00 00 00 00  |..j`............|
00000020  00 00 00 00 01 00 00 00  70 79 74 68 6f 6e 33 2e  |........python3.|
00000030  39 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |9...............|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000060  00 00 00 00 12 4a 95 8c  00 00 00 00 00 00 00 00  |.....J..........|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 2d cb 00 00  |............-...|
00000080  20 00 bd e7 60 15 64 df  00 00 00 00 d8 84 47 d4  | ...`.d.......G.|
00000090  9a 65 d1 60 54 a4 87 dc  00 00 00 00 00 00 00 00  |.e.`T...........|
000000a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

```

好极了！我们找到了 inode！你可以在里面看到 `python3`，这是一个很好的迹象。我们并不打算深入了解所有这些，但是 [Linux 内核的 ext4 inode 结构](https://github.com/torvalds/linux/blob/fdf0eaf11452d72945af31804e2a1048ee1b574c/fs/ext4/ext4.h#L769) 指出，前 16 位是 “模式”，即权限。所以现在我们将看一下 `ffa1` 如何对应到文件权限。

* `ffa1` 对应的数字是 `0xa1ff`，或者 41471（因为 x86 是小端表示）
* 41471 用八进制表示就是 `0120777`
* 这有些奇怪 - 那个文件的权限肯定可以是 `777`，但前三位是什么呢？我以前没见过这些！你可以在 [inode 手册页](https://man7.org/linux/man-pages/man7/inode.7.html) 中找到 `012` 的含义（向下滚动到“文件类型和模式”）。这里有一个小的表格说 `012` 表示 “符号链接”。

我们查看一下这个文件，确实是一个权限为 `777` 的符号链接：

```
$ ls -l /usr/bin/python3
lrwxrwxrwx 1 root root 9 Apr  5  2021 /usr/bin/python3 -> python3.9

```

它确实是！耶，我们正确地解码了它。

### 4、准备复刻

我们尚未准备好启动 `python3`。首先，Shell 需要创建一个新的子进程来进行运行。在 Unix 上，新的进程启动的方式有些特殊 - 首先进程克隆自己，然后运行 `execve`，这会将克隆的进程替换为新的进程。

**自行验证：** 运行 `strace -e clone bash`，然后运行 `python3`。你应该会看到类似下面的输出：

```
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f03788f1a10) = 3708100

```

`3708100` 是新进程的 PID，这是 Shell 进程的子进程。

这里有些工具可以查看进程的相关信息：

* `pstree` 会展示你的系统中所有进程的树状图
* `cat /proc/PID/stat` 会显示一些关于该进程的信息。你可以在 `man proc` 中找到这个文件的内容说明。例如，第四个字段是父进程的PID。

#### 新进程的继承

新的进程（即将变为 `python3` 的）从 Shell 中继承了很多内容。例如，它继承了：

1. **环境变量**：你可以通过 `cat /proc/PID/environ | tr '\0' '\n'` 查看
2. **标准输出和标准错误的文件描述符**：通过 `ls -l /proc/PID/fd` 查看
3. **工作目录**（也就是当前目录）
4. **命名空间和控制组**（如果它在一个容器内）
5. 运行它的**用户**以及**群组**
6. 还有可能是我此刻未能列举出来的更多东西

### 5、Shell 调用 execve

现在我们准备好启动 Python 解释器了！

**自行验证**：运行 `strace -f -e execve bash`，接着运行 `python3`。其中的 `-f` 参数非常重要，因为我们想要跟踪任何可能产生的子进程。你应该可以看到如下的输出：

```
[pid 3708381] execve("/usr/bin/python3", ["python3"], 0x560397748300 /* 21 vars */) = 0

```

第一个参数是这个二进制文件，而第二个参数是命令行参数列表。这些命令行参数被放置在程序内存的特定位置，以便在运行时可以访问。

那么，`execve` 内部到底发生了什么呢？

### 6、获取该二进制文件的内容

我们首先需要打开 `python3` 的二进制文件并读取其内容。直到目前为止，我们只使用了 `stat` 系统调用来获取其元数据，但现在我们需要获取它的内容。

让我们再次查看 `stat` 的输出：

```
$ stat /usr/bin/python3
  File: /usr/bin/python3 -> python3.9
  Size: 9           Blocks: 0          IO Block: 4096   symbolic link
Device: fe01h/65025d    Inode: 6206        Links: 1
...

```

该文件在磁盘上占用 0 个块的空间。这是因为符号链接（`python3.9`）的内容实际上是存储在 inode 自身中：在下面显示你可以看到（来自上述 inode 的二进制内容，以 `hexdump` 格式分为两行输出）。

```
00000020  00 00 00 00 01 00 00 00  70 79 74 68 6f 6e 33 2e  |........python3.|
00000030  39 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |9...............|

```

因此，我们将需要打开 `/usr/bin/python3.9` 。所有这些操作都在内核内部进行，所以你并不会看到其他的系统调用。

每个文件都由硬盘上的一系列的 **块** 构成。我知道我系统中的每个块是 4096 字节，所以一个文件的最小大小是 4096 字节 —— 甚至如果文件只有 5 字节，它在磁盘上仍然占用 4KB。

**自行验证**：我们可以通过 `debugfs` 找到块号，如下所示：（再次说明，我从 Dmitry Mazin 的《[磁盘就是一堆比特](https://www.cyberdemon.org/2023/07/19/bunch-of-bits.html)》文章中得知这些步骤）。

```
$ debugfs /dev/vda1
debugfs:  blocks /usr/bin/python3.9
145408 145409 145410 145411 145412 145413 145414 145415 145416 145417 145418 145419 145420 145421 145422 145423 145424 145425 145426 145427 145428 145429 145430 145431 145432 145433 145434 145435 145436 145437

```

接下来，我们可以使用 `dd` 来读取文件的第一个块。我们将块大小设定为 4096 字节，跳过 `145408` 个块，然后读取 1 个块。

```
$ dd if=/dev/vda1 bs=4096 skip=145408 count=1 2>/dev/null | hexdump -C | head
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  c0 a5 5e 00 00 00 00 00  |..>.......^.....|
00000020  40 00 00 00 00 00 00 00  b8 95 53 00 00 00 00 00  |@.........S.....|
00000030  00 00 00 00 40 00 38 00  0b 00 40 00 1e 00 1d 00  |....@.8...@.....|
00000040  06 00 00 00 04 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
00000050  40 00 40 00 00 00 00 00  40 00 40 00 00 00 00 00  |@.@.....@.@.....|
00000060  68 02 00 00 00 00 00 00  68 02 00 00 00 00 00 00  |h.......h.......|
00000070  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |................|
00000080  a8 02 00 00 00 00 00 00  a8 02 40 00 00 00 00 00  |..........@.....|
00000090  a8 02 40 00 00 00 00 00  1c 00 00 00 00 00 00 00  |..@.............|

```

你会发现，这样我们得到的输出结果与直接使用 `cat` 读取文件所获得的结果完全一致。

```
$ cat /usr/bin/python3.9 | hexdump -C | head
00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  c0 a5 5e 00 00 00 00 00  |..>.......^.....|
00000020  40 00 00 00 00 00 00 00  b8 95 53 00 00 00 00 00  |@.........S.....|
00000030  00 00 00 00 40 00 38 00  0b 00 40 00 1e 00 1d 00  |....@.8...@.....|
00000040  06 00 00 00 04 00 00 00  40 00 00 00 00 00 00 00  |........@.......|
00000050  40 00 40 00 00 00 00 00  40 00 40 00 00 00 00 00  |@.@.....@.@.....|
00000060  68 02 00 00 00 00 00 00  68 02 00 00 00 00 00 00  |h.......h.......|
00000070  08 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00  |................|
00000080  a8 02 00 00 00 00 00 00  a8 02 40 00 00 00 00 00  |..........@.....|
00000090  a8 02 40 00 00 00 00 00  1c 00 00 00 00 00 00 00  |..@.............|

```

#### 关于魔术数字的额外说明

这个文件以 `ELF` 开头，这是一个被称为“<ruby> 魔术数字 <rt>  magic number </rt></ruby>”的标识符，它是一种字节序列，告诉我们这是一个 ELF 文件。在 Linux 上，ELF 是二进制文件的格式。

不同的文件格式有不同的魔术数字。例如，gzip 的魔数是 `1f8b`。文件开头的魔术数字就是 `file blah.gz` 如何识别出它是一个 gzip 文件的方式。

我认为 `file` 命令使用了各种启发式方法来确定文件的类型，而其中，魔术数字是一个重要的特征。

### 7、寻找解释器

我们来解析这个 ELF 文件，看看里面都有什么内容。

**自行验证**：运行 `readelf -a /usr/bin/python3.9`。我得到的结果是这样的（但是我删减了大量的内容）：

```
$ readelf -a /usr/bin/python3.9
ELF Header:
    Class:                             ELF64
    Machine:                           Advanced Micro Devices X86-64
...
->  Entry point address:               0x5ea5c0
...
Program Headers:
  Type           Offset             VirtAddr           PhysAddr
  INTERP         0x00000000000002a8 0x00000000004002a8 0x00000000004002a8
                 0x000000000000001c 0x000000000000001c  R      0x1
->      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
        ...
->        1238: 00000000005ea5c0    43 FUNC    GLOBAL DEFAULT   13 _start

```

从这段内容中，我理解到：

1. 请求内核运行 `/lib64/ld-linux-x86-64.so.2` 来启动这个程序。这就是所谓的**动态链接器**，我们将在随后的部分对其进行讨论。
2. 该程序制定了一个入口点（位于 `0x5ea5c0`），那里是这个程序代码开始的地方。

接下来，让我们一起来聊聊动态链接器。

### 8、动态链接

好的！我们已从磁盘读取了字节数据，并启动了这个“解释器”。那么，接下来会发生什么呢？如果你执行 `strace -o out.strace python3`，你会在 `execve` 系统调用之后观察到一系列的信息：

```
execve("/usr/bin/python3", ["python3"], 0x560af13472f0 /* 21 vars */) = 0
brk(NULL)                       = 0xfcc000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=32091, ...}) = 0
mmap(NULL, 32091, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f718a1e3000
close(3)                        = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 l\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=149520, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f718a1e1000
...
close(3)                        = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3

```

这些内容初看可能让人望而生畏，但我希望你能重点关注这一部分：`openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0" ...`。这里正在打开一个被称为 `pthread` 的 C 语言线程库，运行 Python 解释器时需要这个库。

**自行验证**：如果你想知道一个二进制文件在运行时需要加载哪些库，你可以使用 `ldd` 命令。下面展示的是我运行后的效果：

```
$ ldd /usr/bin/python3.9
    linux-vdso.so.1 (0x00007ffc2aad7000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2fd6554000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2fd654e000)
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f2fd6549000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2fd6405000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f2fd63d6000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2fd63b9000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2fd61e3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f2fd6580000)

```

你可以看到，第一个列出的库就是 `/lib/x86_64-linux-gnu/libpthread.so.0`，这就是它被第一个加载的原因。

#### 关于 LD\_LIBRARY\_PATH

说实话，我关于动态链接的理解还有些模糊，以下是我所了解的一些内容：

* 动态链接发生在用户空间，我的系统上的动态链接器位于 `/lib64/ld-linux-x86-64.so.2`. 如果你缺少动态链接器，可能会遇到一些奇怪的问题，比如这种 [奇怪的“文件未找到”错误](https://jvns.ca/blog/2021/11/17/debugging-a-weird--file-not-found--error/)
* 动态链接器使用 `LD_LIBRARY_PATH` 环境变量来查找库
* 动态链接器也会使用 `LD_PRELOAD` 环境变量来覆盖你想要的任何动态链接函数（你可以使用它来进行 [有趣的魔改](https://jvns.ca/blog/2014/11/27/ld-preload-is-super-fun-and-easy/)，或者使用像 jemalloc 这样的替代品来替换默认内存分配器）
* `strace` 的输出中有一些 `mprotect`，因为安全原因将库代码标记为只读
* 在 Mac 上，不是使用 `LD_LIBRARY_PATH`（Linux），而是 `DYLD_LIBRARY_PATH`

你可能会有疑问，如果动态链接发生在用户空间，我们为什么没有看到大量的 `stat` 系统调用在 `LD_LIBRARY_PATH` 中搜索这些库，就像 Bash 在 `PATH` 中搜索那样？

这是因为 `ld` 在 `/etc/ld.so.cache` 中有一个缓存，因此所有之前已经找到的库都会被记录在这里。你可以在 `strace` 的输出中看到它正在打开缓存 - `openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3`。

在 [完整的 strace 输出](https://gist.github.com/jvns/4254251bea219568df9f43a2efd8d0f5) 中，我仍然对动态链接之后出现的一些系统调用感到困惑（什么是 `prlimit64`？本地环境的内容是如何介入的？`gconv-modules.cache` 是什么？`rt_sigaction` 做了什么？`arch_prctl` 是什么？以及 `set_tid_address` 和 `set_robust_list` 是什么？）。尽管如此，我觉得已经有了一个不错的开头。

#### 旁注：ldd 实际上是一个简单的 Shell 脚本！

在 Mastodon 上，有人 [指出](https://octodon.social/@lkundrak/110832640058459399)，`ldd` 实际上是一个 Shell 脚本，它设置了 `LD_TRACE_LOADED_OBJECTS=1` 环境变量，然后启动程序。因此，你也可以通过以下方式实现相同的功能：

```
$ LD_TRACE_LOADED_OBJECTS=1 python3
    linux-vdso.so.1 (0x00007ffe13b0a000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f01a5a47000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f01a5a41000)
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f2fd6549000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2fd6405000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f2fd63d6000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2fd63b9000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2fd61e3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f2fd6580000)

```

事实上，`ld` 也是一个可以直接运行的二进制文件，所以你也可以通过 `/lib64/ld-linux-x86-64.so.2 --list /usr/bin/python3.9` 来达到相同的效果。

#### 关于 init 和 fini

让我们来谈谈这行 `strace` 输出中的内容：

```
set_tid_address(0x7f58880dca10) = 3709103

```

这似乎与线程有关，我认为这可能是因为 `pthread` 库（以及所有其他动态加载的库）在加载时得以运行初始化代码。在库加载时运行的代码位于 `init` 区域（或者也可能是 `.ctors` 区域）。

**自行验证**：让我们使用 `readelf` 来看看这个：

```
$ readelf -a /lib/x86_64-linux-gnu/libpthread.so.0
...
  [10] .rela.plt         RELA             00000000000051f0  000051f0
       00000000000007f8  0000000000000018  AI       4    26     8
  [11] .init             PROGBITS         0000000000006000  00006000
       000000000000000e  0000000000000000  AX       0     0     4
  [12] .plt              PROGBITS         0000000000006010  00006010
       0000000000000560  0000000000000010  AX       0     0     16
...

```

这个库没有 `.ctors` 区域，只有一个 `.init`。但是，`.init` 区域都有些什么内容呢？我们可以使用 `objdump` 来反汇编这段代码：

```
$ objdump -d /lib/x86_64-linux-gnu/libpthread.so.0
Disassembly of section .init:

0000000000006000 <_init>:
    6000:       48 83 ec 08             sub    $0x8,%rsp
    6004:       e8 57 08 00 00          callq  6860 <__pthread_initialize_minimal>
    6009:       48 83 c4 08             add    $0x8,%rsp
    600d:       c3

```

所以它在调用 `__pthread_initialize_minimal`。我在 glibc 中找到了 [这个函数的代码](https://github.com/bminor/glibc/blob/a78e5979a92c7985eadad7246740f3874271303f/nptl/nptl-init.c#L100)，尽管我不得不找到一个较早版本的 glibc，因为在更近的版本中，libpthread [不再是一个独立的库](https://developers.redhat.com/articles/2021/12/17/why-glibc-234-removed-libpthread)。

我不确定这个 `set_tid_address` 系统调用是否实际上来自 `__pthread_initialize_minimal`，但至少我们知道了库可以通过 `.init` 区域在启动时运行代码。

这里有一份关于 .init 区域的 elf 手册的笔记：

```
$ man elf

```

`.init` 这个区域保存着对进程初始化代码有贡献的可执行指令。当程序开始运行时，系统会安排在调用主程序入口点之前执行该区域中的代码。

在 ELF 文件中也有一个在结束时运行的 `.fini` 区域，以及其他可以存在的区域 `.ctors` / `.dtors`（构造器和析构器）。

好的，关于动态链接就说这么多。

### 9、转到 \_start

在动态链接完成后，我们进入到 Python 解释器中的 `_start`。然后，它将执行所有正常的 Python 解析器会做的事情。

我不打算深入讨论这个，因为我在这里关心的是关于如何在 Linux 上运行二进制文件的一般性知识，而不是特别针对 Python 解释器。

### 10、写入字符串

不过，我们仍然需要打印出 “hello world”。在底层，Python 的 `print` 函数调用了 libc 中的某个函数。但是，它调用了哪一个呢？让我们来找出答案！

**自行验证**：运行 `ltrace -o out python3 hello.py`：

```
$ ltrace -o out python3 hello.py
$ grep hello out
write(1, "hello world\n", 12) = 12

```

看起来它确实在调用 `write` 函数。

我必须承认，我对 `ltrace` 总是有一些疑虑 —— 与我深信不疑的 `strace` 不同，我总是不完全确定 `ltrace` 是否准确地报告了库调用。但在这个情况下，它似乎有效。并且，如果我们查阅 [cpython 的源代码](https://github.com/python/cpython/blob/400835ea1626c8c6dcd967c7eabe0dad4a923182/Python/fileutils.c#L1955)，它似乎在一些地方确实调用了 `write()` 函数，所以我倾向于相信这个结果。

#### 什么是 libc？

我们刚刚提到，Python 调用了 libc 中的 `write` 函数。那么，libc 是什么呢？它是 C 的标准库，负责许多基本操作，例如：

* 用 `malloc` 分配内存
* 文件 I/O（打开/关闭文件）
* 执行程序（像我们之前提到的 `execvp`）
* 使用 `getaddrinfo` 查找 DNS 记录
* 使用 `pthread` 管理线程

在 Linux 上，程序不一定需要使用 libc（例如 Go 就广为人知地未使用它，而是直接调用了 Linux 系统调用），但是我常用的大多数其他编程语言（如 node、Python、Ruby、Rust）都使用了 libc。我不确定 Java 是否也使用了。

你能通过在你的二进制文件上执行 `ldd` 命令，检查你是否正在使用 libc：如果你看到了 `libc.so.6` 这样的信息，那么你就在使用 libc。

#### 为什么 libc 重要？

你也许在思考 —— 为何重要的是 Python 调用 libc 的 `write` 函数，然后 libc 再调用 `write` 系统调用？为何我要着重提及 `libc` 是调用过程的一环？

我认为，在这个案例中，这并不真的很重要（根据我所知，libc 的 `write` 函数与 `write` 系统调用的映射相当直接）。

然而，存在不同的 libc 实现，有时它们的行为会有所不同。两个主要的实现是 glibc（GNU libc）和 musl libc。

例如，直到最近，[musl 的 `getaddrinfo` 并不支持 TCP DNS](https://www.openwall.com/lists/musl/2023/05/02/1)，[这是一篇关于这个问题引发的错误的博客文章](https://christoph.luppri.ch/fixing-dns-resolution-for-ruby-on-alpine-linux)。

#### 关于 stdout 和终端的小插曲

在我们的程序中，stdout（`1` 文件描述符）是一个终端。你可以在终端上做一些有趣的事情！例如：

1. 在终端中运行 `ls -l /proc/self/fd/1`。我得到了 `/dev/pts/2` 的结果。
2. 在另一个终端窗口中，运行 `echo hello > /dev/pts/2`。
3. 返回到原始终端窗口。你应会看到 `hello` 被打印出来了！

### 暂时就到这儿吧!

希望通过上文，你对 `hello world` 是如何打印出来的有了更深的了解！我暂时不再添加更多的细节，因为这篇文章已经足够长了，但显然还有更多的细节可以探讨，如果大家能提供更多的细节，我可能会添加更多的内容。如果你有关于我在这里没提到的程序内部调用过程的任何工具推荐，我会特别高兴。

### 我很期待看到一份 Mac 版的解析

我对 Mac OS 的一个懊恼是，我不知道如何在这个级别上解读我的系统——当我打印 “hello world”，我无法像在 Linux 上那样，窥视背后的运作机制。我很希望看到一个深度的解析。

我所知道的一些在 Mac 下的对应工具：

* `ldd` -> `otool -L`
* `readelf` -> `otool`
* 有人说你可以在 Mac 上使用 `dtruss` 或 `dtrace` 来代替 `strace`，但我尚未有足够的勇气关闭系统完整性保护来让它工作。
* `strace` -> `sc_usage` 似乎能够收集关于系统调用使用情况的统计信息，`fs_usage` 则可以收集文件使用情况的信息。

### 延伸阅读

一些附加的链接：

* [快速教程：如何在 Linux 上创建超小型 ELF 可执行文件](https://www.muppetlabs.com/~breadbox/software/tiny/teensy.html)
* [在 FreeBSD 上探索 “hello world”](https://people.freebsd.org/~brooks/talks/asiabsdcon2017-helloworld/helloworld.pdf)
* [微观视角下的 Windows 中 “Hello World”][23A]
* 来自 LWN 的文章：[如何运行程序](https://lwn.net/Articles/630727/) （[以及第二部分](https://lwn.net/Articles/631631/)）详尽介绍了 `execve` 的内部机制
* Lexi Mattick 的文章，[赋予 CPU “你” 的存在](https://cpu.land/how-to-run-a-program)
* [从零开始在 6502 上实现 “Hello, World”](https://www.youtube.com/watch?v=LnzuMJLZRdU) （来自 Ben Eater 的视频）

*（题图：MJ/b87ed0a2-80d6-49cd-b2bf-1ef822485e3f）*

---

via: <https://jvns.ca/blog/2023/08/03/behind--hello-world/>

作者：[Julia Evans](https://jvns.ca/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1108 WordPress 公司提供百年域名注册选项

Summary:
? WordPress 公司提供百年域名注册选项
? IBM 开发出新型模拟 AI 芯片，大幅降低能耗
? Meta 发布了编程的大语言模型
»
»

# 硬核观察 #1108 WordPress 公司提供百年域名注册选项

### WordPress 公司提供百年域名注册选项

WordPress 公司称，希望保存故事、照片、声音和视频等数字资产的家庭，或希望保护和记录公司历史的创始人可以使用该产品。该服务的费用为 3.8 万美元，也就是平均每年 380 美元。此方案还包括跨越多个地理区域的内容备份，带宽不受限制，以及 24/7 小时的技术支持。

>
> **[消息来源：Silicon Republic](https://www.siliconrepublic.com/business/wordpress-domain-registration-100-years)**
>
>
>

>
> 老王点评：这钱真白交，我不觉得 100 年后还会有现在的互联网。
>
>
>

### IBM 开发出新型模拟 AI 芯片，大幅降低能耗

IBM 的研究团队近期发布了一款新型的模拟 AI 芯片设计，这种基于大脑模式的芯片设计，可以模拟人脑神经网络的工作方式，实现复杂的计算任务，同时保持高效的能源使用。其性能已经达到了 GPU 的级别，却只有同等级 GPU 1/14 的能耗。这种芯片芯片使用相变存储器（PCM），PCM 不是记录数字系统中的 0 或 1，而是非晶态和晶态之间的连续值，它可将神经网络的权重直接编码到物理芯片上。IBM 的原型芯片能编码 3500 万个 PCM 装置，单个芯片最多能支持 1700 万参数的模型。

>
> **[消息来源：IBM](https://research.ibm.com/blog/analog-ai-chip-low-power)**
>
>
>

>
> 老王点评：模拟 AI 芯片以其更低的能耗和类似人脑的处理方式，未来有望在 AI 应用中扮演更重要的角色。
>
>
>

### Meta 发布了编程的大语言模型

Meta 发布了 Code Llama，这是一种基于 Llama 2 的新型大型语言模型，旨在通过生成和调试代码来帮助程序员。它与 ChatGPT 和 GitHub Copilot 类似，你可以用对话要求它编写代码。Code Llama 可以用 Python、Java、C++、PHP、TypeScript、C#、Bash 脚本等多种编程语言进行编程。该模型有三个规模：7B、13B 和 43B，其中 7B 和 13B 模型速度更快，更适合需要低延迟的任务，如实时代码完成，并且可以在单个消费级 GPU 上运行。

>
> **[消息来源：Ars Technica](https://arstechnica.com/information-technology/2023/08/meta-introduces-code-llama-an-ai-tool-aimed-at-faster-coding-and-debugging/)**
>
>
>

>
> 老王点评：这样说，可以在程序员自己的笔记本上跑了？另外，我才知道 Llama 这个缩写原来也是一个英文单词，意思是美洲羊驼，你知道这种动物的。
>
>
>


Linux 内核 6.5 发布，首次支持 Wi-Fi 7 和 USB4

Summary: Linux 内核 6.5 进行了一系列的改善，阅读此文以了解详情。

Linux 内核 6.5 进行了一系列的改善，阅读此文以了解详情。

# Linux 内核 6.5 发布，首次支持 Wi-Fi 7 和 USB4

>
> Linux 内核 6.5 进行了一系列的改善，阅读此文以了解详情。
>
>
>

新版的 Linux 内核已经发布！

**Linux 6.5 内核** 已经推出，此次更新在 Linux 6.4 内核的基础上进行了进一步的开发，带来了值得注意的改变和新特性。

Linus Torvalds 表示，这是一次相对顺畅的发布：

>
> 上周并没有发生任何异常或惊人的事情，因此没有理由延迟 6.5 版的发布。
>
>
> 我仍有这样一个担忧，似乎是因为许多人都在度假，部分导致整体状态比较平静。但目前这次发布进展顺利，所以这可能只是我多虑了。上周的最大更新就仅仅是对我们自我测试的几次修订。
>
>
>

### ? Linux 内核 6.5：新增了哪些功能？

需要说明的是，这次发布的版本不是长期支持（LTS）版本。如果你期望使用最新的功能，那么这个版本就是为你准备的。否则，除非此版本解决了你关心的特定问题或者能有效提升性能，否则没有升级的必要。

以下是新版内核发布的主要亮点：

* AMD FreeSync 视频的即插即用支持
* AMD CPU 默认启用 P-State 主动模式
* 对 USB4 v2 和 WiFi 7 的初步支持
* ASUS ROG Ally 音效优化

### 开箱即用的 AMD FreeSync 视频支持

在这次发布中，重新引入的一项优秀功能是默认开启的 AMD FreeSync 视频模式支持。此特性在 Linux 内核 5.8 版本中首次引入，后因错误而被回滚。

启用 AMD FreeSync 模式后，通过将显示器的刷新率与显卡的帧率相匹配，可以显著减少游戏及视频中的屏幕撕裂和迟滞现象。

用技术词汇来描述，当它在 Linux 内核 5.8 版本中首次发布时，它的描述是：

>
> 这个补丁集启用了 FreeSync 视频模式的使用场景，这样用户空间可以请求一个 FreeSync 兼容的视频模式，因此，切换到此模式不会触发屏幕黑屏。
>
>
>

这对内容创作者和游戏玩家都非常有用。

但请注意，你需要一个兼容 FreeSync 的显示器和显卡才能充分利用它。

### AMD CPU 默认启用 P-State 主动模式

现代 AMD CPU，特别是那些基于 Zen 2 及更新架构构建的，将默认采用 amd-pstate 作为 CPU 性能调整驱动。之前，CPU 的频率调整机制默认由 CPUFreq 负责。

现在，amd-pstate 提供了三种模式：主动、被动和引导式自主模式。在这次发布中，默认启用了主动模式，从而取代了之前 Linux 内核 6.4 版本中使用的引导式自主模式。

据 Phoronix 的一些 [基准测试](https://www.phoronix.com/review/amd-pstate-epp-ryzen-mobile) 结果显示，发现 amd-pstate 的性能优于 CPUFreq。

你可以参考这个 [提交](https://lore.kernel.org/lkml/CAJZ5v0iQk8ytZ0953_HCWU6Vr62J9UeC8Z9pirOHAfjpbvcOfg@mail.gmail.com/) 了解更多详情。

### ASUS ROG Ally 声音优化

ASUS ROG Ally 是一款使用 AMD Z1 和 Z1 Extreme SoCs 驱动的 Windows 手持式游戏电脑，直接竞争的对手是非常知名的 Steam Deck。它在今年七月发布。

使用 Linux 的游戏玩家如果拥有 ASUS ROG Ally，可以期待看到一个针对系统音频设备的修补发布，感谢这个 [提交](https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git/commit/?h=for-next&id=724418b84e6248cd27599607b7e5fac365b8e3f5)。

### 对 USB4 v2 & WiFi 7 的初始支持

下一代无线标准 - WiFi 7 - 的开发工作已经进行了一段时间。WiFi 7 支持 6Ghz 频段，最大数据传输速率达到 23 Gbps！

与此同时，下一代 USB4 标准的开发工作也已开始。USB4 支持 80 Gbps 的数据传输速率！

通过对 WiFi 的这个 [合并](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=3a8a670eeeaa40d87bd38a587438952741980c18) 和对 WiFi 7 的 [拉取请求](https://lore.kernel.org/lkml/ZKKejqr0Db74u8TB@kroah.com/)，对二者的早期支持已经被嵌入到 Linux 6.5 内核中。

### ? 其他改动与提升

除了主要的亮点外，还有一些值得一提的更新：

* 对英特尔 P-State 的 CPU 进行了缩放修复
* 对 Btrfs 的性能进行了改进，以及其他存储优化
* 对最新的 Xbox 控制器增加了 Rumble 支持
* 对 AMD Radeon RX 7000 系列显卡进行了超频支持
* 对 AMD 和英特尔图形驱动进行了各种优化和改进
* 和以往一样，更多的 Rust 代码转换

[官方发布公告](https://lore.kernel.org/lkml/CAHk-=wgmKhCrdrOCjp=5v9NO6C=PJ8ZTZcCXj09piHzsZ7qqmw@mail.gmail.com/) 将给出自从上一个候选版释放以后的摘要。如果你对技术细节有兴趣，不妨参考 [变更日志](https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.5)。

### 安装 Linux 内核 6.5

如果你使用像 Arch 这样的滚动更新发行版，可以很容易地升级至 Linux 内核 6.5。在新版本发布后的一段时间，这些发行版本会提供最新的内核。

另一方面，使用 Ubuntu 及其衍生版本的用户，可以期待在 Ubuntu 23.10 版本中看到这次的 Linux 内核发布。如果你使用的是像 Pop OS 和 Linux Lite 这样的发行版，可能会更早的见到这版内核发布。

但是如果你希望在基于 Ubuntu 的系统里快速尝试，可以按照我们的指南进行（请注意，这是自行承担风险！?）。

你可以在它的 [官方网站](https://www.kernel.org/) 上下载最新的 Linux 内核 的 Tarball（*发布之后可能需要一段时间才能下载到*）。

? 欢迎在评论区分享你对最新内核发布的看法。

---

via: <https://news.itsfoss.com/linux-kernel-6-5-release/>

作者：[Rishabh Moharir](https://news.itsfoss.com/author/rishabh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Firefox 和 Chrome 中轻松截取完整网页截图

# 在 Firefox 和 Chrome 中轻松截取完整网页截图

>
> Firefox 浏览器内置了截屏工具，你可以用它对整个网页进行截屏。Chrome 浏览器也有同样的功能。
>
>
>

截屏来捕获信息是很常见的。

但你知道你可以在 Firefox 中截取整个网页的截图吗？Firefox 附带一个内置的截图工具，允许你截取选定区域、可见屏幕区域甚至整个网页的截图。

这意味着如果你想保存网页供以后参考，你可以快速捕获整个网页。

Chrome 也有截图功能，但稍微复杂一些。

在本教程中，我将引导你完成以下内容：

* 如何在 Firefox 中截图
* 如何在 Chrome 中截图
* 使用 Nimbus 扩展获得比内置的截屏更多的功能

那么让我们从第一个开始。

### 在 Firefox 中截取网页截图

Firefox 的内置工具可让你通过单击选择整个屏幕、整个页面，甚至特定段落。

#### 步骤 1：访问截图工具

要启动截图程序，请在使用 Firefox 时按 `Ctrl + Shift + s`。

如果你不总是能记住快捷方式，也可以从右键单击菜单访问该工具。

如果你经常截图，那么将该程序添加到工具栏将是一个好主意。为此，你只需执行三个简单步骤：

1. 首先，右键单击工具栏并选择 “<ruby> 自定义工具栏 <rt>  Customize Toolbar </rt></ruby>” 选项
2. 找到 “<ruby> 截图 <rt>  Screenshot </rt></ruby>” 程序并将其拖至工具栏
3. 点击 “<ruby> 完成 <rt>  Done </rt></ruby>” 按钮即可

还困惑吗？ 操作方法如下：

启用后，你可以单击刚刚拖动到工具栏的截图图标。

#### 步骤 2：在 Firefox 中截图

当你启动截图工具时，它会提示两个选项：“<ruby> 保存整页 <rt>  Save full page </rt></ruby>” 和 “<ruby> 保存可见 <rt>  Save visible </rt></ruby>”。这里：

* 保存整页将捕获整个网页
* 保存可见只会捕获当前帧中可见的内容

但如果你想捕获特定部分，你可以使用鼠标光标选择该部分并保存：

如你所见，有两个选项：<ruby> 下载 <rt>  Download </rt></ruby> 或 <ruby> 复制 <rt>  Copy </rt></ruby>（到剪贴板，以便你可以将其粘贴到文档或编辑工具中）。你可以根据你的场景使用其中之一。

### 在 Chrome 中截取网页截图

在 Chrome 中截取全部网页截图比在 Firefox 中要复杂一些，因为它隐藏在开发人员选项下。

不用担心！你将通过以下步骤做到：

* 打开菜单，进入 “<ruby> 更多工具 <rt>  More Tools </rt></ruby>-><ruby> 开发者工具 <rt>  Developer tools </rt></ruby>”。或者，你可以按 `Ctrl + Shift + l` 进入开发者工具目录。
* 按 `Ctrl + Shift + p` 并输入 `screenshot`（LCTT 译注：在中文环境中请输入 “屏幕截图”）
* 选择区域或整个页面，然后回下载截图。

让我向你展示如何做到这一点：

Chrome 基本提供的就是这些。

### 如何使用扩展程序截图

>
> ✋ 非自由和开源软件警告！这里讨论的 Nimbus 扩展不是开源的。
>
>
>

如果你想要更多功能，例如添加延迟、水印或符号，那么你必须使用扩展程序。

为此，我建议使用 Nimbus，它几乎可以让你执行任何本地安装的截图工具可以执行的所有操作。

下载 Firefox 版 Nimbus：

>
> **[Firefox 版 Nimbus](https://addons.mozilla.org/en-US/firefox/addon/nimbus-screenshot/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search)**
>
>
>

下载 Chrome 版 Nimbus：

>
> **[Chrome 版 Nimbus](https://chrome.google.com/webstore/detail/nimbus-screenshot-screen/bpconcjcammlapcogcnnelfmaeghhagj)**
>
>
>

>
> ? 只有 Nimbus 的 Chrome 扩展具有视频录制功能。
>
>
>

完成安装后，**请务必注册 Nimbus 以启用所有功能。**

单击 Nimbus 扩展图标，你会看到多个选项：

你可以选择任何显示的功能，完成后，根据捕获后进行的操作（我选择编辑），它将直接下载截图，打开编辑器或将其发送到任何选定的云提供商。

如果你也将 “<ruby> 编辑 <rt>  Edit </rt></ruby>” 作为捕获后的操作，那么它将打开一个编辑器，你可以在其中对捕获的截图进行编辑：

如果你想添加水印、了解/更改快捷方式、更改截图的格式等，请打开 Nimbus 并点击小齿轮按钮：

只是一个扩展却有非常酷的功能。不是吗？

>
> ? 如果你经常截屏，你可能需要将 Nimbus 扩展固定到任务栏。
>
>
>

### 想要更多功能吗？使用截图工具

如果你不想受到扩展功能的束缚，那么需要尝试具有更多功能的截图工具，这些工具可以在整个系统的任何地方使用。

如果你是 Linux 用户，那么我们有一份关于 [Linux 中截取和编辑截图的最佳工具](https://itsfoss.com/take-screenshot-linux/) 的专门指南：

>
> **[Linux 中截取和编辑截图的最佳工具](https://itsfoss.com/take-screenshot-linux/)**
>
>
>

我希望你喜欢这个快速技巧。

（题图：MJ/76cc0d02-fb37-4bd0-94ec-fc249c1f537e）

---

via: <https://itsfoss.com/firefox-screenshot/>

作者：[Sagar Sharma](https://itsfoss.com/author/sagar/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1109 谷歌推出用 AI 给 AIGC 图像加水印的工具

Summary:
? 谷歌推出用 AI 给 AIGC 图像加水印的工具
? 黑客清除了 7.5 万部手机上的跟踪间谍软件
? IDC 称 “PC 之死” 的报道被严重夸大
»
»

侠之大者，为国为民。×2

来自39.144.24.141的 Chrome Mobile 115.0|Android 10 用户

PC短时间不会被淘汰。。。

手机平板目前无法给自己编写应用，更别提跨平台跨设备了。。。

最严重的是工业设计领域，例如机械设计、电路设计、IC设计。。。严重依赖PC。。。

人们买pc的两大需求就是工作和游戏，结合失业率来看pc市场还是很坚挺的

来自海南海口的 Chrome Mobile 111.0|Android 13 用户

PC 被淘汰是大势所趋,有失偏颇，假设一下，如果PC完全没有了，那用什么替代其作为生产力工具，除非是跨时代产品，能够完全替代PC,否则说淘汰还为时过早，不过一部分份额转向其他倒是真的

# 硬核观察 #1109 谷歌推出用 AI 给 AIGC 图像加水印的工具

### 谷歌推出用 AI 给 AIGC 图像加水印的工具

该工具名为 SynthID，最初将只提供给谷歌人工智能图像生成器 Imagen 的用户。传统的水印方法是在图像上添加可见覆盖层，或在元数据中添加信息，但这种方法很脆弱，当图片被裁剪、调整大小或编辑时，水印就会丢失。SynthID 利用神经网络来处理水印。一个神经网络获取原始图像，然后生成另一张看起来几乎一模一样的图像，但对某些像素进行了微妙的修改，这样就产生了一种人眼看不见的嵌入模式。第二个神经网络可以发现这种图案，这样即使对图片进行截图或编辑（例如旋转或调整大小），水印仍然可以被检测到。

>
> **[消息来源：Technology Review](https://www.technologyreview.com/2023/08/29/1078620/google-deepmind-has-launched-a-watermarking-tool-for-ai-generated-images/)**
>
>
>

>
> 老王点评：果然是用魔法打败魔法，AI 制造的问题由 AI 解决。不过，我很怀疑会不会出现一种可以检测并去掉或扰乱这种水印的工具——即便这种水印工具不开源，也只是减缓对抗手段出现的时间。
>
>
>

### 黑客清除了 7.5 万部手机上的跟踪间谍软件

间谍软件允许用户不受限制地访问受害者的设备，其工作方式是在一个人的手机上下载一个应用程序，用一个不会被发现的身份，让监控者完全访问该设备。据报道，某不愿透露姓名的黑客声称他们入侵了间谍软件公司 WebDetetive，并删除了超过 1.5GB 信息，涉及到数万台设备，以保护受害者免受监控。这些间谍软件的用户将不会从他们的监控目标那里获得任何新数据。

>
> **[消息来源：Engadget](https://www.engadget.com/benevolent-hackers-clear-stalking-spyware-from-75000-phones-141904990.html)**
>
>
>

>
> 老王点评：似乎这种“小偷”和“侠盗”的黑客故事越来越多了。
>
>
>

### IDC 称 “PC 之死” 的报道被严重夸大

IDC 研究经理称，PC 需求 “充其量只是不温不火”，并表示 2023 年将是 “消费类个人电脑自诞生以来年度出货量降幅最大的一年”。据预测，2024 年个人电脑出货量将同比增长 3.7%，达到 2.614 亿台，高于 2018 年的水平，但与 2019 年的需求不相上下。与此同时，预计 2023 年的出货量将下降 13.7%，达到 2.52 亿台。

>
> **[消息来源：The Register](https://www.theregister.com/2023/08/29/pc_bounceback_idc/)**
>
>
>

>
> 老王点评：没那么严重，只是 PC 被淘汰是大势所趋。
>
>
>


如何关闭 KDE 钱包？

Summary: 不喜欢 KDE 钱包不时弹出？这里教你如何禁用它。

不喜欢 KDE 钱包不时弹出？这里教你如何禁用它。

# 如何关闭 KDE 钱包？

>
> 不喜欢 KDE 钱包不时弹出？这里教你如何禁用它。
>
>
>

KDE <ruby> 钱包管理器 <rt>  Wallet Manager </rt></ruby> 是 KDE Plasma 桌面默认包含的一个应用，用于存储和管理密码。

无论是存储网站凭据还是 SSH 密钥密码，你都可以使用 KDE 钱包来完成这一切。它与系统的其余部分集成良好，没有任何麻烦。你可以将其配置执行更多操作（或与更多应用和窗口管理器集成）。

既然 KDE 钱包是一个有用的程序，为什么要关闭它呢？

有时，当你与处理密码/凭据的操作交互时，KDE 钱包可能会弹出。因此，如果你遇到这种情况，我们的指南可以帮助你禁用钱包。

### 禁用 KDE 钱包的最快方法

幸运的是，你不需要使用终端或任何类型的命令来禁用它。你可以使用图形用户界面（GUI）直接从系统设置中执行此操作。

请注意，我在 **KDE Plasma 27.4** 上尝试过此操作。

首先，从应用坞或搜索栏打开 <ruby> 系统设置 <rt>  System Settings </rt></ruby> 应用。

接下来，从左侧边栏中的菜单中，单击 “<ruby> KDE 钱包 <rt>  KDE Wallet </rt></ruby>”。

>
> ? 如果你运行的是旧版本的 KDE Plasma，并且找不到下面的设置，那么需要手动安装 KDE <ruby> 钱包管理器 <rt>  Wallet Manager </rt></ruby>（kwalletmanager）。
>
>
> 你可以通过 KDE 的软件中心（<ruby> 发现 <rt>  Discover </rt></ruby> 应用）执行此操作，然后返回系统设置以查找所需的选项。
>
>
>
>
>
>

这里，你可以访问钱包首选项，其中默认启用 KDE 钱包。

你所要做的就是取消选中 “<ruby> 启用 KDE 钱包子系统 <rt>  Enable the KDE wallet subsystem </rt></ruby>” 选项。

完成后，点击 “<ruby> 应用 <rt>  Apply </rt></ruby>” 使更改生效。系统可能会提示你使用密码验证操作。

确实，并不是每个 KDE Plasma 用户都使用这个钱包应用。如果它困扰你或与其他应用冲突，你只需将其禁用即可。

此外，你可以探索一些适用于 Linux 的 [最佳密码管理器](https://itsfoss.com/password-managers-linux/)：

>
> **[5 个 Linux 上的最佳密码管理器](https://itsfoss.com/password-managers-linux/)**
>
>
>

? 你对 KDE 钱包有何看法？ 你经常使用它吗？ 之前有让你烦恼吗？ 除了默认钱包之外，你更喜欢使用什么？ 在下面的评论中分享你的想法。

*（题图：MJ/45d57fcd-72c3-489d-9051-2a1ad1b5eb96）*

---

via: <https://itsfoss.com/disable-kde-wallet/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary: 最新的 Mageia 主要版本已经推出，赶快来试试看吧。

Mageia（法语“魔术”）曾经在2013年是主流发行版之一，现在知道它的人不多，还有一个类似的发行版是OpenMandriva。

Mageia 和 OpenMandriva 都是 Mandriva 的分叉。

早就不关注mageia版本，只关注debian和国产相关的系统

最新的 Mageia 主要版本已经推出，赶快来试试看吧。

# Mageia 9 发布：搭载 Linux 内核 6.4，支持 PulseAudio

>
> 最新的 Mageia 主要版本已经推出，赶快来试试看吧。
>
>
>

Mageia 最初是 [Mandriva Linux](https://en.wikipedia.org/wiki/Mandriva_Linux) 的一个分支，但现在已经发展成全面的 [独立 Linux 发行版](https://itsfoss.com/independent-linux-distros/)。

从 2010 年以来，Mageia 已经成为一个用于桌面或服务器的稳定且安全的操作系统，并且定期更新。

它的近期的发布公告揭示了 Mageia 9 带来的众多核心改进。

下面就让我为你介绍一下这些改进。

### ? Mageia 9：新亮点是什么？

由最新发布的 [Linux 内核 6.4](https://news.itsfoss.com/linux-kernel-6-4/) 驱动的 Mageia 9，与前一个版本相比，有了大量的提升。

以下是一些主要的亮点：

* 改善了内核与硬件的支持
* 更新了软件套件
* 升级了桌面环境

### 改善了内核与硬件的支持

得益于 Linux 内核 6.4，Mageia 9 配备了 [Mesa 3D 23.1](https://docs.mesa3d.org/relnotes/23.1.0.html)，这使得图形支持达到了新的高度。

在硬件方面，**Mageia 9 使用了针对 AMD/ATI 显卡的自由视频驱动程序，AMDGPU**，能同时支持新旧显卡。不过，似乎专有驱动程序不能用于这个版本。

另外，**对于英伟达显卡** ，与 Mageia 8 相比，Xorg Nouveau 驱动的表现得到了提升，并且在非自由仓库中还提供了专有的英伟达驱动程序。

因此，Mageia 9 能够同时支持新款和旧款的英伟达 GPU。

还有，Mageia 9 提供了 **[X.Org](http://X.Org) 21.1.8** 和 **XWayland 22.1.9**，这些都已从 Xserver 分离出来，以便进行更加方便的维护。

### 更新的软件套件

Mageia 9 特色之一是它丰富的应用策略，所有这些应用都已经升级至新版本。

包含如下内容：

* [LibreOffice 7.5](https://news.itsfoss.com/libreoffice-7-5-release/)
* Blender 3.3.4
* VirtualBox 7.0.10
* NeoVim 0.9.1
* Xen 4.17.0
* Ruby 3.1.4
* QEmu 7.2
* RPM 4.18
* Vim 9.0
* PHP 8.2

### 桌面环境升级

首先，由于 Mageia 的默认桌面是 KDE Plasma，让我们先从这个开始。

Mageia 9 带有基于 **Qt 5.15.7** 构建的 **KDE Plasma 5.27.5**、**KDE Frameworks 5.105** 和 **KDE Applications 23.04.1**。

然后，对于 **GNOME 版** ，Mageia 9 提供了 **GNOME 44.2** ，现在默认在启动时运行 Wayland，同时提供了 “GNOME on Xorg” 的备选会话选项。

对于 **Xfce** ，Mageia 9 发行了 [Xfce 4.18](https://news.itsfoss.com/xfce-4-18-release/)，现在有专门的 32 位 / 64 位的立付 DVD。

最后，我们还有 **MATE 1.26.0** 、**Cinnamon 5.6**、**LXQt 1.3.0** ，这些都是 Mageia 9 提供的其它版本。

### ? 其他技术性变化

总结一下，以下是一些值得强调的其他更改：

* 同时支持 PulseAudio 和 PipeWire 声音服务器。
* 如果禁用了推荐软件包，将减少安装占用。
* RPM 数据库现在采用 SQLite 记录，已不再使用 Berkeley DB。
* 对 [Nvidia Optimus](https://en.wikipedia.org/wiki/Nvidia_Optimus) 笔记本进行了重大性能提升。

要了解此版本更多详情，可翻阅 [发布说明](https://wiki.mageia.org/en/Mageia_9_Release_Notes)。

### ? 下载 Mageia 9

Mageia 9 现已可以下载，欢迎访问 [官方网站](https://www.mageia.org/en/downloads/) 进行下载。

>
> **[Mageia 9](https://www.mageia.org/en/downloads/)**
>
>
>

**针对现有用户**，你可以按照官方提供的 [方便的指南](https://wiki.mageia.org/en/How_to_choose_the_right_Mageia_upgrade_method) 进行升级。

? 你对新变化有何感想？你是否一直期待着这次发布？欢迎在下方留言分享你的观点。

---

via: <https://news.itsfoss.com/mageia-9-released/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lujun9972](https://github.com/lujun9972) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1110 SELinux 移除了 NSA 的名字

Summary:
? SELinux 移除了 NSA 的名字
? OpenAI 称以变革的方式使用受版权保护的材料并不违反版权
? 微软使用类似恶意软件的弹窗让人们放弃谷歌
»
»

安装windows时的用户条款，你拥有的只是Microsoft提供的服务，Windows不是一个软体，而是一项服务，所以事实上你不拥有任何东西

某疼表示这个我熟，账户/号码/用户数据都是我某疼的。。。

# 硬核观察 #1110 SELinux 移除了 NSA 的名字

### SELinux 移除了 NSA 的名字

二十年来，安全增强型 Linux（SELinux）一直是主线内核的一部分，它提供了一个实施访问控制安全策略的安全模块，现在已被广泛用于增强生产型 Linux 服务器和其他系统的安全性。SELinux 最初是美国国家安全局（NSA）开发并贡献给 Linux 内核的，并且多年来一直参与贡献，因此其正式的名称是 “NSA SELinux”。但鉴于 NSA 不良的信誉，它一直被怀疑在 SELinux 代码中埋有不为人知的后门，虽然并没有公开的证据可以证明这一点。由于社区的质疑，以及 SELinux 越来越多的由社区参与开发，Linux 内核将从 6.6 开始，NSA SELinux 的名称中将不再包含 “NSA”。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/SELinux-Drops-NSA-References)**
>
>
>

>
> 老王点评：虽然我对 NSA 也持不信任的态度，但是我对这一做法不以为然。
>
>
>

### OpenAI 称以变革的方式使用受版权保护的材料并不违反版权

OpenAI 针对作者们提起的一系列诉讼做出了回应，这些诉讼指控 OpenAI 非法使用他们的作品未经许可的副本训练了 ChatGPT。OpenAI 请求法院驳回除一项直接著作权侵权外的所有指控。OpenAI 称作者们 “误解了版权的范围，没有考虑到限制和例外情况（包括合理使用）”。OpenAI 认为，即使 ChatGPT 庞大数据集中的 “极小一部分” 包含了作者们的书籍，但 “创新者以变革的方式使用受版权保护的材料并不违反版权”。OpenAI 辩称，与试图通过传播版权材料直接获利的剽窃者不同，他们的目标是 “教会其模型推导出人类语言的基本规则”，并提醒法庭注意：“虽然作者可以为其图书注册版权，但该图书中与‘词频、句法模式和主题标记’相关的‘统计信息’却不在版权保护范围之内”。

>
> **[消息来源：Ars Technica](https://arstechnica.com/tech-policy/2023/08/openai-disputes-authors-claims-that-every-chatgpt-response-is-a-derivative-work/)**
>
>
>

>
> 老王点评：从一定意义上，这些诉讼反映了当前 AI 技术发展与版权法之间的矛盾，其判决可以视为未来 AI 领域的一个重要法律参考。值得持续关注。
>
>
>

### 微软使用类似恶意软件的弹窗让人们放弃谷歌

有人反馈，当他使用 Chrome 浏览器时，他的 Windows 11 弹出了一个窗口，要求将 Chrome 浏览器中的默认搜索引擎切换为微软必应。它并不是一个普通的通知，它既没有出现在通知中心，也与 Windows 11 向你推荐新功能的部分无关。它是一个以某种方式出现在临时目录中的可执行文件，并带有微软的数字签名。这种行为让用户感觉像“被安装了恶意软件”一样。微软回应称，他们“已经意识到了这些报告，并暂停了这一通知”。

>
> **[消息来源：The Verge](https://www.theverge.com/2023/8/30/23851902/microsoft-bing-popups-windows-11-malware)**
>
>
>

>
> 老王点评：我本来想说，“已经为微软许可证付费的用户有理由不受这种广告、分析的影响，而开源的操作系统就可以避免这种情况”，但是我想起来 Canonical 也做过类似的事情，所以我无话可说。
>
>
>


FreeBSD 现在能在 25 毫秒内完成启动

Summary: 这是运行在 AWS Firecracker 上的，当然，同时也有其他的新兴微虚拟机引擎可供选择。

一段话的内容明显是重复翻译了，这种错误很有chatgpt的风格。

这个锅是我的，不是 ChatGPT 的。是我重复喂给它同一段落了。

上面明确写着 --译者：ChatGPT

每一篇都会经过校对审核。这篇的错误是我疏漏。

# FreeBSD 现在能在 25 毫秒内完成启动

>
> 这是运行在 AWS Firecracker 上的，当然，同时也有其他的新兴微<ruby> 虚拟机 <rp>  （ </rp> <rt>  microVM </rt> <rp>  ） </rp></ruby>引擎可供选择。
>
>
>

<img src="content_image/album_202308_31_162750z9mduhkks254zsdd.jpg" alt="" title="">

在更换了 FreeBSD 内核中的排序算法后，其启动速度提高了 100 倍以上……虽然这是专门针对 <ruby> 微虚拟机 <rt>  microVM </rt></ruby> 的优化，但所有人都应能从中受益。

过去五年，微虚拟机在科技研发领域中备受关注。其核心理念是重新包装和创新了 IBM 在 1960 年代随着 <ruby> 虚拟机管理程序 <rt>  hypervisor </rt></ruby> 诞生所发明的 [一些概念和技术](https://www.theregister.com/2011/07/14/brief_history_of_virtualisation_part_2/)：设计专门作为另一个操作系统上的访客系统运行的操作系统。这意味着该操作系统必须专门构建在虚拟机内执行，并与特定的管理程序提供的资源进行交互，而不是模拟硬件。

这就意味着访客操作系统几乎不需要针对真实硬件的支持，只需要 [VirtIO](https://wiki.osdev.org/Virtio) 驱动，它们可以直接和宿主机的管理程序提供的功能进行交互。反过来说，管理程序无需提供模拟的 PCI 总线、模拟的电源管理、模拟的显卡、模拟的网卡等等。结果就是，管理程序本身可以变得更加微型和简化。

通过无情地缩减虚拟机监视器和运行在其内部的操作系统，这让两端都能更小、更简洁。意味着虚拟机能更少的使用资源，并能更快速地启动。

目前，这个商业目标是提供 “<ruby> 无服务器 <rt>  serverless </rt></ruby>” 的计算能力。实际上，“无服务器” 是一种市场双关语：当然，真实世界中的服务器仍存在于某个数据中心中。但这与提供“基础设施即服务（IaaS）”模型不同，而是提供“[函数即服务（FaaS）](https://www.theregister.com/2018/12/19/serverless_computing_study/)”的模式。这就代表着你不需要了解任何有关基础设施的知识 —— 你的程序直接调用另一个程序，然后管理工具会运行所需的特定操作，返回结果，然后删除用于执行计算的虚拟机。你根本不需要知道这过程在何处，如何进行。

对消费者来说，这种技术的优势在于其快速和易用性。而对服务提供商而言，因为能够更快地回收和再利用资源，使得相同的硬件能服务更多的客户，这是一个巨大的优势。

AWS 通过一项名为 Lambda 的服务提供 FaaS，这个名称是来源于一个深奥的函数式编程术语。Lambda 由亚马逊自家研发的 [Firecracker](https://www.theregister.com/2018/11/27/aws_sets_firecracker/) 管理程序提供支持，Firecracker 同样也支撑着 [Fargate](https://www.theregister.com/2020/04/09/aws_revamps_fargate_serverless_containers/) 这一无服务器服务。

Firecracker 基于 Linux 内核的内建 KVM 管理程序：这本身就有别于之前 AWS [基于 Xen 管理程序](https://www.theregister.com/2017/11/07/aws_writes_new_kvm_based_hypervisor_to_make_its_cloud_go_faster/) 的实践。这也就意味着它本质上是一个 Linux-on-Linux 的解决方案。这听起来对 FreeBSD 内核开发者 Colin Percival 来说像是一个挑战，正如我们 [一年前的报道](https://www.theregister.com/2022/10/19/freebsd_comes_to_amazons_lightweight/)：他决定在 Firecracker 上运行 FreeBSD。然而就如同大部分的计算任务一样，优化的过程大致上是：首先，让它可以运行；然后，提高其运行速度。

根据他本周稍早的一则 [推文](https://twitter.com/cperciva/status/1693127769901969772)，他最新的性能优化成果相当令人震惊：替换排序算法使 FreeBSD 内核启动过程加速了约一百倍，将内核加载时间降至了惊人的 25 毫秒。换言之，只有四十分之一秒的时间。

>
> FreeBSD（HEAD）现已不再执行其 SYSINIT 上的冒泡排序。如今，我们运行的是更高效、速度大概快了 100 倍的归并排序：<https://cgit.freebsd.org/src/commit/?id=9a7add6d01f3c5f7eba811e794cf860d2bce131d>
>
>
>
> >
> > 当 FreeBSD 内核在 Firecracker （配备 1 CPU，128 MB 内存）中启动时，现在有大约 7% 的时间用于执行其 SYSINIT 上的冒泡排序。
> >
> >
> > 当你需要对上千个条目进行排序时，`O(N^2)` 的复杂度可能会带来较大的影响。因此，是时候将冒泡排序替换为更高效的算法了。
> >
> >
> >
>
>
>

这一调整只是一系列优化措施中的最新一个环节，两天后，他进一步 [详细](https://www.usenix.org/publications/loginonline/freebsd-firecracker) 阐述了这些优化。这包括了引导所需的初始更改：消除了假定在 Xen 下引导的一些初始化步骤，然后查询 ACPI 获取处理器的类型和数量。这一步出现了问题，因为 Firecracker 并未提供 ACPI。接着，对其仿真的唯一的硬件，串行控制台，进行初始化也失败了。

在内核成功启动之后，内存的使用迅速成为了一个问题：Firecracker 默认只给客户端分配了 128MB 的内存，原因在于一个必须修改的假设。之后是一整套的优化清单，每一项都为减少时间作出了一部分贡献。

即便你不是特别懂技术，阅读这篇文章也会很有趣。一些步骤更改了在专用硬件上引导的合理选择，在虚拟环境中，这些选择在机器产生、做工作、然后在几秒钟内再次被删除的情况下，已经无法适用。

Percival [评论](https://news.ycombinator.com/item?id=37205578) 称：

>
> 我相信在相同的环境下，Linux 的引导时间是 75-80 毫秒，而我已经让 FreeBSD 在 25 毫秒内引导。
>
>
>

他 [接着](https://news.ycombinator.com/item?id=37205475) 说道：

>
> 当我开始研究提速引导的过程时，内核大约需要 10 秒钟的时间来引导，所以现在我拥有的内核引导速度，比我几年前快约 400 倍。
>
>
>

目前，已经优化的系统内核是 FreeBSD 14 版的，运行在 x86-64 架构上，但也正在进行适配到 Arm64 的工作 —— AWS 是世界上 [最大的 Arm 服务器用户](https://www.theregister.com/2023/08/08/amazon_arm_servers/)。

Firecracker 是众多备受瞩目的微虚拟机中的一员，但也有其他的微虚拟机，而且它的成功也激励了 QEMU 开发者增加了一个 [微虚拟机](https://qemu.readthedocs.io/en/v8.1.0/system/i386/microvm.html) 平台。Canonical 的开发者 Christian Erhardt 在 [博客](https://cpaelzer.github.io/blogs/009-microvm-in-ubuntu/) 上介绍了如何在 Ubuntu 中使用这种技术，并且在线代码开发环境供应商 Hocus 最近 [解释](https://hocus.dev/blog/qemu-vs-firecracker/) 了为什么它从 Firecracker 转移到了 QEMU 等价物。

我们可以看到微虚拟机有很多潜在的使用场景，不仅仅是在云场景中。能够在一个完全不同的 OS 上运行为另一个 OS 构建的单个程序，而不需要始终运行完整的模拟环境，可能在各种情况下都非常方便。

容器是一个非常有用的工具，但在容器中你只能运行与宿主 OS 相同的二进制文件。运行任何其他的东西 —— 比如在 macOS 上运行 Docker Linux 容器 —— 意味着有一些模拟和一个访客操作系统被隐藏在堆栈的某个位置。这个 VM 能够越小，并且使用的资源越少，无论是对容器还是整个机器的整体性能来说都会更好。

*（题图：MJ/a5910e84-656d-4a5c-abad-bb0b0ffcb3fc）*

---

via: <https://www.theregister.com/2023/08/29/freebsd_boots_in_25ms/>

作者：[Liam Proven](https://www.theregister.com/Author/Liam-Proven) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](/article-16144-1.html) 荣誉推出


如何使用 grubby 更改 RHEL 8 和 9 的默认内核

Summary: 在本文中，我们将向您展示如何使用 grubby 工具将旧的内核版本设置为 RHEL 8 和 RHEL 9 系统上的默认版本。

直接改grub配置不是更简单

# 如何使用 grubby 更改 RHEL 8 和 9 的默认内核

通常 Linux 系统会默认引导系统进入最新安装的内核，并保留最新的 3 个 Linux 内核引导条目。

假设你已经执行了 `yum update`，并且新的内核作为更新的一部分已经安装了。这时，由于这个新内核与应用程序不兼容，它会阻止应用程序启动。

想要暂时解决这个问题，你应该还是引导系统进入旧内核。

在本文中，我们将向您展示如何使用 `grubby` 工具将旧的内核版本设置为 RHEL 8 和 RHEL 9 系统上的默认版本。

### grubby 是什么

`grubby` 是一个命令行工具，用于在多个架构上更新和显示引导加载配置文件的信息。

### 检查当前引导的内核

你可以使用如下的 `uname` 命令来检查当前引导/加载的内核。

```
# uname -r
4.18.0-477.13.1.el8_8.x86_64

```

### 列出默认内核

使用 `grubby` 验证默认内核版本，运行以下命令：

```
# grubby --default-kernel
/boot/vmlinuz-4.18.0-477.13.1.el8_8.x86_64

```

要获取当前默认内核的索引号，请运行以下命令：

```
# grubby --default-index
0

```

### 检查已安装的内核

要检查已安装的内核的列表，请运行以下命令：

我们来解释以下的输出信息。最新安装的内核的**条目索引**为 `0`，接下来的 **较旧的内核** 版本将会是 `1`，第二个更旧的内核版本将会是 `2`，而 **救援内核** 的条目索引将会是 `3`。

```
# grubby --info=ALL | egrep -i 'index|title'
index=0
title="Red Hat Enterprise Linux (4.18.0-477.13.1.el8_8.x86_64) 8.8 (Ootpa)"
index=1
title="Red Hat Enterprise Linux (4.18.0-425.19.2.el8_7.x86_64) 8.7 (Ootpa)"
index=2
title="Red Hat Enterprise Linux (4.18.0-425.13.1.el8_7.x86_64) 8.7 (Ootpa)"
index=3
title="Red Hat Enterprise Linux (0-rescue-13iu76884ec5490puc67j8789s249b0c) 8.2 (Ootpa)"

```

### 更改默认内核引导条目

我们可以用两种方式，使用 “内核文件名”，或者使用 “内核条目索引”。我们设置索引号为 `1` 的 `4.18.0-425.19.2.el8_7.x86_64` 为默认内核，以此满足应用程序的依赖关系。

语法：

```
# grubby --set-default [kernel-filename]

```

```
# grubby --set-default /boot/vmlinuz-4.18.0-425.19.2.el8_7.x86_64

```

或者

```
# grubby --set-default vmlinuz-4.18.0-425.19.2.el8_7.x86_64

```

使用内核条目索引更改默认的内核引导：

语法：

```
# grubby --set-default-index=[kernel-entry-index]

```

```
# grubby --set-default-index=1

```

### 重启系统

重启系统，检查旧内核是否持久更改。

```
# reboot

```

或者

```
# init 6

```

### 验证更改

让我们检查一下在上一步中添加的内核是否生效了。好了，按我们的预期使用了较旧的内核 “N-1” 进行引导了。

```
# uname -r
4.18.0-425.19.2.el8_7.x86_64
# grubby --default-kernel
/boot/vmlinuz-4.18.0-425.19.2.el8_7.x86_64

```

要检查所有内核的详细信息，请运行以下命令：

```
# grubby --info=ALL

```

### 总结

在本教程中，我们展示了如何使用 `grubby` 工具在 RHEL 8 和 RHEL 9 系统上将旧版本内核设置为默认。

如果有任何问题或反馈，欢迎在下方发表评论。

*（题图：MJ/9204b9c1-c1ad-4694-b2f6-a7d983976d22）*

---

via: <https://www.2daygeek.com/changing-default-kernel-rhel-8-rhel-9/>

作者：[Rasool Cool](https://www.2daygeek.com/author/rasool/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[onionstalgia](https://github.com/onionstalgia) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出