linux下虚拟文件系统介绍
Linux虚拟文件系统sysfs之属性文件attribute整理(一)

Linux虚拟文件系统sysfs之属性文件attribute整理(一)sysfs接口函数到建立_DEVICE_ATTR架构图:最近在弄Sensor驱动,看过一个某厂家的成品驱动,里面实现的全都是sysfs接口,hal层利用sysfs生成的接口,对Sensor进行操作。
说道sysfs接口,就不得不提到函数宏 DEVICE_ATTR原型是#define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)函数宏DEVICE_ATTR内封装的是__ATTR(_name,_mode,_show,_stroe)方法,_show表示的是读方法,_stroe表示的是写方法。
当然_ATTR不是独生子女,他还有一系列的姊妹__ATTR_RO宏只有读方法,__ATTR_NULL等等如对设备的使用 DEVICE_ATTR ,对总线使用 BUS_ATTR ,对驱动使用 DRIVER_ATTR ,对类别 (class) 使用 CLASS_ATTR, 这四个高级的宏来自于<include/linux/device.h>DEVICE_ATTR 宏声明有四个参数,分别是名称、权限位、读函数、写函数。
其中读函数和写函数是读写功能函数的函数名。
如果你完成了DEVICE_ATTR函数宏的填充,下面就需要创建接口了例如:static DEVICE_ATTR(polling, S_IRUGO | S_IWUSR, show_polling, set_polling);static struct attribute *dev_attrs[] = {&dev_attr_polling.attr,NULL,};当你想要实现的接口名字是polling的时候,需要实现结构体struct attribute *dev_attrs[]其中成员变量的名字必须是&dev_attr_polling.attr然后再封装static struct attribute_group dev_attr_grp = {.attrs = dev_attrs,};在利用sysfs_create_group(&pdev->dev.kobj, &dev_attr_grp);创建接口通过以上简单的三个步骤,就可以在adb shell 终端查看到接口了。
linux vfs实现原理 -回复

linux vfs实现原理-回复什么是Linux VFS?Linux VFS(Virtual File System,虚拟文件系统)是Linux操作系统中的核心组件之一,它提供了一个统一的接口,使得用户空间程序可以通过相同的方式来操作不同类型的文件系统。
使用Linux VFS,用户可以对文件和目录进行创建、删除、重命名、读写等基本操作,而无需关注底层文件系统的具体实现细节。
Linux VFS的实现原理:Linux VFS的实现原理主要包括以下几个方面:1. Linux VFS的核心结构:Linux VFS的核心结构是以inode(index node,索引节点)为基础的。
每个文件或目录在Linux文件系统中都对应一个唯一的inode,inode包含了文件或目录的属性信息以及指向该文件数据块的指针。
通过inode,Linux VFS可以追踪文件和目录的位置和属性,实现对其进行各种操作。
2. 文件系统抽象层:Linux VFS实现了一个文件系统抽象层,用于屏蔽不同文件系统的差异性。
通过定义一组统一的接口,将不同文件系统的具体实现细节隐藏起来,使得上层应用程序可以通过相同的方式来操作不同类型的文件系统。
文件系统抽象层提供了一系列的操作函数,如文件打开、读写、关闭等,供上层应用程序调用。
3. 虚拟文件系统和挂载:Linux VFS实现了一个虚拟文件系统(Virtual File System),通过挂载(mount)操作将各个具体文件系统与虚拟文件系统关联起来。
挂载操作可以将一个具体文件系统的根目录挂载到虚拟文件系统的某个目录上,从而使得该具体文件系统的内容在虚拟文件系统中可见。
这样,用户就可以通过虚拟文件系统的接口来操作具体文件系统中的文件和目录。
4. 命名空间(Namespace)的实现:Linux VFS通过命名空间的概念来解决不同文件系统之间的冲突和隔离问题。
每个命名空间都有自己的根目录,文件系统中的文件和目录都是相对于该根目录进行操作的。
linux proc文件夹介绍

/proc/stat 所有的CPU活动信息
/proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的
/proc/irq 中断请求设备信息
/proc/net 网卡设备信息
/proc/scsi scsi设备信息
/proc/tty tty设备信息
/proc/net/dev 显示网络适配器及统计信息
/proc/vmstat 虚拟内存统计信息
/proc/vmcore 内核panic时的内存映像
除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。
2. 子文件或子文件夹
/proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关
/proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb
/proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理
/proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关
Linux下/proc目录简介
1. /proc目录
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
LinuxCgroups详解(三)

