您的位置:首页 > 其它

【文件管理】文件系统的安装和拆卸

2014-05-27 20:11 169 查看
每一个块设备上按一定格式建立起文件系统的时候,或者系统引导之初,设备上的文件和节点都还是不可访问的;也就是说,还不能按一定格式的路径名访问其中的某个特定的节点或文件;只有把它安装到计算机系统的某个文件系统中的某个结点上,才能使设备上的文件和节点成为可访问的;经过安装以后,设备上的文件系统就成为整个文件想it哦你给的一部分;一般而言,,文件系统的结构好像一颗倒立的树,不过由于可能存在着的节点的链接和符号链接,所以并不是真正意义上的书;

(1)起初时,整个系统只有一个节点,就是整个文件系统的根节点'/',这个节点在内存中,而不再任何具体的设备上;系统初始化时将一个根设备安装到‘/’上,这个设备上的文件系统就成了整个系统的原始的,基本的文件系统;此后,就可以由超级用户进程通过系统调用mount把其他的子系统安装到已存在于文件系统的空闲节点上,使整个文件系统得以扩充;当不需要使用某个子系统时,或者在关闭之前,则umount把已安装的设备逐个卸载下来;

(2)系统调用mount()将一个可访问的块设备安装到一个可访问的节点上;所谓可访问是指该节点或文件已经存在于已安装的的文件系统中,可以通过路径名访问;设备文件通常在在/dev中,每一个设备文件实际上只是一个索引节点,节点提供了设备号(主设备号(设备或驱动程序种类)和次设备号(同种设备或驱动程序的第几个))两部分构成;所以找到了某个设备的索引节点,就知道怎样读写了;如果不安装文件系统,只是原始设备,可访问的是一个线性的无结构字节流,设备上文件系统时不可访问的;

(3)在sys_mount()中,type指文件系统的类型,如ext2,iso9660等,dir_name是安装点(空闲目录节点名)的路径名,dev_name是待安装设备的路径名;flags为安装模式,如若MS_NOSUID,则整个系统的所有可执行文件的suid都失效;最后data表示安装的附加信息;首先通过getname()(遇到'\0'就停止)和copy_mount_options()(拷贝整个页面)将字符串形式或结构形式的参数值从用户空间复制到系统空间,都以一个页面为限;

(4)在do_mount()中,首先是对参数的验证,dirname不为0,并且指定的字符串的第一个字符不为0,既不是字符串;dev_name是可以为0的;如果MS_REMOUNT标志位为1,就表示所要求的只是改变一个原已安装的设备的安装方式,如原来只读改为只写;或原来的MS_NOSUID标识为0,而现在改变成了1,执行do_remount();如果标志MS_BIND,就要等待回接设备的处理,这不是一种设备而是一种机制,从系统的角度来看,它是一种设备,但实际上它提供了一条lookback到某个可访问普通文件或块设备的手段,可使用-t
bind将所安装的设备捆绑到另一个对象上的回接设备上;接着首先看当前进程是否有CAP_SYS_ADMIN的权限;

