2022年7月

俄罗斯的 Debian 衍生发行版的开发商计划上市

来自俄罗斯的 Astra Linux 是 Debian 的下游发行版,它已经存在了一些年,除了 x86、Arm 等 CPU 架构外,它还支持 MIPS 架构。它是由 RusBITech 开发的,是专门为俄罗斯军队设计的。微软已经阻止了 Windows 在俄罗斯的使用,这似乎大大有助于推动替代操作系统的采用。路透社报道说,RosBITech 正计划在莫斯科证券交易所上市,估值约折合为 2.6 亿美元。

消息来源:The Register
老王点评:我觉得他们比较谦虚,要是搞个根社区可能估值更高呢。

KDE Plasma 5.26 有望使用 C++20 进行开发

在即将到来的 KDE Plasma 5.26 桌面环境中,KDE 开发者正考虑使用 C++20 语言开发后续功能,尤其是使用 C++ 协同例程支持特性。随着时间的推移,这种较新的 C++ 语言也会用于其他 KDE 组件。将 C++ 要求提升到 C++20 意味着将 KDE 编译器要求提高到 GCC 10 或 Clang 11,而这些版本的编译器已经稳定发布两年了。

消息来源:Phoronix
老王点评:看来最近各个开源项目都在逐渐迁移到新的语言标准和新的编译器了,这种稳健而进步的态度是开源的生命力。

RISC-V 仅用 12 年达成百亿核心里程碑

在近日召开的 Embedded World 大会上,RISC-V 国际的 CEO 宣布目前 RISC-V 市场上的核心数量已经突破 100 亿。CEO 认为开放标准是关键,“Linux 在为软件所做的事情,和我们为硬件所做的事情有异曲同工之妙。”RISC-V 是一种开放标准指令集架构(ISA),根据开源许可提供。据悉,ARM 架构经过 17 年,在 2008 年实现了这个里程碑。而 RISC-V 只用了 12 年就完成了这一目标。

消息来源:WCCF Tech
老王点评:看来 RISC-V 真能复制 Linux 在软件方面的成功啊。

学习如何用动态链接库将多个 C 目标文件结合到一个单个的可执行文件之中。

当使用 C 编程语言编写一个应用程序时,你的代码通常有多个源文件代码。

最终,这些文件必须被编译到一个单个的可执行文件之中。你可以通过创建静态或动态库(后者也被称为 共享 shared 库)来实现这一点。这两种类型的库在创建和链接的方式上有所不同。两者都有缺点和优点,这取决于你的使用情况。

动态链接是最常见的方法,尤其是在 Linux 系统上。动态链接会保持库模块化,因此,很多应用程序可以共享一个库。应用程序的模块化也允许单独更新其依赖的共享库。

在这篇文章中,我将演示动态链接是如何工作的。在后期的文章中,我将演示静态链接。

链接器

链接器 linker 是一个命令,它将一个程序的数个部分结合在一起,并为它们重新组织内存分配。

链接器的功能包括:

  • 整合一个程序的所有的部分
  • 计算出一个新的内存组织结构,以便所有的部分组合在一起
  • 恢复内存地址,以便程序可以在新的内存组织结构下运行
  • 解析符号引用

链接器通过这些功能,创建了一个名为 可执行文件 executable 的可以运行的程序。在你创建一个动态链接的可执行文件前,你需要一些用来链接的库,和一个用来编译的应用程序。准备好你 最喜欢的文本编辑器 并继续。

创建目标文件

首先,创建带有这些函数签名的头文件 mymath.h

int add(int a, int b);
int sub(int a, int b);
int mult(int a, int b);
int divi(int a, int b);

使用这些函数定义来创建 add.csub.cmult.cdivi.c 文件。我将把所有的代码都放置到一个代码块中,请将其分为四个文件,如注释所示:

// add.c
int add(int a, int b){
return (a+b);
}

//sub.c
int sub(int a, int b){
return (a-b);
}

//mult.c
int mult(int a, int b){
return (a*b);
}

//divi.c
int divi(int a, int b){
return (a/b);
}

现在,使用 GCC 来创建目标文件 add.osub.omult.odivi.o