LinuxCgroups详解(三)Cgroup⽂件系统Cgroups⽤户空间管理Cgroups⽤户空间的管理是通过cgroup⽂件系统实现的。
⽐如要创建⼀个层级:mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem这个命令就创建⼀个名为cpu_and_mem的层级,这个层级上附加了cpu,cpuset,memory三个⼦系统,并把层级挂载到了/cgroup/cpu_and_mem.创建⼀个cgroup:cd /cgroup/cpu_and_memmkdir foo通过以上两个命令,我们就在刚才创建的层级下创建了⼀个叫foo的cgroup。
你再cd foo,然后ls你会发现⼀些⽂件,这是cgroups相关⼦系统的控制⽂件,你可以读取这些控制⽂件,这些控制⽂件存储的值就是对相应的cgrouop的控制信息,你也可以写控制⽂件来更改控制信息。
在这些⽂件中,有⼀个叫tasks的⽂件,⾥⾯的包含了所有属于这个cgroup的进程的进程号。
在刚才创建的foo下,你cat tasks,应该是空的,因为此时这个cgroup⾥⾯还没有进程。
你cd /cgroup/cpu_and_mem 再cat tasks,你可以看到系统中所有进程的进程号,这是因为每创建⼀个层级的时候,系统的所有进程都会⾃动被加到该层级的根cgroup⾥⾯。
Tasks⽂件不仅可以读,还可以写,你将⼀个进程的进程号写⼊到某个cgroup⽬录下的tasks⾥⾯,你就将这个进程加⼊了相应的cgroup。
Cgroup⽂件系统的实现在讲cgroup⽂件系统的实现之前,必须简单的介绍⼀下Linux VFS。
VFS是所谓的虚拟⽂件系统转换,是⼀个内核软件层,⽤来处理与Unix标准⽂件系统的所有系统调⽤。
VFS对⽤户提供统⼀的读写等⽂件操作调⽤接⼝,当⽤户调⽤读写等函数时,内核则调⽤特定的⽂件系统实现。
Linux基础与服务管理-文件系统与磁盘管理

第四章 文件系统与磁盘管理
教师:
目录 文件系统与磁盘管理
4.1 文件系统 4.2 磁盘管理 4.3 逻辑卷管理 4.4 RAID管理 4.5 作业
第四章 文件系统与磁盘管理
➢了解文件系统的概念。
学习 目标
➢掌握常用的几种文件系统类型。
➢掌握磁盘管理的常用命令。
➢掌握磁盘逻辑卷的管理。
挂载示意图
4.2 磁盘管理
手动挂载
Mount命令的作用就是将一个设备(通常是存储设备)挂载到一 个已存在的目录上。访问这个目录就是访问该存储设备。
格式:mount [-t 文件系统类型] 设备文件名 挂载点 常用选项:
-t vsftype:指定要挂载的设备上的文件系统类型; -r: readonly,只读挂载; -w: read and write, 读写挂载; -a:自动挂载所有支持自动挂载的设备;(定义在了/etc/fstab 文件中,且挂载选项中有“自动挂载”功能)。
4.2 磁盘管理
1
2
分区信息各
3
字段的含义
4
5
6
7
设备:分区的设备文件名称。
Boot:是否是引导分区。是,则带有“*” 标识 Start: 该分区在硬盘中的起始位置( 柱面数)。
End:该分区在硬盘中的结束位置( 柱面数)。 Blocks:分区的大小。 Id:分区类型的ID标记号,对于ext4分区 为83,LVM分共为8e。 System:分区类型。“Linux”代表ext4 文件系统,“Linux LVM”代表逻辑卷。
/etc/fstab称为文件系统数据表(File Sysem Table),文件中的内容显示 系统已存在的挂载信息,如下图所示。
linux vfs实现原理

