0%

Linux 伪文件系统

Procfs

procfs 被称为 “进程文件系统” 或 “伪文件系统”,它是一个控制中心,可以通过更改其中某些文件改变内核运行状态,它也是内核提空给我们的查询中心,用户可以通过它查看系统硬件及当前运行的进程信息

  • procfs 放置的数据都是在内存当中(例如:系统内核、进程、外部设备的状态及网络状态等),因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间

procfs 为 Linux 中的许多命令提供了信息,例如:lsmod 的命令和 cat /proc/modules

1
2
3
4
5
6
7
8
9
➜  ~ lsmod           
Module Size Used by
isofs 49152 1
xt_conntrack 16384 3
xt_MASQUERADE 20480 3
nf_conntrack_netlink 49152 0
nfnetlink 20480 2 nf_conntrack_netlink
xfrm_user 40960 1
xfrm_algo 16384 1 xfrm_user
1
2
3
4
5
6
7
8
➜  ~ cat /proc/modules
isofs 49152 1 - Live 0x0000000000000000
xt_conntrack 16384 3 - Live 0x0000000000000000
xt_MASQUERADE 20480 3 - Live 0x0000000000000000
nf_conntrack_netlink 49152 0 - Live 0x0000000000000000
nfnetlink 20480 2 nf_conntrack_netlink, Live 0x0000000000000000
xfrm_user 40960 1 - Live 0x0000000000000000
xfrm_algo 16384 1 xfrm_user, Live 0x0000000000000000

procfs 通过 VFS 把内核的抽象文件作为常规文件映射到一个目录树中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
➜  ~ ls /proc                
1 127 146 20 230 262 33 44 96 locks
10 128 147 2004 231 263 338 45 963 mdstat
100 1281 148 2010 232 264 339 46 964 meminfo
101 129 1485 2037 233 265 34 465 965 misc
102 13 1491 2046 234 266 3438 5 97 modules
103 130 15 2061 235 267 3453 568 98 mounts
1038 1308 150 2073 236 268 3462 613 99 mpt
105 131 151 2081 237 269 3505 7 acpi mtrr
107 1310 152 2089 238 27 3510 755 bootconfig net
108 132 153 2092 239 270 36 756 buddyinfo pagetypeinfo
11 1322 1538 2094 2393 271 37 772 bus partitions
110 133 154 21 2397 272 379 778 cgroups pressure
111 1337 158 2104 24 273 38 793 cmdline schedstat
112 134 16 2108 240 274 3827 794 consoles scsi
113 135 1640 2109 2408 275 39 797 cpuinfo self
114 136 166 2110 241 276 3914 801 crypto slabinfo
115 1360 1671 2113 242 277 3929 803 devices softirqs
116 1362 169 2117 243 278 3932 805 diskstats stat
117 137 17 2124 244 279 3996 806 dma swaps
1171 1377 170 2125 245 28 3997 812 driver sys
1177 138 171 2128 246 280 4 813 dynamic_debug sysrq-trigger
118 1383 173 2133 247 281 40 816 execdomains sysvipc
119 139 178 2138 248 282 4036 820 fb thread-self
12 1390 18 2145 249 283 408 825 filesystems timer_list
120 1397 19 2150 25 284 409 827 fs tty
121 14 1905 2156 250 285 41 829 interrupts uptime
1212 140 1910 2157 251 286 412 830 iomem version
1214 141 1934 2161 252 2867 413 835 ioports version_signature
122 1410 1941 2182 253 287 414 841 irq vmallocinfo
1225 1419 1954 2193 254 288 415 861 kallsyms vmstat
123 142 1974 2197 255 3 416 874 kcore zoneinfo
1233 1422 1978 22 256 30 417 88 keys
1236 1423 1979 226 257 307 418 884 key-users
1238 1426 1981 2264 258 308 419 9 kmsg
124 143 1986 227 259 31 42 913 kpagecgroup
1240 145 1995 2274 26 315 420 932 kpagecount
125 1455 1999 229 260 316 423 942 kpageflags
126 1459 2 2294 261 32 43 95 loadavg

Sysfs

sysfs 包括系统所有的硬件信息以及内核模块等信息(为设备驱动服务)

Linux-2.6-kernel 中增加了一个引人注目的新特性:统一设备模型 device model

  • 统一设备模型的最初动机是为了实现智能的电源管理,linux 内核为了实现智能电源管理,需要建立表示系统中所有设备拓扑关系的树结构
  • 这样在关闭电源时,可以从树的节点开始关闭

统一设备模型的核心部分就是设备驱动模型 kobject,它就是 device model 拓扑树中的各个节点

而 sysfs 为我们提供 kobject 对象层次结构的视图,帮助用户可以以一个简单文件系统的方式来观察各种设备的拓扑结构:

1
2
➜  / ls sys 
block bus class dev devices firmware fs hypervisor kernel module power
  • 在 sysfs 中的每个目录项都是一个 kobject
  • 相比于 procfs,使用 sysfs 导出内核数据的方式更为统一,因此 sysfs 替代了 procfs 中有关设备驱动的部分(新设计的内核机制应该尽量使用 sysfs 机制)

Devfs

devfs 被称为设备文件系统

devfs 将所有系统中的设备以动态文件系统命名空间呈现,devfs 也可以通过内核设备驱动直接管理这些命名空间和接口,以此来提供智能的设备管理(包括设备入口注册/注销)

  • sysfs 是以面向对象的方式提供了 device model 的可视化结构
  • devfs 是为了给设备提供进行 IO 操作的接口

因此,当我们需要操控某个设备的时候,需要使用对应的 API 来进行注册/注销:

  • 注册符号设备:
1
2
int register_chrdev_region(dev_t first, unsigned int count, char *name);
void unregister_chrdev_region(dev_t first, unsigned int count);
  • 注册块设备:
1
2
int register_blkdev(unsigned int, const char *);
void unregister_blkdev(unsigned int, const char *);
  • 然后就会在 /dev 目录中生成一个对应的文件