[关闭]
@tony-yin 2017-12-21T15:51:48.000000Z 字数 2578 阅读 794

译:一切皆文件

Linux Filesystem


Everything is a file

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

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

备份主引导记录

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

dd表示disk dump的缩写,意为“磁盘转储”,但是我们很多资深管理员一直认为它是disk destroyer的缩写,因为如果你不是很小心的话,这个工具会准确无误地执行你告诉它要做的事情,包括将硬盘上或者分区上所有的数据都破坏掉。

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

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

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

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

都是文件系统的一部分

Linux计算机上的所有内容都可以作为文件系统空间的文件被访问。这是非常重要的,这使得我们 可以使用通用的工具访问不同的东西

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

  1. dd if=/dev/sdf2 of=/dev/sdg3
  2. dd if=/dev/sda of=/dev/sdg

此外文件系统还有其他工具可以达到此作用。比如,cat命令可以用来将任意文件的内容发送到标准输出,这包括分区和整个硬盘。然后,输出还可以被重定向到一个文件。

  1. cat /dev/sda1 > partition1.backup

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

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

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

用一个非root登录,你可以通过who am i这个命令来确定哪一个tty设备连接到当前控制台。

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

  1. ls -l /dev tty[23]

有大量的定义过的tty设备,但是它们其中的大多数我们并不关心,我们只关系tty2tty3设备。作为设备文件,它们没有什么特殊之处;它们只是简单的字符类型的设备。我们将用这些设备做这个实验。tty2设备连接到虚拟控制台2tty3设备连接到虚拟控制台3

Ctrl-Alt-F3组合键切换到控制台3,再次以同样的非root用户登录。

现在在控制台3输入以下命令:

  1. 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文件。

  1. 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文档项目中的这篇文章这篇文章会有所帮助。

原文地址:https://opensource.com/life/15/9/everything-is-a-file

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注