linux设备

一 介绍

在linux中,一切皆为文件,比如设备、网络、硬盘或其分区等等,都在表示 为文件。设备被表示为设备文件(Device Files)(也被称为device node),是一个与设备驱动(device driver) 交互的接口。在设备驱动被加载进内存后,如果有对应设备的插入或拔出,linux内核会发送事件uevent信息给用户空间中的守护进程(daemonudev,udev收到事件后还会将它发送给其他进程。udev为了维护/dev目录,会动态创建或删除device node。udev的功能依赖于sysfs文件系统,使得udev能够在用户空间中获得更多关于设备的信息。

设备文件分为块设备和字符设备,他们的区别在于读写方式的不同。设备文件也可以对应虚拟设备,只要有对应的驱动程序。貌似管道文件也是设备文件?

二 /dev与/sys

设备文件都被存于/dev下,为了通过对设备文件操作直接作用到设备中,/dev会被挂载到专门的文件系统devtmpfs中(不要与tmpfs混淆)。

ll /dev会显示所有的设备文件,权限前的第一个字符表示文件类型,b表示块设备,c表示字符设备等等。日期前的两个数字分别表示主和次设备号,相似的设备通常拥有相同的主设备号,如sda3和sdb1。通过主次设备号用于标识设备。

/dev下的设备文件是用于操作设备的接口,但它不提供更多的信息,如设备的属性等。这些信息由/sys目录下对应的文件提供,如/dev/vda对应/sys/devices/pci0000:00/0000:00:05.0/virtio2/block/vda,这是一个目录,目录下的各种文件包含设备的详细信息,如dev文件含有主次设备号。

那么如何从/dev中找到/sys下对应的目录呢?

  • 因为设备文件是通过udev创建的,因此可以通过它的管理工具udevadm来获得设备文件详细的信息。
    udevadm info --query=all --name=/dev/vda
    
  • /sys/block目录下会含有系统中可用的块设备目录的符号链接。同样,/sys/dev含有主次设备号与对应目录的关系。

/sys目录下含有一些关于内核子系统、硬件设备等信息,这些信息由虚拟文件(即访问时临时计算出数据的文件)提供,需要挂载到专门的文件系统sysfs中。

三 命名约定

系统加入设备后,udev给设备命名的规范:

  • SCSI driver, also used by libATA (modern PATA/SATA driver), USB, IEEE 1394, etc.即使底层使用的设备和驱动不一样,但是这些设备最顶层的驱动还是scsi。然而真正的SCSI设备已经被淘汰了,但SCSI协议由于它的适用性被保留了下来。
    • sd: mass-storage driver
      • sda: first registered device
        • sda4: last partition on this disk (example)
        • sda6: second logical drive in the extended partition (example)
      • sdb, sdc, etc.: second, third, etc. registered devices
    • ses: Enclosure driver
    • sg: generic SCSI layer
    • sr: “ROM” driver (data-oriented optical disc drives; scd is just a secondary alias)
    • st: magnetic tape driver
  • hd: (“classic”) IDE driver (previously used for ATA hard disk drive, ATAPI optical disc drives, etc.)老式PATA硬盘使用的文件名,已经很少见了,因此不展开讲解。
  • fd: (platform) floppy disks(软盘)
  • 终端tty*,pts/*:都代表终端(terminals),不过tty表示本地终端,或是真实硬件或是内核模拟出来的;pts表示伪终端,通过用户空间程序模拟出来的。
  • 串行端口终端ttyS*:相当于windows上的串口。
  • 并行端口lp*
  • 等等

四 terminal、console、shell

terminal(终端)和console(控制台)都是字符设备,功能上并没有什么区别,都是与你的显示器和键盘交互的。启动linux但没有启动xwindow的屏幕就是console,而进入xwindow后打开的terminal就是terminal,通过ssh连接打开的终端也是terminal。

shell不是一种设备,而是程序,一个与操作系统服务交互的用户接口。因此shell分两种:使用命令行接口(command-line interface)的Text(CLI) shell,和图形用户接口(graphical user interface)的Graphical shell。CLI shell提供命令解析的功能,通过命令与系统交互,gui shell提供图形化的操作与系统交互。

不要以为gui程序只能在gui shell中运行,几乎只要有diplay server和它的客户端client就能运行,即使在CLI shell下。参考:ssh 第四章或尝试运行该命令:xinit /usr/bin/firefox

4.1 与设备文件的关系

console在很多linux发行版中被实现为7个virtual console,分别用设备文件tty1tty2tty7表示。一般桌面环境运行在第7个virtual console,用tty7表示。通过ctrl+alt+F*切换。

terminal则被表示为除了tty1tty7之外的tty*pts/*pts/*是伪终端的设备文件,GUI shell打开的终端和ssh连接打开的终端都是伪终端。剩下的tty*是干什么用的呢?连接什么终端呢?我不知道。。

特殊的终端设备文件:

  • tty:是当前程序的控制终端的引用,可以是tty*ttyS*pts/*等等。通过ps可以看到程序对应的具体终端。对于控制终端,参考零碎知识3.8小节
  • tty0:是当前(或前台)virtual console的引用,可以是tty1...tty7
  • console:系统控制台(system console),默认指向tty0。这也是为什么开机后会输出很多系统信息的原因。

五 特殊设备文件

除了3.3.1中的特殊终端文件外,还有一些特殊的伪终端文件:

  • /dev/null – accepts and discards all input; produces no output (always returns an end-of-file indication on a read)
  • /dev/zero – accepts and discards all input; produces a continuous stream of NUL (zero value) bytes
  • /dev/full – produces a continuous stream of NUL (zero value) bytes when read, and returns a “disk full” message when written to
  • /dev/random and /dev/urandom – they produce a variable-length stream of pseudo-random numbers.

六 例子

命令/etc/resolv.conf的一个可能的数据流程如下:

hard disk–>SATA driver–>SCSI driver–>/dev/sda1(分区设备文件)–>cat /etc/resolv.conf(命令或进程)–>/dev/pts/1(终端设备文件)–>终端设备驱动–>终端


命令cat /etc/resolv.conf > /etc/resolv.bak的一个可能的数据流程如下:

hard disk–>SATA driver–>SCSI driver–>/dev/sda1(分区设备文件)–>cat /etc/resolv.conf(命令或进程)–>/dev/sda1(分区设备文件)–>SCSI driver–>SATA driver–>hard disk

可以看出,重定向的原理就是重定向到了不同的设备文件。


打开virtual console1和virtual console2(ctrl+alt+F2),在console2上输入echo "hello world" > /dev/tty1,然后会发现console1出现了hello world

七 相关命令

7.1 dd

dd从文件或stdin读取数据,并写入数据到文件或stdout,这个过程中可能会做一些编码转换。

  • if=file:输入文件,默认stdin
  • of=file:输出文件,默认stdout
  • bs=size:一次读入和写入的字节数,默认512。可带有单位,如b(512),K(1024),M(10242),G(10243)
  • ibs=size,obs=size:分别是一次性读入或写入的字节数。如果相同,则使用bs
  • count=num:拷贝输入块的次数,默认一致拷贝直到文件尾。
  • skip=num:跳过输入的num个块,才开始读。
  • conv=CONV:按照CONV对数据进行转换

例子:

  • 备份MBR
    dd if=/dev/sda of=/tmp/myMBR.bak bs=512 count=1
    
  • 制作光盘镜像
    dd if=/dev/sda of=~/disk1.img conv=noerror,sync
    

其中,noerror表示读取出错后继续;sync表示,如果读取字节不够,填充NULL(即数值0)。一般情况下sync无用,只有配合noerror在读取失败时才会填充。这样保证及时镜像文件部分损坏,但可用。

7.2 mknod

当设备文件意外丢失或想要创建命名的管道文件时,可以使用mknod创建。但需要事先知道主次设备号。如:

 mknod /dev/sda1 b 8 2

b为块状设备,主次设备号分别为8,2。

7.3 udevadm

udevadm用于管理守护进程udev,因此可以查出设备文件的全部信息:

udevadm info --query=all –-name=/dev/sda

7.4 lsscsi

列出所有的scsi设备

参考

Managing devices in Linux
Device file wiki
Udev wiki
终端,Shell,“tty”和控制台(console)有什么区别?
Why are there so many /dev/tty in Linux?
Linux系统dev/目录下的tty
What is the difference between Terminal, Console, Shell, and Command Line?
What is the exact difference between a ‘terminal’, a ‘shell’, a ‘tty’ and a ‘console’?
shell wiki
virtual console wiki

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值