分类 技术 下的文章

观察你的代码在其他解释器下运行的表现或许是一项有趣的尝试。

作为最受欢迎的编程语言之一,Python 需要一个解释器来执行其代码所定义的命令。与其他可直接编译成机器代码的语言不同,Python 代码需要解释器读取它并把它转译给进行相关操作的 CPU。那么,哪些解释器有哪些呢?本文将对其中几种进行介绍。

解释器简介

提到 Python 解释器,我们通常会想到 /usr/bin/python 这个二进制文件。它使你能够执行 .py 文件。然而,解释操作仅仅是其中一环。在 Python 代码真正被 CPU 执行之前,都需要经过以下四个步骤:

  1. 词法分析 - 将人类编写的源代码转换为一序列逻辑实体,被称为 词法标记 lexical token
  2. 解析 - 解析器会检查词法标记的语法和语义规则生成 抽象语法树 abstract syntax tree (AST)。
  3. 编译 - 编译器会根据 AST 创建 Python 字节码,这些字节码由非常基础的,和平台无关的指令组成。
  4. 解释 - 解释器处理字节码并执行特定的操作。

如你所见,在任何实质性的操作发生之前,我们需要走过这些步骤。这也解释了深入研究不同解释器的重要性。

1、CPython

作为 Python 的参考实现,CPython 默认地被许多系统所采用。如其名称所示,CPython 是用 C 语言编写的。这也意味着,我们可以 以 C 语言编写扩展,从而让 Python 打通到广泛使用的 C 语言库代码。CPython 广泛应用于各种平台,包括 ARM 和 RISC。然而,作为 Python 的参考实现,CPython 更注重精细的优化,而非运行速度。

2、Pyston

Pyston 是一个从 CPython 解释器衍生出的分支,其中实现了性能优化。该项目定位自己为标准 CPython 解释器在处理大型、真实世界应用时的替代品,并有可能加速高达 30%。由于缺乏兼容的二进制包,Pyston 在下载过程中需要重新编译。

3、PyPy

采用了 RPython 编写的 PyPy 是一个专为 Python 配备的 即时(JIT) 编译器,RPython 是 Python 的一个静态类型的子集。不同于 CPython 解释器,PyPy 对源代码进行编译,生成 CPU 可直接执行的机器码。PyPy 是 Python 开发者的实验室,在这里他们能更容易地测试新特性。

相较于 CPython,PyPy 的执行速度更快。由于 JIT 编译器的特性,长时间运行的应用更能从缓存中受益。PyPy 可以被视为 CPython 的有效替代。虽然其中存在一些缺点,大部分的 C 扩展模块在 PyPy 中也得到支持,但运行速度会相对慢一些。PyPy 扩展模块使用 Python(而不是 C)编写,这使 JIT 编译器能够对其进行优化。只要你的应用程序不依赖于不兼容的模块,PyPy 就是替换 CPython 的理想选择。你可以在项目官网找到一个专门的页面,详细描述 PyPy 与 CPython 的不同之处:PyPy 与 CPython 的差异

4、RustPython

顾名思义,RustPython 是一个由 Rust 编写的 Python 解释器。尽管 Rust 如今还是一个相对年轻的编程语言,但因其优良特性已逐步受到开发者的推崇,甚至被视为 C 和 C++ 的可能接班人。默认情况下,RustPython 的行为与 CPython 的解释器类似,但它也可以选择启用 JIT 编译器。值得一提的是,Rust 工具链能直接编译为 WebAssembly ,进而允许在浏览器中全面运行解释器。你可以在 这里 看到它的在线演示。

5、Stackless Python

Stackless Python 自称是 Python 编程语言的增强版本。该项目基本上是 CPython 解释器衍生的一个项目,其为该语言添加了微线程、通道和调度器。微线程可以帮助你将代码组织成可以并行运行的 “ 小任务 tasklet ”。这与采用 greenlet 模块的绿色线程模型相似。通道可以用作 “小任务” 之间的双向通信。Stackless Python 的一个知名用户是大型多人在线角色扮演游戏 Eve Online

6、Micro Python

如果你的目标平台是微控制器,那么 MicroPython 将是你的首选。它是一种极简的实现,只需要 16kB 的内存和 256kB 的存储空间。由于其主要面向的是嵌入式环境,MicroPython 的标准库只包含 CPython 丰富的 STL 的一部分。对于开发和测试,或者作为轻量级替代品,MicroPython 也可以在普通的 x86 和 x64 系统上运行。MicroPython 支持 Linux、Windows,以及多种微控制器。

性能

就其设计而言,Python 本质上是一种运行速度不够快的语言。根据任务性质的不同,各种解释器间存在明显的性能差异。要想弄清楚哪种解释器最适合特定任务,可以参考 pybenchmarks.org。与使用解释器相比,另一种选择是直接将 Python 二进制代码编译成机器码,例如,Nuitka 就是能够完成这种工作的项目之一,它可以将 Python 代码编译成 C 代码,然后将 C 代码通过常规的 C 编译器编译成机器码。Python 编译器的主题范围广泛,值得一篇独立的文章来详述。

总结

Python 是构建快速原型和自动化任务的优秀语言,同时它又易于学习,对初学者友好。如果你平时维持使用 CPython,那么尝试看看你的代码在另一解释器上运行会是什么样子也许会很有趣。如果你是 Fedora 用户,你可以轻松地测试几种其他解释器,因为其包管理器已经提供了需要的二进制文件。你可以在 fedora.developer.org 上查找更多信息。

(题图:MJ/9b24f27b-bd2b-4916-9f33-bcfb9e2b1d33)


via: https://opensource.com/article/22/9/python-interpreters-2022

作者:Stephan Avenwedde 选题:lkxed 译者:ChatGPT 校对:wxy

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

在这篇初学者教程中,学习在 Arch Linux 中安装 Brave 浏览器。

Firefox 和 Brave 是我日常浏览网页的程序。

当我安装带有 GNOME 的 Arch Linux 时,它有 GNOME Web 浏览器。这是一个不错的浏览器,但我不能接受它,因为我需要保存的密码、浏览历史记录和插件。

因此,我开始安装我最喜欢的网络浏览器,因此本教程是关于在 Arch Linux 中安装 Brave。

如果你安装了 Yay(或任何其他 AUR 帮助程序),那么安装 Brave 就像使用以下命令一样简单:

yay -S brave-bin

是的!就这么简单。让我们详细看看。

? Manjaro 内置了 AUR 支持。你可以使用 Pamac 软件中心或 pamac/pacman 命令在 Manjaro 中安装 Brave。

在 Arch Linux 上安装 Brave 浏览器

Brave 在官方 Arch 仓库中不可用。但是,它可以在 AUR(Arch 用户仓库)中使用,并且可以使用 Yay 等 AUR 帮助程序轻松安装。

如果你没有 Yay 或任何其他 AUR 帮助程序,请逐一使用这些命令来 安装 Yay

sudo pacman -S --needed base-devel git
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si

安装 Yay 后,用它来安装 Brave:

yay -S brave-bin

不用担心。它最终会要求你输入密码。

如果这是你第一次安装浏览器,系统可能会要求你选择字体提供方。使用默认选择或选择任何其他选项。

接下来,它会询问你有关清理构建的问题。Yay 询问你是否应该重新下载软件包(和依赖项)并再次构建它或使用早期构建的缓存(如果有)。

你可以按回车键继续操作,这应该意味着不清理构建。

事实上,当你看到默认选项时,你可以继续按回车键。

在实际安装之前,系统会要求你输入帐户密码。输入你的密码并继续该过程。它将下载大小约为 350 MB 的文件:

安装后,在系统菜单中查找 Brave browser 并从那里运行它。

保持 Brave 更新

你可以使用以下命令更新通过 Yay 安装的 AUR 软件包来保持 Brave 浏览器更新:

yay -Sua

从 Arch 中删除 Brave

不喜欢 Brave? 不用担心。你可以轻松将其删除。

与任何其他软件一样,使用 pacman 命令从 Arch 中删除 Brave:

sudo pacman -Rs brave-bin

总结

AUR 再次拯救你! 安装 Brave 变得非常简单。

顺便说一句,我注意到 Brave 不知何故成为打开图像的默认应用。这意味着,双击图像将在新的 Brave 窗口中打开它们。

我必须通过右键单击图像并选择“打开方式”选项再次将图像查看器设置为默认值。

Somehow Brave becomes the default image viewer. You should change it

在接下来的几天里,我将分享更多我的 Arch 经验。敬请关注!

(题图:MJ/46bf8413-5fe1-41aa-b6f3-a5e660efce2b)


via: https://itsfoss.com/install-brave-arch-linux/

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

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

这篇文章会探讨什么是 Btrfs 快照,它们如何工作的,你在日常生活中进行快照的好处。这篇文章是《Btrfs 详解》系列文章中的一篇。从 Fedora Linux 33 开始,Btrfs 就是 Fedora Workstation 和 Fedora Silverblue 的默认文件系统。

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

简介

想象一下,你长时间处理一个文件,反复添加和撤销修改。然后,在某个时刻你意识到:两小时前你撤销的部分修改,现在会非常有用。而昨天在你销毁那个设计之前,你也已经修改了这个特殊的部分。当然,由于你会定期保存文件,所以旧的改动会丢失。很多人可能都遇到过这样的情况。如果能恢复旧版本的文件,而无需定期手动复制,岂不美哉?

