一直以来我一直认为 mkdir 只能创建目录。但我惊讶地发现它在某些条件下也能够创建文件。我最近开始使用 cgroups,当我在 /cgroup 下运行“mkdir”命令时,它创建了文件和目录。
[abc@master ~]$ which mkdir
/bin/mkdir
[abc@master ~]$ mkdir /cgroup/cpu/group0
[abc@master ~]$ ls /cgroup/cpu/group0/
cgroup.event_control cpu.cfs_period_us cpu.rt_period_us cpu.shares
notify_on_release cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us
cpu.stat tasks.
该命令如何mkdir
能够创建文件和目录?
我可以看到这只发生在 cgroups 下。操作系统如何区分cgroup下的mkdir和其他地方的mkdir?
我试图在网上寻找答案,但找不到任何真正有用的东西。任何相关信息将不胜感激。
答案1
这是文件系统的功能cgroup
,而不是命令的功能mkdir
。该mkdir
命令仅调用mkdir
系统调用。系统mkdir
调用调用虚拟FS内核中的层,它对命令进行一些分析,特别是通过分析目录树中挂载点的层次结构来确定要在哪个文件系统上创建目录。然后VFS层调用该文件系统的驱动程序中的代码,即cgroup
文件系统驱动程序。
文件系统驱动程序对每个文件系统操作(打开文件、读取、写入、创建目录、删除目录等)的作用取决于该文件系统驱动程序。用于磁盘存储的文件系统将修改磁盘内容以按照指示记录目录的存在。网络文件系统将通过网络发送命令。这proc 文件系统报告有关进程和内核的信息,cgroup 文件系统做了类似的事情。
cgroup 文件系统的行为在内核文档。
使用 mkdir 系统调用或 shell 命令创建新的 cgroup。 cgroup 的属性(例如其标志)可通过写入该 cgroups 目录中的相应文件来修改,如上面所列。
当 cgroup 文件系统驱动程序mkdir
在层次结构的该级别接收到命令时,它会将其解释为具有给定名称的“创建新 cgroup”。当它收到readdir
中的命令(枚举目录条目的系统调用)时/cgroup/cpu0
,它会列出该 CPU 上的 cgroup。当它收到readdir
中的命令时/cgroup/cpu0/group0
,它会报告一组固定的文件,这些文件反映存储在内存中的该 cgroup 的参数。当它收到对这些文件的read
或write
命令时,它会报告或修改相应的参数。
cgroup 的设计者选择通过文件系统完全控制它,而不是添加新的系统调用。这使得它易于使用,而无需开发大量库代码和许多实用程序。