2024年1月

这是历来重大的 Linux 内核发布之一,集大量修复和新增功能于一身。

新年伊始,全新 Linux 内核发布! ?

我们在 2024 年以 Linux 内核 6.7 版本 的推出开启了新的篇章,这一版本具备许多显著改进,其中包括上一版本遗漏的部分内容。

Linus Torvalds 在 公告 中解释了假期引发的小幅延误:

实际上,我们上周的工作量稍比假期前一周多些,但这不会让我觉得我们需要再进一步推迟发布。

最后的结果:6.7 版本基于提交数量(超过 17k 的非合并提交,以及 1k+ 的合并提交)来看,已经是我们有史以来发布的最大规模的内核版本之一。然而,额外的第 8 个 rc 版本主要是由于圣诞节假期的时间安排,并非大规模发布所引发的。

? Linux 内核 6.7:新的变化

由于 6.7 是非长期支持版本,你没有必须要升级到 Linux 内核 6.7 的压力,除非你急于体验 Linux 的尖端技术。

有鉴于此,我们来看看这个版本关键的亮点包括了哪些内容:

  • 英特尔的优化
  • 增强的 RISC-V 支持
  • 针对 AMD 的特别增强
  • 众多存储功能的优化

英特尔的优化

首先要讲的是英特尔的 Meteor Lake 处理器。Linux 内核 6.7 对于英特尔 Meteor Lake 图形提供了原生支持。在此之前,此项支持还处在 实验性 阶段。但现在,你可以在装备有第一代 Core Ultra 处理器的笔记本上全面享受到它的优势了。

另外,英特尔即将发布的 Arrow Lake 和 Lunar Lake 芯片在 Turbostat(一个用于监测处理器频率、空闲统计等信息的命令行工具)中也做好了规划。

不过,也有一些支持功能被删除。

在 Linux 内核 6.7 中,不再支持英特尔安腾 IA-64 架构。这已经计划了好一段时间,现在,终于实现了。

增强的 RISC-V 支持

RISC-V 的一大亮点是 引入了软件阴影调用堆栈,这旨在保护 CPU 架构免受意外和恶意操作的影响。

此外,在用户空间对 cbo.zero,以及在基于 ACPI 系统中对 CBO 的支持,还有许多其他杂项修复也同样进行了。这个 合并请求 中有更多信息。

你还可以阅读关于 阴影堆栈 Shadow Stack 的文章,以了解它更多的应用。

针对 AMD 的特别增强

AMD 的 无缝启动功能已经扩展到支持 Display Core Next 3.0 及以后版本的 GPU。包括 Radeon RDNA2/RDNA3,以及未来发布的任何 GPU。

此功能使得系统 平滑过渡,避免了通常随着电源按钮压下后会出现的屏幕闪烁现象。之前,这个功能仅对 AMD 的 Van Gogh 系列 APU 开放。

接下来是 错误检测和纠正EDAC)在 Versal SoC 系列中的引入,它添加了一个 EDAC 驱动,支持在集成的 Xilinx DDR 内存控制器上进行 RAS 功能。

在这个 提交信息 中,你能了解到关于它如何实施的更多信息,我们在此对 Phoronix 的发现表示感谢。

众多存储功能的升级

我们终于在 Linux 内核 6.7 中迎来了 Bcachefs 文件系统的引入。如果你对它不熟悉,简单来说,它是一种写时复制(COW)文件系统,其重点放在可靠性和稳健表现上。

此外,Btrfs 引入了 新的三项特性,F2FS 现在 支持更大的页面尺寸,甚至 IBM 的日志文件系统(JFS)也有所增强

?️ 其它变化及优化

最后,还有其他一些值得注意的变化包括:

  • 停止对 MIPS AR7 平台的支持。
  • x86 CPU 微码加载过程 的改进。
  • EROFS 上,MicroLZMA 压缩 现在被认为是稳定的。
  • 更好地支持 采用 RISC-V 的 Milk-V Pioneer 板。
  • 引入 Nouveau GPU 系统处理器(GSP),它为英伟达的 “Turing” 及更新的 GPU 开启了更好的体验途径。

你可以通过阅读 短日志 或等待在 内核档案 上发布的更新日志,以了解更多的技术更新。

安装 Linux 内核 6.7