这是一个 Btrfs 快照可以帮助你的特别场景。当你使用正确的话,快照同时也为你的电脑提供了很好的备份方案。

下面你会找到一些关于快照的例子。如果你想跟着操作,你必须拥有访问某些 Btrfs 文件系统的权限和 root 权限。你可以通过下面命令来验证一个目录的文件系统。

$ findmnt -no FSTYPE /home
btrfs

这个命令会输出你 /home/ 目录的文件系统名称。如果它是 btrfs,那就可以了。让我们创建一个新的目录去做实验:

$ mkdir ~/btrfs-snapshot-test
$ cd ~/btrfs-snapshot-test

在下面的文本中,你会看到很多像上面显示的那样的命令输出框。请在阅读/比较命令输出时请记住,框中的内容在行末会被换行。这使得识别跨多行的长行变得困难,降低了可读性。如果有疑问,试着调整浏览器窗口的大小,看看文本的变化!

Btrfs 快照

让我们从一个基本的问题开始:什么是 Btrfs 快照?如果你在文档 [1] 和维基 [2] 中查找,你不会立刻找到这个问题的答案。事实上,从“功能”一节里是找不到的。如果你搜索一下,你会发现快照和 Btrfs 子卷一起被大量地提及 [3] 。所以现在做什么呢?

还记得快照在系列前面的文章里两次被提到吗?是这样说的:

CoW 的优势在哪里?简单的说:文件被修改和编辑的历史被保存了下来。Btrfs 保存文件旧版本的引用(inode)可以轻易地被访问。这个引用就是快照:文件系统在某个时间点的状态镜像。这将是这系列文章里的单独的一篇,所以暂时留到后面介绍。

—— Btrfs 详解:基础概念

以及:

另外一个分离 //home 的优势是我们可以分别进行 快照 。子卷是快照的边界,对一个子卷的快照永远不会包含该子卷下面的其他子卷的内容。快照的更多细节会在后续的文章中介绍。

—— Btrfs 详解:子卷

看起来快照是和 Btrfs 子卷相关的。你可能之前在其他地方听到过快照,比如说 LVM(逻辑卷管理器)。虽然技术角度上它们都是为了同一个目的,但它们在实现方面有所不同。

每个 Btrfs 快照是一个子卷。但是,不是每个子卷都是一份快照。区别在于子卷里面包含的内容。一个快照是子卷加上一些内容:它包含对现在和过去版本的文件的引用(inode)。让我们看看快照是从哪来的!

创建 Btrfs 快照

想使用快照功能,你需要一个 Btrfs 子卷来进行快照。让我们在测试目录(~/btrfs-snapshot-test)里创建一个:

$ cd ~/btrfs-snapshot-test
$ sudo btrfs subvolume create demo
Create subvolume './demo'
$ sudo chown -R $(id -u):$(id -g) demo/
$ cd demo

因为 Btrfs 子卷默认是被 root 所有的,你必须用 chown 去修改子卷里的文件的所有权到普通用户上。现在我们在里面新加一些文件:

$ touch foo bar baz
$ echo "Lorem ipsum dolor sit amet, " > foo

你的目录现在看起来像这样:

$ ls -l
total 4
-rw-r--r--. 1 hartan hartan  0 Dec 20 08:11 bar
-rw-r--r--. 1 hartan hartan  0 Dec 20 08:11 baz
-rw-r--r--. 1 hartan hartan 29 Dec 20 08:11 foo

让我们从这里创建第一次快照:

$ cd ..
$ sudo btrfs subvolume snapshot demo demo-1
Create a snapshot of 'demo' in './demo-1'

这就好了。让我们看看发生了什么:

$ ls -l
total 0
drwxr-xr-x. 1 hartan hartan 18 Dec 20 08:11 demo
drwxr-xr-x. 1 hartan hartan 18 Dec 20 08:11 demo-1
$ tree
.
├── demo
│   ├── bar
│   ├── baz
│   └── foo
└── demo-1
    ├── bar
    ├── baz
    └── foo

2 directories, 6 files

这看起来是一份拷贝!为了验证,我们从快照里读取 foo 的内容:

$ cat demo/foo
Lorem ipsum dolor sit amet,
$ cat demo-1/foo
Lorem ipsum dolor sit amet,

当我们修改原始文件时,真正的效果变得明显:

$ echo "consectetur adipiscing elit, " >> demo/foo
$ cat demo/foo
Lorem ipsum dolor sit amet,
consectetur adipiscing elit,
$ cat demo-1/foo
Lorem ipsum dolor sit amet,

这表明快照仍然持有“旧”版本的数据:foo 的内容没有改变。到目前为止,你可以通过一个简单的文件复制来实现完全相同的目标。现在你也可以继续处理旧文件了。

$ echo "sed do eiusmod tempor incididunt" >> demo-1/foo
$ cat demo-1/foo
Lorem ipsum dolor sit amet,
sed do eiusmod tempor incididunt

但是在底层,我们的快照实际上是一个新的 Btrfs 子卷。你可以通过下面的命令来验证这一点:

$ sudo btrfs subvolume list -o .
ID 259 gen 265 top level 256 path home/hartan/btrfs-snapshot-test/demo
ID 260 gen 264 top level 256 path home/hartan/btrfs-snapshot-test/demo-1

Btrfs 子卷 vs. 文件复制

这一切有什么意义呢?到目前为止快照看起来是一个更加复杂的复制文件的方式。事实上,快照不仅仅是表面上看起来那么简单。让我们来创建一个更大的文件:

$ dd if=/dev/urandom of=demo/bigfile bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB, 512 MiB) copied, 1.3454 s, 399 MB/s

现在有一个512 MB 大小的新文件 demo/bigfile 。让我们创建另一个快照,这样在你修改数据的时候就不会丢失:

$ sudo btrfs subvolume snapshot demo demo-2
Create a snapshot of 'demo' in './demo-2'

现在我们通过追加少量字符串到文件来模拟变化:

$ echo "small changes" >> demo/bigfile

这是生效后的文件结构:

$ tree
.
├── demo
│   ├── bar
│   ├── baz
│   ├── bigfile
│   └── foo
├── demo-1
│   ├── bar
│   ├── baz
│   └── foo
└── demo-2
    ├── bar
    ├── baz
    ├── bigfile
    └── foo

3 directories, 11 files

但是真正的神奇的发生在其他地方。你已经复制了 demo/bigfile ,你现在拥有了两个大约 512 MiB 的文件。但是,因为它们是不同的拷贝,它们应该会占据共 1 GiB 的空间。记住两个文件的差异不超过 10 字节 —— 和原文件大小相比这几乎没什么差别。

Btrfs 快照工作原理与文件复制不同:而是它们保持对当前和过去的 inode 的引用。当你在文件追加更新时,在底层 Btrfs 分配更多的空间去存储更新,同时在原来的 inode 增加对新数据的引用。之前的内容保持不变。为了便于理解,你可以认为这是仅仅“存储”原文件和修改版本的差异。

让我们看看这个效果:

$ sudo compsize .
Processed 11 files, 5 regular extents (9 refs), 3 inline.
Type       Perc     Disk Usage   Uncompressed Referenced
TOTAL      100%      512M         512M         1.0G
none       100%      512M         512M         1.0G

这个有趣的数字出现在 TOTAL 一行:

  • Referenced 是当前目录下所有文件大小的总和
  • Disk Usage 是用于在磁盘上存储文件分配空间的大小

你有一共 1 GiB 的文件,但存储它们仅仅占据了 512 MiB。

Btrfs 快照和备份

目前为止,在这篇文章中,你已经看到如何创建 Btrfs 快照和它们的特别之处。有人可能会想:如果我在我的 PC 本地进行一系列的快照,我就有一个可靠的备份策略。 其实不是这样的 。如果 Btrfs 子卷共享的底层数据被偶然破坏了(被 Btrfs 之外的东西影响,比如宇宙射线),所有指向这些数据的子卷都会存在相同的错误。

为了让快照成为真正的备份,你应该将它们存储到一个不同的 Btrfs 系统上,例如在一个外部驱动器上。为了本文的目的,让我们在一个文件里创建一个新的 Btrfs 系统,并挂载它来模拟一个外部驱动。如果你有一个格式为 Btrfs 的外部驱动器,请随意替换以下命令中提到的所有路径来试试!让我们创建一个新的 Btrfs 文件系统:

注意:下面的命令会在你的文件系统上创建一个 8 GB 大小的新文件。如果你想跟着下面的步骤,请确保你的磁盘空间至少有 8 GB 剩余。请不要分配小于 8 GB 到这个文件,否则 Btrfs 可能在挂载时会遇到问题。

$ truncate -s 8G btrfs_filesystem.img
$ sudo mkfs.btrfs -L "backup-drive" btrfs_filesystem.img
btrfs-progs v5.18
See http://btrfs.wiki.kernel.org for more information.

[ ... ]

Devices:
    ID        SIZE  PATH
    1     8.00GiB  btrfs_filesystem.img

