一切皆文件

还没有读者喜欢这个。
Arrows moving a process forward

Opensource.com

这里有一个棘手的问题要问你:以下哪些是文件?

  • 目录
  • Shell 脚本
  • LibreOffice 文档
  • 串行端口
  • 内核数据结构
  • 内核调优参数
  • 硬盘驱动器
  • 分区
  • 逻辑卷 (LVM)
  • 打印机
  • 套接字

也许你不会相信,但对于 Unix 和 Linux 来说,它们都是文件。这是最令人惊叹的概念之一——它使得执行许多管理任务成为可能,这些任务可能原本极其困难或不可能完成,方法却非常简单而强大。

备份主引导记录

例如,考虑一下备份硬盘驱动器的主引导记录 (MBR) 的简单任务。我有时需要恢复或重建我的 MBR,特别是分区表。从头开始重建非常困难。从保存的文件中恢复则很容易。Linux 自带一个强大的 GNU 实用程序 dd,它可以执行此功能和许多其他功能。

dd 代表 "disk dump"(磁盘转储),但我们这些长期从事管理的管理员都知道它被称为 "disk destroyer"(磁盘破坏者),因为如果你不非常小心,它会完全按照你告诉它的那样做,包括破坏硬盘驱动器或分区上的所有数据。

以下命令将备份你的 MBR。它必须以 root 用户身份运行,因为非 root 用户无权访问 /dev 目录中的硬盘驱动器 设备文件。BS 是块大小,count 是要从源文件读取的块数。此命令将在 /tmp 目录中创建一个文件 myMBR.bak。该文件的大小为 512 字节,包含 MBR 的内容,包括引导代码和分区表。

dd if=/dev/sda of=/tmp/myMBR.bak bs=512 count=1

如果 MBR 损坏,则需要引导到救援磁盘并使用以下命令,该命令本质上执行与上述命令相反的操作。请注意,不必像第一个命令中那样指定块大小和块计数,因为 dd 命令只会将备份文件复制到硬盘驱动器的第一个扇区,并在到达源文件末尾时停止。

dd if=/tmp/myMBR.bak of=/dev/sda

这一切都是文件系统的一部分

Linux 计算机上的所有内容都可以作为文件系统空间中的文件访问。这样做的全部意义在于能够在不同的事物上使用通用工具

dd 命令可用于将硬盘驱动器的整个分区复制到文件或另一个硬盘驱动器,如下所示。同样,dd 命令将数据复制到输入设备的末尾并停止。请确保输出设备的大小大于输入设备。

dd if=/dev/sdf2 of=/dev/sdg3

dd if=/dev/sda of=/dev/sdg

其他文件系统工具也有效。例如,cat 命令可用于将任何文件的内容发送到标准输出。这包括分区和整个硬盘驱动器。然后可以将输出重定向到文件。

cat /dev/sda1 > partition1.backup

然而,cat 命令没有 dd 命令的控制能力。例如,无法指定要从源设备或文件读取的数据量。

这是一个有趣的实验,它将演示一切皆文件的事实。大多数 Linux 发行版都有多个虚拟控制台,1 到 7,可用于使用 shell 界面登录到本地控制台会话。可以使用组合键 Ctrl-Alt-F1 访问控制台 1,Ctrl-Alt-F2 访问控制台 2,依此类推。

按 Ctrl-Alt-F2 切换到控制台 2。在某些发行版上,登录信息包括与此控制台关联的 tty(电传打字机)设备,但许多发行版没有。它应该是 tty2,因为你在控制台 2 中。

以非 root 用户身份登录。然后你可以使用 who am i 命令——是的,就像那样,带空格——来确定哪个 tty 设备连接到此控制台。

在我们实际执行此实验之前,请查看 /dev 中 tty2 和 tty3 设备的列表。

ls -l /dev tty[23]

将定义大量 tty 设备,但我们不关心大多数设备,只关心 tty2 和 tty3 设备。作为设备文件,它们没有什么特别之处;它们只是字符类型设备。我们将使用这些设备进行此实验。tty2 设备连接到虚拟控制台 2,tty3 设备连接到虚拟控制台 3。

按 Ctrl-Alt-F3 切换到控制台 3。再次以相同的非 root 用户身份登录。

现在在控制台 3 上输入以下命令。

echo "Hello world" > /dev/tty2

按 Ctrl-Alt-F2 返回控制台 2。字符串 "Hello world"(不带引号)显示在控制台 2 中。

此实验也可以在 GUI 桌面上的终端模拟器上执行。桌面上的终端会话使用 /dev 树中的伪终端设备,例如 /dev/pts/1。使用 Konsole 或 Xterm 打开两个终端会话。确定它们连接到哪个伪终端,并使用一个向另一个发送消息。

现在继续实验,使用 cat 命令在不同的终端上显示 /etc/fstab 文件。

另一个有趣的实验是使用 cat 命令将文件直接打印到打印机。假设你的打印机设备是 /dev/usb/lp0,并且你的打印机可以直接打印 PDF 文件,则以下命令将在你的打印机上打印 PDF 文件。