如果你在使用如 Arch 或 Fedora 这样的滚动版本发行版,可以期待在发行版开发者的一番测试后,就能收到升级。

对于其他用户,你可以安静等待,或者按照我们的简明教程, 在 Ubuntu 上升级到最新的主线 Linux 内核

? 我们并不建议你手动升级 Linux 内核,除非你的确有某些问题需要解决。

你可以从 官方网站 获取最新 Linux 内核版本的 tarball。但是请记住,新版本发布后需要一些时间才能下载得到。

Linux 内核 6.7

? 你打算升级到 Linux 内核 6.7 吗?你对这个版本有何评价?

(题图:DA/0e329f2b-a118-4a00-9d90-da036172c271)


via: https://news.itsfoss.com/linux-kernel-6-7-release/

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

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

Deepin Linux 抢占 AI 创新权? 看起来是这样。

Deepin 是一个神秘而美丽的发行版。

当然,我们都在等待他们的 Deepin 23 稳定版。

在那之前,我们继续期待 ?

但是,等等,还有一些有趣的东西正在开发中,我认为,这值得等待...

Deepin Linux 即将推出 AI 功能。你现在可以通过现有安装(deepin V20.9 及更高版本)访问它。不过,它应该会让未来的发布体验更加精彩。

那么,那又怎样呢? 让我在这里告诉你更多。

AI 混合深度体验

我们已经提到整合 AI 功能是我们的 2024 年预测 之一。

我想,我们可以看到未来吗? ?

嗯,看来 Deepin Linux 在 2024 年拉开了序幕,推出了一款新的 IDE,其中包含 AI 编程助手

你可以在深度应用商店中找到它。我们还没有尝试过,但这听起来很有趣。

不仅限于此,他们还开始通过 “看图 AI 插件” 将 AI 功能集成到图像查看器应用中。

你可以通过图像查看器使用插件重新修饰或增强现有图像。

你可以使用它执行的一些功能包括:

  • 背景模糊:降低图像背景的清晰度,使主体更加突出
  • 删除背景:删除图像背景,使主体独立或替换新背景
  • 手绘:将真实图像转换为手绘漫画风格
  • 2D 漫画:将真实图像转换为 2D 漫画风格
  • 3D 漫画:将真实图像转变成 3D 漫画风格
  • 素描:将真实图像转换为素描风格

这是 2D 转换图像的另一个示例:

而且,所有这一切都发生在你本地的计算机上。它不需要互联网连接。

除此之外,开发人员正在探索更多方法来整合和增强该发行版的 AI 功能。

?你对此有何看法? 请在下面的评论中告诉我你的想法。


via: https://news.itsfoss.com/deepin-linux-distro-ai/

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

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

1 OpenAI 称不用版权材料训练不出来 ChatGPT

OpenAI 在给英国上议院的文件中表示,如果不能访问受版权保护的内容,就无法建立像 ChatGPT 这样的人工智能系统。该公司表示,人工智能工具必须包含受版权保护的作品,以 “充分代表人类智慧和经验的多样性和广度”。OpenAI 认为,使用来自互联网的数据训练人工智能模型属于合理使用规则的范畴,该规则允许重新使用受版权保护的作品。另外,OpenAI 也宣布,网站可以从 2023 年 8 月开始阻止 OpenAI 的网络爬虫访问其数据。

(插图:DA/f7aafbbf-3d3e-4864-8ed0-56b86fd3d634)

消息来源:The Verge
老王点评:虽然是否属于版权法的合理使用还需要法律上的讨论,但我倾向于给予 AI 一个野蛮生长的机会。

2 美国去年仅净增长 700 个 IT 工作岗位

根据美国劳工统计局的数据分析,尽管美国 2023 年第四季度创造了超过 21,000 个 IT 工作岗位,但去年净增长的 IT 工作岗位仅为 700 个,而前一年则为 26.7 万个。目前,由于技能不匹配,有近 10 万个未填补的工作岗位和 10.1 万多名失业的 IT 专业人员。另外,尽管对拥有人工智能、安全、开发和区块链技能的人的需求仍然很旺盛,但入门级 IT 需求正在萎缩,入门级职位正在被人工智能取代。

(插图:DA/f5dee957-f727-414a-bfb9-18efdda5c06b)

消息来源:The Register
老王点评:上有经济不景气,下有 AI 追杀,IT 人真难。