这些命令创建了名为 btrfs_filesystem.img 的 8 GB 新文件,同时在上面格式化了一个 Btrfs 文件系统。现在你可以像外部驱动器一样挂载它:

$ mkdir backup-drive
$ sudo mount btrfs_filesystem.img backup-drive
$ sudo chown -R $(id -u):$(id -g) backup-drive
$ ls -lh
total 4.7M
drwxr-xr-x. 1 hartan hartan    0 Dec 20 08:35 backup-drive
-rw-r--r--. 1 hartan hartan 8.0G Dec 20 08:37 btrfs_filesystem.img
drwxr-xr-x. 1 hartan hartan   32 Dec 20 08:14 demo
drwxr-xr-x. 1 hartan hartan   18 Dec 20 08:11 demo-1
drwxr-xr-x. 1 hartan hartan   32 Dec 20 08:14 demo-2

妙,现在挂载在 backup-drive 下面有一个独立的 Btrfs 文件系统!让我们尝试进行快照并且把快照放进去:

$ sudo btrfs subvolume snapshot demo backup-drive/demo-3
Create a snapshot of 'demo' in 'backup-drive/demo-3'
ERROR: cannot snapshot 'demo': Invalid cross-device link

发生了什么?噢,你尝试对 demo 进行一次快照并把它存在不同的 Btrfs 文件系统里(从 Btrfs 视角来看是一个不同的设备)。还记得一个 Btrfs 子卷仅持有对文件和内容的引用(inode)?这正是问题所在:文件和内容存在于我们的 home 文件系统,但不在新创建的 backup-drive 。你得找到一种方式去传输子卷和其内容到新的文件系统里。

在不同的 Btrfs 文件系统存储快照

针对这个目的 Btrfs 工具有两个特殊的命令。让我们首先来看看它们是如何工作的:

$ sudo btrfs send demo | sudo btrfs receive backup-drive/
ERROR: subvolume /home/hartan/btrfs-snapshot-test/demo is not read-only
ERROR: empty stream is not considered valid

另一个错误!这时它告诉你我们想要传输的子卷不是只读的。这是对的:你可以写入新内容到所有目前为止创建的快照/子卷。你可以像这样创建一个只读的快照:

$ sudo btrfs subvolume snapshot -r demo demo-3-ro
Create a readonly snapshot of 'demo' in './demo-3-ro'

不像之前那样,这里 -r 选项被加到了 snapshot 子命令里。这创建一个只读的快照,这很容易去验证:

$ touch demo-3-ro/another-file
touch: cannot touch 'demo-3-ro/another-file': Read-only file system

现在你可以重新尝试传输子卷:

$ sudo btrfs send demo-3-ro | sudo btrfs receive backup-drive/
At subvol demo-3-ro
At subvol demo-3-ro
$ tree

├── backup-drive
│   └── demo-3-ro
│       ├── bar
│       ├── baz
│       ├── bigfile
│       └── foo
├── btrfs_filesystem.img
├── demo
[ ... ]
└── demo-3-ro
    ├── bar
    ├── baz
    ├── bigfile
    └── foo

6 directories, 20 files

成功了!你成功传输原来子卷 demo 的一个只读快照到一个外部的 Btrfs 文件系统。

在非 Btrfs 文件系统存储快照

上面你已经看到你如何能存储 Btrfs 子卷/快照到其他的 Btrfs 文件系统。但如果你没有其他的 Btrfs 文件系统并且不能新创建一个,比如说外部驱动器需要一个和 Windows 或 MacOS 兼容的文件系统,你可以做什么呢?在这种情况下你可以存储子卷在文件里:

$ sudo btrfs send -f demo-3-ro-subvolume.btrfs demo-3-ro
At subvol demo-3-ro
$ ls -lh demo-3-ro-subvolume.btrfs
-rw-------. 1 root root 513M Dec 21 10:39 demo-3-ro-subvolume.btrfs

文件 demo-3-ro-subvolume.btrfs 现在包含了随后重建 demo-3-ro 子卷需要的所有东西。

增量地发送快照

如果你对不同的子卷重复执行这个操作,你会发现在某些时间点不同的子卷不再共享它们的文件内容。这是因为像上面一样发送一个子卷,去重建这个单独的子卷的所有数据将被传送到目标位置。但是,你可以引导 Btrfs 只向目标位置发送不同子卷的差异!所谓的增量发送将保证共享的引用在子卷中仍然共享。为了展示这一点,新增一些变动到我们原来的子卷:

$ echo "a few more changes" >> demo/bigfile

然后创建另一个只读子卷:

$ sudo btrfs subvolume snapshot -r demo demo-4-ro
Create a readonly snapshot of 'demo' in './demo-4-ro'

然后现在发送它:

$ sudo btrfs send -p demo-3-ro demo-4-ro | sudo btrfs receive backup-drive
At subvol demo-4-ro
At snapshot demo-4-ro

在上面的命令,-p 选项指定了一个父子卷用来计算差异。重要的是记住原 Btrfs 文件系统和目标 Btrfs 文件系统都必须包含相同的、未被修改过的父子卷!确保新的子卷真的在那里:

$ ls backup-drive/
demo-3-ro  demo-4-ro
$ ls -lR backup-drive/demo-4-ro/
backup-drive/demo-4-ro/:
total 524296
-rw-r--r--. 1 hartan hartan         0 Dec 20 08:11 bar
-rw-r--r--. 1 hartan hartan         0 Dec 20 08:11 baz
-rw-r--r--. 1 hartan hartan 536870945 Dec 21 10:49 bigfile
-rw-r--r--. 1 hartan hartan        59 Dec 20 08:13 foo

但你怎样知道增量发送只传输了子卷间的差异呢?让我们传输数据流到一个文件里然后看看它有多大:

$ sudo btrfs send -f demo-4-ro-diff.btrfs -p demo-3-ro demo-4-ro
At subvol demo-4-ro
$ ls -l demo-4-ro-diff.btrfs
-rw-------. 1 root root 315 Dec 21 10:55 demo-4-ro-diff.btrfs

根据 ls ,这个文件仅仅只有 315 字节大小!这意味着增量传输只传输子卷间的差异,和额外的 Btrfs 相关的元数据。

从快照中恢复子卷

在继续之前,让我们清理掉这时候不再需要的东西:

$ sudo rm -rf demo-4-ro-diff.btrfs demo-3-ro-subvolume.btrfs
$ sudo btrfs subvolume delete demo-1 demo-2 demo-3-ro demo-4-ro
$ ls -l
total 531516
drwxr-xr-x. 1 hartan hartan         36 Dec 21 10:50 backup-drive
-rw-r--r--. 1 hartan hartan 8589934592 Dec 21 10:51 btrfs_filesystem.img
drwxr-xr-x. 1 hartan hartan         32 Dec 20 08:14 demo

到目前为止你已经成功创建了可读/写和只读的 Btrfs 子卷快照,并把它们发送到外部。但是,为了把这作为备份策略,还要有一种方式去发送子卷回原来的文件系统和让它们再次变为可写。出于这个目的,我们移动 demo 子卷到其他地方并且尝试从最近的快照中重建它。第一步:重命名为 broken 子卷。一旦恢复成功它会被删除:

$ mv demo demo-broken

第二步: 传回最近的快照到这个文件系统:

$ sudo btrfs send backup-drive/demo-4-ro | sudo btrfs receive .
At subvol backup-drive/demo-4-ro
At subvol demo-4-ro
[hartan@fedora btrfs-snapshot-test]$ ls
backup-drive  btrfs_filesystem.img  demo-4-ro  demo-broken

第三步: 从快照创建一个可读写的子卷:

$ sudo btrfs subvolume snapshot demo-4-ro demo
Create a snapshot of 'demo-4-ro' in './demo'
$ ls
backup-drive  btrfs_filesystem.img  demo  demo-4-ro  demo-broken

上一步非常重要:你不能重命名 demo-4-rodemo ,因为这仍然是一个只读子卷!最后你可以检查你所有你想要的东西是不是在那里:

$ tree demo
demo
├── bar
├── baz
├── bigfile
└── foo

0 directories, 4 files
$ tail -c -19 demo/bigfile
a few more changes

最后的命令告诉你 bigfile 的最后 19 个字符实际上是上次变更执行的结果。这个时候,你可能想从 demo-broken 复制最近的更新到新的 demo 子卷。因为你没有执行任何更新,你可以过时的子卷:

$ sudo btrfs subvolume delete demo-4-ro demo-broken
Delete subvolume (no-commit): '/home/hartan/btrfs-snapshot-test/demo-4-ro'
Delete subvolume (no-commit): '/home/hartan/btrfs-snapshot-test/demo-broken'

就是这样!你成功从一个之前存在不同 Btrfs 文件系统(外部介质)的快照中恢复 demo 子卷。

子卷作为快照的边界

在本系列的第二篇文章中我提到子卷作为快照的边界,但这到底是什么意思呢?简单来说,子卷的一份快照仅包含这个子卷的内容,而不是下面嵌套的子卷。让我们来看看这个:

$ sudo btrfs subvolume create demo/nested
Create subvolume 'demo/nested'
$ sudo chown -R $(id -u):$(id -g) demo/nested
$ touch demo/nested/another_file

让我们像以前一样进行一次快照:

