原文地址: https://opensource.com/life/1...
原翻译地址: http://www.tony-yin.top/2017/...
这里先提一个技巧性的问题:以下哪一个是文件?
- 目录
-
Shell
脚本 -
Office
文档 - 串行端口(
Serial ports
) - 内核数据结构
- 内核调优参数
- 硬盘驱动器
- 分区
- 逻辑卷(
LVM
) - 打印机
- 套接字(
Sockets
)
也许你不会相信,但是对于Unix
和Linux
,它们都是文件。这是最令人惊奇的概念之一——这样做使得许多管理任务可以被一些非常简单但功能强大的方法执行,否则这些任务实现起来可能非常困难甚至不可能。
备份主引导记录
举个简单任务的例子,考虑一下为你的硬盘驱动器地主引导记录(MBR
)做一个备份工作。有时候我需要恢复或重新创建我的MBR
,尤其是分区表。从头开始重新创建它是非常困难的。但是从保存好的文件中恢复出来这是非常容易的。Linux
有一个很强大的GNU
工具 --- dd
,它可以实现这个和其他很多功能。
dd
表示disk dump
的缩写,意为“磁盘转储”,但是我们很多资深管理员一直认为它是disk destroyer
的缩写,因为如果你不是很小心的话,这个工具会准确无误地执行你告诉它要做的事情,包括将硬盘上或者分区上所有的数据都破坏掉。
以下命令将会备份你的MBR
,它必须要是root
用户执行,因为非root
用户没有访问/dev
目录下硬盘驱动器设备文件的权限。BS
是Block Size
缩写,表示块大小,count
表示从源文件读取的块的个数。这个命令将在/tmp
目录创建一个myMBR.bak
的文件。这个文件的大小将为512
字节,包含了MBR
的内容,包括引导代码和分区表等。
dd if=/dev/sda of=/tmp/myMBR.bak bs=512 count=1
如果MBR
被损坏了,就需要引导到一个修复盘并执行下面的命令,这个命令本质上就是上面的反向操作。值得注意的是这条命令没有必要指定块大小和块个数这两个参数,因为dd
命令将会把备份文件简单地拷贝到硬盘的第一个扇区,并且当它执行到源文件末尾后停止。
dd if=/tmp/myMBR.bak of=/dev/sda
都是文件系统的一部分
Linux
计算机上的所有内容都可以作为文件系统空间的文件被访问。这是非常重要的,这使得我们 可以使用通用的工具访问不同的东西。
dd
命令可用于将硬盘的整个分区拷贝到一个文件或者如下所示的其他硬盘。在这里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
这个命令来确定哪一个tty
设备连接到当前控制台。
在我们实际执行这个实验之前,请看一下/dev
目录下的tty2
和tty3
设备的列表清单。
ls -l /dev tty[23]
有大量的定义过的tty
设备,但是它们其中的大多数我们并不关心,我们只关系tty2
和tty3
设备。作为设备文件,它们没有什么特殊之处;它们只是简单的字符类型的设备。我们将用这些设备做这个实验。tty2
设备连接到虚拟控制台2
,tty3
设备连接到虚拟控制台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
命令实际上更适合这个任务。
“一切皆文件”的含义
“一切都是文件”的含义是深远的,远远超过了像这篇文章所列举的那样。你们已经在前面的实验中看到过一些例子,但这里有一个包含这些和更多的简短列表。
- 克隆硬盘。
- 备份分区。
- 备份主引导记录(
MBR
)。 - 在
u
盘上安装ISO
镜像。 - 与其他终端用户沟通。
- 将文件打印到打印机。
- 更改
/proc pseudo
文件系统中的某些文件的内容,以修改运行内核的配置参数。 - 用随机数据或零覆盖文件、分区或整个硬盘驱动器。
- 将不需要的输出重定向到
/dev/null
设备,它将永远不会显示。 - 等等,等等,等等。。。
这里有太多的例子,任何一个列表都只是表面的一部分。我相信,你肯定会想出或指出许多比我这里提到更有创造性的方式,来使用Linux
的这个特性。我很乐意看到你对如何使用“一切都是文件”的评论。
附加信息
有关/dev/
目录和你可能在那里找到的设备的更多信息,请参阅Linux Journal
上的这篇文章。有关单个设备的更详细信息,Linux文档项目中的这篇文章和这篇文章会有所帮助。