(LCTT 校注:关于“ 目标文件 object file ”,有时候也被称作“对象文件”,对此,存在一些译法混乱情形,称之为“目标文件”的译法比较流行,本文采用此译法。)

$ gcc -c add.c sub.c mult.c divi.c

-c 选项跳过链接步骤,并且只创建目标文件。

创建一个共享的目标文件

在最终的可执行文件的执行过程中将链接动态库。在最终的可执行文件中仅放置动态库的名称。实际上的链接过程发生在运行时,在此期间,可执行文件和库都被放置到了主内存中。

除了可共享外,动态库的另外一个优点是它减少了最终的可执行文件的大小。在一个应用程序最终的可执行文件生成时,其使用的库只包括该库的名称,而不是该库的一个多余的副本。

你可以从你现有的示例代码中创建动态库:

$ gcc -Wall -fPIC -c add.c sub.c mult.c divi.c

选项 -fPIC 告诉 GCC 来生成 位置无关的代码 position-independent code (PIC)。-Wall 选项不是必需的,并且与代码的编译方式是无关的。不过,它却是一个有价值的选项,因为它会启用编译器警告,这在排除故障时是很有帮助的。

使用 GCC ,创建共享库 libmymath.so

$ gcc -shared -o libmymath.so add.o sub.o mult.o divi.o

现在,你已经创建了一个简单的示例数学库 libmymath.so ,你可以在 C 代码中使用它。当然,也有非常复杂的 C 库,这就是他们这些开发者来生成最终产品的工艺流程,你和我可以安装这些库并在 C 代码中使用。

接下来,你可以在一些自定义代码中使用你的新数学库,然后链接它。

创建一个动态链接的可执行文件

假设你已经为数学运算编写了一个命令。创建一个名称为 mathDemo.c 的文件,并将这些代码复制粘贴至其中:

#include <mymath.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
  int x, y;
  printf("Enter two numbers\n");
  scanf("%d%d",&x,&y);
 
  printf("\n%d + %d = %d", x, y, add(x, y));
  printf("\n%d - %d = %d", x, y, sub(x, y));
  printf("\n%d * %d = %d", x, y, mult(x, y));

  if(y==0){
    printf("\nDenominator is zero so can't perform division\n");
      exit(0);
  }else{
      printf("\n%d / %d = %d\n", x, y, divi(x, y));
      return 0;
  }
}

注意:第一行是一个 include 语句,通过名称来引用你自己的 libmymath 库。要使用一个共享库,你必须已经安装了它,如果你没有安装你将要使用的库,那么当你的可执行文件在运行并搜索其包含的库时,将找不到该共享库。如果你需要在不安装库到已知目录的情况下编译代码,这里有 一些方法可以覆盖默认设置。不过,对于一般使用来说,我们希望库存在于已知的位置,因此,这就是我在这里演示的东西。

复制文件 libmymath.so 到一个标准的系统目录,例如:/usr/lib64, 然后运行 ldconfigldconfig 命令创建所需的链接,并缓存到标准库目录中发现的最新共享库。

$ sudo cp libmymath.so /usr/lib64/
$ sudo ldconfig

编译应用程序

从你的应用程序源文件代码(mathDemo.c)中创建一个名称为 mathDemo.o 的目标文件:

$ gcc -I . -c mathDemo.c

-I 选项告诉 GCC 来在其后所列出的目录中搜索头文件(在这个示例中是 mymath.h)。在这个示例中,你指定的是当前目录,通过一个单点(.)来表示。创建一个可执行文件,使用 -l 选项来通过名称来引用你的共享数学库:

$ gcc -o mathDynamic mathDemo.o -lmymath

GCC 会找到 libmymath.so ,因为它存在于一个默认的系统库目录中。使用 ldd 来查证所使用的共享库:

$ ldd mathDemo
    linux-vdso.so.1 (0x00007fffe6a30000)
    libmymath.so => /usr/lib64/libmymath.so (0x00007fe4d4d33000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fe4d4b29000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fe4d4d4e000)

看看 mathDemo 可执行文件的大小:

