Linux内核 特殊文件系统

特殊文件系统

1.proc文件系统

  • /proc是一个位于内存中的伪文件系统(in-memory pseudo-file system)。该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,如系统内存、磁盘io、设备挂载信息和硬件配置信息等。

  • proc目录是一个控制中心,用户可以通过更改其中某些文件来改变内核的运行状态。

  • proc目录也是内核提供给我们的查询中心,我们可以通过这些文件查看有关系统硬件及当前正在运行进程的信息。

  • proc文件系统提供了内核空间用户空间之间的通信方法。

1)proc各目录说明
  • /proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关
  • /proc/cmdline 启动时传递给kernel的参数信息
  • /proc/cpuinfo cpu的信息
  • /proc/crypto 内核使用的所有已安装的加密密码及细节
  • /proc/devices 已经加载的设备
  • /proc/dma 已注册使用的ISA DMA频道列表
  • /proc/execdomains linux内核当前支持的execution domains
  • /proc/fb 帧缓冲设备列表,包括数量和控制它的驱动
  • /proc/filesystems 内核当前支持的文件系统类型
  • /proc/interrupts x86架构中的每个IRQ中断数
  • /proc/iomem 每个物理设备当前在系统内存中的映射
  • /proc/ioports 一个设备的输入输出所使用的注册端口范围
  • /proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb
  • /proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理
  • /proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关
  • /proc/locks 内核锁住的文件列表
  • /proc/mdstat 多硬盘,RAID配置信息(md=multiple disks)
  • /proc/meminfo RAM使用的相关信息
  • /proc/misc 其他的主要设备(设备号为10)上注册的驱动
  • /proc/modules 所有加载到内核的模块列表
  • /proc/mounts 系统中使用的所有挂载
  • /proc/mtrr 系统使用的Memory Type Range Registers (MTRRs)
  • /proc/partitions 分区中的块分配信息
  • /proc/pci 系统中的PCI设备列表
  • /proc/slabinfo 系统中所有活动的 slab 缓存信息
  • /proc/stat 所有的CPU活动信息
  • /proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的
  • /proc/uptime 系统已经运行了多久
  • /proc/swaps 交换空间的使用情况
  • /proc/version Linux内核版本和gcc版本
  • /proc/bus 系统总线(Bus)信息,例如pci/usb等
  • /proc/driver 驱动信息
  • /proc/fs 文件系统信息
  • /proc/ide ide设备信息
  • /proc/irq 中断请求设备信息
  • /proc/net 网卡设备信息
  • /proc/scsi scsi设备信息
  • /proc/tty tty设备信息
  • /proc/net/dev 显示网络适配器及统计信息
  • /proc/vmstat 虚拟内存统计信息
  • /proc/vmcore 内核panic时的内存映像
  • /proc/diskstats 取得磁盘信息
  • /proc/schedstat kernel调度器的统计信息
  • /proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用
2)进程目录/proc/[pid]说明
  • /proc/N pid为N的进程信息
  • /proc/N/cmdline 进程启动命令
  • /proc/N/cwd 链接到进程当前工作目录
  • /proc/N/environ 进程环境变量列表
  • /proc/N/exe 链接到进程的执行命令文件
  • /proc/N/fd 包含进程相关的所有的文件描述符
  • /proc/N/maps 与进程相关的内存映射信息
  • /proc/N/mem 指代进程持有的内存,不可读
  • /proc/N/root 链接到进程的根目录
  • /proc/N/stat 进程的状态
  • /proc/N/statm 进程使用的内存的状态
  • /proc/N/status 进程状态信息,比stat/statm更具可读性
  • /proc/self 链接到当前正在运行的进程

2.sysfs伪文件系统

  • Sysfs文件系统是一个类似于proc文件系统的基于内存的虚拟的文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。

  • 挂载到 /sys 目录下,在用户态可以通过对sys文件系统的访问,来看内核态的一些驱动或者设备等。

  • 手动挂载sysfs

    mount -t sysfs sysfs /sys 
    