linux vfs实现原理(原创版)目录1.虚拟文件系统(VFS)的概念与作用2.VFS 的原理与实现3.VFS 在 Linux 中的应用4.VFS 的未来发展趋势正文虚拟文件系统(VFS,Virtual Filesystem)是 Linux 中一种重要的文件系统技术。
VFS 可以为系统中的各种文件系统提供统一的访问接口,使得不同的文件系统在操作系统中的表现更加一致。
在 VFS 的实现过程中,它采用了一种虚拟化的技术,将实际存在的文件系统抽象成一种可以在操作系统中统一管理的形式。
VFS 的原理与实现主要基于 Linux 内核中的文件系统驱动。
在Linux 内核中,文件系统驱动负责实现对各种文件系统的支持。
VFS 作为文件系统驱动的一部分,主要负责将用户的文件系统请求转换为具体的文件系统操作。
这个过程中,VFS 会将用户请求中的文件路径转换为实际文件系统的路径,然后通过文件系统驱动执行相应的文件系统操作。
在 Linux 中,VFS 的应用十分广泛。
除了支持多种文件系统之外,VFS 还可以支持块设备、管道和 socket 等其他类型的设备。
这使得Linux 系统在处理不同类型的设备时,可以采用一致的方式进行管理。
另外,VFS 还可以实现文件系统的挂载和卸载,方便用户对文件系统进行管理和维护。
随着计算机技术的不断发展,VFS 在未来也将面临一些新的挑战。
例如,随着文件系统越来越大,如何高效地管理大量的文件和目录将成为VFS 需要解决的问题。
此外,随着云计算和虚拟化技术的发展,VFS 还需要支持更多的虚拟化功能,以满足用户对文件系统的多样化需求。
总之,虚拟文件系统(VFS)是 Linux 中一种重要的文件系统技术,它为系统中的各种文件系统提供了统一的访问接口。
VFS 的实现原理主要基于 Linux 内核中的文件系统驱动,并且在 Linux 中有着广泛的应用。
proc 文件系统