$ du ./mathDynamic
24   ./mathDynamic

当然,它是一个小的应用程序,它所占用的磁盘空间量也反映了这一点。相比之下,相同代码的一个静态链接版本(正如你将在我后期的文章所看到的一样)是 932K !

$ ./mathDynamic
Enter two numbers
25
5

25 + 5 = 30
25 - 5 = 20
25 * 5 = 125
25 / 5 = 5

你可以使用 file 命令来查证它是动态链接的:

$ file ./mathDynamic
./mathDynamic: ELF 64-bit LSB executable, x86-64,
dynamically linked,
interpreter /lib64/ld-linux-x86-64.so.2,
with debug_info, not stripped

成功!

动态链接

因为链接发生在运行时,所以,使用一个共享库会产生一个轻量型的可执行文件。因为它在运行时解析引用,所以它会花费更多的执行时间。不过,因为在日常使用的 Linux 系统上绝大多数的命令是动态链接的,并且在现代硬件上,所能节省的时间是可以忽略不计的。对开发者和用户来说,它的固有模块性是一种强大的功能。

在这篇文章中,我描述了如何创建动态库,并将其链接到一个最终可执行文件。在我的下一篇文章中,我将使用相同的源文件代码来创建一个静态链接的可执行文件。


via: https://opensource.com/article/22/5/dynamic-linking-modular-libraries-linux

作者:Jayashree Huttanagoudar 选题:lkxed 译者:robsean 校对:wxy

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

Meta 的 “ 不落下任何语言 No Language Left Behind ” 是一个宏大的开源项目,旨在以最高准确度翻译语言。

meta

Meta(前身是 Facebook)在开源世界做出了不小的贡献。Meta 除了专注于 元宇宙 Metaverse 和其社交媒体平台外,还致力于各种研究和创新工作,比如 React(一个 JaveScript 库)。

现在,Meta 的研究人员决定开源一个叫 “ 不落下任何语言 No Language Left Behind ” 项目。

(LCTT 校注:这个直译项目名称不够好听,我来抛砖引玉,似可称做“无人独语”,读者有什么建议吗?)

Meta 试图不落下任何语言

目前,虽然世界上有大约 7000 个在使用中的语言,但大多数在线的内容都是以少数的流行语言来提供的,比如英语。这让许多不懂这些语言的人处于不利的地位。

虽然现存的许多翻译工具,但语法错误会让错误变得难以阅读和理解。另外,如果你想把内容翻译为一个不流行的语言(特别是非洲和亚洲的一些语言),翻译体验不会很好。

因此,Meta 正在开发有最高质量的翻译工具,可以帮助解决这一全球性的问题。

NLLB-200( 不落下任何语言 No Language Left Behind ) 是一个人工智能翻译模型,其可以翻译 200 多种语言。该模型在每种语言中的翻译结果是通过一个名为 FLORES-200 复杂数据集来确定和评估的。

正如 Meta 所说,NLLB 的翻译结果比以前的人工智能研究方法好 40% 。对于一些最不常见的语言,其翻译准确率甚至超过 70%。了不起的工作!

为了帮助开发项目和提高模型的翻译质量,Meta 向所有感兴趣的研究人员开放了源代码,包括 NLLB-200 模型、FLORES-200 数据库、模型训练和重建训练数据库的代码。

你可以在 GitHub 上找到源代码,并且可以在该项目的 博客 上了解它的更多信息。

对社会事业的鼓励

Meta 宣布向从事 联合国可持续发展目标 UN Sustainable Development Goals 任何领域工作和翻译非洲语言的非营利组织和研究人员提供高达 20 万美元的捐赠,也鼓励其他学术领域如语言学和机器翻译的研究人员申请。

项目的影响

尽管 Meta 主要打算在其数字平台上,特别是在“元宇宙”上使用 NLLB,但 NLLB 也有可能在其他领域产生巨大影响。

许多用户可以用他们的母语轻松地访问和阅读在线资源。项目开源后,社区应该能够帮助实现这个目标。

你对 Meta 的这个项目有什么看法?


via: https://news.itsfoss.com/meta-open-source-ai-model/

作者:Rishabh Moharir 选题:lkxed 译者:fenglyulin 校对:wxy

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

新款支持 Pluton 的 ThinkPad 默认不能安装 Linux

Pluton 是微软公司于 2020 年首次推出的 Windows PC 安全协处理器。与 TPM 一道,其旨在增强 Windows 操作系统的安全性。联想发布的新款 ThinkPad Z13 和 Z16 笔记本电脑就支持 Pluton。然而,有 Linux 专家发现,无法在 ThinkPad Z13 笔记本电脑上,通过 USB 来启动 Linux。这是因为 Pluton 默认只接受 Windows 引导加载和配套驱动程序,使用第三方 UEFI 证书的 Linux 发行版会被阻止启动。联想证实,从 2022 年起,该公司开始遵循微软给出的 PC 安全启动建议,并于默认情况下禁用第三方证书。

消息来源:Phoronix
老王点评:所以,不为他们所用的 Linux 不是好 Linux,而要为他们所用,可以是子系统、可以是虚拟机,对吧。

Ubuntu 将 Firefox Snap 启动速度提升了一倍

Canonical 在一篇博文中披露,“与 Firefox 101 相比,全新安装版本的启动时间平均减少了 50%。”这是由于 Firefox 改成了在启动时一次只复制一个环境 / 语言包(而不是所有语言包),区域设置将遵循系统设置,因而大幅缩减了启动等待时间。以及将 Firefox 及其 GNOME 和 GTK 主题的 Snap 软件包从 XZ 切换到 LZO,加快了解压/启动速度。

消息来源:Phoronix
老王点评:总算是又进一步改善了 Snap,虽然还有一些缺陷。

Web3 项目今年前半年因黑客攻击损失超过 20 亿美元

根据一项研究报告,Web3 领域仍然受到黑客、诈骗和网络钓鱼计划的困扰,同时还面临着相对较新的威胁,如闪电贷款攻击。在今年的前六个月,Web3 项目因黑客和漏洞而损失超过 20 亿美元,超过了去年全年。此外,研究还发现,Discord 是绝大多数网络钓鱼企图的载体,这是一个信号,表明它作为 Web3 的首选社交网络仍然很受欢迎,尽管安全问题不断。

消息来源:The Verge
老王点评:Web3 虽然以积木式金融为创新,但是其最大的问题可能也来自于这种积木式结构。

NTFS 是 Windows NT 系列操作系统支持的磁盘文件系统格式,它是一个特别为网络和磁盘配额、文件加密等管理安全特性设计的文件系统。而 Linux 内核中新进入主线支持的 NTFS3 驱动是一个功能齐全的 NTFS 驱动程序,该驱动程序适用于最高的 NTFS 3.1 版本。

简介

最初,Linux 内核没有 NTFS 的原生支持,后来对 NTFS 的支持也仅提供了只读功能。来自 Tuxera 的 NTFS-3G 是之前主流的解决方案,但在实际使用中也存在一些问题。NTFS-3G 是借助 Linux 的用户空间文件系统(FUSE)模块在用户层实现的一个对 NTFS 支持的文件系统,其对 NTFS 的访问逻辑代码都是在用户层代码实现的。

在 NTFS3 出现之前,Linux 上使用 NTFS 主要问题还是缺乏稳定且功能齐全的读/写支持。

2020 年,Paragon 软件公司做出了一个惊人的决定:尝试将之前只提供给商业客户的 NTFS3 驱动程序贡献到 Linux 主线。最终,在经过多轮审核和修改之后,Linux 内核 5.15 合并了 Paragon 提供的 NTFS3 内核驱动,它拥有更高的性能和更多的特性。

  • 该驱动程序实现了对 NTFS 文件系统中的正常、稀疏和压缩文件的读/写支持。
  • 支持本地日志回放。
  • 支持已挂载的 NTFS 卷的 NFS 导出。
  • 支持文件和文件夹的权限管理。

使用 ntfs3 驱动替换 ntfs-3g 挂载 windows NTFS 分区

如何使用 NTFS3 驱动挂载 NTFS 卷