$ sudo btrfs subvolume snapshot demo demo-nested
Create a snapshot of 'demo' in './demo-nested'

然后查看里面的内容:

$ tree demo-nested
demo-nested
├── bar
├── baz
├── bigfile
├── foo
└── nested

1 directory, 4 files

$ tree demo
demo
├── bar
├── baz
├── bigfile
├── foo
└── nested
    └── another_file

1 directory, 5 files

注意到 another_file 不见了,仅仅是目录 nested 还在。这是因为 nested 是一个子卷:demo 的快照包含嵌套子卷的目录(挂载点),但里面的内容是缺失的。目前没有方法递归地执行快照去包含嵌套子卷。但是,我们可以利用这个优势去从快照中排除一些目录!这通常对那些你容易再现的数据有用,或者它们很少变化。例子有虚拟机或者容器镜像,电影,游戏文件等等。

在总结之前,我们移除所有测试过程中创建的东西:

$ sudo btrfs subvolume delete demo/nested demo demo-nested
Delete subvolume (no-commit): '/home/hartan/btrfs-snapshot-test/demo/nested'
Delete subvolume (no-commit): '/home/hartan/btrfs-snapshot-test/demo'
Delete subvolume (no-commit): '/home/hartan/btrfs-snapshot-test/demo-nested'
$ sudo umount backup-drive
$ cd ..
$ rm -rf btrfs-snapshot-test/

基于 Btrfs 备份最后思考

如果你决定使用 Btrfs 来执行数据的定期备份,那么你可能需要使用一个工具来自动完成这项任务。Btrfs 维基有一个专门针对 Btrfs [4] 的备份工具列表。在那里,你还将看到另一个手动执行 Btrfs 备份步骤的摘要。就我个人而言,我对 btrbk [5] 有很多很好的体验,我正在使用它来执行我自己的备份。除了备份之外,btrbk 还可以在你的 PC 本地保存 Btrfs 快照列表。我使用它来防止意外的数据删除。

如果你想要了解更多有关使用 Btrfs 进行备份的内容,欢迎在下面评论,我会考虑写一篇专门讨论这个话题的后续文章。

总结

本文研究了 Btrfs 快照,它们本质上是 Btrfs 子卷。你了解了如何创建可读写和只读快照,以及这种机制如何有助于防止数据丢失。

本系列的后续文章将讨论:

  • 压缩 - 透明地节省存储空间
  • 配额组 - 限制文件系统大小
  • RAID - 替代 mdadm 配置

如果你还想了解与 Btrfs 相关的其他主题,请查看 Btrfs 维基 [2:1] 和文档 [1:1] 。不要忘记查看本系列的前两篇文章!如果你认为本文缺少了一些内容,请在下面的评论中告诉我们。再会!

参考资料

  1. https://btrfs.readthedocs.io/en/latest/Introduction.html ↩︎ ↩︎
  2. https://btrfs.wiki.kernel.org/index.php/Main_Page ↩︎ ↩︎
  3. https://btrfs.readthedocs.io/en/latest/Subvolumes.html ↩︎
  4. https://btrfs.wiki.kernel.org/index.php/Incremental_Backup#Available_Backup_Tools ↩︎
  5. https://github.com/digint/btrbk ↩︎

(题图:MJ/ad8a61ed-ce6f-409e-b503-69104dd71149)


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

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

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

Yay 是最流行的 AUR 助手之一,用于处理 Arch 用户资源库中的软件包。学习在 Arch Linux 中安装它。

你可以在 Arch 用户仓库 Arch User Repository (AUR)中找到社区成员打包的大量软件。

由于它来自第三方,纯粹主义者建议从 AUR 手动下载并构建每个所需的包。

但这是一项乏味的任务,这就是为什么会有 AUR 助手来避免麻烦。

Yay 是最受欢迎的 AUR 帮助程序之一,在本教程中,我将分享如何在 Arch Linux 上安装 Yay。我还将分享一些有关使用 Yay 管理 AUR 包的技巧。

? Yay 可在 Manjaro 的仓库中找到。因此,Manjaro 用户只需使用 pacman -S yay 即可安装

在 Arch Linux 上安装 Yay

在继续安装 Yay 之前,你需要一些构建它所需的软件包。

让我把它分成几个步骤。

步骤 1:安装必备包

首先刷新包缓存并更新系统是一个好主意:

sudo pacman -Syu

安装所需的 base-devel(包含 makepkg 等工具)和 git(克隆 yay 的 Git 仓库所需的)。

sudo pacman -S --needed base-devel git

使用 --needed 标志,它不会重新安装已经安装的软件包。

它看起来是这样的:

现在你已经有了所需的软件包,是时候在你的系统上安装 Yay

步骤 2:克隆 Yay Git 仓库并切换到它

使用 git 命令 “克隆” Yay 仓库。你可以在系统中的任何位置执行此操作,无论是主目录还是其他目录。

git clone https://aur.archlinux.org/yay.git

完成后,切换到克隆的目录:

cd yay

终于可以安装 Yay 了。

步骤 3:安装 Yay

事实上,你是在构建它。你将在此处看到 PKGBUILD 文件。使用以下命令从此处构建包:

makepkg -si

按照屏幕上的说明进行操作。当系统要求你确认时,按 Y

该过程完成后,通过检查其版本来验证 Yay 是否已成功安装。

yay --version

现在你已经成功安装了它,你可以删除克隆的 Yay Git 仓库。不再需要它了。

使用 Yay 进行包管理

Yay 遵循与 pacman 类似(但不相同)的命令结构。所以你用 Yay 管理 AUR 包应该不难。

搜索软件包:

yay search_term

安装软件包:

yay -S package_name

删除软件包:

yay -R package_name

要删除包及其依赖项:

yay -Rns package_name

仅升级 AUR 包:

yay -Sua

Yay 还能够升级非 AUR 软件包。上面的 a 标志将其限制为 AUR。

将 Yay 升级到新版本

现在,你可能想知道如何将 Yay 升级到可用的新版本。

答案是你不需要做任何特别的事情。当你运行以下命令时,Yay 可以自行更新:

yay -Sua

从 Arch 系统中删除 Yay

如果你不喜欢 Yay 或不再需要它,你可以使用 pacman 命令像删除任何其他软件包一样删除它:

sudo pacman -Rs yay

总结

这是对 Yay AUR 助手的快速介绍。你可以访问其 GitHub 仓库以了解有关其工作的更多详细信息。

Arch 用户仓库(AUR)是为什么有些人喜欢使用 Arch Linux 的原因之一。

虽然纯粹的 Arch 用户一般都会嘲笑 AUR,特别是 AUR 助手,但它们仍然因其提供的易用性而受到欢迎。

我希望你发现这个快速教程有助于在 Arch Linux 上获得 Yay。如果你仍有疑问或发现任何技术错误,请告诉我。

(题图:MJ/f01331ab-ee70-45c4-8fd1-163e63497a6a)


via: https://itsfoss.com/install-yay-arch-linux/

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

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

编者注:本文译自微软官方发布的指南。

Linux 是一款操作系统,与 Windows 有许多相似之处,但由于其开源和高度定制化的特性,衍生出众多的版本。安装 Linux 的前提是,你需要决定一个安装方式,并选定一个适合的 Linux 发行版。

要安装 Linux,你需要如下步骤:

  1. 首先,确定一个安装方式。你可以选择使用 Windows 的 Linux 子系统 Windows Subsystem for Linux (WSL)进行安装,也可以选择完全安装在物理硬件上(即裸机安装),或者在本地或云端创建一个虚拟机(VM)来运行 Linux。
  2. 其次,选择一个 Linux 发行版。如:Ubuntu、Debian、Kali Linux、OpenSUSE 等。
  3. 然后,按照你所选的安装方法进行操作。具体可以是以下四种方式之一:

    • 使用 Windows 子系统 Linux(WSL)中的安装 Linux 命令
    • 在云中创建一个 Linux 虚拟机(VM)
    • 在本机创建一个 Linux 虚拟机(VM)
    • 创建一个可引导的 USB,以安装裸机版 Linux
  4. Linux 安装完成后,你需要熟悉你所选发行版的包管理器,更新和升级可获取的包,并熟悉微软提供的 Linux 资源,比如培训课程、为 Linux 设计的流行工具、新闻以及开源活动等。

步骤 1:选择一个安装 Linux 的方法

至于如何选择安装 Linux 的方式,这主要取决于你的需求和喜好。

  • 如果你是 Linux 新手,我们推荐你首先尝试 Windows 的 Linux 子系统(WSL),这是入门 Linux 最简单的方法。
  • 如果你正在企业环境中工作,或你在处理的业务有更复杂的需求,如规模或安全性等方面,我们推荐你在云端运行 Linux 虚拟机,并查看 Azure 所能提供的帮助。此建议也适用于想要将 Linux 作为服务器的用户。
  • 如果你只想将 Linux 作为你主要的操作系统,可以选择在物理硬件上裸机安装 Linux,尽管这个安装过程稍微复杂一些,且你可能无法访问到 Windows 的工具(如 Outlook、Teams、Word、PowerPoint 等),但你可以全力发挥你硬件的全部性能,无需承担虚拟化或仿真的开销。

你可以在下文中了解这些选项的详细信息。

Windows 的 Linux 子系统(WSL)

Windows 的 Linux 子系统(WSL)是一个安装 Linux 的简便方式,适用于使用 Windows 机器的用户。这是安装 Linux 最简单的一种方式。你只需执行 Linux 的安装命令:wsl --install,即可安装 Ubuntu 发行版。

此方法通过虚拟技术,将 Windows 和 Linux 操作系统(后者运行在真实的 Linux 内核上)整合到一起。你可以根据需要添加任何数量的 Linux 发行版,并且可以方便地在 Windows 中运行你喜爱的 Linux 工具,包括图形界面应用。此外,你还可以在同一条命令行中混合使用 Bash 和 PowerShell 命令。在这种方式下,项目文件由 Linux 文件系统托管,你可能需要用到的开发工具(如 VS Code)则由 Windows 文件系统托管。此安装方式的效率高且性能优秀。选择 Linux 发行版(或默认的 Ubuntu 发行版)后,你可以按照 Windows 的 Linux 子系统下的 Linux 安装命令 进行操作,或在 WSL 文档 中查阅更多信息。

WSL install command screenshot

创建虚拟机(VM)

创建虚拟机(VM)的选项适合所有人,无论你正在使用 Windows 还是 MacOS。然而,如果你想在云端创建虚拟机,你需要有一个 Azure 账户,或者如果你打算在你的电脑上直接创建虚拟机,你需要安装虚拟化软件。

虚拟机实际上是真实计算机的数字版,对于在可能需要提高硬件支持(例如:需要更多内存和处理能力)以及安全级别(如防病毒、加密、备份、策略管理等)的环境中运行 Linux 的场景非常受欢迎。

就像使用 WSL一样,你可以根据自己的需求创建多个不同 Linux 发行版的虚拟机实例,这些虚拟机在相互独立的环境中运行,它们没有任何冲突,非常适合进行软件开发和测试。虽然在 WSL 上运行 Linux 发行版的性能稍微更优,但 Linux 虚拟机更易于复制和迁移。可以根据你的需求,在 Azure 等云服务上或者通过虚拟化软件(也称为 管理程序 hypervisor )在自己的电脑上创建虚拟机。

在 Azure 上创建虚拟机,实际上是在云端的微软的服务器上托管你的虚拟机,你只是在向微软租用计算资源以运行虚拟机。这种方式在当你需要快速配置新的虚拟机或需要运行需求超过你个人电脑能力的任务时,将非常方便。大规模企业,由于其对扩展性、控制和功能需求更高,往往选择 在 Azure 上运行 Linux 虚拟机

在本地计算机上创建虚拟机需要使用虚拟化软件,即管理程序。Windows 提供了一个名为 Hyper-V 的 “类型 1” 管理程序,可以直接在你的硬件上运行虚拟化。此外,还有一些在操作系统上运行的“类型 2” 管理程序,比如 VirtualBox 或 VMware。如果你使用的是 Mac,一般推荐使用的管理程序是收费的“Parallels Desktop”。如果你想了解更多关于在配备了苹果硅芯片的 Mac 上如何安装 Linux 虚拟机的信息,可以参考对应的 安装教程。需要指出的是,VirtualBox 支持 Windows 和 MacOS。有关于如何在苹果硅芯片或基于英特尔的 Mac 上设计并运行自定义 Linux 客户机的更多信息,请参考 这篇

使用虚拟机管理器时,你需要自行管理虚拟机,包括分配内存、磁盘空间等资源,并确保系统的安全和及时性。相比其他选项,这需要更多的技术专长,并且可能无法达到同等的扩展性和容错容忍度。

一旦你选定了 Linux 发行版,并决定是在 本地通过虚拟机管理器运行虚拟机,还是 在云端通过 Azure 运行,你就可以按照相应的说明,在云上或在本地创建 Linux 虚拟机。

Create a Linux VM on Azure screenshot

裸机 Linux

所谓的裸机 Linux,意味着 Linux 是直接在设备硬件上运行。要进行裸机安装,你需要从你选择的 Linux 发行版官方网站下载 ISO 安装文件,并从这个文件创建一个可启动的 USB 驱动器。为了完成这个步骤,你需要一个已经安装有操作系统(Windows 或者其他操作系统)的设备。

许多用户选择裸机安装 Linux,并在同一台设备上与 Windows 共存,这就需要利用所谓的“双启动”模式。使 Windows 和 Linux 能双启动,就需要对你的硬盘进行分区,以保证两个操作系统(Linux 和 Windows)都有各自独立的空间。尽管 WSL、虚拟机和裸机 Linux 的性能已经相差无几,但由于双启动方式需要在两个操作系统间切换的时候频繁重启设备,所以这种安装方式并不是首选。此外,如果选择裸机安装 Linux,还需要对可能出现的设备驱动或硬件兼容性问题做好准备。

你可以在 Linux.org 网站上找到各种可供下载的主流 Linux 发行版。在你选定一个发行版之后,按照指南制作一个 可启动的 USB 驱动器,进行裸机 Linux 的安装就可以了。

Create a bootable USB screenshot

步骤 2:选择一个 Linux 发行版

Linux 的不同版本被称为“发行版”。因此,实际上并没有一个简单的“安装 Linux”的方法,你需要首先选择你想下载和安装哪一个使用了 Linux 内核的发行版。目前存在超过 600 种活跃的 Linux 发行版,如 Ubuntu、Debian、Kali Linux、OpenSUSE 等。在选择发行版时,有许多因素需要考虑,如:

需要 Linux 经验

如果你是 Linux 新手,可能会首选 Ubuntu。由于其支持健全且易用,Ubuntu 是 Linux 用户的主要起点之一。Ubuntu 提供了桌面版和服务器版供你选择,具体使用哪个版本由你打算如何使用它决定。操作系统需要负责的具体任务可能帮助你确定使用哪个发行版。Arch Linux 对于希望具有高度自定义、自行决定如何配置,但仍然稳定且得到大用户群支持的用户来说是个不错的选择。从这个地方开始可能会更复杂,但可以帮助你更好地理解 Linux 如何工作。

系统要求

如果需要一个资源消耗较少,或者说“轻量级”的发行版,就需要考虑对内存和处理速度需求较低的发行版。Alpine Linux 是一个热门的选择,用户会发现大部分的功能默认关闭或者没有安装,但这个发行版仍有你运行一个容器化应用所需的所有东西。

安全需求

有些 Linux 用户可能有特殊的安全需求需要考虑。Kali Linux 是设计用于进行安全任务如渗透测试、安全研究、计算机鉴识和逆向工程的发行版的一个例子。

对商业和企业环境的需求

与普通用户环境相比,商业、企业或者学术环境可能有着各自独特的要求。红帽企业 Linux(RHEL)和 Oracle Linux 提供全天候的全球支持和订阅服务。CentOS 也是一款备受欢迎的企业级发行版,它由社区支持,同时与 RHEL 具有良好的兼容性。

社区支持

具有强大用户社区的发行版往往受到青睐,因为这样的社区可以持续对发行版作出贡献,包括修复问题,增加新的功能,解答使用中的问题等。Ubuntu 就是最受欢迎的发行版之一,而 OpenSUSE 的历史比大多数其他发行版更悠久,且仍然在活跃更新中。随着用户需求和喜好的变化,许多其他的发行版也迅速赢得了用户的喜爱。Linux.org 网站提供了一些资源帮助你了解哪些发行版具有良好的支持或正在日益受到欢迎。

Screenshot of the list of distributions on Linux.org

步骤 3:按照安装方法步骤执行安装

在 Windows 的 Linux 子系统(WSL)中安装 Linux

若在 Windows PC 上安装 Linux,需要执行 Linux 安装命令。

  1. 首先,通过右键点击选择 “ 以管理员身份运行 Run as administrator ” 来打开 PowerShell 或 Windows 命令提示符。
  2. 执行 Linux 安装命令:wsl --install
  3. 然后,重启你的电脑。

WSL Linux Install List Command screenshot

Linux 安装命令的选项

默认情况下,安装命令会选择 Ubuntu 的 Linux 发行版。你可以查看微软商店中的其它可用发行版,方法是输入命令:wsl -l -o 。如需安装 Ubuntu 之外的其它发行版,在安装命令后加上 -d 参数,然后输入你想安装的发行版的名称:

wsl --install -d <发行版名称>

若你想安装的发行版不在微软商店中,你可参照 WSL 文档,学习如何 导入 你想与 WSL 一起使用的任何 Linux 发行版。

若想获取更多关于如何使用 VS Code、Git、Database、Docker、GUI apps、GPU 加速、NodesJS、USB 设备、挂载磁盘、创建自定义发行版、管理磁盘空间、为企业业务设置 WSL 的信息,你可以查阅 WSL 的文档

在云端创建 Linux 虚拟机

若想在 Azure 云上创建由 Linux 支持的虚拟机(VM),你需要登录 Azure Portal,并选择 “ 创建虚拟机 Create a Virtual Machine ” 服务。然后,按照指示完成用户名、项目、实例、SSH 密钥、端口设置,并复制 IP 地址。

Azure 提供了多种在云上创建 Linux VM 的选项。你可以选择喜欢的方法创建 Linux VM,快速指南选择方法如下:

