6.6实例研究: Linux的文件管理 6.6.1 Linux文件管理概述 Linux支持多种不同类型的文件系统,包 括EXT、EXT2、 MINIX、 UMSDOS、NCP、 ISo9660、HPFS、 MSDOS、NTFS、XIA VFAT、PROC、NFS、SMB、SYSV AFFS以及UFS等
6.6实例研究:Linux的文件管理 6.6.1 Linux文件管理概述 Linux支持多种不同类型的文件系统,包 括EXT、EXT2、MINIX、UMSDOS、NCP、 ISO9660、HPFS、MSDOS、NTFS、XIA、 VFAT、PROC、NFS、SMB、SYSV、 AFFS以及UFS等
r Linux文件系统概念 了演变: rMinⅸ文件系统(64Mb) rEXT( Extended file system)文件系统(2Gb) Xa文件系统(2Gb) rEXT2( Second Extended file system)文件系 统(4Tb)
Linux文件系统概念 演变: Minix文件系统(64Mb) EXT(Extended file system)文件系统(2Gb) Xia文件系统(2Gb) EXT2(Second Extended file system)文件系 统(4Tb)
几个术语 了1i节点( inode) 了文件描述信息包括:文件类型、访问权限、拥 有者、时间、尺寸、块指针 2目录 了树型目录结构,这是一种存储文件目录项的文 件。含义同Unx 3链接 了多个文件名指向同 inode,实现文件共享 了4设备文件
几个术语: 1 i-节点(inode) 文件描述信息包括:文件类型、访问权限、拥 有者、时间、尺寸、块指针。 2 目录 树型目录结构,这是一种存储文件目录项的文 件。含义同Unix。 3 链接 多个文件名指向同一inode,实现文件共享。 4 设备文件
6.6.2 Linux文件系统的管理 Linux中,一个文件系统在物理数据组织上一般 划分成引导块、超级块、 inode区以及数据区 了引导块位于文件系统开头,通常为一个扇区,存 放引导程序、用于读入并启动操作系统。 了超级块由于记录文件系统的管理信息,根据特定 文件系统的需要超级块中存储的信息不同 r inode区用于登记每个文件的目录项,第一个 node是该文件系统的根节点。数据区则存放文 件数据或一些管理数据
6.6.2 Linux文件系统的管理 Linux中,一个文件系统在物理数据组织上一般 划分成引导块、超级块、inode区以及数据区。 引导块位于文件系统开头,通常为一个扇区,存 放引导程序、用于读入并启动操作系统。 超级块由于记录文件系统的管理信息,根据特定 文件系统的需要超级块中存储的信息不同。 inode区用于登记每个文件的目录项,第一个 inode是该文件系统的根节点。数据区则存放文 件数据或一些管理数据
Linux操作系统究竞支持几种不 同类型的文件系统 了通过文件系统类型注册链表来描述的 向系统注册文件系统类型有两种途径, 是在编译操作系统内核时确定,并在 系统初始化时通过函数调用向注册表登 另一种是把文件系统当作一个模块,通过 kerneld或 insmod命令在装入该文件系统 模块时向注册表登记它的类型
Linux操作系统究竟支持几种不 同类型的文件系统 通过文件系统类型注册链表来描述的。 向系统注册文件系统类型有两种途径, 一是在编译操作系统内核时确定,并在 系统初始化时通过函数调用向注册表登 记; 另一种是把文件系统当作一个模块,通过 kerneld或insmod命令在装入该文件系统 模块时向注册表登记它的类型
文件系统注册表的数据结构 r file_ systems指向文件系统注册表,每一个文 件系统类型在注册表中有一个登记项,记录了 该文件系统类型的名name、支持该文件系统 的设备 requires_dev、读出该文件系统在外存 超级块的函数 read_super、以及注册表的链表 指针next。 了函数 rregister_filesystem用于注册一个文件系统 类型,函数 unregister_ filesystem用于从注册 表中卸装一个文件系统类型
文件系统注册表的数据结构 file_systems指向文件系统注册表,每一个文 件系统类型在注册表中有一个登记项,记录了 该文件系统类型的名name、支持该文件系统 的设备requires_dev、读出该文件系统在外存 超级块的函数read_super、以及注册表的链表 指针next。 函数register_filesystem用于注册一个文件系统 类型,函数unregister_filesystem用于从注册 表中卸装一个文件系统类型
f e system type file system t file syster requires dev equires dev requires dev
file_system_type name requires_dev read_super next file_systems file_system_type name requires_dev read_super next file_system_type name requires_dev read_super next
r Linux操作系统不通过设备标识访问某个 具体文件系统,而是通过 mount命令把 它安装到整个文件系统树的某一个目录 节点,该文件系统的所有文件和子目录 就是该目录的文件和子目录,直到用 umount命令显式的撤卸该文件系统
Linux操作系统不通过设备标识访问某个 具体文件系统,而是通过mount命令把 它安装到整个文件系统树的某一个目录 节点,该文件系统的所有文件和子目录 就是该目录的文件和子目录,直到用 umount命令显式的撤卸该文件系统
了当 Linux自举时,首先装入根文件系统, 然后根据/etc/ fstab中的登记项使用 mount命令自动逐个安装文件系统。此 外用户也可以显式地通过 mount和 umount命令安装和卸装文件系统
当Linux自举时,首先装入根文件系统, 然后根据 /etc/fstab 中 的 登 记 项 使 用 mount命令自动逐个安装文件系统。此 外 用 户 也 可 以 显 式 地 通 过 mount 和 umount命令安装和卸装文件系统
smnttail%链表尾的单项链表中增加或删除一个 amount节参 了文件系统的注册和注销操作时,将在以 vfsmntlist为链表头 具体数据结构如下 r static struct vfsmount vfsmntlist =(static struct vfsmount NULL, r static struct vfsmount * vfsmnttail=(static struct vfsmount *)NUL/*尾* r static struct vfsmount *mru-vfsmnt =(static struct vfsmount * )NULL;/ 米当 前 r struct vfsmount t kdey t mnt dev;/*文件系统所在的主次设备号* cha* mnt devname;/*文件系统所在的设备名,*/ char* mnt dirname;/*安装目录名*/ unsigned int mnt_ flags;/*设备标志,如ro* struct semaphore mnt_ sen;/*设备有关的信号量*/ struct super_ block* mnt sb;/*指向超级块* struct file* mnt_ quotas[MAXQUOTAS];/*指向配额文件的指针 r time-t mnt_jexpIMAXQUOTAS]: / expiretime for inodes * time t mnt bexp[MAXQUOTAS]: / expiretime for blocks k struct vfsmount* mnt next;/*后继指针*
文件系统的注册和注销操作时,将在以vfsmntlist为链表头和 vfsmnttail为链表尾的单项链表中增加或删除一个vfsmount节点, 具体数据结构如下: static struct vfsmount vfsmntlist = (static struct vfsmount )NULL; static struct vfsmount *vfsmnttail = (static struct vfsmount *)NULL; /* 尾 */ static struct vfsmount *mru_vfsmnt = (static struct vfsmount *)NULL; /*当前*/ struct vfsmount { kdev_t mnt_dev; /* 文件系统所在的主次设备号 */ char* mnt_devname;/*文件系统所在的设备名, */ char* mnt_dirname;/* 安装目录名 */ unsigned int mnt_flags;/* 设备标志,如ro */ struct semaphore mnt_sem;/* 设备有关的信号量 */ struct super_block* mnt_sb;/* 指向超级块 */ struct file* mnt_quotas[MAXQUOTAS];/*指向配额文件的指针 time_t mnt_iexp[MAXQUOTAS]; /* expiretime for inodes */ time_t mnt_bexp[MAXQUOTAS]; /* expiretime for blocks */ struct vfsmount* mnt_next; /* 后继指针 */ };