1)/sys目录说明
2)sysfs与proc的关系
  • 在 sysfs 下的很多 kobject 下都有 uevent 属性,用于内核与 udev (自动设备发现程序)之间的一个通信接口;
  • netlink 协议套接字是udev 与内核的通信接口。
  • uevent 属性文件一般都是可写的,可以向 udevd (udev 后台程序)发送一条 netlink 消息,让它再重新一遍相关的 udev 规则文件,从而让用户空间的udev动态创建或删除设备文件;

3.devfs设备文件系统

  • 存在于内核空间,在linux2.6之后被抛弃,内核空间的devfs被用户空间的udev取代。
  • 特点:
    • 设备文件被打开时才加载驱动
    • 由内核管理设备文件名称

4.udev设备管理器

udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfshotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware时。

1)运行方式
  • 动态管理:udev是在用户空间运行的守护进程,它会监听内核的uevent事件(通过netlink socket),根据事件和配置的udev规则,添加或者删除设备文件。
  • 自定义命名规则:通过 Linux 默认的规则文件,udev 在 /dev/ 里为所有的设备定义了内核设备名称,比如 /dev/sda、/dev/hda、/dev/fd等等。由于 udev 是在用户空间 (user space) 运行,Linux 用户可以通过自定义的规则文件,灵活地产生标识性强的设备文件名,如/dev/ttyGPS。
  • 设定设备的权限和所有者 / 组:udev 可以按一定的条件来设置设备文件的权限和设备文件所有者 / 组。
image
2)udev组成

udev系统可以分为三个部分:

  • libudev函数库,可以用来获取设备的信息。

  • udevd守护进程,处于用户空间,用于管理虚拟/dev

  • 管理命令udevadm,用来诊断出错情况。

    $ udevadm info /dev/ttyTHS1
    P: /devices/70006040.serial/tty/ttyTHS1
    N: ttyTHS1
    E: DEVNAME=/dev/ttyTHS1
    E: DEVPATH=/devices/70006040.serial/tty/ttyTHS1
    E: ID_MM_CANDIDATE=1
    E: MAJOR=238
    E: MINOR=1
    E: SUBSYSTEM=tty
    E: TAGS=:systemd:
    E: USEC_INITIALIZED=4078860
    E: net.ifnames=0
    
  • 查看udev设备详细信息

$ udevadm info -a -p /sys/class/net/eth1

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/1003000.pcie/pci0000:00/0000:00:02.0/0000:01:00.0/net/eth1':
    KERNEL=="eth1"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{addr_assign_type}=="0"
    ATTR{addr_len}=="6"
    ATTR{address}=="00:04:4b:e5:da:f3"
    ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
    ATTR{carrier}=="1"
    ATTR{carrier_changes}=="2"
    ATTR{dev_id}=="0x0"
    ATTR{dev_port}=="0"
    ATTR{dormant}=="0"
    ATTR{duplex}=="full"
    ATTR{flags}=="0x1003"
    ATTR{gro_flush_timeout}=="0"
    ATTR{ifalias}==""
    ATTR{ifindex}=="4"
    ATTR{iflink}=="4"
    ATTR{link_mode}=="0"
    ATTR{mtu}=="1500"
    ATTR{netdev_group}=="0"
    ATTR{operstate}=="up"
    ATTR{proto_down}=="0"
    ATTR{speed}=="1000"
    ATTR{tx_queue_len}=="1000"
    ATTR{type}=="1"

  looking at parent device '/devices/1003000.pcie/pci0000:00/0000:00:02.0/0000:01:00.0':
    KERNELS=="0000:01:00.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="r8168"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x020000"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{device}=="0x8168"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="1"
    ATTRS{irq}=="405"
    ATTRS{local_cpulist}=="0-3"
    ATTRS{local_cpus}=="f"
    ATTRS{msi_bus}=="1"
    ATTRS{subsystem_device}=="0x8168"
    ATTRS{subsystem_vendor}=="0x10ec"
    ATTRS{vendor}=="0x10ec"

  looking at parent device '/devices/1003000.pcie/pci0000:00/0000:00:02.0':
    KERNELS=="0000:00:02.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="pcieport"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x060400"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{device}=="0x0faf"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="1"
    ATTRS{irq}=="83"
    ATTRS{local_cpulist}=="0-3"
    ATTRS{local_cpus}=="f"
    ATTRS{msi_bus}=="1"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{subsystem_vendor}=="0x10de"
    ATTRS{vendor}=="0x10de"

  looking at parent device '/devices/1003000.pcie/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

  looking at parent device '/devices/1003000.pcie':
    KERNELS=="1003000.pcie"
    SUBSYSTEMS=="platform"
    DRIVERS=="tegra-pcie"
    ATTRS{driver_override}=="(null)"

3)udev规则和文件
  • udev配置文件是/etc/udev/udev.conf,指定udev规则存储的目录,默认为udev_rules=“/etc/udev/rules.d”。

  • 目录中存储一系列以.rules结束的规则文件,每个文件处理一系列规则来帮助udev分配名字给设备文件并保证内核可以识别此名字。

    root@michael-desktop:/etc/udev/rules.d# ls -l
    total 32
    -rw-r--r-- 1 root root  497 Jul 17 08:19 90-alsa-asound-tegra.rules
    -rw-r--r-- 1 root root  175 Jul 17 08:19 91-xorg-conf-tegra.rules
    -rw-r--r-- 1 root root  711 Jul 17 08:19 92-hdmi-audio-tegra.rules
    -rw-r--r-- 1 root root  208 Jul 17 08:19 99-nv-l4t-usb-device-mode.rules
    -rw-r--r-- 1 root root  634 Jul 17 08:19 99-nv-wifibt.rules
    -rw-r--r-- 1 root root 1425 Jul 17 08:19 99-tegra-devices.rules
    -rw-r--r-- 1 root root  130 Jul 17 08:19 99-tegra-mmc-ra.rules
    -rw-r--r-- 1 root root  157 Aug 14 14:10 ttyUSB.rules
    
  • 规则文件由系列键-值对组成,匹配键和赋值键操作符解释如下

    操作符     匹配或赋值                         解释
    ----------------------------------------
         ==            匹配              相等比较
         !=            匹配              不等比较
         =             赋值              分配一个特定的值给该键,他可以覆盖之前的赋值.
         +=            赋值              追加特定的值给已经存在的键
         :=            赋值              分配一个特定的值给该键,后面的规则不可能覆盖它.
    
  • 常用键说明

    键                含义
    ----------------------------------------
    ACTION               事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 ).
    KERNEL               在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备
    DEVPATH              内核设备路径,比如/devices/*
    SUBSYSTEM            设备子系统名字,例如:sda 的子系统为 block.
    BUS                  总线的名字,比如IDE,USB
    DRIVER               设备驱动的名字,比如ide-cdrom
    ID                   独立于内核名字的设备名字
    SYSFS{ value}        sysfs属性值,他可以表示任意
    ATTRS                  匹配设备的sysfs属性,或任何父设备的sysfs属性
    ENV{ key}            环境变量,可以表示任意
    PROGRAM              可执行的外部程序,如果程序返回0值,该键则认为为真(true)
    RESULT               上一个PROGRAM调用返回的标准输出.
    NAME                 根据这个规则创建的设备文件的文件名.
    (注意:仅仅第一行的NAME描述是有效的,后面的均忽略.如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键.)
    SYMLINK              为 /dev/下的设备文件产生符号链接.由于 udev 只能为某个设备产生一个设备文件,
    (所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接.)
    OWNER                设备文件的属组
    GROUP                设备文件所在的组.
    MODE                 设备文件的权限,采用8进制
    RUN                  为设备而执行的程序列表
    LABEL                在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务)
    GOTO                 跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO
    IMPORT{ type}        导入一个文件或者一个程序执行后而生成的规则集到当前文件
    WAIT_FOR_SYSFS       等待一个特定的设备文件的创建.主要是用作时序和依赖问题.
    PTIONS               特定的选项:
    last_rule            对这类设备终端规则执行;
    ignore_device        忽略当前规则;
    ignore_remove        忽略接下来的并移走请求.
    all_partitions       为所有的磁盘分区创建设备文件.
    
  • 特殊的值和替换值

    例如:my_root_disk, my_printer.同时也可以引用下面的替换操作符:
    ----------------------------------------
    $kernel,       %k:       设备的内核设备名称,例如:sda、cdrom.
    $number,       %n:       设备的内核号码,例如:sda3 的内核号码是 3.
    $devpath,      %p:       设备的 devpath路径.
    $id,           %b:       设备在 devpath里的 ID 号.
    $sysfs{file},  %s{file}: 设备的 sysfs里 file 的内容.其实就是设备的属性值.
    $env{key},     %E{key}:   一个环境变量的值.
    $major,        %M:        设备的 major 号.
    $minor,       %m:        设备的 minor 号.
    $result,       %c:        PROGRAM 返回的结果
    $parent,       %P:        父设备的设备文件名.
    $root,         %r:        udev_root的值,默认是 /dev/.
    $tempnode,     %N:        临时设备名.
    %%:           符号 % 本身.
    $$:           符号 $ 本身.
    
4)编写udev规则步骤

编写udev规则

  • 获取设备KERNEL相关的信息

    # udevinfo -a -p /sys/block/sda
    
      looking at device '/block/sda':
        KERNEL=="sda"
        SUBSYSTEM=="block"
        ATTR{stat}=="  128535     2246  2788977   766188    73998   317300  3132216  5735004        0   516516  6503316"
        ATTR{size}=="234441648"
        ATTR{removable}=="0"
        ATTR{range}=="16"
        ATTR{dev}=="8:0"
    
      looking at parent device '/devices/pci0000:00/0000:00:07.0/host0/target0:0:0/0:0:0:0':
        KERNELS=="0:0:0:0"
        SUBSYSTEMS=="scsi"
        DRIVERS=="sd"
        ATTRS{ioerr_cnt}=="0x0"
        ATTRS{iodone_cnt}=="0x31737"
        ATTRS{iorequest_cnt}=="0x31737"
        ATTRS{iocounterbits}=="32"
        ATTRS{timeout}=="30"
        ATTRS{state}=="running"
        ATTRS{rev}=="3.42"
        ATTRS{model}=="ST3120827AS     "
        ATTRS{vendor}=="ATA     "
        ATTRS{scsi_level}=="6"
        ATTRS{type}=="0"
        ATTRS{queue_type}=="none"
        ATTRS{queue_depth}=="1"
        ATTRS{device_blocked}=="0"
    
      looking at parent device '/devices/pci0000:00/0000:00:07.0':
        KERNELS=="0000:00:07.0"
        SUBSYSTEMS=="pci"
        DRIVERS=="sata_nv"
        ATTRS{vendor}=="0x10de"
        ATTRS{device}=="0x037f"
    
  • 如对两个usb转ttl设备生成新的符号链接

    $ cat ttyUSB.rules 
    ATTRS{serial}=="A5XK3RJT", MODE:="0777", GROUP:="dialout", SYMLINK+="ttyGPS"
    ATTRS{serial}=="AH072FQW", MODE:="0777", GROUP:="dialout", SYMLINK+="ttyHandle"
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,561评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,218评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,162评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,470评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,550评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,806评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,951评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,712评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,166评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,510评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,643评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,306评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,930评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,745评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,983评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,351评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,509评论 2 348

推荐阅读更多精彩内容