使用 NTFS3 驱动挂载时使用的文件系统类型是 ntfs3

手动挂载

以前使用 NTFS-3g 驱动的挂载方式是:

# mount -t ntfs-3g /dev/sdxY /mnt

现在只需要将 ntfs-3g 替换为 ntfs3 即可:

# mount -t ntfs3 /dev/sdxY /mnt

-t 指出文件系统类型,/dev/sdxY 是你的 NTFS 卷(分区)的路径,可以使用 lsblk 命令查看。/mnt 是挂载的目标文件夹。

如果需要指定挂载参数,可使用 -o 指定参数,如:

# mount -t ntfs3 -o iocharset=utf8,umask=22,prealloc /dev/sdxY /mnt

这里的 iocharset=utf8,umask=22,prealloc 挂载参数,详见后文解释。

开机自动挂载

如需在开机时自动挂载,可编辑 /etc/fstab 文件,添加如下行:

UUID=**** /data ntfs3 iocharset=utf8,umask=0,prealloc 0 0

其中 UUID=**** 是指定卷(分区)的 UUID。使用 UUID 的好处在于它们与磁盘挂载顺序无关。如果你在 BIOS 中改变了你的存储设备顺序,或是重新拔插了存储设备,或是一些 BIOS 可能会随机地改变存储设备的顺序,那么用 UUID 来表示指定卷(分区)会更有效。可以使用 blkid 命令查看 UUID

/data 是挂载位置。本示例的位置是 /data,你需要提前创建这个文件夹。

后面的选项都是挂载参数,参见后文介绍。

最后两个 0 0 ,表示是否备份和是否检查。0 0 表示不备份、不检查。

挂载参数说明

参数解释
iocharset=name此选项告知驱动程序如何解释路径字符串,并将其转换为 Unicode 或返回。如果未设置此选项,将使用默认代码页。示例:iocharset=utf8
uid=挂载用户 ID
gid=挂载组 ID
umask=控制装载 NTFS 卷后创建的文件/目录的默认权限。
dmask=fmask 只适用于文件,dmask 只适用于目录,而不是指定同时适用于文件和目录的 umask
fmask=见上
noacsrules“无访问规则”装载选项将文件/文件夹的访问权限设置为 777,所有者/组设置为 root。此装载选项吸收所有其他权限。文件/文件夹的权限更改将报告为成功,但仍将保持 777。所有者/组更改将报告为成功,但他们将保留为 root 用户。
nohiddenLinux 下不会显示具有 Windows 特定隐藏(FILE_ATTRIBUTE_HIDDEN)属性的文件。
sys_immutable具有 Windows 特定系统(FILE_ATTRIBUTE_SYSTEM)属性的文件将标记为系统不可变文件。
discard支持 TRIM 命令以提高删除操作的性能,建议将其用于固态驱动器(SSD)。
force即使卷被标记为脏,也强制驱动程序装载分区。不建议使用。
sparse创建稀疏的新文件。
showmeta使用此参数可显示已装入 NTFS 分区上的所有元文件(系统文件)。默认情况下,所有元文件都是隐藏的。
prealloc当写入时文件大小增加时,为文件过度预分配空间。减少对不同文件执行并行写入操作时的碎片。
acl支持 POSIX ACL(访问控制列表)。如果内核支持,则有效。不要与 NTFS ACL 混淆。指定为 acl 的选项支持 POSIX acl。

NTFS3 的优点

NTFS3 是内核态的驱动,ntfs3 比 ntfs-3g 无论是速度还是负载都要好上不少。

已经有诸多网友做过测试:

除了性能更好以外,NTFS3 还支持挂载用户和文件权限管理等功能。具体使用方法可以自行学习 giduid 以及 umask 的用法。

另外 NTFS3 还支持 NTFS 的 prealloc 特性,可以大幅减少文件碎片的产生。

关于 NTFS3 驱动无人维护的问题

Paragon 于 2020 年在 GNU 通用许可证下发布了 NTFS3 驱动程序,在开源后的一年里,NTFS3 的驱动经过了多轮审查和修改,用来提高代码质量。直到 2021 年合并进入内核主线。

