一切皆文件

Everything is a file

原文地址: https://opensource.com/life/1...
原翻译地址: http://www.tony-yin.top/2017/...

这里先提一个技巧性的问题:如下哪个是文件?html

  • 目录
  • Shell脚本
  • Office文档
  • 串行端口(Serial ports
  • 内核数据结构
  • 内核调优参数
  • 硬盘驱动器
  • 分区
  • 逻辑卷(LVM
  • 打印机
  • 套接字(Sockets

也许你不会相信,可是对于UnixLinux,它们都是文件。这是最使人惊奇的概念之一——这样作使得许多管理任务能够被一些很是简单但功能强大的方法执行,不然这些任务实现起来可能很是困难甚至不可能。linux

备份主引导记录

举个简单任务的例子,考虑一下为你的硬盘驱动器地主引导记录(MBR)作一个备份工做。有时候我须要恢复或从新建立个人MBR,尤为是分区表。从头开始从新建立它是很是困难的。可是从保存好的文件中恢复出来这是很是容易的。Linux有一个很强大的GNU工具 --- dd,它能够实现这个和其余不少功能。shell

dd表示disk dump的缩写,意为“磁盘转储”,可是咱们不少资深管理员一直认为它是disk destroyer的缩写,由于若是你不是很当心的话,这个工具会准确无误地执行你告诉它要作的事情,包括将硬盘上或者分区上全部的数据都破坏掉。数据结构

如下命令将会备份你的MBR,它必需要是root用户执行,由于非root用户没有访问/dev目录下硬盘驱动器设备文件的权限。BSBlock Size缩写,表示块大小,count表示从源文件读取的块的个数。这个命令将在/tmp目录建立一个myMBR.bak的文件。这个文件的大小将为512字节,包含了MBR的内容,包括引导代码和分区表等。工具

dd if=/dev/sda of=/tmp/myMBR.bak bs=512 count=1

若是MBR被损坏了,就须要引导到一个修复盘并执行下面的命令,这个命令本质上就是上面的反向操做。值得注意的是这条命令没有必要指定块大小和块个数这两个参数,由于dd命令将会把备份文件简单地拷贝到硬盘的第一个扇区,而且当它执行到源文件末尾后中止。spa

dd if=/tmp/myMBR.bak of=/dev/sda

都是文件系统的一部分

Linux计算机上的全部内容均可以做为文件系统空间的文件被访问。这是很是重要的,这使得咱们 能够使用通用的工具访问不一样的东西.net

dd命令可用于将硬盘的整个分区拷贝到一个文件或者以下所示的其余硬盘。在这里dd命令再次将数据拷贝到输入设备的末尾并中止。请确保输出设备的容量要大于输入设备。翻译

dd if=/dev/sdf2 of=/dev/sdg3

dd if=/dev/sda of=/dev/sdg

此外文件系统还有其余工具能够达到此做用。好比,cat命令能够用来将任意文件的内容发送到标准输出,这包括分区和整个硬盘。而后,输出还能够被重定向到一个文件。code

cat /dev/sda1 > partition1.backup

可是,cat命令没有dd命令的控制功能。例如,不能指定从源设备或者源文件读取的数据量。htm

下面是一个有趣的实验,它将正面一切皆文件的事实。大多数Linux发行版都有多个虚拟控制台,其中17能够用来登陆到一个带有shell接口的本地控制台会话。能够经过一些组合键访问它们,好比Ctrl-Alt-F1是控制台1Ctrl-Alt-F2是控制台2,以此类推。

Ctrl-Alt-F2切换到控制台2。在一些发行版中,登陆信息包括与此控制台相关的ttyTeletype)设备,可是也有不少发行版不包括。页面应该显示tty2的信息,由于你当前在控制台2

用一个非root登陆,你能够经过who am i这个命令来肯定哪个tty设备链接到当前控制台。

在咱们实际执行这个实验以前,请看一下/dev目录下的tty2tty3设备的列表清单。

ls -l /dev tty[23]

有大量的定义过的tty设备,可是它们其中的大多数咱们并不关心,咱们只关系tty2tty3设备。做为设备文件,它们没有什么特殊之处;它们只是简单的字符类型的设备。咱们将用这些设备作这个实验。tty2设备链接到虚拟控制台2tty3设备链接到虚拟控制台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命令实际上更适合这个任务。

“一切皆文件”的含义

“一切都是文件”的含义是深远的,远远超过了像这篇文章所列举的那样。大家已经在前面的实验中看到过一些例子,但这里有一个包含这些和更多的简短列表。

  1. 克隆硬盘。
  2. 备份分区。
  3. 备份主引导记录(MBR)。
  4. u盘上安装ISO镜像。
  5. 与其余终端用户沟通。
  6. 将文件打印到打印机。
  7. 更改/proc pseudo文件系统中的某些文件的内容,以修改运行内核的配置参数。
  8. 用随机数据或零覆盖文件、分区或整个硬盘驱动器。
  9. 将不须要的输出重定向到/dev/null设备,它将永远不会显示。
  10. 等等,等等,等等。。。

这里有太多的例子,任何一个列表都只是表面的一部分。我相信,你确定会想出或指出许多比我这里提到更有创造性的方式,来使用Linux的这个特性。我很乐意看到你对如何使用“一切都是文件”的评论。

附加信息

有关/dev/目录和你可能在那里找到的设备的更多信息,请参阅Linux Journal上的这篇文章。有关单个设备的更详细信息,Linux文档项目中的这篇文章这篇文章会有所帮助。

相关文章
相关标签/搜索