美文网首页
一切皆文件

一切皆文件

作者: 守拙圆 | 来源:发表于2017-09-13 14:12 被阅读124次

    译者: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/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 命名很显然更适合于承担这项工作。

    “一切皆文件”的暗示

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

    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许可证

    相关文章

      网友评论

          本文标题:一切皆文件

          本文链接:https://www.haomeiwen.com/subject/polksxtx.html