在使用 shellscript 扫描文件系统以查找更改时,我忘记排除/dev
,因此core
也进行了测试。奇怪的是,无论我以哪种方式测试它,它对于类型都不一致:
$ if [ -f ./core ] ; then echo file ; else echo something else ; fi
file
$ ls -al core
lrwxrwxrwx 1 root root 11 Sep 29 15:40 core -> /proc/kcore
$ file core
core: symbolic link to `/proc/kcore'
$ if test -f core ; then echo file ; else echo something else ; fi
file
$ if /usr/bin/test -f core ; then echo file ; else echo something else ; fi
file
$ if test -h core ; then echo link ; else echo something else ; fi
link
$ if /usr/bin/test -h core ; then echo link ; else echo something else ; fi
link
这里发生了什么?
答案1
首先,/dev/core
是到常规文件的符号链接/proc/kcore
。所以 和test -h /dev/core
都是test -f /dev/core
正确的:-h
因为它是一个符号链接,-f
因为符号链接的目标是一个常规文件。
现在来说说/proc/kcore
是什么。这是一个常规文件,但与您习惯的常规文件有点不同。每当程序对文件执行某些操作(打开、读取、写入等)时,都是通过系统调用,即通过在内核中执行一些代码。调用的代码取决于文件系统类型。对于磁盘文件系统(例如 ext4 或 FAT),此代码计算出组成文件的数据片段的排列方式,并调用底层存储层(例如磁盘驱动程序)来读取和写入这些数据片段。对于网络文件系统(例如 NFS 或 Samba),此代码将网络数据包发送到文件服务器。对于/proc
,这是安装点procfs 文件系统,此代码显示或修改内核数据结构。
大多数文件/proc
报告有关系统的信息,例如/proc/mounts
报告挂载点列表,/proc/modules
报告加载的模块列表,/proc/123/stat
报告有关PID 123的进程的状态信息等。该文件/proc/kcore
报告系统物理内存的内容,采用适合调试器的格式,因此从中读取字节/proc/kcore
本质上是读取物理内存的内容。
procfs 文件系统上的文件可以被认为是“神奇的”,有点像设备文件是“魔法”。设备文件和文件系统,例如 procfs 和系统文件系统以不同的方式获得它们的魔力:设备文件可以在任何(好吧,大多数)文件系统上创建,它们很神奇,因为它们的目录条目显示“字符设备”的“块设备”而不是“常规文件”;/proc
和下的文件/sys
很神奇,因为它们所在的整个文件系统都很神奇。
除此之外,正如我们在上面看到的,没有涉及任何实际的魔法。它只是内核代码,无论该代码计算块布局并从磁盘读取它们还是格式化内核数据结构。
答案2
该/dev/core
文件是 的链接/proc/kcore
。 kcore 文件是一个虚拟文件,仅作为进程文件系统。它包含内核可以分配的内存。在 64 位系统上,大小/proc/kcore
甚至为 128TB,因为这是 64 位系统可以分配的绝对限制。该文件的格式类似于ELF二进制。请参阅(并注意文件大小):
$ file /proc/kcore
/proc/kcore: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, [...]
$ ls -lh /proc/kcore
-r-------- 1 root root 128T Sep 29 20:01 /proc/kcore
和ctime
等于mtime
我调用该命令的时间ls
,因为该文件仅作为文件存在,而不是之前和之后;就在那一刻。
因此它看起来像一个常规文件,但是,与 proc 文件系统中的所有其他文件一样,它只是虚拟的。当您请求时,内核将可分配内存抽象为文件。这意味着它只是可用的当一个read()
或一个stat()
系统调用请求它(当您对文件stat()
使用实用程序时发生)。test
然后内核拦截或捕获系统调用并给出特定值,而不是真实的内容,不存在。如果您/proc/kcore
作为文件读取(cat
例如),内核会进行内存读取。
proc 文件系统中的每个文件后面都有一个处理函数,它负责应作为文件内容返回的内容。
由于/proc/kcore
是 ELF 格式,因此内容旨在由调试器检查,例如gdb
.