如果你还没有 Azure 订阅账户,可以在开始之前创建一个 免费账户。如果这是你第一次在 Azure 上创建 Linux VM,你可以学习更多 有关 VM 的知识,或者查看在线培训课程:在 Azure 上创建 Linux 虚拟机

Select Linux VM size on Azure screenshot

使用虚拟机管理程序在本地创建 Linux 虚拟机

要在你的本地机器上使用虚拟机管理程序创建 Linux 虚拟机,你可以选择使用:

首先,你需要根据你所选择的管理程序检查硬件需求。在管理程序启用或安装后,你需要确定你想要安装的操作系统类型及其安装源(一般为 .iso 或 .vhdx 文件)。给虚拟机命名,选择文件存储的目录,设置分配给虚拟机的内存和虚拟硬盘大小(通常可以在固定或动态分配的硬盘空间中选择)。由于显示驱动和其他硬件依赖关系,有时候整合 Linux 虚拟机可能比较棘手,但大部分的管理程序都有活跃的用户社区,可以提供必要的帮助。如果你希望你的虚拟机能够连接到网络,可能还需要设置一个虚拟网络。

如果你刚接触管理程序,想要了解更多的话,可以尝试免费的在线课程:配置和管理 Hyper-V 虚拟机

Hyper-V install screenshot

创建可引导的 USB 驱动器以安装裸机 Linux

如果你需要裸机的 Linux,不论是在设备上单独运行某个发行版,还是在该发行版和 Windows 之间进行双启动,皆可以按照以下步骤进行:

  1. 下载你所选的 Linux 发行版的镜像文件,一般是 ISO 文件,例如,你可以在 Ubuntu 桌面版下载 页面下载最新版的 Ubuntu 镜像。有些 Linux 发行版可能在下载前需要你验证镜像签名。
  2. 创建一个可引导的 USB 驱动器。你通常需要一个至少有 16GB 空间的 USB 驱动器。同样,你也需要一个可以创建引导驱动器的软件,例如 balenaEtcher、Rufus、UNetbootin 等。通常情况下,你选择的 Linux 发行版的下载页面会推荐使用哪种引导盘创建软件。
  3. 从 USB 驱动器启动你的设备。在设备重启时,你需要进入启动菜单,这通常通过在启动期间按下 F12 键来实现。然后你可以选择安装包含有你的 Linux 发行版本 ISO 文件的 USB 驱动器。
  4. 选择安装选项。通常,你的 Linux 发行版的安装器会包括一系列安装步骤,这些步骤中会包含是否包括某些特性、第三方软件包等的选项。你还可能需要在该 Linux 发行版会是唯一操作系统的情况下选择是否对磁盘进行清除,或者如果你计划运行多个操作系统,你可能需要使用一个分区。你也可能会被询问是否希望启用加密。
  5. 最后,与任何 Linux 安装一样,你需要创建一个用户名和密码。

Ubuntu install screenshot

步骤 4:Linux 安装成功后需要进行的操作

在你成功安装 Linux 发行版后,还需要进行以下几个重要的步骤:

  1. 首先,熟悉你选择的 Linux 发行版所使用的首选包管理器。Linux 通过包管理器来下载和更新你打算使用的所有软件。例如,Ubuntu 就使用了 Advanced Packaging Tool(APT)。
  2. 进一步,利用你的发行版的包管理器进行发行版的更新和升级。稳定的 Linux 发行版中的软件包往往已经过时,因此我们建议你定期更新你的系统。同时,你可能希望进行升级操作,它会更新你已经安装的所有包文件的版本。如你使用的是 Ubuntu,那么你可以运行命令:sudo apt update && sudo apt upgrade
  3. 除此之外,探索 Microsoft 提供的 Linux 资源 也非常重要,例如针对 Linux 的 Microsoft 工具(如 Visual Studio Code、.NET 和 PowerShell),Learn 目录中可供学习的免费 Linux 相关课程,以及关于事件、新闻和 Linux 组织与 Microsoft 之间的持续伙伴关系的信息,包括 Microsoft 支持的 Mariner 发行版。

(题图:MJ/36b362bf-a6c5-4e60-b279-65b67e157872/)


via: https://learn.microsoft.com/en-us/linux/install

作者:mattwojo 译者:ChatGPT 校对:wxy

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

我很高兴分享我最喜欢的 26 个 FreeDOS 命令。

我家最早的一批计算机中有一台运行着一款名称为 DOS 的命令行操作系统,即 “ 磁盘操作系统 Disk Operating System ”。我是在 DOS 系统环境中长大的,学会了利用命令行来使我的工作更轻松。很多其他的人也是如此。我们非常爱 DOS ,所以在 1994 年 6 月 29 日,我们创建了 FreeDOS 工程。

如果你的 FreeDOS 的初学者,你可能会对如何使用其附带的不同的命令行程序感到困惑。让我们从我最喜欢的 26 个 FreeDOS 命令开始吧。要学习更多的信息,在大部分命令的后面添加 /? 选项来获取更多的信息:

C:\>attrib /?
ATTRIB v2.1 - 显示或更高文件属性。
版权所有 (c) 1998-2003,遵循 GPL2 协议。

语法:ATTRIB { options | [path][file] | /@[list] }

选项:

  +H 设置隐藏属性。     -H  清除隐藏属性。
  +S 设置系统属性。     -S  清除系统属性。
  +R 设置只读属性。     -R  清除只读属性。
  +A 设置存档属性。     -A  清楚存档属性。

  /S 处理具体指定路径中的所有目录中的文件。
  /D 处理带有通配符的参数的目录名称。
  /@ 处理文件,文件列在具体指定文件 中 [或 stdin]。

示例:

  attrib file -rhs
  attrib +a -r dir1 dir2*.dat /s
  attrib -hs/sd /@list.txt *.*

A 是 ATTRIB

ATTRIB 程序显示或更改文件的 属性 。属性可以是以下四个值之一:隐藏(H)、系统 S)、只读(R)、存档(A)。

标记为隐藏的文件将不会在目录列表中显示。例如,假设你想隐藏一个名称为 SECRET.TXT 的文件,这样就不会有人它在那里。首先,你可以显示该文件的属性,以便查看它的当前设置:

C:\FILES>attrib secret.txt 
[----A] SECRET.TXT

为隐藏这个文件,使用加号(+)操作符来开启用隐藏属性,像这样:

C:\FILES>attrib +h secret.txt 
[----A] -> [-H--A] SECRET.TXT
C:\FILES>dir
 Volume in drive C is FREEDOS2022
 Volume Serial Number is 333D-0B18

 Directory of C:\FILES

.                   <DIR>  05-27-2022  9:22p
..                  <DIR>  05-27-2022  9:22p
         0 file(s)              0 bytes
         2 dir(s)     279,560,192 bytes free

ATTRIB 的另一种常见使用方法是操作只读属性,这样你就不会意外地覆盖重要的文件。假设你想要保护 SECRET.TXT 文件,这样你就不能删除或更改它。使用 +R 修饰符 ,打开只读属性,像这样:

C:\FILES>attrib +r secret.txt 
[----A] -> [---RA] SECRET.TXT
C:\FILES>del secret.txt
C:\FILES\SECRET.TXT: Permission denied
no file removed.

B 是“哔哔”声

如果你需要在一个批处理文件中添加一些激情活力,你可以使用 BEEP 命令来获取用户的注意力。BEEP 不会在屏幕上显示任何内容,但是会简单地发出一个 “哔哔” 的声音信号。

注意:BEEP 使用个人计算机内置的扬声器来发出 “哔哔” 声。如果你使用一台虚拟机器来引导启用 FreeDOS,检查你的系统是否建立正确的模拟个人计算机扬声器。否则,你将不会听到任何声音。

C 是 CD

像 Linux 一样,FreeDOS 支持目录,这会允许你以一种来你有帮助的方式来组织你的文件。例如,你可以在一个名称为 FILES 的目录中存放你的全部文件,对于某些类型的文件,你可能会有其它的目录,例如,针对字处理器文件的 DOCS ,或者针对表格文件的 SPRDSHT

你可以使用 CD(即 “ 更改目录 change directory ”) 命令来导航到一个目录。CHDIR 命令和 CD 命令一样,如果你更喜欢使用这种语法的话。

为更改到一个新的目录,使用 CD 目录和目标目录:

C:\>cd files
C:\FILES>cd sprdsht
C:\FILES\SPRDSHT>dir
Volume in drive C is FREEDOS2022
Volume Serial Number is 333D-0B18
  
Directory of C:\FILES\SPRDSHT
  
. <DIR> 05-27-2022 9:59p
.. <DIR> 05-27-2022 9:59p
FIB WKS 2,093 05-27-2022 10:07p
LAB1 WKS 2,087 05-27-2022 10:10p
MIS100 WKS 2,232 05-27-2022 10:05p
3 file(s) 6,412 bytes
2 dir(s) 279,527,424 bytes free

你不必一次导航一层目录。相反,你可以使用一个 CD 命令和提供完整的你想要更改到的目录路径:

C:\>cd \files\sprdsht
C:\FILES\SPRDSHT>dir
Volume in drive C is FREEDOS2022
Volume Serial Number is 333D-0B18
  