(5)在file_system_type结构体中,系统支持的每一个文件系统都有一个file_system_type,fs_flags指明了具体文件系统的一些特性;read_super各种文件系统通过这个指针读入其超级块的函数,不同文件系统的超级块也是不同的;name是文件系统的类型名,使用-t来表示,owner指所代表的文件系统类型通过可安装模块实现的;在get_fs_type()中根据具体的文件系统的类型名在内核中找对应的file_system_type(file_system_type是一个队列,通过register_filesystem()挂入这个队列,也可通过可安装模块的方式来实现,递增try_inc_mod_count计数,如果失败即file_systems队列中找不到所需要的文件系统的类型,则使用request_module()试试在已安装的文件系统中找到用来实现所需文件系统类型的可安装模块,现在file_systems队列中注册,然后再查找,如果还是失败,那么就认为linux系统并不支持所要求的文件系统类型;一般通过DECLARE_FSTYPE_DEV()是用来创建常规文件系统类型的,它们的FS_REQUIRE_DEV为1;而特殊的,虚拟的文件系统大多是直接通过DECLARE_FSTYPE()建立数据结构的,它们fs_flags是特殊的;

(6)在do_mount()中,找到了文件系统类型的数据结构后,就要寻找代表安装点的dentry数据结构了,通过path_init(),以及path_walk()中,然后要把待安装设备的超级块读进来并根据超级块的信息在内存中建立相应的super_block数据结构,但是有些虚拟的文件系统(如pipe,以及共享内存区),要由kem_mount()安装,而根本不允许由用户进程通过mount()来安装,这样的文件系统类型在其fs_flags中的FS_NOMOUNT标志位为1,虚拟的文件系统类型的设备是没有超级块的,所以只按待定的内容初始化,或者说生成一个super_block,因此对于这种文件系统类型,mount()会出错返回;对于FS_REQUIRE_DEV的,说明是正常类型,如ext2,minx等,通过get_sb_bdev读入超级块;对于有些虚拟文件系统,安装了同类型的第一个设备后,就创建了超级块super_block的数据结构,以后同类型的其他设备只需要共享这个已存在的super_block,对应的fs_flags为FS_SINGLE,使用get_sb_single(),表示整个文件系统只有一个超级块,而不行一般的文件系统类型那样在每一个具体的设备上都有一个超级块;对于其他的如FS_NOMOINT,FS_REQUIRE_DEV,以及FS_NOMOINT为0,它们的文件系统也是虚拟的,但是要用get_sb_nodev()来生成一个super_block结构;

(7)在get_sb_bdev()中,dev_name(待安装设备的路径名)是一个有效路径名,同样的通过path_init()和path_walk()来找到目标节点,即相应的dentry以及inode结构,当然找到的inode结构必须是一个块设备,其i_mode中的S_IFBLK必须是1,否则就出错了;在读这样一个inode时,读一个设备文件的inode,是调用init_special_inode()来读的,i_dev表示索引节点所在的设备号码,另一个索引节点所代表的设备的号码i_rdev;当索引节点代表着设备时,其ext2_inode的数组i_block是未用的,将i_block[0]用于设备号,而i_dev是不要说明的,因为索引节点已经在某个设备上额,可以利用这些空间来记录所代表设备的设备号;

(8)在get_sb_bdev()中,然后得到bdev和bdops,然后转到或建立待安装设备的super_block数据结构;首先还是在内存中来查找(一个super_block数据结构的队列,super_block通过s_list链入这个队列中,通过get_super()来找),在get_super()中,一般会失败,因此需从设备读入超级块并在内存中建立起该设备的super_block;因此要先打开blkdev_get();在block_device中,bdev是16位的设备号,devfs的bd_ops已经设置了,而传统的块设备需要通过get_blkfops()来根据设备的主设备号来设置这个指针,已主设备号为下标的数组中blkdevs[]保存着指向各种块设备的block_device_operations(系统初始化时将各种块设备的block_device_operations结构读入填入数组中的相应元素中),bdops为0,则表明设备有可能是通过装入模块来设置相应的指针的,因此要调用request_module()将其装入的;打开了块设备本身,需要使用check_disk_chaange()来检查介质是否已经变动;然后就要使用read_super()从设备上读入超级块并在内存中建立起super_block;先在superblocks中找到一个空闲的super_block,然后初始化以后,通过file_system_type()的函数指针read_super()(ext2_read_super),读入了超级块,就使用get_filesystem()有可能递增用来实现此种文件系统类型的可安装模块的使用者计数;

(9)在do_sys_mount()中,当使用d_mountpoint()已经检测到dentry的d_vfsmount已经非空了,那就说明已经有设备安装在上面了,使用follow_down前进到已经安装设备上的根节点,并且还用通过循环来进一步检测新的安装点上(可以吧一个设备安装在一个非空的目录下,这样原目录中内容就变成不可访问了);把一个设备安装到一个目录节点时,要用vfsmount作为连接件;

(10)mnt_mountpoint指向安装点的dentry;mount_root指向所安装设备上根目录的dentry指针;在两者之间搭起一起桥梁;dentry并没有指向vfsmount的指针,同一个安装点可以安装多个设备;mnt_clash通过它链入安装点(dentry)的d_vfsmount中,但是所安装设备上根目录是不能直接找到vfsmount,而是要通过其super_block中转;指针mnt_sb指向所安装设备超级块的super_block;反之在所安装设备的super_block并没有直接指向vfsmount,而是有个队列头s_mounts,因为设备与安装点也是一对多的关系,通过mnt_instances链入到设备s_mounts中;mnt_parent指向安装点所在设备在当初安装时的vfsmount,但根设备或其他不存在上一层vfsmount,这个指针指向本身;mnt_child链入到上一层的vfsmonts结构的mnt_mounts;这样就形成了一种安装设备安装的树型结构,这样从一个vfs_mount结构的mnt_mounts可以找到直接或间接的安装在这个设备(文件系统)的其他设备了;系统中vfsmntlist是一个总的vfs_mounts队列,vfs_mounts通过mnt_list链入到该队列;

(11)所安装设备的super_block数据结构与作为连接件的vfsmount是一对多的关系,即把同一物理设备安装到文件系统中的不同节点上,成为逻辑上相互独立的子树;可是安装点的dentry与vfs_mount结构也是一对多的,可以把多个设备安装到一个目录上;其实安装时是虚拟的,将一个设备挂接到两个不同的目录,这两个目录是不同,可安装对应的设备;具体搜索时,是要看路径名的上下问的,上一层的vfs_mount就是这样的上下文,因此在follow_down()就是这样来搜索的;安装点找到以后,就把待安装设备的super_block安装到super_block和安装点的dentry联系在一起;在add_vfsmnt中完成;

(12)在do_loopback()是一个回接设备的安装,过程类似,但是有个区别,当内核企图通过回接设备的驱动程序从该虚拟的块设备上读入记录块时,却是由回接设备的驱动程序转换到了目标驱动程序上,而回接设备的驱动程序在这个过程在中间往往是对过往的记录块进行加密和解密;这是一种间接安装,要通过回接设备;

(13)在sys_umount中,是文件系统的卸载,由于LOOKUP_FOLLOW标志位为1,不论给定的是安装点的路径名还是设备文件的路径名,path_walk()的结果都是一样的,nd.dntry指向设备文件的根目录上的dentry,而nd.mnt指向用来将该设备安装到另一个设备的某个结点上;

(14)在do_umount()中,umount_root表示所要拆卸的是否是根设备,我们在sys_umount()中调用这个参数为0,用户进程是不能通过umount()直接来卸载根设备的;用户通过umount()系统调用卸载根设备只意味着它重装成只读模式;如果vfsmount的计数mnt_count,大于2的时候说明还有其他操作过程还在使用这个数据结构,因此不能完成拆卸而是出错返回;

(15)vfsmount结构在安装文件系统时通过其队列头mnt_instacnces挂入super_block结构的s_mounts队列,通常一个块设备只安装一次,所以其super_block的队列s_mounts只含一个vfs_mounts;即mnt_instacnces中的两个指针就不相等了;但是有些情况下,同一个设备是可以多次安装的,此时其super_block结构中的s_mounts队列是包含多个vfsmount,此时s_mounts中的两个指针也就不想等了,所以remove_vfsmnt()只是将拆除一次安装中的一次,而并非将多次安装中的一次;如果只是一次安装时,在拆卸时先调用一个函数处理的开始,这种设备通过其super_operations函数跳转表内中的函数指针umount_begin;把一个设备从文件系统中拆卸下来,这就意味着从此以后这个子系统中的所有节点不再是可访问的;在dput()时,递减其技术时,减为0的时候,并不将dentry释放,要放入到dentry_unused队列中;可现在要最终卸载这个设备,则这个设备的所有dentry再也没有必要留住了;所以此时要扫描dentry_unused队列,把所有属于这个队列的dentry结构释放掉,这就是shrink_dcache_sb()要做的;

(16)在do_umount()中,执行fsync_dev(),为提高效率,或者对某个数据块的改变,都只是对它们在内存影像中映像的改变,而不一定马上就回写设备上,现在设备要卸载下来了,当然要把现在以改变的,但是尚未写回到设备的内容写回去,这就称为同步;先看sysnc_dev(),每当该改变一个super_block结构的内容时,都要将结构中s_dirty置为1,表示内容已脏,如果是一些虚拟设备,可能就没有什么超级块而言,看super_block结构中s_op是否指向一个super_operations,对于EXT2而言,就是ext2_write_super()了;对于sys_inodes(),对于凡是改变的inode都要用i_list链入到其所属的super_block的s_dirty;所以也是要同步整个队列的,这是由sync_list完成的;最后使用sync_buffers来进行数据块的同步;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: