当前位置: 首页 > 科技观察

如何在Linux中管理设备_0

时间:2023-03-14 15:32:31 科技观察

探索/dev目录以了解如何在Linux中直接访问设备。Linux的目录结构有很多有趣的特性,这次我将介绍一些关于/dev目录的有趣的事情。在继续阅读本文之前,我建议您阅读我之前的文章。Linux文件系统,万物皆文件,这两篇文章介绍了一些有趣的Linux文件系统概念。先检查一下-完成后我会回来。...伟大的!欢迎回来。现在我们可以继续更详细地探索/dev目录。设备文件设备文件也称为设备特定文件。设备文件用于为操作系统和用户提供它们所代表的设备的接口。所有的Linux设备文件都位于/dev目录下,该目录是根(/)文件系统的组成部分,因为这些设备文件在操作系统启动过程中必须可用。关于这些设备文件要记住的一件重要事情是它们中的大多数都不是设备驱动程序。它们更准确地描述为设备驱动程序的网关。数据从应用程序或操作系统传递到设备文件,然后再传递到设备驱动程序,设备驱动程序又将其发送到物理设备。也可以使用反向数据通道,从物理设备通过设备驱动程序,到设备文件,最后到应用程序或其他设备。让我们直观地看一下典型命令的数据流。图1:典型命令的简单数据流。在上面的图1中,显示了一个简单命令的简化数据流。从Konsole或xterm等GUI终端仿真器发出命令cat/etc/resolv.conf,它从磁盘读取resolv.conf文件,磁盘设备驱动程序处理特定于设备的功能,例如定位和读取文件。数据通过设备文件,然后从命令到设备文件,再到伪终端6的设备驱动程序,然后显示在终端会话中。当然,可以通过以下方式将cat命令的输出重定向到文件cat/etc/resolv.conf>/etc/resolv.bak,这将创建该文件的备份。在这种情况下,图1左侧的数据流量将保持不变,而右侧的数据流量将经过/dev/sda2设备文件、硬盘设备驱动程序,然后到达硬盘驱动器本身.这些设备文件使得使用标准流(STD/IO)和重定向访问Linux或Unix计算机上的任何设备变得非常容易。只需将数据流定向到设备文件,即可将数据发送到设备。设备文件类设备文件至少可以分为两种方式。第一个也是最常用的分类是基于与设备相关的数据流。例如,tty(电传打字机)和串行设备被认为是基于字符的,因为数据流一次传输和处理一个字符或字节;块型设备(如硬盘)以块为单位传输数据,通常是256字节的倍数。您可以在终端上以非root用户身份将当前工作目录(PWD)更改为/dev,并显示长目录列表。这将显示设备文件列表、它们的权限以及它们的主要和次要编号。例如,下面的设备文件只是我的Fedora24工作站上/dev目录中的几个文件。它们代表磁盘和tty设备类型。注意输出中每一行最左边的字符。b代表块类型设备,c代表字符设备。brw-rw----1rootdisk8,0Nov707:06sdabrw-rw----1rootdisk8,1Nov707:06sda1brw-rw----1rootdisk8,16Nov707:06sdbbrw-rw----1rootdisk8,17Nov707:06sdb1brw-rw----1rootdisk8,18Nov707:06sdb2crw--w----1roottty4,0Nov707:06tty0crw--w----1roottty4,1Nov707:07tty1crw--w----1roottty4,10Nov707:06tty10crw--w----1roottty4,11Nov707:06tty11识别设备文件的更详细和具体的方法是使用设备主要和次要编号。磁盘设备的主要编号为8,这将它们指定为SCSI块设备。请注意,所有PATA和SATA硬盘驱动器都由SCSI子系统管理,因为旧的ATA子系统在多年前由于代码质量差而被认为无法维护。因此,以前称为“hd[a-z]”的硬盘现在称为“sd[a-z]”。您可能可以从上面的示例中推断出磁盘驱动器次编号的模式。次要编号0、16、32等等,直到240,是整个磁盘的编号。所以primary/secondary8/16代表整个磁盘/dev/sdb,8/17是第一个分区/dev/sdb1的设备文件。数字8/34代表/dev/sdc2。上面列表中的tty设备文件编号比较简单,从tty0到tty63。Kernel.org上Linux下的分配设备文件是设备类型和主要和次要编号分配的官方注册表。它可以帮助您了解所有当前定义的设备的主要/次要编号。有趣的设备文件让我们花几分钟时间进行一些有趣的实验,以展示Linux设备文件的强大功能和灵活性。大多数Linux发行版都有1到7个虚拟控制台,可用于使用shell界面登录到本地控制台会话。可以使用键盘组合访问它,例如Ctrl-Alt-F1(控制台1)、Ctrl-Alt-F2(控制台2)。请按Ctrl-Alt-F2切换到控制台2。在某些发行版中,登录显示包括与控制台关联的tty设备,但大多数不包含。它应该是tty2,因为您在控制台2中。以非root用户身份登录。然后您可以使用whoami命令——是的,那个命令,带空格——来确定哪个tty设备连接到这个控制台。在我们实际执行此实验之前,请查看/dev中tty2和tty3的设备列表。ls-l/dev/tty[23]有大量的tty设备,但我们不关心大部分,只关心tty2和tty3设备。作为设备文件,它们没有什么特别之处。它们都只是字符型设备。我们将使用这些设备进行此实验。tty2设备连接到虚拟控制台2,tty3设备连接到虚拟控制台3。按Ctrl-Alt-F3切换到控制台3。以相同的非根用户身份再次登录。现在在控制台3输入以下命令echo"Helloworld">/dev/tty2按Ctrl-Alt-f2返回控制台2,控制台2会显示字符串"Helloworld"(不带引号),这个实验可以也可以使用GUI桌面上的终端仿真器执行。桌面上的终端会话使用/dev中的伪终端设备,例如/dev/pts/1。使用Konsole或Xterm打开两个终端会话。确定它们连接到哪些伪终端,并使用一个伪终端向另一个发送消息。现在继续实验,尝试使用cat命令在不同的终端上显示/etc/fstab文件。另一个有趣的实验是使用cat命令将文件直接打印到打印机。假设你的打印机设备是/dev/usb/lp0,你的打印机可以直接打印PDF文件,下面的命令会在你的打印机上打印test.pdf文件。cattest.pdf>/dev/usb/lp0/dev目录包含一些非常有趣的设备文件,它们是硬件的入口点,人们通常不会将其视为硬盘驱动器或显示器等设备。例如,系统内存RAM并不是通常认为的“设备”,而是/dev/mem是可以实现直接访问内存的入口点。下面的例子有一些有趣的结果。ddif=/dev/membs=2048count=100上面的dd命令提供了比简单地使用cat命令转储所有系统内存更多的控制。它提供了指定从/dev/mem读取多少数据的能力,还允许指定从内存中开始读取数据的位置。在读取一些内存时,内核响应以下错误,可以在/var/log/messages中看到。Nov1414:37:31davidkernel:usercopy:kernelmemoryexposureattemptdetectedfromffff9f78c0010000(dma-kmalloc-512)(2048bytes)这个错误意味着内核正在通过保护属于其他进程的内存来完成它的工作,这正是它应该如何工作的。因此,虽然可以使用/dev/mem来显示存储在RAM内存中的数据,但访问的大多数内存空间都是受保护的,并且可能会导致错误。只有内核内存管理器分配给运行dd命令的BASHshell的虚拟内存才能被访问而不会出错。抱歉,您不能偷看不属于您的内存,除非您发现可利用的漏洞。/dev中还有一些非常有趣的设备文件。设备文件null、zero、random和urandom不与任何物理设备关联。例如,空设备/dev/null可以用作shell命令或程序输出重定向的目标,这样它们就不会显示在终端上。我在我的BASH脚本中经常使用它来防止向用户显示可能会使他们感到困惑的输出。/dev/null设备可用于生成空字符串。使用下面显示的dd命令查看/dev/null设备文件的一些输出。#ddif=/dev/nullbs=512count=500|od-c0+0recordsin0+0recordsout0bytescopied,1.5885e-05s,0.0kB/s0000000请注意,确实没有可见的输出,因为空字符没有任何作用。注意字节数。/dev/random和/dev/urandom设备也很有趣。顾名思义,它们都产生随机输出,不仅是数字,还有字节的任意组合。/dev/urandom设备产生确定性的随机输出并且速度非常快。这意味着输出由算法确定,使用种子字符串作为起点。因此,如果知道原始种子,黑客就可以重现输出,这是可能的,尽管非常困难。可以使用命令cat/dev/urandom查看典型输出,并使用Ctrl-c退出。/dev/random设备文件产生不确定的随机输出,但它产生输出的速度更慢。此输出不是由依赖于先前数字的算法确定的,而是由击键和鼠标移动产生的。这种方法使得复制特定系列的随机数变得更加困难。使用cat命令查看/dev/random设备文件的一些输出。尝试移动鼠标以查看它如何影响输出。顾名思义,/dev/zero设备文件会产生无穷无尽的零流作为输出。请注意,这些是八进制零,而不是ASCII字符零(0)。像下面这样使用dd来查看/dev/zero设备文件中的一些输出#ddif=/dev/zerobs=512count=500|od-c0000000\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0*500+0recordsin500+0recordsout256000bytes(256kB,250KiB)copied,0.00126996s,202MB/s0764000请注意,此命令的字节数不为零。创建设备文件过去,/dev中的设备文件是在安装时创建的,导致几乎所有设备文件都在一个目录中,即使大多数设备文件从未使用过。在极少数情况下需要新的设备文件,或者在意外删除后需要重新创建设备文件,可以使用mknod程序手动创建设备文件。前提是你必须知道设备的主从设备号。CentOS和RHEL6、7以及Fedora的所有版本-至少可以追溯到Fedora15,使用更新的方法创建设备文件。所有设备文件都是在引导时创建的。这是因为udev设备管理器检测设备何时添加和删除。这可以在主机启动并运行时实现真正的动态即插即用功能。它还通过在引导过程的早期检测系统上安装的所有设备,在引导时执行相同的任务。Linux.com对udev有很好的描述。返回/dev中的文件列表并记下文件的日期和时间。所有文件都是在上次启动时创建的。您可以使用uptime或last命令验证这一点。在我上面的设备列表中,所有这些文件都是在11月7日早上7:06创建的,这是我最后一次启动系统。当然,mknod命令仍然可用,但新的MAKEDEV(是的,全部大写,在我看来这违反了使用小写命令名称的Linux原则)命令提供了一个更简单的创建设备文件的界面。在当前版本的Fedora或CentOS7中,默认不安装MAKEDEV命令;它安装在CentOS6中。您可以使用YUM或DNF安装MAKEDEV包。结论有趣的是,我已经很久没有创建设备文件的需要了。然而,最近我遇到了一个有趣的情况,我经常使用的设备文件之一没有创建,我不得不创建它。从那以后,该设备没有出现任何问题。所以丢失设备文件的情况仍然会发生,知道如何处理它可能很重要。设备文件的类型数不胜数,我可能没有涵盖您遇到的那些。下文引用的资源中提供了此信息的详细信息。我希望我已经让您对这些文件的功能和工具有了一些基本的了解,您可以在下一步中自行探索更多。资源一切皆文件,DavidBoth,Opensource.comLinux文件系统简介,DavidBoth,Opensource.com文件系统层次结构,Linux文档项目设备文件,WikipediaLinux下的分配设备,Kernel.org