一切皆文件

译者:penghuster
原文:Everything is a file

Image by : opensource.com

让我们以一个有趣的问题开始:下面哪些项是文件?

  • 目录
  • 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/sdg3dd 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 命名很显然更适合于承担这项工作。

“一切皆文件”的暗示

“一切皆文件”的暗示实例是广泛的,它远远不是本文这样一篇短文所能罗列的。在前面的实验中你已经看到了一些例子,下面将罗列出一些暗示操作对象是文件的一些例子(其中包含但不止于上文实例)。

  1. 克隆硬件驱动
  2. 备份分区
  3. 备份主引导记录(MBR)
  4. 安装 ISO 镜像文件到 USB 移动设备
  5. 不同终端之间的通信
  6. 打印文件到打印机
  7. 改变伪文件系统 /proc 中某个文件的内容来修改正在运行中内核的参数
  8. 重写文件,分区,或整个硬盘用随机数或者 0
  9. 重定向不想输出的内容到 /dev/null 设备使该内容永远消失。
  10. 等等等...

本文中所涉及的仅仅是“一切皆文件”的肤浅研究。我确信你已经或者即将指出更多创造性的方法使用 Linux 的该特点,我将很高兴看到你们在评论中写出你们的发现。

额外信息

更多有关信息你可以发现。此文在 Linux Journal 中被引用。另外更多具体的关于个别设备的信息,在 Linux Documentation Project 中的文章 1文章 2 是值得参考的。


版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值