译者:penghuster
原文:Everything is a file
让我们以一个有趣的问题开始:下面哪些项是文件?
- 目录
- shell 脚本
- LibreOffice 文档
- 串行端口
- 内核数据结构
- 内核调节参数
- 硬件驱动
- 分区
- 逻辑卷(LVM)
- 打印机
- 套接字
对于 Unix 和 Linux 来说,可能你不敢相信上述一切皆为文件。这是一个了不起的概念,它为执行许多管理任务提供了简单有力的方法,否则这是极端困难甚至是不可能的。
备份主引导记录
例如,考虑备份硬盘的主引导记录(MBR)这个简单的任务。在少数情况下,我需要恢复或重建主引导记录,尤其是分区表。从损坏的记录中重建是十分困难的,而从一个存储的文件中恢复是十分容易的。Linux 为此提供了一个强有力的 GNU 工具—dd,该工具可以完成上述任务,并且提供了许多其他功能。
dd 是磁盘转储(disk dump)的缩写,但是长时间以来在系统管理员中 dd 都以 “磁盘毁灭者(disk destroyer)”著称。因为如果你不非常小心,它将准确完成你所指定的工作,包括销毁磁盘或者分区的全部数据。
下面的命令将备份主引导记录(MBR)。由于非 root 用户没有访问 /dev 目录中硬盘驱动文件的权限,故该命令必须以 root 用户执行。BS 是硬盘块大小, count 表示从源文件中读取的盘块的数目。这个命令将在 /tmp 目录创建一个 myMBR.bak 文件。该文件的大小为 512 字节,该主引导记录包括了引导程序代码和分区表。
dd if=/dev/sda of=/tmp/myMBR.bak bs=512 count=1
如果这个主引导记录(MBR)被损坏了,系统需要从一个诊断盘中进入诊断模式,并使用下面命令,本质上来说,是执行上面命令反向操作。需要注意的是,因为 dd 命令将仅仅拷贝这个备份文件到硬盘的第一个扇区,在文件达到末尾停止拷贝,故参数盘块大小和数目可以不指定(不像第一个命令中必须给定)。
dd if=/tmp/myMBR.bak of=/dev/sda
它是文件系统的一部分
Linux 上一切都是可以作为文件系统空间中一个文件来访问的。这意味着在 Linux 上可以用通用命令执行不同的功能。
按照如下所示命令,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(teletype)的终端设备,但是更多的不这样做,而直接是 tty2 关联到控制台 2,以此一一对应。
非 root 用户登录,你可以用 who am i 命令来确认当前正连接于哪个控制台。
在执行这个实验之前,让我们在 /dev 目录下看看 tty2 和 tty3.
ls -l /dev tty[23]
/dev 目录下定义有大量的 tty 设备,但是除了 tty2 和 tty3 我们将不会关注其他 tty 设备。作为设备文件,他们本省没有什么特别的,他们都仅仅是字符型设备。我们将使用这些设备进行实验,控制台
2 被附着于 tty2,控制台 3 被附着于 tty3。
按下 Ctrl-Alt-F3 切换到控制台 2,然后用同名非 root 用户登录。
现在输入如下命令在控制台 3。
echo "Hello world" > /dev/tty2
然后按下 Ctrl-Alt-F2 回到控制台 2。这个字符串 “Hello world”(没有引号)是显示于控制台 2。
在图形化操作界面中,这个实验也能够借助终端模拟器进行。在桌面操作系统中终端会话使用在 /dev 下的伪终端,例如 /dev/pts/1。打开两个终端会话用 Konsole 或 Xterm。确认会话连接的伪终端,并用其中一个发送消息到另外一个。
现在使用 cat 命令继续这个实验,从一个终端显示 /etc/fstab 文件的内容到另一终端。
另外一个有趣的实验是利用 cat 命令直接调用打印机打印一个文件。假设你的打印机设备是 /dev/usb/lp0,那么使用下面命令你的打印机将直接打印该 pdf 文件。
cat test.pdf > /dev/usb/lp0/
dd 命令也能够用调用打印机打印就绪的文件。但是,我认为 cat 命名很显然更适合于承担这项工作。
“一切皆文件”的暗示
“一切皆文件”的暗示实例是广泛的,它远远不是本文这样一篇短文所能罗列的。在前面的实验中你已经看到了一些例子,下面将罗列出一些暗示操作对象是文件的一些例子(其中包含但不止于上文实例)。
- 克隆硬件驱动
- 备份分区
- 备份主引导记录(MBR)
- 安装 ISO 镜像文件到 USB 移动设备
- 不同终端之间的通信
- 打印文件到打印机
- 改变伪文件系统 /proc 中某个文件的内容来修改正在运行中内核的参数
- 重写文件,分区,或整个硬盘用随机数或者 0
- 重定向不想输出的内容到 /dev/null 设备使该内容永远消失。
- 等等等...
本文中所涉及的仅仅是“一切皆文件”的肤浅研究。我确信你已经或者即将指出更多创造性的方法使用 Linux 的该特点,我将很高兴看到你们在评论中写出你们的发现。
额外信息
更多有关信息你可以发现。此文在 Linux Journal 中被引用。另外更多具体的关于个别设备的信息,在 Linux Documentation Project 中的文章 1 和文章 2 是值得参考的。
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)