2023年10月

本篇文章作为终端基础教程系列的一部分,介绍如何在 Linux 命令行中,利用绝对路径和相对路径实现目录切换。

Linux 的 cd 命令让你可以轻松切换文件夹(即目录)。只需提供你要切换到的文件夹路径即可。

cd path_to_directory

然而对于 Linux 新人来说,可能会在路径的指定上有所困扰。

首先,让我们解决这个问题。

理解 Linux 中的路径

在 Linux 文件系统中,路径是用来追踪文件位置的信息。所有的路径都从根目录开始,然后向下延伸。

你可以通过下面的方式查看当前所在的位置:

pwd

结果可能是类似于 /home/username 的输出。注意,这里的 username 将会是你自己的用户名。

你可以注意到,路径是由 / 符号和目录名组成的。比如路径 /home/abhishek/scripts, 表示 scripts 是在文件夹 abhishek 之内,而文件夹 abhishekhome 文件夹之内。要注意,第一个 '/' 是指根目录(即文件系统的开始处),后面的 '/' 则作为目录的分隔符。

Path in Linux

?️ 在终端中键入 ls /,然后按回车。你将会看到根目录下的所有内容,试试看!

接下来,让我们学习两种常见的路径指定方式:绝对路径和相对路径。

绝对路径:这种路径从根开始,然后一直扩展到你需要的位置。如果一个路径是以 / 开头,那就说明它是一个绝对路径。

相对路径:这是相对于你文件系统中当前位置的路径。如果我当前位置在 /home/abhishek,并且我需要去 /home/abhishek/Documents, 我只需要简单地切换到 Documents,而不需要指定整个绝对路径 /home/abhishek/Documents

在我演示这两种路径的区别之前,有必要先熟悉两个特殊的目录标识:

  • . (单点)表示当前目录。
  • .. (双点)表示上一级目录,也就是当前目录的母目录。

这里有一张图形化的表示。

Absolute path vs relative path

利用 cd 命令变更目录

在你已对路径概念有所了解之后,我们来了解如何切换目录。

?️ 如果你仅键入 cd 并按回车键,无论当前位置在哪,系统都会将你带回主目录。试一试吧。

敲入以下命令,你就能看到主目录里的所有文件夹:

ls

这是我看到的情况:

abhishek@ituxedo:~$ ls
Desktop    Downloads  Pictures  Templates  VirtualBoxVMs
Documents  Music      Public    Videos

你的情况可能与此类似,但未必完全一样。

假如你希望跳转到 Documents 文件夹。由于它就在当前目录下,这里使用相对路径会比较方便:

cd Documents
? 注意,大部分 Linux 发行版预设的终端模拟器会在提示符本身显示出当前所在的位置。因此你不必频繁使用 pwd 指令来确认自己的位置。

Most Linux terminal prompts show the current location

假如你希望切换到位于主目录里的 Templates 文件夹。

你可以使用相对路径 ../Templates.. 会让你返回到上层目录,即 /home/username,然后你就可以进入 Templates 文件夹了)。

但这次我们尝试使用绝对路径。请把下面的 abhishek 替换成你的用户名。

cd /home/abhishek/Templates

此刻你已经在 Templates 文件夹里了。如何前往 Downloads 文件夹呢?这次我们再使用相对路径:

cd ../Downloads

下面的图片会回顾一下你刚才学到的所有或有关目录切换的范例。

cd command example

? 别忘了你还可以使用终端的 tab 键自动补全功能。只需要键入命令或者文件夹名称的前几个字母,然后敲击 tab 键,系统就会尝试自动地补全命令或文件夹名称,或者给你显示出所有可能的选项。

故障解决

在 Linux 终端操作切换目录的过程中,你可能会遇到一些常见的错误。

文件或目录不存在

如果在你尝试切换目录时,出现类似下面的错误信息:

bash: cd: directory\_name: No such file or directory

那么你可能在路径或目录名称上犯了误解。这里有几点你需要注意的:

  • 请确定你输入的目录名中没有拼写错误。
  • Linux 系统对大小写敏感,因此,Downloadsdownloads 会被识别为不同的目录。
  • 你可能未正确指定路径。可能你所在的位置与你预期的不同?或者你遗漏了绝对路径中的开头的 / 字符?

