分类 技术 下的文章

du 和 ncdu 两个命令提供了相同信息的两种不同视图,便于我们跟踪存储在计算机上的内容。

无论你有多少存储空间,了解文件占用了多少磁盘空间都是一个重要的考虑事项。我的笔记本有一个相对较小的 250GB NVME 驱动器,大多数时候都没什么问题,但几年前我开始探索 Linux 上的游戏,情况变得有所不同,安装 Steam 和其他游戏使存储管理更加重要。

du 命令

检查磁盘驱动器上剩余存储空间最简单的方法是 du 命令。它会估计文件空间使用情况,像其他所有 Linux 工具一样,du 非常强大,但学会如何根据你的特定需求使用它会很有帮助。我总是查阅手册页来掌握实用程序的用法。du 有几个选项,可以为你提供文件存储的最佳快照,以及它们在系统上消耗多少空间。

du 命令有很多选项,以下是一些常见的:

  • -a - 包括文件夹和文件在内的存储信息
  • --apparent-size - 打印自身大小而不是占用磁盘量
  • -h - 人类可读的格式
  • -b - 以字节为单位
  • -c - 总计
  • -k - 以块为单位
  • -m - 以兆字节为单位的大小

务必查看 du 手册页获取完整帮助列表。

显示所有文件

你可以选择的第一个选项是 du -a,它可以显示系统上所有文件及其存储目录的大小。这个命令让我知道了我的主目录中存储了 11555168 个字节。使用 du -a 可以快速递归地查看我的存储系统。如果我想要一个更有意义的数字,并且我想深入到目录中查看大文件的位置,该怎么办?

我认为在 Downloads 目录下有一些大文件,所以我输入 du -a /home/don/Downloads 来查看。

$ du -a ~/Downloads
4923    ./UNIX_Driver_5-0/UNIX Driver 50
4923    ./UNIX_Driver_5-0
20      ./epel-release-latest-9.noarch.rpm
12      ./rpmfusion-free-release-9.noarch.rpm
2256    ./PZO9297 000 Cover.pdf
8       ./pc.md
2644    ./geckodriver-v0.31.0-linux64.tar.gz
466468

最左边的数字是以字节为单位的文件大小。我想要一些对我更有帮助的东西,所以我将人类可读格式的选项添加到命令中,结果是 456M(兆字节),这对我来说是一种更有用的数字格式。

$ du -ah ~/Downloads
4.9M    ./UNIX_Driver_5-0/UNIX Driver 50
4.9M    ./UNIX_Driver_5-0
20K    ./epel-release-latest-9.noarch.rpm
12K    ./rpmfusion-free-release-9.noarch.rpm
2.2M    ./PZO9297 000 Cover.pdf
8.0K    ./pc.md
2.6M    ./geckodriver-v0.31.0-linux64.tar.gz
456M    .

与大多数 Linux 命令一样,你可以组合选项,要以人类可读的格式查看 Downloads 目录,使用 du -ah ~/Downloads 命令。

总和

-c 选项在最后一行提供了磁盘使用总和。我可以使用 du -ch /home/don 来显示主目录中的每个文件和目录。这里有很多信息,我只想知道最后一行的信息,所以我将 du 命令通过管道传输给 tail 来显示最后几行。命令是 du -ch /home/don | tail。(LCTT 校注:可以使用 tail -1 来仅显示最后一行汇总行。)

将 du 命令输出通过管道传输到 tail

ncdu 命令

对存储在驱动器上内容感兴趣的 Linux 用户,另一个选择是 ncdu 命令,它代表 “NCurses 磁盘使用情况”。基于你的 Linux 发行版,你可能需要下载并安装它。

在 Linux Mint、Elementary、Pop\_OS! 或其它基于 Debian 的发行版上:

$ sudo apt install ncdu

在 Fedora、Mageia 或 CentOS 上:

$ sudo dnf install ncdu

在 Arch、Manjar 或者类似发行版上:

$ sudo pacman -S ncdu

安装后,你可以使用 ncdu 来分析你的文件系统。以下是在我的主目录中发出 ncdu 后的示例输出。ncdu 的手册页指出 “ncdu(NCurses Disk Usage)是众所周知的 du 基于 curses 的版本,它提供了一种快速查看哪些目录正在使用磁盘空间的方法。”

du 命令输出

我可以使用方向键上下导航,按下回车键进入目录。有趣的是,du 报告我的主目录中的总磁盘使用量为 12GB,而 ncdu 显示为 11GB。你可以在 ncdu 手册页中找到更多信息。

你可以将 ncdu 指向某个目录来探索特定目录。例如,ncdu /home/don/Downloads

ncdu 命令输出

? 键显示帮助菜单。

ncdu 帮助

总结

duncdu 两个命令提供了相同信息的两种不同视图,便于我们跟踪存储在计算机上的内容。

如果你不习惯使用终端,或者想寻找此类信息的另一种查看方式,可以看看 GNOME 磁盘使用分析器。如果你的系统上还没有它,你可以轻松安装和使用它。检查你的发行版是否有 baobab 开发的这个软件,如果你想试试,那就去安装它吧。

(文内图片来自于 Don Watkins, CC BY-SA 4.0)


via: https://opensource.com/article/22/7/check-disk-usage-linux

作者:Don Watkins 选题:lkxed 译者:MjSeven 校对:wxy

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

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

使用 C 编写的应用程序时,通常有多个源码文件,但最终你需要编译成单个的可执行文件。

你可以通过两种方式来完成这项工作:通过创建一个 静态 static 库 或 一个 动态 dynamic 库(也被称为 共享 shared 库)。从创建和链接的方式来看,它们是两种不同类型的库。选择使用哪种方式取决于你的的具体场景。

