这里有一个棘手的问题问你:以下哪些是文件?
- 目录
- Shell 脚本
- LibreOffice 文档
- 串行端口
- 内核数据结构
- 内核调优参数
- 硬盘驱动器
- 分区
- 逻辑卷 (LVM)
- 打印机
- 套接字
也许你不会相信,但对于 Unix 和 Linux 来说,它们都是文件。这是最令人惊叹的概念之一——它为执行许多管理任务提供了非常简单但强大的方法,否则这些任务可能极其困难或不可能。
备份主引导记录
例如,考虑一个简单的任务,即备份硬盘驱动器的主引导记录 (MBR)。我有时需要恢复或重建我的 MBR,特别是分区表。从头开始重建它非常困难。从保存的文件中恢复它很容易。Linux 配备了一个强大的 GNU 实用程序 dd,它可以执行此功能和许多其他功能。
dd 代表“磁盘转储”,但我们这些长期以来的管理员都知道它被称为“磁盘破坏者”,因为如果你不非常小心,它会完全按照你告诉它的那样做,包括破坏硬盘驱动器或分区上的所有数据。
以下命令将备份你的 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 命令实际上更适合此任务。
“一切皆文件”的含义
“一切皆文件”的含义深远,远远超出本文这样的短文所能列出的范围。你已经在前面的实验中看到了一些示例。但这是一个简短的列表,其中包含这些示例以及更多内容。
- 克隆硬盘驱动器。
- 备份分区。
- 备份主引导记录 (MBR)。
- 将 ISO 映像安装到 USB 拇指驱动器上。
- 与其他终端上的用户通信。
- 将文件打印到打印机。
- 更改 /proc 伪文件系统中某些文件的内容,以修改正在运行的内核的配置参数。
- 用随机数据或零覆盖文件、分区或整个硬盘驱动器。
- 将命令中不需要的输出重定向到 /dev/null 设备,使其永远消失。
- 等等,等等,等等。
这里有太多的可能性,任何列表都只能触及表面。我确信你已经或将会找出比我在此处提到的更具创意的方式来使用 Linux 的此功能。我很想看看你关于如何使用“一切皆文件”的评论。
附加信息
有关 /dev/ 目录以及你可能在那里找到的设备的更多信息,请参阅 Linux Journal 上的这篇文章。有关各个设备的更具体信息,这篇文章和 Linux 文档项目中的这篇文章很有帮助。
7 条评论