Common examples of "no such file or directory" error

非目录错误

如果你看到像下面这样的错误提示:

bash: cd: filename: Not a directory

这表示你尝试使用 cd 命令对一个文件进行操作,而不是一个目录(文件夹)。很明显,你不能像进入文件夹那样“进入”一个文件,因此会出现这样的错误。

Not a directory error with the cd command

参数过多

这是 Linux 新手常犯的另一个错误:

bash: cd: too many arguments

cd 命令只接受一个参数。也就是说,你只能对命令指定一个目录。

如果你指定了超过一个的参数,或者在路径中误加了空格,你就会看到这个错误。

Too many arguments error in Linux terminal

?? 如果你输入 cd -,它将会把你带到前一个目录。当你在两个相隔较远的地方切换时非常方便,可以避免再次输入长路径。

特殊目录符号

在结束这个教程之前,我想快速告诉你关于特殊符号 ~。在 Linux 中,~ 是用户主目录的捷径。

如果用户 abhi 运行它,~ 就会代表 /home/abhi,如果用户 prakash 运行,~ 就意味着 /home/prakash

总结一下你在这个基础教程系列中学到的所有特殊目录标识:

符号描述
.当前目录
..上级目录
~主目录
-前一个目录

测试你的知识

下面是一些简单的练习,用来测试你刚刚学到的关于路径和 cd 命令的知识。

移动到你的主目录,并使用这个命令创建一个嵌套的目录结构:

mkdir -p sample/dir1/dir2/dir3

然后,一步步来试试这个:

  • 使用绝对路径或相对路径进入 dir3
  • 使用相对路径移动到 dir1
  • 使用你能想象到的最短路径进入 dir2
  • 使用绝对路径切换到 sample 目录
  • 返回你的主目录
? 想知道你是否全都做对了吗?欢迎分享你的答案。

现在你知道如何切换目录,是不是应该学习一下如何创建它们呢?

我强烈推荐你阅读这篇文章,了解一些关于终端和命令的小技巧。

如果你想了解 Linux 命令行的基础知识,记得关注我们的 Linux 终端基础系列教程的更多章节。


via: https://itsfoss.com/change-directories/

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

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

通过新的 Tor 浏览器更新提升你的私人网络体验!

Tor 浏览器是访问 Tor 网络) 的流行方式之一,它一直是许多想要规避对其施加的限制的人的首选,甚至是那些注重隐私的人的首选。

当然,使用 Tor 浏览器是最简单的 提高隐私的方法

虽然 Tor 浏览器基于 Mozilla Firefox,但它也进行了一些调整。

在最新的主要更新中,让我们看看发生了什么变化。

? Tor 浏览器 13.0:有什么新变化?

据开发人员介绍,Tor 浏览器 13.0 基于 Firefox ESR 115,并带来了一年的推送到上游的修改。

过渡到较新的 Firefox 版本还允许他们利用 Firefox 113 中引入的改进的辅助功能引擎

因此,使用屏幕阅读器等辅助技术的用户现在可以在使用 Tor 浏览器时获得比以往更好的性能

此版本的亮点包括:

  • 改进的 “ 信封打印 Letterboxing ” 功能
  • 更新主页
  • 更新徽标

改进的 “ 信封打印 Letterboxing ” 功能

Tor 浏览器 13.0 版本中的 “ 信封打印 Letterboxing ” 功能得到了重要更新。

(LCTT 译注:“ 信封打印 Letterboxing ” 是一种网络浏览隐私保护技术,它通过为浏览器窗口添加白色填充(看起来像一个信封的周围),来防止网站跟踪你的浏览行为。当你改变浏览器窗口的大小时,“信封打印” 功能会在周边提供白色填充,确保窗口大小始终为特定的大众标准尺寸。这意味着即使你改变窗口大小,那些尝试通过窗口尺寸来跟踪你的网站也无法获取独特的信息。)

开发人员发现 1000×1000 像素的默认 “信封打印” 尺寸存在问题,许多现代网站无法正常运行,导致这些网站切换到适用于平板电脑和智能手机的布局。

有些网站甚至会显示桌面网站,但只有横向滚动条。为了解决这个问题,他们调整了窗口的大小,最大为 1400×900 像素。

对于最终用户来说,这意味着你无需手动调整窗口大小即可获得合适的尺寸。

他们还补充说:

桌面版 Tor 浏览器不应再在大屏幕上触发响应断点,并且我们的绝大多数桌面用户将看到熟悉的横向纵横比,更符合现代浏览器的要求。

通过计算,我们选择了这一特定尺寸,以便为新窗口提供更大的空间,同时又不会增加过多的桶数量。

更新了主页

Tor 浏览器主页的更新已经等了很长时间了。在此版本中,它展示了更新的徽标(更多内容见下文)以及一个新功能 —— “洋葱化的” DuckDuckGo,用于访问其 “.onion 站点”。

这也与我之前提到的改进的辅助功能引擎齐头并进,从而为屏幕阅读器和其他辅助技术的用户提供更好的支持。

他们还修复了可怕的“红屏死亡”错误,该错误在打开新的主页选项卡时偶尔会弹出。

更新徽标

从文章的开头你就可能已经注意到 Tor 浏览器的徽标有些不同。

实际上,Tor 浏览器所有版本的徽标都已更新,外观更加干净和现代。

这个熟悉的“洋葱标志”已经存在了一段时间,它是由当时的社区民意调查选出的。很高兴看到他们仍在努力改进它。

这些只是该版本的主要亮点,你可以通过 官方发行说明 了解所有技术修复和其他改进。

? 下载 Tor 浏览器 13.0

此版本的 Tor 浏览器适用于 LinuxWindowsAndroid、macOS。你可以前往官方网站获取你选择的套餐。

Tor 浏览器 13.0

via: https://news.itsfoss.com/tor-browser-13-0-release/

作者:Sourav Rudra 选题:lujun9972 译者:geekpi 校对:wxy

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

内存 RowHammer 保护措施被新的方法击破

2015 年,研究人员发现了一种被称之为 RowHammer 的攻击方式,当一个用户级应用程序反复访问 DDR 内存芯片的特定区域,可以导致比特翻转。 比特翻转 Bitflips 是指储存在电子设备上的个别比特发生翻转的事件,比如从 0 变为 1 或反之。各个内存厂商在后续产品中纷纷加入了抵御 RowHammer 攻击的保护措施,主要方法是限制程序在给定时间内打开和关闭目标芯片区域的次数。现在,研究人员发明了被称之为 RowPress 的新方法,能在部署了最新的 RowHammer 保护措施的 DRAM 中诱发比特翻转。RowPress 不是反复“锤击”选定区域,而是让其保持更长的打开时间。将这一方法和 RowHammer 结合可进一步提高这种攻击的威力。研究人员表示,“这本身并不是一种攻击。它只是表明比特翻转是可能的,而且很多,这很容易成为攻击的基础”。

消息来源:Ars Technica
老王点评:如果类似的方法层出不穷,那或许是该考虑新的内存技术了。

一种新的路灯技术可以避免光污染对天文望远镜的影响

光污染对天文学的威胁与日俱增,现代望远镜高度敏感,能感受到距离 50 甚至 200 公里的城市室外照明的影响。一项研究发现,星星正在以平均每年 10% 的速度从天空中“消失”。一项名为 “DarkSkyProtector” 的技术可以“让望远镜看到几乎是一片黑暗的天空”。该方案依赖于三个组件:一个能让 LED 灯以人眼无法察觉的极高频率闪烁的简单装置、一个全球定位系统接收器,以及望远镜摄像头上一个能与 LED 灯同步闪烁的特殊设计的快门。全球定位系统技术引导望远镜的快门只在 LED 灯熄灭的瞬间打开。该技术可以将天文图像中不必要的天空辉光减少 94%。

消息来源:Space
老王点评:技术的进步可以解决技术带来的副作用。另外,是不是可以顺便把马斯克的星链轨迹也一起消除了。

Debian 继续支持 /usr 合并

Debian 12 的目标是采用与其他 Linux 发行版类似的合并 /usr 文件系统布局,即 /{bin,sbin,lib}/ 目录成为 /usr/{bin,sbin,lib}/ 的符号链接。但 Debian 技术委员会在今年早些时候决定暂停合并 /usr 文件。不过,随着 Debian 12 正式发布几个月后,这一暂停决定被废止了。Debian 的合并 /usr 动作有望在两年后的 Debian 13 发布时全部完成。

消息来源:Phoronix
老王点评:这就是历史遗留问题,依我看,其实大可不必这么小心翼翼。

IT 管理员最爱用 admin 作为密码

网络安全研究人员分析了恶意程序窃取的身份凭证,将其中的管理员账号挑选出来。他们共分析了 180 万个管理员凭证,发现其中使用 admin 的账号有 4 万个。其它流行的密码包括:123456、12345678、1234、Password、123、12345、admin123、demo、root 和 admin1 等等。

消息来源:Bleeping Computer
老王点评:就安全意识而言,很多系统管理员和普通用户也差不多。

Windows 11 设备数量超过 4 亿台

微软内部数据显示,Windows 11 的活跃设备使用量最近刚刚突破 4 亿台,并在稳步攀升,预计到 2024 年初将达到 5 亿台。这意味着微软用了大约两年的时间才使 Windows 11 的月活跃设备达到 4 亿台。这一速度明显慢于 Windows 10,后者仅用了一年多的时间,并最终在 2020 年初达到了 10 亿用户。当然,这和微软对待它们的升级策略不同有很大关系。

消息来源:Windows Central
老王点评:不得不说,微软 Windows 还是最受欢迎的桌面操作系统。

安卓将在侧载安装应用程序时扫描恶意软件

谷歌的安卓上的恶意软件系统 “Google Play Protect” 一直以来都能检查侧载应用程序中的恶意软件,但它使用的是定义文件等更快的技术,而且是在后台悄悄进行的。这项新技术将通过全屏 “扫描” 界面延迟应用程序的安装,同时谷歌将对应用程序代码进行深度扫描。谷歌在博文中称,这是 “在代码层面进行实时扫描,以打击新型恶意应用程序” ,而且它可以 “在安装从未扫描过的应用程序时推荐进行实时应用程序扫描,以帮助检测新出现的威胁”。

消息来源:Ars Technica
老王点评:每一个流行的操作系统都需要一种“杀毒软件”,而不太流行的系统,比如 macOS 和 Linux 就不太需要。

Ubuntu MATE 23.10 发布了!

在所有的 Ubuntu 版本中,Ubuntu MATE 的升级总是非常有趣的。

不过,最近发布的 Ubuntu MATE 决定坚持小幅改动,并进行预期的软件包升级和修复。你可能知道为什么!

对于不了解的读者:这是为了开发我们去年报道过的 计划中的 Debian MATE 定制版

说到这里,让我重点介绍一下这些变化。

? Ubuntu MATE 23.10 将支持九个月,直至 2024 年 7 月

Ubuntu MATE 23.10:有什么新功能?

Ubuntu MATE 23.10 受益于 Ubuntu 23.10 推出的所有好东西。

此外,这里还有一些改进:

  • MATE 桌面更新至 v1.26.2。
  • 添加更多人工智能生成的壁纸。
  • 应用更新。

MATE 桌面升级

在最新的 MATE 桌面 1.26.2 中,你将获得大量错误修复和一些小的改进。

升级包括以下内容:

  • 更新 MATE 用户指南 v1.26.2-1
  • 改进门户支持
  • 改进系统监视器,以便从 /usr/libexec 获取 libexec 文件
  • 修正 MATE 会话管理器,使其更好地与系统监视器配合使用
  • mate-utils 1.26.1-1 修复了内存泄漏问题

额外的人工智能生成的壁纸

虽然你已经可以从 Ubuntu 23.10 更新合集 中下载一些有趣的壁纸,但在这里你还能获得额外的壁纸(如上面的截图所示)。

Simon Butcher 是使用前沿的 Diffusion 模型制作这款壁纸的人,他提到:

由于牛头人是一种想象中的生物,因此对其的解释往往千差万别。我想制作一个具有漫画小说风格的强大生物图像,尽管不像许多描述那样令人毛骨悚然。

最新开源的 Stable Diffusion XL 基本模型在更高分辨率下进行了训练,质量上的差异非常明显,尤其是在整体一致性和细节方面,同时减少了图像中的解剖不规则性。图像是使用 Linux 和英伟达 A100 80GB GPU 在本地制作的,从最初的文本提示开始,使用 img2img、修复和放大功能进行完善。

Linux 内核 6.5

当然,Linux 内核 6.5 还能为硬件带来更好的兼容性、新代组件和其他改进。

其他改进

主要的应用程序升级包括 Firefox 118、Celluloid 0.25、Evolution 3.50 和 LibreOffice 7.6.1。

所有这些都将改善用户体验。

? 获取 Ubuntu MATE 23.10

你可以从 官方网站Ubuntu 仓库 下载 Ubuntu MATE 23.10 ISO。

Ubuntu MATE 23.10

如果你是现有用户并希望升级,请按照 发布说明 中的官方说明进行操作。

(题图:Ubuntu Mate


via: https://news.itsfoss.com/ubuntu-mate-23-10/

作者:Ankush Das 选题:lujun9972 译者:geekpi 校对:wxy

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

这篇文章将探索 Btrfs 中的透明文件系统压缩,以及它如何帮助节省存储空间。这篇文章是《Btrfs 详解》系列文章中的一篇。从 Fedora Linux 33 开始,Btrfs 就是 Fedora Workstation 和 Fedora Silverblue 的默认文件系统。

如果你错过了,这里是本系列的上一篇文章:Btrfs 详解:快照

简介

很多人都经历过存储空间用完的情况。也许你想从互联网下载一个大文件,或者你需要快速从你的手机中复制些照片,然后操作突然失败。虽然存储空间成本正在稳步降低,但越来越多的设备要么制造时就是固定数量的存储容量,要么最终用户难以扩展其存储容量。

但当你的存储空间不足时你可以做什么呢?也许你会求助于云存储,或者你可以随身携带一些外部存储设备。

在这篇文章里我会研究该问题的另一种解决方案:透明的文件系统压缩,这是 Btrfs 的一个特性。理想情况下,这将解决你的存储问题,同时几乎不需要对你的系统进行修改!让我们来看看是如何做到的。

透明压缩的解释

首先,让我们来探寻 透明 压缩是什么意思。你可以通过像 gzip、xz 或者 bzip2 这些压缩算法去压缩文件。这通常是显式操作:你利用一个压缩工具并且让它操作你的文件。虽然根据文件的内容,节约了空间,这有一个主要的缺点:当你想读取文件或者修改的时候,你得先解压缩。

这不仅是一个乏味的过程,而且也暂时打破了你之前节省的空间。再者,你最终解压了你不想访问的那部分文件内容。明显有比这更好的方法!

相反,透明压缩发生在文件系统级别。在这里,压缩的文件对用户看起来像常规的未压缩文件一样。但是,它们是被压缩后存储在硬盘上的。这之所以可行,是因为操作系统仅仅选择性地访问那部分文件,并且确保在向磁盘写入更新时再次压缩它们。

这里的压缩是透明的在于它不被用户感知,除了在文件访问时可能的 CPU 负载小量增加。因此,你可以应用在已有的系统而不是进行硬件修改或者求助于云存储。

压缩算法对比

Btrfs 提供了多个压缩算法的选择。出于技术原因它不能选用任意的压缩算法。它现在支持:

  • zstd
  • lzo
  • zlib

好消息是,由于透明压缩的工作原理,你不需要安装这些程序供 Btrfs 使用。在下面的文章里,你会看到如何去运行一个简单的性能测试来对比压缩算法。但是,为了运行性能测试,你必须安装必要的可执行文件。事后不需要留着它们,所以你将使用 Podman 容器来确保不会在系统中留下任何痕迹。

注意 :因为 Btrfs 使用的压缩依赖于内核对这些压缩算法的(重新)实现,用户空间版本的算法得出的结果应该认为是粗略估计。

因为一次次敲重复的命令是枯燥的工作,我已经在 Gitlab 上准备了一个可以运行的 Bash 脚本 (https://gitlab.com/hartang/btrfs-compression-test)。这会用上面提到的每个算法在不同的压缩级别运行一次简单的压缩和解压缩。

首先,下载脚本:

$ curl -LO https://gitlab.com/hartang/btrfs-compression-test/-/raw/main/btrfs_compression_test.sh

下一步,启动一个 Fedora Linux 容器去挂载你当前的工作目录,以便你可以和主机交换文件同时在那里运行脚本:

$ podman run --rm -it --security-opt label=disable -v "$PWD:$PWD" \
    -w "$PWD" registry.fedoraproject.org/fedora:37

最后运行脚本:

$ chmod +x ./btrfs_compression_test.sh
$ ./btrfs_compression_test.sh

在我机器上的输出是这样:

[INFO] Using file 'glibc-2.36.tar' as compression target
[INFO] Target file 'glibc-2.36.tar' not found, downloading now...
################################################################### 100.0%
[ OK ] Download successful!
[INFO] Copying 'glibc-2.36.tar' to '/tmp/tmp.vNBWYg1Vol/' for benchmark...
[INFO] Installing required utilities
[INFO] Testing compression for 'zlib'

    Level | Time (compress) | Compression Ratio | Time (decompress)
-------+-----------------+-------------------+-------------------
        1 |         0.322 s |          18.324 % |           0.659 s
        2 |         0.342 s |          17.738 % |           0.635 s
        3 |         0.473 s |          17.181 % |           0.647 s
        4 |         0.505 s |          16.101 % |           0.607 s
        5 |         0.640 s |          15.270 % |           0.590 s
        6 |         0.958 s |          14.858 % |           0.577 s
        7 |         1.198 s |          14.716 % |           0.561 s
        8 |         2.577 s |          14.619 % |           0.571 s
        9 |         3.114 s |          14.605 % |           0.570 s

[INFO] Testing compression for 'zstd'

    Level | Time (compress) | Compression Ratio | Time (decompress)
-------+-----------------+-------------------+-------------------
        1 |         0.492 s |          14.831 % |           0.313 s
        2 |         0.607 s |          14.008 % |           0.341 s
        3 |         0.709 s |          13.195 % |           0.318 s
        4 |         0.683 s |          13.108 % |           0.306 s
        5 |         1.300 s |          11.825 % |           0.292 s
        6 |         1.824 s |          11.298 % |           0.286 s
        7 |         2.215 s |          11.052 % |           0.284 s
        8 |         2.834 s |          10.619 % |           0.294 s
        9 |         3.079 s |          10.408 % |           0.272 s
       10 |         4.355 s |          10.254 % |           0.282 s
       11 |         6.161 s |          10.167 % |           0.283 s
       12 |         6.670 s |          10.165 % |           0.304 s
       13 |        12.471 s |          10.183 % |           0.279 s
       14 |        15.619 s |          10.075 % |           0.267 s
       15 |        21.387 s |           9.989 % |           0.270 s

[INFO] Testing compression for 'lzo'

    Level | Time (compress) | Compression Ratio | Time (decompress)
-------+-----------------+-------------------+-------------------
        1 |         0.447 s |          25.677 % |           0.438 s
        2 |         0.448 s |          25.582 % |           0.438 s
        3 |         0.444 s |          25.582 % |           0.441 s
        4 |         0.444 s |          25.582 % |           0.444 s
        5 |         0.445 s |          25.582 % |           0.453 s
        6 |         0.438 s |          25.582 % |           0.444 s
        7 |         8.990 s |          18.666 % |           0.410 s
        8 |        34.233 s |          18.463 % |           0.405 s
        9 |        41.328 s |          18.450 % |           0.426 s

[INFO] Cleaning up...
[ OK ] Benchmark complete!

重要的是在根据脚本得出的数据做决定之前注意这些事情:

  • 不是所有的文件压缩效果都一样好。像图片或电影这种已经压缩过的现代多媒体格式不会压缩得更小。
  • 脚本中压缩和解压缩各进行一次。重复运行会产生稍微不同的输出。因此,时间应该被理解为是估计,而不是准确的测量。

鉴于输出的数据,我决定在我的系统上使用压缩级别 3 的 zstd 压缩算法。依据你的需求,你可能想使用更高的压缩级别(比如,如果你存储设备相当的慢)。要估算可达到的读/写速度,可以将源存档大小(约 260MB)除以(解)压缩时间。

压缩测试默认是对 GNU libc 2.36 源码进行的。如果你想看看对指定文件的效果,你可以通过第一个参数传递文件路径给脚本。记住文件一定要可以在容器内访问才行。

如果你想要测试其他东西或者执行更加详细的测试,可以阅读脚本的源码,根据需要修改它。

配置 Btrfs 压缩

Btrfs 里的透明文件系统压缩可以通过几种方式配置:

  • 作为挂载文件系统的挂载选项(可用于相同 Btrfs 文件系统的所有子卷)
  • 通过 Btrfs 文件属性
  • btrfs filesystem defrag 时(不是永久的,不在这里介绍)
  • 通过 chattr 文件属性接口(不在这里介绍)

我只会介绍其中前两个。

在挂载时开启压缩

有一个 Btrfs 挂载选项可以开启文件压缩:

$ sudo mount -o compress=<ALGORITHM>:<LEVEL> ...

例如,去挂载一个文件系统,并使用等级 3 的 ztsd 算法去压缩,你可以写成:

$ sudo mount -o compress=zstd:3 ...

设置压缩等级是可选的。重要的是注意到 compress 挂载选项应用到整个 Btrfs 文件系统和它所有的子卷。此外,这是目前唯一支持的指定压缩等级的方式。

为了对文件系统的根应用压缩,必须在 /etc/fstab 上指定。例如,Fedora Linux 安装器,默认启用级别 1 的 zstd 压缩,在 /etc/fstab 里是这样:

$ cat /etc/fstab
[ ... ]
UUID=47b03671-39f1-43a7-b0a7-db733bfb47ff  /  btrfs   subvol=root,compress=zstd:1,[ ... ] 0 0

启用单个文件压缩

另外一种方式指定压缩的方法是通过 Btrfs 文件系统属性。使用下面的命令去查看文件、目录或子卷的压缩设置:

$ btrfs property get <PATH> compression

类似的,你可以像这样配置压缩:

$ sudo btrfs property set <PATH> compression <VALUE>

例如,对在 /etc 下所有文件启用 zlib 压缩:

$ sudo btrfs property set /etc compression zlib

你可以通过 man btrfs-property 得到支持值的列表。记住这个接口不允许指定压缩级别。除此之外,如果设置了一个压缩属性,它会覆盖挂载时的其他压缩配置。

压缩已有文件

在这时,如果你对现有文件系统采用压缩,然后通过 df 或类似命令检查空间利用率,你会发现什么都没变。这是因为 Btrfs 自身不会 “重新压缩” 所有已有的文件。压缩只会发生在往磁盘写新数据的时候。有一些方式去执行显式的重压缩:

  1. 等待,什么都不做:只要文件被修改并被写回磁盘,Btrfs 根据配置压缩新写入的文件内容。如果我们等待足够长,越来越多的文件被重写,在某个时间点就会被压缩。
  2. 移动文件到另一个文件系统然后移动回来:取决于你想压缩哪些文件,这可能是相当乏味的选项。
  3. 执行一次 Btrfs 碎片整理。

最后一个选项可能是最方便的,但是它会对已经包含快照的 Btrfs 文件系统提出警告:它会破坏快照间的共享范围。换句话来说,两个快照间所有的共享内容,或者一个快照和它的父子卷,在碎片整理操作后将保存多份。

因此,如果你在你的文件系统里已经有很多快照,你不应该对整个文件系统运行碎片整理。这也没有必要,因为如果你想的话,Btrfs 可以对特定的目录或者单个文件进行碎片整理。

你可以使用以下命令去执行一次碎片整理:

$ sudo btrfs filesystem defragment -r /path/to/defragment

例如,你想像这样去整理你主目录的碎片:

$ sudo btrfs filesystem defragment -r "$HOME"

如果有疑问,最好从碎片整理单个大文件开始,并在监视文件系统上的可用空间的同时继续处理越来越大的目录。

测量文件系统压缩

有时,你可能会想,文件系统压缩为你节省了多少空间。但如何判断呢?首先,要知道一个 Btrfs 文件系统是否在挂载时启用了压缩,你可以使用以下命令:

$ findmnt -vno OPTIONS /path/to/mountpoint | grep compress

如果你得到了结果,那么给定挂载点的文件系统就使用了压缩!下一步,compsize 命令会告诉你你的文件需要多少空间:

$ sudo compsize -x /path/to/examine

在我的主目录,结果是这样:

$ sudo compsize -x "$HOME"
Processed 942853 files, 550658 regular extents (799985 refs), 462779 inline.
Type       Perc     Disk Usage   Uncompressed Referenced
TOTAL       81%       74G          91G         111G
none       100%       67G          67G          77G
zstd        28%      6.6G          23G          33G

每一行告诉你应用到文件的压缩 “类型” 。* TOTAL 是下面所有行的总计。

另一方面,这些列告诉你我们的文件需要多少空间:

  • Disk Usage 是实际分配在硬盘上的空间,
  • Uncompressed 是如果没有压缩,文件所需要的空间,
  • Referenced 是所有未压缩文件加起来的总大小。

Referenced 可以与数据 Uncompressed 不同,比如一个文件之前被重复了,或者有快照共享内容。在上面的例子,你可以看到在我的硬盘上总计 91 GB 的未压缩文件仅占据了 74 GB 的存储。取决于在目录里存储的文件类型和应用的压缩等级,这些数字可以有很大差异。

文件压缩的其它注意事项

Btrfs 使用启发式算法去探测压缩文件。这是因为压缩文件通常效果不好,所以没有必要浪费 CPU 周期去尝试进一步的压缩。为了这个目的,Btrfs 在写入压缩数据到磁盘之前测量压缩率。如果文件的第一部分压缩效果不好,文件被标记为不可压缩并且不会有后续的压缩。

如果出于某些原因,你想 Btrfs 压缩所有写入的数据,你可以通过 compress-force 选项挂载一个 Btrfs 文件系统,像这样:

$ sudo mount -o compress-force=zstd:3 ...

当像这样配置,Btrfs 会用等级 3 的 zstd 算法压缩所有写入磁盘的数据。

一个重要的注意事项是挂载一个有很多数据并开启压缩的 Btrfs 文件系统会比没开启压缩耗时更长。这是有技术上的原因的,而且这是一个不会影响文件系统操作的正常行为。

总结

本文详细介绍了 Btrfs 中的透明文件系统压缩。这是一种内置的、相对廉价的方法,可以在不需要修改的情况下从现有硬件中获得一些额外的存储空间。

本系列文章的下一篇将讨论:

  • Qgroups - 限制文件系统大小
  • RAID - 替换 mdadm 配置

(LCTT 译注:后继文章尚未发布,一旦发布我们会尽快翻译。)

如果你想了解与 Btrfs 相关的其他主题,请查看 Btrfs 维基 [1] 和文档 [2] 。如果你还没有阅读本系列的前三篇文章,请不要忘记去看看!如果你觉得本文缺少某些内容,请在下面的评论中让我知道。我们下篇文章见!

参考资料

  1. https://btrfs.wiki.kernel.org/index.php/Main_Page ↩︎
  2. https://btrfs.readthedocs.io/en/latest/Introduction.html ↩︎

(题图:MJ/1a45064c-8da5-4b60-87f2-9886d6a3299e)


via: https://fedoramagazine.org/working-with-btrfs-compression/

作者:Andreas Hartmann 选题:lujun9972 译者:A2ureStone 校对:wxy

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