上一篇文章 中,我演示了如何创建一个动态链接的可执行文件,这是一种更通用的方法。在这篇文章中,我将说明如何创建一个静态链接的可执行文件。

使用静态库链接器

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

链接器的功能包括:

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

链接器通过这些功能,创建了一个名称为可执行文件的一个可运行程序。

静态库是通过复制一个程序中的所有依赖库模块到最终的可执行镜像来创建的。链接器将链接静态库作为编译过程的最后一步。可执行文件是通过解析外部引用、将库例程与程序代码结合在一起来创建的。

创建目标文件

这里是一个静态库的示例以及其链接过程。首先,创建带有这些函数识别标志的头文件 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 选项跳过链接步骤,而只创建目标文件。

创建一个名称为 libmymath.a 的静态库,接下来,移除目标文件,因为它们不再被需要。(注意,使用一个 trash 命令比使用一个 rm 命令更安全。)

$ ar rs libmymath.a add.o sub.o mult.o divi.o
$ trash *.o
$ ls
add.c  divi.c  libmymath.a  mult.c  mymath.h  sub.c

现在,你已经创建了一个名称为 libmymath 的简单数学示例库,你可以在 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 库。

针对 mathDemo.c 创建一个名称为 mathDemo.o 的对象文件:

$ gcc -I . -c mathDemo.c

-I 选项告诉 GCC 搜索在其后列出的头文件。在这个实例中,你通过单个点(.)来指定当前目录。

链接 mathDemo.olibmymath.a 来生成最终的可执行文件。这里有两种方法来向 GCC 告知这一点。

你可以指向文件:

$ gcc -static -o mathDemo mathDemo.o libmymath.a

或者,你可以具体指定库的路径及名称:

$ gcc -static -o mathDemo -L . mathDemo.o -lmymath

在后面的那个示例中,-lmymath 选项告诉链接器来链接对象文件 mathDemo.o 和对象文件 libmymath.a 来生成最终的可执行文件。-L 选项指示链接器在下面的参数中查找库(类似于你使用 -I 所做的工作)。

分析结果

使用 file 命令来验证它是静态链接的:

$ file mathDemo
mathDemo: ELF 64-bit LSB executable, x86-64...
statically linked, with debug_info, not stripped

使用 ldd 命令,你将会看到该可执行文件不是动态链接的:

$ ldd ./mathDemo
        not a dynamic executable

你也可以查看 mathDemo 可执行文件的大小:

$ du -h ./mathDemo
932K    ./mathDemo

在我 前一篇文章 的示例中,动态链接的可执行文件只占有 24K 大小。

运行该命令来看看它的工作内容:

$ ./mathDemo
Enter two numbers
10
5

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
10 / 5 = 2

看起来令人满意!

何时使用静态链接

动态链接可执行文件通常优于静态链接可执行文件,因为动态链接会保持应用程序的组件模块化。假如一个库接收到一次关键安全更新,那么它可以很容易地修补,因为它存在于应用程序的外部。

当你使用静态链接时,库的代码会“隐藏”在你创建的可执行文件之中,意味着在库每次更新时(相信我,你会有更好的东西),仅有的一种修补方法是重新编译和发布一个新的可执行文件。

不过,如果一个库的代码,要么存在于它正在使用的具有相同代码的可执行文件中,要么存在于不会接收到任何更新的专用嵌入式设备中,那么静态连接将是一种可接受的选项。


via: https://opensource.com/article/22/6/static-linking-linux

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

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

前几天我试图安装 massCode 应用。对于安装,它提供了一个 Snap 文件以供下载。

当我尝试从 Snap 文件安装应用程序时:

sudo snap install snap_file

它给了我以下错误:

error: cannot find signatures with metadata for snap "masscode_2.6.1_amd64.snap"

cannot find signature with metadata for snap

这很奇怪。在 Ubuntu 中添加外部仓库 时,你必须添加 GPG 密钥。但是这里的开发人员没有提供这样的东西。

“修复”简单易行。让我给你解释一下。

处理 “cannot find signatures with metadata for snap” 错误

这里其实不涉及签名。

发生的情况是你从第三方下载了 Snap 安装程序。 Ubuntu 中的 Snap 机制希望你从官方 Snap 商店获取 Snap 包。

由于它不是来自 Snap 商店,因此你会看到 “cannot find signatures with metadata for snap” 的错误消息。与大多数错误消息一样,这个错误消息不是描述性的。

那么,这里的解决方案是什么?

任何未通过 Snap 商店分发的 Snap 包都必须使用 --dangerous 选项进行安装。这就是规则。

sudo snap install --dangerous path_to_snap_file

这样,你告诉 Snap 包管理器显式安装 Snap 包。

在这里,我使用了这个选项并且能够成功地从它的 Snap 包中安装 massCode。

installing third party snap packages

以这种方式安装 Snap 包有多“危险”?几乎和下载并 安装 deb 格式安装包 相同。

在我看来,如果你是从项目开发者的网站上下载 Snap 包,你已经在信任该项目了。在这种情况下,你可以使用 --dangerous 选项安装它。

当然,你应该首先搜索该软件包是否在 Snap 商店中可用:

snap find package_name

我希望这个快速的小技巧可以帮助你修复 Snap 错误。如果你有任何问题或建议,请告诉我。如果你想了解更多信息,请参阅 这个使用 Snap 命令指南


via: https://itsfoss.com/snap-metadata-signature-error/

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

本文由 LCTT 原创编译,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中国 荣誉推出

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中国 荣誉推出