3 确保 AI 安全的理论仍未就绪

美国国家标准与技术研究院(NIST)的计算机科学家 阿波斯托尔·瓦西列夫 Apostol Vassilev 表示,预测性和生成性人工智能系统仍然容易受到各种攻击。他说:“尽管人工智能和机器学习取得了重大进展,但这些技术很容易受到攻击。……确保人工智能算法安全的理论问题尚未解决。”他最近与其他人共同撰写的一篇论文试图对人工智能系统带来的安全风险进行分类,重点关注了四个具体的安全问题:规避攻击、中毒攻击、隐私攻击和滥用攻击。总的来说,结果并不乐观。论文最后指出,可信的人工智能目前需要在安全性与公平性和准确性之间做出权衡。

(插图:DA/3ea75ca9-198a-414c-8fc0-57b543c031d8)

消息来源:The Register
老王点评:AI 的安全也存在一个不可能三角吗?

让我们尝试预测未来吧!

新的一年快乐,朋友们 ✨

2024 年的钟声已经敲过,我们有必要去预见一下将塑造本年度的各种潮流。

我们不能预见未来,所以无法精确预知将会发生什么,但根据目前观察到的动向,我们可以进行一些预测。

以下是我们对 Linux 和开源发展方向的预测。

1、开源 AI 的兴起

2023 年初,Mozilla 成为了最早投身于开源 AI 的团队之一,研发类似于 ChatGPT 的解决方案。Hugging Face 紧随其后,崭露头角,发展成为备受赞誉的 AI 社区之一,激发了全球范围内的协作。

我们也见证了 AI 联盟 的成立,这个联盟由超过 50 个创始成员组成,包括一些大名鼎鼎的公司如 Meta、英特尔、甲骨文和 CERN 等重量级大佬。他们的目标清晰明了:推进 AI 的开放式创新和科学发展。

更有一款名为 GuardRail 的开源项目,它积极倡导负责任的 AI 开发,提供了相应的框架来监控 AI 的行为。

所有的开源 AI 开发可能致力于与发行版或开源工具的更深度整合。当然,不像其他商业成就卓著的桌面操作系统,Linux 发行版可能不会大力市场化 AI 功能,但谁知道呢?

总的来讲,如果你问我们,对于开源 AI 来说,2024 年将是举足轻重的一年,我们都等不及看到更多的惊喜了!?

2、Linux 游戏市场扩张

过去的 Linux 游戏 市场的发展可谓好坏皆有。尽管平台上有一些原生游戏,和 Wine、Lutris、Bottles 等实用工具。但在 Valve 的 Steam Deck 掌机发布之前,Linux 并未真正受到大部分游戏开发者的关注。

这款设备由基于 Arch 的 SteamOS 提供驱动,为众多游戏在 Linux 上的运行铺平了道路,并将游戏开发商的目光吸引到这个平台上。

在 2023 年,我们已经看到了大量 原生兼容 Linux 的游戏发布,我们预测 2024 年也将如此。

别忘了,像 Bottles 这样的开源游戏工具也将致力于提升用户体验。因此,那些从 Windows 切换过来的用户,将会发现这个平台更加符合其游戏需求。

? 我们非常期待看到新的 AAA 级大作) 在发布时就已经支持 Linux!

3、更多的不可变 Linux 发行版

没错,预计 2024 年将有更多 不可变 Linux 发行版 面世,Ubuntu 将走在前列。早在 2023 年初,他们就宣布了在即将发布的 Ubuntu 24.04 LTS 发行版中提供基于 Snap 的不可变 Ubuntu 桌面 的计划。

? 这可能会让一些人不适,但毫无疑问,这样的变革正在路上。

除了 Fedora 早已推出了配备 GNOME 桌面的不可变版本 Silverblue 之外,他们还增加了一款新品。在 Fedora 39 的发布 中,一款带着 Budgie 桌面的名为 “Fedora Onyx” 的新版首次登场就吸引了眼球。

鉴于此,我们预计 2024 年将会出现更多新的不可变发行版,现有的不可变发行版如 blendOS 和 Vanilla OS 也将有所进步。

4、RISC-V 服务器的亮相

随着美国在 2023 年加大了他们与中国的 AI 芯片竞争,我们可能在 2024 年看到 RISC-V 服务器成为热点,因为各国纷纷在芯片制造领域努力实现更大的自主性。

中国已经开始部署他们自称为 “首个商业版的云端 RISC-V 集群”,那是在山东大学建立的一个由 SOPHON SG2042 驱动的集群。

5、Linux 发行版 UI/UX 将进一步提升

如果以 2023 年为标志,我们大可以预言,2024 年将是 Linux 发行版在用户界面和用户体验方面不断创新的一年。

看看 GNOME 45 的发布 所做的事情,它放弃了“活动”按钮,改为药丸形的工作区切换器,彻底改变了用户与工作区的交互方式。

再看看 Zorin OS 17,它通过实施一个“空间桌面”,在 Linux 发行版中重新定义了视觉体验,以便用户在与桌面交互时获得更好的环境感知。

而且,首次在 2024 年,我们将在 Linux 中看到蓝屏死机现象,多亏了 systemd,它将在启动失败时提供有用的错误消息

像 Vanilla OS 2(Orchid)这样的新发行版发布,像 KDE Plasma 6 这样的桌面升级,以及基于 Rust 的 COSMIC 等可能会带来更高的水平,我们倾向于这样期待!

别忘了,许多 Linux 发行版也在大力推广 默认采用 Wayland 的未来

6、软件项目的源码可见

虽然某些软件项目并未完全遵循开源原则,但有些在限制商业分发的前提下,已经走上了公开源代码的道路。

这成为可能,多亏了 CC BY-NC-SA 4.0(创作共享署名-非商业-相同方式共享 4.0) 等许可证。

有人可能会争辩,企业应该全面拥抱其产品的开源。然而,我们坚信,这种做法将相比传统封闭源产品,提升彼此之间的信任并推广透明度

2024是 Linux 桌面之年吗??

我们知道,自 Linux 桌面在用户友好性和普及性上大踏步前进以来,我们一直在期待这个。

看着 Linux 的 市场份额,你可能觉得数据太低了。但我们还是不能放弃希望。

也许这正是你现在的反应。

尽管我们可能距离 Linux 桌面元年还有些距离,但我们比以往任何时候都要接近了。你看,Linux 桌面的接纳率在 2023 年稳定增长,而 2024 年可能就是见证其更大涨幅的一年。

? 你对 2024 年有何预测?欢迎在下方评论中分享你的观点!

(题图:DA/d1246dc6-583c-4ff8-8c2d-b3808e9ec460)


via: https://news.itsfoss.com/predictions-linux-open-source-2024/

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

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

1 Mozilla 已经将目光投向 Firefox 以外的领域

过去几年,Mozilla 不仅投资了 Mastodon 客户端和帮助识别虚假评论的浏览器扩展等初创公司,还推出了 Mozilla.ai,并在其董事会中增加了一批专注于人工智能的新董事。Mozilla 总裁 马克·苏尔曼 Mark Surman 在采访中说,Mozilla.ai “有一个广泛的任务,即寻找开源的、值得信赖的人工智能机会,并围绕这些机会建立一项业务。”他们的目标是如何利用不断增长的开源大型语言模型雪球,并找到一种既能加速雪球滚动,又能确保其滚动方向符合其目标和钱包。苏尔曼说 Mozilla 在人工智能方面“做的这一切,都是为了完成我们的使命。我认为,其中一些必须是纯粹的公共产品”。至于 Firefox,他表示,“Firfox 浏览器会更加保护你”。

(插图:DA/7fe9b88e-6668-4fa1-921e-21103939636c)

消息来源:Tech Crunch
老王点评:往好处看是 Mozilla 在寻求除了 Firefox 之外的收入来源,但从另外一个方面看,这是在其最重要的根本上溃败,战略性转移。

2 PyPy 项目转移到 GitHub

PyPy 项目是 Python 语言的实现之一,但运行速度快了约四倍。该项目已将其主要版本库和问题跟踪器转移到微软旗下的 GitHub,取代了 Mercurial。该项目的核心贡献者称,虽然他们觉得 Mercurial 是更好的版本控制系统,在命名分支模型和用户界面都更胜一筹,但“开源已经成了 GitHub 的代名词,我们太小了,无法改变这一点。……事实证明,不迁移到 GitHub 会阻碍贡献和问题报告。”该项目之前也曾移动过它的仓库,2010 年时它的代码放在 Atlassian Bitbucket 上。十年后,它转移到了 Mercurial 上。

(插图:DA/80b7ff0c-2f1d-42c0-8280-d599eae60800)

消息来源:Dev Class
老王点评:我认为 GitHub 成为开源的代名词是一件非常严重的事情,尤其是它还属于一个软件巨头。

3 随着人工智能的崛起,Web3 已不再受青睐

根据 Crunchbase 的最新数据,2023 年 Web3 初创公司的融资额比 2022 年下降了 73%。2023 年,Web3 初创公司融资额为 78 亿美元,而 2022 年为 215 亿美元。而根据 Dealroom 的数据,2023 年人工智能领域的融资额高达 178 亿美元。

(插图:DA/394ad7db-112f-49d0-9b69-0a94f006f1f5)

消息来源:INC
老王点评:不知道人工智能这一次是否能真正成为改变世界的浪潮,但目前看起来 Web3 还没到时机。

大家好!某天,我突发奇想 —— 是否能把 Git 存储库制作成一个 FUSE 文件系统,然后把所有的提交记录做成文件夹呢?答案是肯定的!有 giblefsGitMounter 和用于 Plan 9 号的 git9

但在 Mac 上使用 FUSE 实在很烦人 —— 你需要安装一个内核扩展,但由于安全的原因,Mac OS 上安装内核扩展看起来越来越难了。此外,我还有一些想法,希望能用与这些项目不同的方式来组织文件系统。

因此,我想在 Mac OS 上尝试 FUSE 以外的挂载文件系统的方法会很有趣,因此我创建了一个名为 git-commit-folders 的项目来做这个事。它可以同时使用 FUSE 和 NFS(至少在我的电脑上),WebDav 的实现起来还有点问题。

这个项目很有实验性(我不确定这究竟是一个有用的软件,还是一个思考 Git 如何工作的有趣玩具),但写起来很有趣,我自己也很喜欢在小型存储库中使用它,下面是我在写这个项目时遇到的一些问题。

目标:像文件夹一样显示提交记录

我做这个事的主要目的是给大家一些启发:Git 核心是如何运行的。总结来说,Git 提交记录实际上和文件夹非常类似 —— 每个 Git 提交都包含一个目录,其中 列出了文件,这个目录也可以有子目录,依此类推。

只是为了节省磁盘空间,Git 提交实际上并不是以文件夹的形式实现的。

而在 git-commit-folders,所有的提交记录实际上看起来就是一个文件夹,如果你想浏览历史提交记录,你可以像浏览文件系统一样浏览它们!例如如果你像查看我的博客的初始提交记录,你可以如下操作:

$ ls commits/8d/8dc0/8dc0cb0b4b0de3c6f40674198cb2bd44aeee9b86/
README

其他之后的提交记录,如下:

$ ls /tmp/git-homepage/commits/c9/c94e/c94e6f531d02e658d96a3b6255bbf424367765e9/
_config.yml  config.rb  Rakefile  rubypants.rb  source

分支是符号链接

通过 git-commit-folders 挂载的文件系统中,提交是唯一真正的文件夹 —— 其他一切(分支、标签等)都是提交记录的符号链接。这反映了 Git 底层的工作方式。

$ ls -l branches/
lr-xr-xr-x 59 bork bazil-fuse -> ../commits/ff/ff56/ff563b089f9d952cd21ac4d68d8f13c94183dcd8
lr-xr-xr-x 59 bork follow-symlink -> ../commits/7f/7f73/7f73779a8ff79a2a1e21553c6c9cd5d195f33030
lr-xr-xr-x 59 bork go-mod-branch -> ../commits/91/912d/912da3150d9cfa74523b42fae028bbb320b6804f
lr-xr-xr-x 59 bork mac-version -> ../commits/30/3008/30082dcd702b59435f71969cf453828f60753e67
lr-xr-xr-x 59 bork mac-version-debugging -> ../commits/18/18c0/18c0db074ec9b70cb7a28ad9d3f9850082129ce0
lr-xr-xr-x 59 bork main -> ../commits/04/043e/043e90debbeb0fc6b4e28cf8776e874aa5b6e673
$ ls -l tags/
lr-xr-xr-x - bork 31 Dec  1969 test-tag -> ../commits/16/16a3/16a3d776dc163aa8286fb89fde51183ed90c71d0

这个并不能完全呈现 Git 的所有工作机理(相比简单的类似文件夹的提交,还有很多复杂的细节),但是我希望大家对“每个提交如同一个文件夹,里面有你的旧版本代码”有一个直观的认识。

这么做有什么好处呢?

在我深入介绍它的实现之前,我想说下为什么把 Git 提交记录变成拥有文件夹的文件系统很有用。我的很多项目最终都没有真正使用过(比如 dnspeep),但我发现自己在做这个项目的时候确实使用到了一些。

目前为止我发现主要用处是:

  • 查找已经删除的函数 - 可以用 grep someFunction branch_histories/main/*/commit.go 查找它的旧版本
  • 快速查看其他分支的一个文件并从其拷贝一行,如 vim branches/other-branch/go.mod
  • 在每个分支中搜索某个函数,如 grep someFunction branches/*/commit.go

所有这些操作都通过提交记录的符号链接,来替代提交记录的直接引用。

这些都不是最有效的方法(你可以用 git showgit log -S 或者 git grep 来完成类似操作),但是对我个人来说,我经常忘记 Git 语法,而浏览文件系统对我来说更简单。git worktree 还允许你同时签出多个分支,但对我来说,为了看一个文件而设置整个工作树感觉很奇怪。

接下来我想谈谈我遇到的一些问题。

问题 1: 用 WebDav 还是 NFS?

Mac OS 原生支持的两个文件系统是 WebDav 和 NFS。我说不出那个更新容易实现,所以我就索性尝试两个都支持。

起初,WebDav 的实现看起来更容易一些,在 golang.org/x/net 上有一个 WebDav 实现,这个很好配置。

但这个实现不支持符号链接,我想可能原因是它用的是 io/fs 接口,而 io/fs 还不支持 符号链接。不过看起来正在进行中。所以我放弃了 WebDav,而决定重点放在 NFS 实现上了,用 go-nfs NFSv3 的库文件来实现。

有人也提到了 Mac 上的 FileProvider,我还没有深入了解这个。

问题 2: 如何确保所有的实现保持一致?

我已经实现了三个不同的文件系统(FUSE、NFS 和 WebDav),但对我来说还是没搞清楚如何避免大量的重复代码。

我的朋友 Dave 建议写一个核心实现,然后写一个适配器(如 fuse2nfsfuse2dav)来转换成 NFS 和 WebDav 版本。这个看起来需要我着手实现三个文件系统的接口:

  • 对应 FUSE 的 fs.FS
  • 对应 NFS 的 billy.Filesystem
  • 对应 WebDav 的 webdav.Filesystem

因此我把所有的核心逻辑放到 fs.FS 接口上,然后写两个函数:

  • func Fuse2Dav(fs fs.FS) webdav.FileSystem
  • func Fuse2NFS(fs fs.FS) billy.Filesystem

所有的文件系统都比较类似,因此转换起来不是很难,但就是有大量的烦人的问题需要修复。

问题 3: 我不想罗列所有的提交记录怎么办

一些 Git 存储库有成千上万的提交记录。我的第一个想法是如何让 commits/ 看起来是空的,这样就可以如下展示:

$ ls commits/
$ ls commits/80210c25a86f75440110e4bc280e388b2c098fbd/
fuse  fuse2nfs  go.mod  go.sum  main.go  README.md

因此所有的提交记录可以直接查看,但是又不能罗列它们。这个对文件系统是一个奇怪的事情,实际上 FUSE 可以做到。但我在 NFS 上无法实现。我认为这里的原因是,如果你告诉 NFS 某个目录是空的,它就会认为该目录实际上是空的,这是合理的。

我们最终是这样处理的:

  • 按照 .git/objects 的方式,以前两个字符组织管理提交记录(因此 ls commits 会显示 0b 03 05 06 07 09 1b 1e 3e 4a),但这样做会分为两层,这样 18d46e76d7c2eedd8577fae67e3f1d4db25018b0 则为 commits/18/18df/18d46e76d7c2eedd8577fae67e3f1d4db25018b0
  • 开始只罗列一次所有的已经打包的提交哈希,将它们缓存在内存中,然后后面仅更新稀疏对象。主要思路是版本库中几乎所有的提交都应该打包,而且 Git 不会经常重新打包提交

这个看起来在拥有百万提交记录的 Linux 内核的 Git 存储库上似乎效果不错。在我的机器上实测它初始化大概需要一分钟,之后只需快速增量更新即可。

每个提交哈希只有 20 个字节,因此缓存 1 百万个提交哈希也不是很大,大约 20MB。

我认为更聪明的做法是延迟加载提交列表 —— Git 会按提交 ID 对其打包文件进行排序,所以你可以很容易地进行二叉树搜索,找到所有以 1b1b8c 开始的提交。我用的 Git 库 对此并不支持,因为罗列出来 Git 存储库所有的提交记录确实一个奇怪的事情。我花了 几天时间 尝试实现它,但没有达到我想要的性能,所以就放弃了。

问题 4: 不是目录

我常遇到下面这个错误:

"/tmp/mnt2/commits/59/59167d7d09fd7a1d64aa1d5be73bc484f6621894/": Not a directory (os error 20)

这起初真的把我吓了一跳,但事实证明,这只是表示在列出目录时出现了错误,而 NFS 库处理该错误的方式就是显示 “Not a directory”(不是目录)。这个错误遇到了很多次,我需要每次跟踪这个错误的根源。

有很多类似错误。我也遇到 cd: system call interrupted,令人沮丧的是,但最终也只是程序中的其他错误。

我意识到终极大法是用 Wireshark 查看 NFS 发送和接受的数据包,很多问题便可迎刃而解。

问题 5: inode 编号

在开始的时候我不小心将所有的文件夹的 inode 设为 0。这很糟糕,因为如果在每个目录的 inode 都为 0 的目录上运行查找,它就会抱怨文件系统循环并放弃,这个也是符合逻辑的。

我通过定义一个 inode(string) 来修复这个问题,通过散列字符串来获取 inode 编号,并使用树 ID / blob ID 作为散列字符串。

问题 6: 过期文件句柄

我一直遇到这个“Stale NFS file handle”(过期文件句柄)错误。问题是,我需要获取未知的 64 字节 NFS “文件句柄”,并将其映射到正确的目录。

我使用的 NFS 库的工作方式是为每个文件生成一个文件句柄,并通过固定大小的缓存来缓存这些引用。这对小型存储库来说没问题,但是如果对于拥有海量的文件的存储库来说,由于缓存就会溢出,就会导致“stale file handle” 错误。

这仍然是个问题,我不知道如何解决。我不明白真正的 NFS 服务器是如何做到这一点的,也许它们只是有一个非常大的缓存?

NFS 文件句柄占用 64 个字节(不是比特),确实很大,所以很多时候似乎可以将整个文件路径编码到句柄中,根本不需要缓存。也许我会在某个时候尝试实现这一点。

问题 7: 分支历史

branch_histories/ 目录目前仅罗列对应分支的最近 100 个提交记录。我不知道该怎么做,如果能以某种方式列出分支的全部历史就更好了。也许我可以使用 commits/ 目录中类似的子文件夹技巧。

问题 8: 子模块

Git 存储库有时包含了子模块。由于目前我对子模块的理解还不深入,我先忽略它吧。因此这个算是一个问题。

问题 9: NFSv4 是否更好?

我构建这个项目使用的是 NFSv3 库,因为我当时只能找到一个 NFSv3 的 Go 库文件。可当我搞完的时候才发现了一个名叫 buildbarn 的项目里有 NFSv4 服务器。有没有可能用它会更好一些?

我不知道这样做有什么问题,或者用 NFSv4 有哪些优点?我还有点不确定是否要使用 buildbarn NFS 库,因为不清楚他们是否希望其他人使用它。

就这些吧

之前已经解决了很多问题我都忘记了,这是我目前能回想起来的。我未来有可能解决或根本解决不了 NFS 的“过期文件句柄” 错误,或者“在 Linux 内核的存储库上启动需要 1 分钟”的问题,就这样吧。

感谢我的朋友 vasi,他给我了很多文件系统方面的帮助。

(题图:DA/d22b1c01-e80a-4529-b88a-419ceef74b5e)


via: https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-folders-with-nfs/

作者:Julia Evans 选题:lujun9972 译者:guevaraya 校对:wxy

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