但是自从该驱动 2021 年在 Linux 5.15 中最终被主线化以来,至今为止,在接近一年的时间里,还没有任何重大的错误修复被送入驱动。

有人推测是该驱动的维护者 Konstantin Komarov 身处俄罗斯,受到俄乌战争影响的原因。

随后包括 Linus Torvalds 在内的诸多程序员都对此事表达了关切,并且愿意参与到贡献中来。

现在,我们看到 Paragon 软件公司的 Konstantin Komarov 在因休息和其他事务而离开后,又重新活跃在内核邮件列表中。Komarov 在 2022 年 6 月 3 日为 Linux 5.19 的合并窗口提交了一批 NTFS3 的修正。

我相信 ntfs3 未来会越来越好。并且目前,ntfs3 已经是 Linux 中最好用 NTFS 驱动了,我觉得你也不妨尝试一下。


作者简介:一个喜欢瞎鼓捣的医学生


via: https://www.insidentally.com/articles/000029/

作者:insidentally 编辑:wxy

本文由贡献者投稿至 Linux 中国公开投稿计划,采用 CC-BY-SA 协议 发布,Linux中国 荣誉推出

Tig 是审查 Git 仓库的绝佳工具,它鼓励你探索日志,而无需构建冗长且有时复杂的查询。

如果你发现浏览你的 Git 仓库非常复杂,我已经为你准备好了工具,来了解一下 Tig。

Tig 是一个 基于 ncurses 的 Git 文本模式界面,它允许你浏览 Git 仓库中的更改。它还可以充当各种 Git 命令输出的分页器。使用这个工具可以让我很好地了解在哪个提交中发生了哪些更改,最新的提交合并是什么等等。请跟随这个简短的教程,亲自尝试一下。

安装 Tig

在 Linux 上,你可以使用包管理器安装 Tig。例如,在 Fedora 和 Mageia 上:

$ sudo dnf install tig

在 Debian、Linux Mint、Elementary、Pop\_OS 和其他基于 Debian 的发行版上:

$ sud apt install tig

在 macOS 上,使用 MacPortsHomebrew。 Tig 的完整安装指南可在 Tig 手册 中找到。

使用 Tig

Tig 提供了常见 Git 输出的交互式视图。例如,使用 Git,你可以使用命令 git show-ref 查看所有引用:

$ git show-ref
98b108... refs/heads/master
6dae95... refs/remotes/origin/1010-internal-share-partition-format-reflexion
84e1f8... refs/remotes/origin/1015-add-libretro-openlara
e62c7c... refs/remotes/origin/1016-add-support-for-retroarch-project-cd
1c29a8... refs/remotes/origin/1066-add-libretro-mess
ffd3f53... refs/remotes/origin/1155-automatically-generate-assets-for-external-installers
ab4d14... refs/remotes/origin/1160-release-on-bare-metal-servers
28baa9... refs/remotes/origin/1180-ipega-pg-9118
8dff1d... refs/remotes/origin/1181-add-libretro-dosbox-core-s
81a7fe... refs/remotes/origin/1189-allow-manual-build-on-master
[...]

使用 Tig,你可以在可滚动列表中获取该信息以及更多信息,此外还可以使用键盘快捷键来打开其他视图,其中包含每个引用的详细信息。

分页模式

当输入来自标准输入时,Tig 进入分页模式。当指定 show 子命令并给出 --stdin 选项时,标准输入被假定为提交 ID 列表,它被转发到 git-show

$ git rev-list --author=sumantrom HEAD | tig show –stdin

日志和差异视图

当你在 Tig 的日志视图中时,你可以按键盘上的 d 键来显示差异。这将显示提交中更改的文件以及删除和添加的行。

交互式 Git 数据

Tig 是对 Git 的一个很好的补充。它鼓励你探索日志,而无需构建冗长且有时复杂的查询,从而可以轻松查看你的 Git 仓库。

立即将 Tig 添加到你的 Git 工具包中!


via: https://opensource.com/article/22/7/visualize-git-workflow-tig

作者:Sumantro Mukherjee 选题:lkxed 译者:geekpi 校对:wxy

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