Directory of C:\FILES\SPRDSHT
  
.  <DIR> 05-27-2022 9:59p
.. <DIR> 05-27-2022 9:59p
FIB WKS 2,093 05-27-2022 10:07p
LAB1 WKS 2,087 05-27-2022 10:10p
MIS100 WKS 2,232 05-27-2022 10:05p
3 file(s) 6,412 bytes
2 dir(s) 279,527,424 bytes free

D 是 DELTREE

如果需要删除一个单个文件,你可以使用 DEL 命令。为删除一个空的目录,你可以使用 RMDIRRD 命令。但是,如果你想删除一个有很多文件和子目录的目录?

一个包含有其它目录的目录称为 目录树 。你可以使用 DELTREE 命令来删除整个目录树。例如,为删除你的 FILES 目录,包括其中包含的所有的文件和目录,输入这个命令:

C:\>deltree files

    [DEFAULT-BUILD v1.02g] of DELTREE.  The "ROOT-SAFETY-CHECK" is enabled.

Delete directory "C:\FILES"
and all its subdirectories?

[Y] [N] [Q], [ENTER] ?  Y

==> Deleting "C:\FILES" ...

你可以使用一个单一的 DELTREE 命令来轻松快捷地完成很多工作,因此,FreeDOS 的 DELTREE 提示会询问你是否真的想要这样做。谨慎地使用这个命令。

E 是 EDIT

如果你需要在 FreeDOS 上编辑一个文本文件,EDIT 程序会让你轻松快速地完成任务。例如,要开始编辑一个名称为 HELLO.TXT 的文件,输入 EDIT HELLO.TXT 。如果 HELLO.TXT 文件已经存在,EDIT 打开文件并开始编辑。如果 HELLO.TXT 尚未存在,那么 EDIT 为你开启一个新的文件。

Image of edit

FreeDOS 的 EDIT 使用了一种友好的界面,对大多数人来说应该很容易使用。使用菜单来访问 EDIT 的各种特色功能,包括保存文件、打开一个新的文件、或者退出编辑器。为访问菜单,在你的键盘上按下 Alt 按键,然后使用箭头按键来避开和进入选择的动作。

Image of save menu

F 是 FIND

如果你需要在一个文件中查找文本,FIND 命令可以完成这项工作。类似于在 Linux 上的 fgrepFIND 会打印一些包含一个字符串的行。例如,为检查 FDCONFIG.SYS 文件中的 "Menu Default" 条目项,像这样使用 FIND :

C:\>find "MENUDEFAULT" fdconfig.sys

---------------- FDCONFIG.SYS
MENUDEFAULT=2,5

如果你不确定你想要查找的字符串是使用的大写字母还是小写字母,添加 /I 选项来忽略字母的大小写情况:

C:\>find /i "menudefault" fdconfig.sys
---------------- FDCONFIG.SYS
MENUDEFAULT=2,5

G 是 GRAPHICS

如果你想要捕捉屏幕,你可以使用你键盘上的 PrtScr 打印屏幕 Print Screen )按键来直接将你显示器上的文本打印到打印机上。不过,这只对纯文本来说有效。如果你要打印图形屏幕,你需要加载 GRAPHICS 程序。

GRAPHICS 支持不同的打印机类型,包括 HP 的 PCL 打印机、Epson 的点阵打印机,和兼容 PostScript 的打印机。例如,如果有一台连接到你的计算机的 HP 的激光打印机,你可以通过输入这条命令来为这台打印机加载支持:

C:\>graphics hpdefault
Running in MS GRAPHICS compatibility mode...
Using HPPCL type for type hpdefault
  If you think this is not correct, mail me (see help text).
Printing black as white and white as black
which internally uses /I of this GRAPHICS.
You can use the following command directly instead of
GRAPHICS [your options] in the future:
LH GRAPH-HP /I
Note that GRAPH-HP allows extra options:
  /E economy mode, /1 use LPT1, /2 use LPT2, /3 use LPT3,
  /R for random instead of ordered dither
  /C for 300dpi instead of 600dpi
Driver to make 'shift PrtScr' key work
even in CGA, EGA, VGA, MCGA graphics
modes loaded, in HP PCL mode.

H 是 HELP

如果你刚刚来到 FreeDOS 的世界,你可以通过输入 HELP 来获取如何使用不同命令的提示。这将带来 FreeDOS 的帮助系统,包含所有命令的文档:

Image of FreeDos help system

I 是 IF

你可以使用 IF 语句来将条件语句添加到你的命令行或批处理文件IF 进行一次简短的测试,然后执行一个单个命令。例如,如果存在某个文件,那么打印结果 “It's there”,你可以输入:

C:\>if exist kernel.sys echo It's there
It's there

如果你想要测试相反的东西,在测试内容前,使用 NOT 关键字。例如,如果两个字符串的值不相同,那么打印结果 “Not equal” ,输入这条语句:

C:\>if not "a"=="b" echo Not equal
Not equal

J 是 JOIN

早期的 DOS 版本是相当简单的;DOS 的第一个版本甚至不支持目录。为向这些较旧的程序提供向后兼容性,我们需要 JOIN 程序来作为一种巧妙的应变方法。JOIN 使用驱动器字母代替路径,这样,你可以将旧程序放入其自己的子目录中,但是,使用一个单个驱动器字母来访问它。

让我们假设你有一个名称为 VC 的旧应用程序,它不懂目录。为保持 VC 的工作,你可以将它的路径 连接 join 到一个驱动器字母。例如:

JOIN V: D:\VC

FreeDOS 将 JOIN 实施为 SWSUBST,它也兼备类似 SUBST 命令的特色功能。为将 D:\VC 路径链接到到一个名称为 V: 的驱动器字母,输入:

C:\>swsubst v: d:\vc
C:\>dir v:
Volume in drive V is DATA
Volume Serial Number is 212C-1DF8

Directory of V:\

. <DIR> 02-21-2022 10:35p
.. <DIR> 02-21-2022 10:35p
VC COM 27,520 07-14-2019 4:48p

1 file(s) 27,520 bytes
2 dir(s) 48,306,176 bytes free

K 是 KEYB

DOS 默认采用美式英语键盘布局。你的键盘是不同的,你可以使用 KEYB 命令来加载新的键盘语言布局。例如,为为加载一种德语键盘布局,输入:

C:\>keyb gr
FreeDOS KEYB 2.01 - (c) Aitor Santamaría Merino - GNU GPL 2.0
Keyboard layout : C:\FREEDOS\BIN\KEYBOARD.SYS:GR [858] (3)

L 是 LABEL

FreeDOS 使用 标签 label 来命名每个软盘驱动器和硬盘驱动器。这些标签提供了一种识别磁盘可能包含内容的方法。当你需要将文件存储到单个不同的软盘上时,LABEL 命令是非常有用的,你可以标记一个软盘 “Data”,另一个软盘为 “Games” 。

为分配一个新的标签到一个驱动器。或者更改在一个驱动器上的现存标签。像这样使用标签:

D:\>label d: data
D:\>dir /w
Volume in drive D is DATA
Volume Serial Number is 212C-1DF8

Directory of D:\

[123] [ABILITY] [ASEASY] [GAMES2] [QUATTRO]
[SRC] [TEMP] [THE] [VC] [WORD]
[WS400] EDLIN16.EXE EDLIN32.EXE MYENV.BAT
3 file(s) 113,910 bytes
11 dir(s) 48,306,176 bytes free

M 是 MEM

运行程序和加载驱动程序会占用内存。可以查看你的系统有多少内存,以及有多少可用来运行 DOS 程序,使用 MEM 命令:

C:\>mem

Memory Type Total Used Free
---------------- -------- -------- --------
Conventional 639K 11K 628K
Upper 104K 18K 86K
Reserved 281K 281K 0K
Extended (XMS) 15,224K 537K 14,687K
---------------- -------- -------- --------
Total memory 16,248K 847K 15,401K
  
Total under 1 MB 743K 29K 714K
  
Total Expanded (EMS) 8,576K (8,781,824 bytes)
Free Expanded (EMS) 8,192K (8,388,608 bytes)
  
Largest executable program size 628K (643,104 bytes)
Largest free upper memory block 84K ( 85,728 bytes)
FreeDOS is resident in the high memory area.

N 是 NANSI

如果你想添加一点颜色到 FreeDOS 命令行,你可以使用 ANSI 转义序列。这些序列之所以叫“转义”,是因为每个序列都以代码 33(转义字符 ESC)和一个由美国国家标准化协会(ANSI)定义的特殊字符序列为开头。

FreeDOS 通过 NANSI.SYS 驱动程序来支持 ANSI 转义序列。随着 NANSI 的加载,你的 FreeDOS 控制台将解释 ANSI 转义序列,例如,设置文本颜色。

Image of Nansi

O 是 oZone

FreeDOS 是一款命令行操作系统,但是一些人们更喜欢使用可备选的图形化用户界面。这就是为什么 FreeDOS 的 1.3 发行版包含一些图形化桌面的原因。我喜欢的一款名称为 oZone 的图形化桌面,它提供一种时尚、现代化外观的界面。

Image of Ozone GUI

注意,oZone 有一点烦人的错误,可能还需要一些来自外部开发者的关爱。如果你想让 oZone 变得更好,可以下载源文件代码做些贡献。

