一切皆文件

译者: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许可证

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,221评论 9 467
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,154评论 2 33
  • 最近对Linux的学习呢,有很多很多不懂,不熟悉的命令。不过印象很深刻的一句话是,Linux下,一切皆文件。虽然不...
    JOooo_阅读 3,549评论 2 2
  • 1.Linux下如何用命令查看实时日志(完整命令) tail -f 路径.log查看前多少行 tai-200f 路...
    qianyewhy阅读 2,268评论 0 11
  • 每个人都是孤独发光的星体,至亲、爱人、朋友,构成了我们的星系。星辰会陨落、轨道会迁移,或许再也见不到你。我会...
    驿云阅读 359评论 0 1