cat test.pdf > /dev/usb/lp0

dd 命令也可用于打印打印机就绪文件。我认为 cat 命令实际上更适合此任务。

"一切皆文件" 的含义

"一切皆文件" 的含义是深远的,并且比本文这样一篇短文中所能列出的要多得多。你已经在前面的实验中看到了一些示例。但这是一个简短的列表,其中包含这些以及更多内容。

  1. 克隆硬盘驱动器。
  2. 备份分区。
  3. 备份主引导记录 (MBR)。
  4. 将 ISO 镜像安装到 USB 拇指驱动器。
  5. 与其他终端上的用户通信。
  6. 将文件打印到打印机。
  7. 更改 /proc 伪文件系统中某些文件的内容,以修改正在运行的内核的配置参数。
  8. 用随机数据或零覆盖文件、分区或整个硬盘驱动器。
  9. 将来自命令的不需要的输出重定向到 /dev/null 设备,在那里它将永远消失。
  10. 等等,等等,等等。

这里有太多的可能性,任何列表都只能触及表面。我确信你已经或将要找出许多方法,比我在这里提到的更有创意地使用 Linux 的这个功能。我很想看到你关于如何使用 "一切皆文件" 的评论。

附加信息

有关 /dev/ 目录以及你可能在那里找到的设备的更多信息,请参阅 Linux Journal 上的这篇文章。有关各个设备的更具体信息,Linux 文档项目中的这篇文章这篇文章很有帮助。

David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。自 1996 年以来,他一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是 "系统管理员 Linux 哲学" 的坚定支持者和传播者。

7 条评论

实际上,"dd" 的名称是 "convert and copy"(转换和复制),但 "cc" 已被 "clang" 占用。
除此之外,第二个命令示例有两个 "if" 参数,没有 "of" 参数。

感谢您告知我不正确的参数。我已经修复了它,现在是正确的,并且同时具有 if= 和 of= 参数。

谢谢!

回复 作者 Arthur (未验证)

一些对 linux / unix 不够熟悉的读者无疑会想,“嗯,这很棒 - 你可以把任何东西都当作文件来处理。” 我在很长一段时间里都陷入了这种思维模式。

然后有一天,我深入研究了创建“虚拟磁盘”所涉及的魔力。事实证明,没有什么特殊的成分。你只需创建一个指定大小的文件,对其进行分区并格式化。

是的,有一些小的调整(我似乎永远记不住命令)你可以对其进行调整,以防止 fdisk 和 mke2fs 过多抱怨,但即使没有它也能工作。

对于操作系统来说,一切真的 -是- 文件,而文件真的可以 -是- 任何东西。

关于虚拟磁盘:在类 unix 系统上,如果你有一个你认为其中有文件系统的文件,例如 cd/dvd/iso 镜像、软盘镜像和虚拟磁盘,如果你使用 'loop' 选项,你总是可以挂载它们。这仅仅是因为内核期望找到文件的设备。

mount /full/path/to/file.iso /path/to/mountpoint/ -o loop -t filesystem.

回复 作者 Liam (未验证)

感谢这篇有趣的文章。
我如何列出所有伪终端设备?

谢谢!我很高兴你觉得它有趣。

较新版本的 Linux 在 /dev/pts 目录中维护伪终端设备。这些设备仅在创建新的终端会话时才根据需要创建。因此,没有 pts 设备的永久列表。

要确定特定打开的终端会话的 pts 设备,请像对虚拟控制台一样使用 "who am i" 命令。

# who am i
root pts/3 2015-09-28 07:50 (:0:S.1)

在本例中,终端会话是 /dev/pts/3。

我希望这有帮助。

回复 作者 JJ

当我学习 unix 时,这句话是:一切皆文件,如果它不是文件,它仍然可以像文件一样处理。而文件是字节序列。

从编程的角度来看:文件可以打开、关闭、读取、写入,并且可以设置指针。

在设备上使用此功能有一些含义。写入键盘(/dev/kbd 是我想到的一个名称)只能设置 caps-lock、num-lock 和 scroll-lock 的指示灯。完全不可能设置指针(除了重置指示灯)。读取将只读取按键或字符序列,具体取决于 'raw' 或 'dedicated' 设备。

对于当时使用的字符屏幕,始终可以写入,设置指针有 2 个坐标,但并非总是可以读取。

磁盘只是一个文件。最有可能 /dev/sd0 是你的磁盘(当时是 /dev/hd0)。如果磁盘已分区,则 /dev/sd0a 是第一个分区。如果你有一个较小的磁盘并将其复制到较大磁盘上的文件中

一旦 linux(和许多其他类 unix 系统)开始使用 cdrom,特别是可写版本,这一切就都出错了。只有少数 unix 实现可以使用命令 `dd if=image.iso of=/dev/sr0` 刻录 cd,其中反向命令 (`dd if=/dev/sr0 of=image.iso`) 是从任何 cd 创建 iso 文件的最佳方法。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.