该函数将创建一个目录,父目录为parent。
proc文件系统的编程接口
删除节点(文件或者目录)remove_proc_entry()
void remove_proc_entry ( const char *name, struct proc_dir_entry *parent)
该函数将删除一个proc节点(按文件名删除)。
proc文件系统的编程接口
以上五个创建节点的函数在内核中的实现流程:
通过proc_create为结构申请空间,并进行一些初始化工 作。 proc_register则进一步填写结构中的域。并完成注册工作
删除节点的函数在内核中的实现流程:
则是先调用clear_bit和proc_kill_inodes,注销inode结构 ,如果引用数为0,则调用free_proc_entry释放结构对应 的空间;否则置一个删除标志,不释放空间
proc文件系统的编程接口
创建设备文件proc_mknod()
struct proc_dir_entry *proc_mknod( const char *name, mode_t mode, struct proc_dir_entry *paren建一个名字为name的设 备文件,文件类型和权限为mode,设备号为rdev 。
操作系统 课程设计
proc 文件系统
proc
proc 文件系统是 Linux 中的特殊文件系统,提供 中的特殊文件系统, 给用户一个可以了解内核内部工作过程的可读窗 口,在运行时访问内核内部数据结构、改变内核 在运行时访问内核内部数据结构、 设置的机制。 设置的机制。
保存系统当前工作的特殊数据,但并不存在于任何物 理设备中; 对其进行读写时,才根据系统中的相关信息即时生成 ;或映射到系统中的变量或数据结构; proc 被称为‘伪文件系统’; 其挂接目录点固定为/proc; ‘man proc’ 进行了详细说明。
linux文件系统的分类

linux文件系统的分类一、引言Linux作为一个开源的操作系统,其文件系统是其核心部分之一。
文件系统是用于组织、存储和访问文件和目录的方法和数据结构。
Linux文件系统的分类是指不同的文件系统类型,可以根据其特点和用途进行分类。
本文将介绍Linux文件系统的几种常见分类。
二、本地文件系统本地文件系统是指在计算机硬盘上存储数据的文件系统。
在Linux 中,常见的本地文件系统有以下几种:1. ext文件系统:ext文件系统是最常用的Linux文件系统,包括ext2、ext3和ext4。
它们具有较高的性能和稳定性,支持大容量存储和快速访问。
2. XFS文件系统:XFS文件系统是一种高性能的日志文件系统,特别适用于大型文件和大容量存储。
它支持快速的数据恢复和高效的文件管理。
3. Btrfs文件系统:Btrfs文件系统是一个新的高级文件系统,具有快速的数据恢复和高效的快照功能。
它支持数据压缩、数据校验和RAID等先进功能。
4. JFS文件系统:JFS文件系统是一个高性能的日志文件系统,具有快速的文件访问和高效的空间管理。
它适用于大容量存储和大型文件。
三、网络文件系统网络文件系统是指通过网络访问远程文件系统的方法。
在Linux中,常见的网络文件系统有以下几种:1. NFS文件系统:NFS是一种标准的网络文件系统协议,用于在不同的计算机之间共享文件和目录。
它允许用户在本地计算机上访问远程服务器上的文件。
2. CIFS文件系统:CIFS是一种用于在Windows和Linux之间共享文件的协议。
它允许Linux系统挂载Windows共享目录,使用户可以在Linux上访问Windows文件。
3. AFS文件系统:AFS是一种分布式文件系统,用于在广域网上共享文件和目录。
它提供高性能和可扩展性,适用于大规模的网络环境。
四、虚拟文件系统虚拟文件系统是指用于访问不同文件系统的统一接口。
在Linux中,常见的虚拟文件系统有以下几种:1. proc文件系统:proc文件系统是一个特殊的文件系统,用于访问内核和进程信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
super block里有一个字段是用来记录一组的函式,这个字段的型别是super_operations。
这个结构在Kernel 2.2.1里包含了11个函式指针。
这些指针是要让VFS来呼叫的。
因此,这是VFS和档案系统之间的一个接口,经由这层接口,super block可以控制档案系统底下的档案或目录。
struct super_operations *s_op;在super_block结构里,s_op就是用来记录这一组的函式。
这组函式必须由写档案系统的人来提供。
底下我们就来看看super_operations 里各个函式应该要提供什么样的功能。
struct super_operations {void (*read_inode) (struct inode *);void (*write_inode) (struct inode *);void (*put_inode) (struct inode *);void (*delete_inode) (struct inode *);int (*notify_change) (struct dentry *,struct iattr *);void (*put_super) (struct super_block *);void (*write_super) (struct super_block *);int (*statfs) (struct super_block *,struct statfs *,int);int (*remount_fs) (struct super_block *,int *,char *);void (*clear_inode) (struct inode *);void (*umount_begin) (struct super_block *);};不知各位有没有发现,在这11个函式里,居然没有一个函式是用来读super block的。
其实也没什么好奇怪的,因为读取super block的函式早在注册档案系统时就要给了,要不然,是谁把super block读出来。
因此,我们可以发现super_operations里只有write_super(),put_super()等等,而没有 read_super()。
以下就分别来讨论各个函式应该提供什么样的功能,如果你想自己写一个档案系统,这部分可是很重要的喔。
· write_super(sb)故名思义,这个函式主要就是用来将sb这个super block写到磁盘上的。
在正常情况下,write_super()应该要检查sb->s_dirt是否为True,只有当s_dirt为True 时才将super block写回disk里。
当然,我想这部分主要还是看各个档案系统是如何的implement,但是,记得write_super()最后应该要将 s_dirt设为0,表示这个super block不再是dirty。
还有一件事,就是write_super()应该要检查档案系统是否被mount成只读(检查sb-> s_flags&MS_RDONLY),或档案系统本身就是只读,像iso9660档案系统,在这种情况下,由于系统是只读,所以,系统设计者可以不提供write_super()或让write_super()不做事。
· put_super(sb)当档案系统被umount时,VFS就会呼叫档案系统的put_super()。
所以,put_super()要做的事就是将super block所配置的buffer释放掉。
此外,一般来讲,如果档案系统是写成module的话,通常在put_super()也会呼叫 MOD_DEC_USE_COUNT将module的reference count减一。
至于MOD_INC_USE_COUNT则是应该在read_super()时做的。
除此之外,有点要注意,有的人会认为 put_super()应该要将sb释放掉,但是,根据Kernel 2.2.1版的原始码看来,这部分的工作是由VFS来做的。
(所谓释放掉并不是呼叫kfree()将super block所占的内存释放,而是将sb->s_dev设成0而已。
VFS会自动将s_dev为0的super block视为空的,而拿来重复使用。
)· read_inode(inode)我想大家看名字就知道了,read_inode()就是去读一个inode,并将它放到传过来的inode结构里。
在VFS里,read_inode()只会被get_new_inode()呼叫,而get_new_inode()又只会被iget()呼叫,所以,事实上,当我们去看Kernel的原始码的时候,我们不会看到直接呼叫read_inode()的情形出现,通常是呼叫iget()传回所要的inode。
有的人会有疑问,read_inode() 怎么知道要读那一个inode出来呢? 很简单,在呼叫read_inode()之前,VFS会先在inode结构里填入一些资料,以让read_inode()得知要读那个inode。
在 VFS里,它会填入以下的值:inode->i_sb = sb;inode->i_dev = sb->s_dev;inode->i_ino = ino;inode->i_flags = 0;inode->i_count = 1;inode->i_state = I_LOCK;当然,在你自己写的read_inode()里是不会用到这么多资料的,会用到的大概只有i_sb,i_no这两个而已。
其实,就跟super block结构一样,inode结构也有一个字段是用来放档案系统自己认为需要的资料,这个字段通常也是在read_inode()中做的,除此之外, read_inode()最重要的一件事就是填入i_op这个字段,这个字段也是一组的函式,这组的函式是用来运作inode的。
底下这些程序代码是从 Ext2档案系统的ext2_read_inode()中取出的,它们就是用来填i_op这个字段。
else if (S_ISREG(inode->i_mode))inode->i_op = &ext2_file_inode_operations;else if (S_ISDIR(inode->i_mode))inode->i_op = &ext2_dir_inode_operations;else if (S_ISLNK(inode->i_mode))inode->i_op = &ext2_symlink_inode_operations;else if (S_ISCHR(inode->i_mode))inode->i_op = &chrdev_inode_operations;else if (S_ISBLK(inode->i_mode))inode->i_op = &blkdev_inode_operations;· write_inode(inode)write_inode()要做的事就是将inode写回disk。
· put_inode(inode)put_inode()是跟read_inode()是相对的。
基本上,呼叫一次read_inode()就应该呼叫一次put_inode()。
但是,在Kernel中,put_inode()跟read_inode()一样是不会直接被使用的。
put_inode()只有在iput()中会被呼叫,iget()根据super block以及inode number以取得inode结构,而iput()则是iget()的相反,用iget()取得的inode应该用iput()释放掉。
其实,inode 结构里有一个i_count的字段,这是用来记录这个inode的reference count,所以,当我们取得inode时,应该对i_count加1,而在释放inode时则应该将i_count减1,但是,很幸运的,iget() 和iput()已经帮我们做好这件事,我们不用在read_inode()和put_inode()中做了。
那put_node()应该做什么呢? 它不用将inode中所配置的内存释放掉,因为这件事应该要在inode的reference count等于0而hard link的个数等于0的时候做,VFS会自动帮我们呼叫适当的函式。
put_inode()所做的事是根据档案系统而有不同的需求,像在Ext2中就是将 inode的prealloc的block释放掉。
但切记,尽管呼叫put_inode()之后,inode->i_count不见得就会变成0,有可能有别的行程在使用这个inode,所以,put_inode()做的事不应该防碍别的行程对此inode的运作。
· delete_inode(inode)delete_inode()做的事当然就是将inode删除掉啰。
之前说过,当inode的reference count等于0时,VFS会开始将inode所占的内存释放掉。
但是,如果这个时候hard link的个数也是0的时候,VFS就会呼叫delete_inode()将inode()从disk上删除掉。
所以,user所提供的delete_inode()要做的事就是把disk上关于这个inode的资料以及档案系统自己本身所配置的东西删除掉。
至于释放掉inode所占的内存则交由VFS来做吧。
· clear_inode(inode)这个函式是用来将inode结构里的信息清除。
档案系统应该只清除自己加在上面的资料,其余的部分应交由VFS来做。
在Kernel里,是不会直接呼叫s_op-> clear_inode()的,VFS提供一个函式也叫clear_inode(),它会呼叫s_op->clear_inode()。
所以,如果有需要用到clear_inode()应该呼叫VFS提供的clear_inode()而不是s_op->clear_inode()。
· statfs(sb,statfs,size)这个函式是用来取得档案系统的统计资料,statfs,fstatfs,和ustat这几个系统呼叫其实都是直接呼叫statfs来将传入的 statfs结构填满,档案系统本身的统计资料本来就只有档案系统自己最清楚,所以,statfs()由super block来提供也是最为适当。