P 是 PROMPT

标准的 FreeDOS 命令行提示符会告诉你:你所在文件系统中的位置。当你第一次启动 FreeDOS 时,你的提示符看起来像 C:\>, 这意味着 \(根)目录在 C: 驱动器。> 字符表示着你可以在那里输入命令。

在你的提示符中,如果你更喜欢不同的信息,使用 PROMPT 目录来更改它。你可以使用一个带有 $ 的开头的特殊代码来显示不同的信息,例如,$D 用于日期、$T 用于时间。例如,你可以使用 $$ 指令来使你的 FreeDOS 命令行看起来像一个 Linux 提示符,来打印一个单个美元符号:

C:\>prompt $$
$

输入 PROMPT /? 来查看一份全部特殊代码的列表。

Q 是 QBASIC

FreeDOS 实际上没有 QBASIC 。它是针对 MS-DOS 的专有 BASIC 语言环境。作为备选方案,我们提供一些开放源文件的编译器,包括一些针对 BASIC 编程的编译器。

FreeBASIC 编译器可以编译外来的大多数 QBASIC 程序。这里有一个简单的 “猜数” 示例:

dim number as integer
dim guess as integer
randomize timer
number = int( 10 * rnd() ) + 1
print "Guess the number from 1 to 10:"
do
input guess
if guess < number then print "Too low"
if guess > number then print "Too high"
loop while guess <> number
print "That's right!"

使用 FBC 命令来编译 FreeBASIC 程序:

C:\DEVEL\FBC>fbc guess.bas

这里是这个简单游戏的快速演示:

C:\DEVEL\FBC>guess
Guess the number from 1 to 10:
? 5
Too high
? 3
Too low
? 4
That's right!

R 是 REM

在编写程序时,注释是极好的;注释帮助我们理解程序应该要做什么。可以在批处理文件中使用 REM 来做同样的事。在批处理文件中,在 REM 的后面的任何东西都将会被忽略。

REM this is a comment

S 是 SET

FreeDOS 命令行使用一系列称为 环境变量 environment variables 的变量,让你来自定义你的系统。你可以使用 SET 命令来设置这些变量。例如。使用 DIRCMD 变量来控制 DIR 如何排列目录列表。为设置 DIRCMD 变量,使用 SET 命令:

SET DIRCMD=/O:GNE

这告诉 DIR 先按照目录分组(G)来排序(O)输出,然后再按照名称(N)和扩展名(E)来排序结果。

T 是 TYPE

TYPE 命令是最常使用的 DOS 命令之一。TYPE 显示一个文件的内容,类似于在 Linux 上的 cat

C:\DEVEL>type hello.c
#include 

int
main()
{
puts("Hello world");
return 0;
}

U 是 UNZIP

在 Linux 上,你可能更熟悉标准的 Unix 存档命令: tar。在 FreeDOS 上也有一个 tar 版本(和其它大量的流行的存档程序),但是,在 DOS 上的事实上的标准的存档命令是 ZIPUNZIP 。两者都默认安装在 FreeDOS 1.3 之中。

比如说,我有一些文件的一个 zip 存档。如果我想提取整个 Zip 文件,我可以只使用 UNZIP 命令,并将 Zip 文件作为命令行的选项来提供。这将在我当前工作目录中开始提取存档文件。除非我正在恢复一些东西的先前版本,我通常不希望覆盖我的当前文件。在这种情况下,我将提取存档到一个新的目录。你可以使用 -d(“ 目标 destination ”)命令行选项来具体指定目标路径:

D:\SRC>unzip monkeys.zip -d monkeys.new
Warning: TZ environment variable not found, cannot use UTC times!!
Archive: monkeys.zip
creating: monkeys.new/monkeys/
inflating: monkeys.new/monkeys/banana.c
inflating: monkeys.new/monkeys/banana.obj
inflating: monkeys.new/monkeys/banana.exe
creating: monkeys.new/monkeys/putimg/
inflating: monkeys.new/monkeys/putimg/putimg.c
inflating: monkeys.new/monkeys/putimg/putimg.obj
inflating: monkeys.new/monkeys/putimg/putimg.exe

为学习更多关于 ZIPUNZIP 命令的信息,可以阅读 如何在 FreeDOS 上存档文件

V 是 VER

在 DOS 的古老岁月中,VER 命令会报告你正在运行的 DOS 发行版本,例如:“MS-DOS 5.0.D”。对于 FreeDOS,VER 命令将给予你额外的详细信息,例如 FreeDOS Shell 的版本:

C:\DEVEL>ver
FreeCom version 0.85a - WATCOMC - XMS_Swap [Jul 10 2021 19:28:06]

如果你还想查看 FreeDOS 内核版本和 DOS 兼容性等级,添加 /R 选项:

C:\DEVEL>ver /r

FreeCom version 0.85a - WATCOMC - XMS_Swap [Jul 10 2021 19:28:06]

DOS version 7.10
FreeDOS kernel 2043 (build 2043 OEM:0xfd) [compiled May 14 2021]

W 是 WHICH

FreeDOS 命令行可以运行来自记录在 PATH 变量中的不同的目录列表的程序。你可以使用 WHICH 命令来准确地识别出程序的位置。只需要输入 WHICH 加上你想要定位的程序名称:

C:\>which xcopy
xcopy C:\FREEDOS\BIN\XCOPY.EXE

X 是 XCOPY

COPY 命令只能将文件从一个位置复制到另一个位置。如果你想扩大复制的范围来包括一些目录,使用 XCOPY 命令。我通常添加 /E 选项来包含所有的子目录,包括空的子目录,这样,我可以复制整个目录树。这样就可以有效地备份我正在工作的任意工程:

D:\SRC>xcopy /e monkeys monkeys.bak
Does MONKEYS.BAK specify a file name
or directory name on the target (File/Directory)? d
Copying D:\SRC\MONKEYS\PUTIMG\PUTIMG.C
Copying D:\SRC\MONKEYS\PUTIMG\PUTIMG.OBJ
Copying D:\SRC\MONKEYS\PUTIMG\PUTIMG.EXE
Copying D:\SRC\MONKEYS\BANANA.C
Copying D:\SRC\MONKEYS\BANANA.OBJ
Copying D:\SRC\MONKEYS\BANANA.EXE
6 file(s) copied

Y 是 Yellow

这不是一个命令,而是关于 DOS 如何显示颜色的有趣的百科知识。如果你仔细留心过 FreeDOS,你可能已经注意到,文本只能获取有限的颜色范围—— 十六种文本颜色、八种背景颜色。

IBM 的 5153 彩色显示器,通过点亮不同亮度等级的微小的红、绿、蓝荧光点的方式创建 16 种文本颜色和 8 种背景颜色来为用户显示颜色。早期的个人计算机只能以“标准强度”级别来显示背景颜色;只有文本颜色可以使用明亮颜色。

如果你查看文本颜色,你有黑色、蓝色、绿色、蓝绿色、红色、品红色、橙色和白色。这些颜色的“明亮”版本有亮黑色(暗灰色)、亮蓝色、亮绿色、亮蓝绿色、亮红色、亮品红色、黄色和亮白色。橙色的“明亮”版本有实际上是黄色。没有“亮橙色”。

如果你想要学习更多关于文本颜色的信息,阅读我们关于 FreeDOS 为什么有 16 种颜色 的文章。

Z 是 ZIP

你可以在 DOS 命令行中使用 ZIP 来创建文件和目录的存档。这是一种很便利的方法:可以备份你的工作,或者发布一个 “软件包” 来在未来的 FreeDOS 发行版中使用。例如,比如说,我想备份我的工程源文件代码,其中包含这些源文件文件:

D:\SRC>zip -9r monkeys.zip monkeys
zip warning: TZ environment variable not found, cannot use UTC times!!
adding: monkeys/ (stored 0%)
adding: monkeys/banana.c (deflated 66%)
adding: monkeys/banana.obj (deflated 26%)
adding: monkeys/banana.exe (deflated 34%)
adding: monkeys/putimg/ (stored 0%)
adding: monkeys/putimg/putimg.c (deflated 62%)
adding: monkeys/putimg/putimg.obj (deflated 29%)
adding: monkeys/putimg/putimg.exe (deflated 34%)

ZIP 支持很多命令行选项来完成不同的工作,但是,我使用最多的命令行选项是: -r 用于递归处理目录和子目录、-9 用于提供尽可能大的压缩比。ZIPUNZIP 使用类 Unix 命令行,因此,你可以在短划线后面合并选项: -9r 将在 Zip 文件中给予最大压缩比和包括子目录。

关于如何使用 ZIPUNZIP 命令的更多详细信息,阅读 如何在 FreeDOS 上存档文件

新的 FreeDOS 指南

准备好你的 FreeDOS 旅程的下一步了吗?查看我们的新的电子书,现在开始尝试我们的 FreeDOS !

FreeDOS 使用指南
深入 FreeDOS 高级指南

(题图:MJ/0b21dcc8-4c8d-457b-9e0d-fbbe5dd08c60)


via: https://opensource.com/article/22/6/26-freedos-commands

作者:Jim Hall 选题:lkxed 译者:robsean 校对:wxy

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