1 / 30

Linux File System

Linux File System. 文件系统 VFS VFS 的作用 基于 VFS 的文件访问 VFS 重要数据结构 文件系统的注册与安装 ext2、ext3 文件系统 文件操作 proc 文件系统 CRAMFS 文件系统. 各种各样的文件系统. Windows FAT16,FAT32, NTFS 传统 UNIX: UFS (Unix File System) BSD 文件系统 FFS(Fast File System) Proc File System: 只存在于内存中 Linux File System

gretel
Télécharger la présentation

Linux File System

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Linux File System • 文件系统 • VFS VFS的作用 基于VFS的文件访问 VFS重要数据结构 • 文件系统的注册与安装 • ext2、ext3文件系统 • 文件操作 • proc文件系统 • CRAMFS文件系统

  2. 各种各样的文件系统 • Windows FAT16,FAT32, NTFS • 传统UNIX: UFS (Unix File System) • BSD文件系统FFS(Fast File System) • Proc File System:只存在于内存中 • Linux File System • ext2 ( is first introduced in kernel 2.0.x ) • reiserfs ( is first introduced in kernel 2.2.x ) • ext3 ( is first introduced in kernel 2.4.x ,default in RedHat now) • xfs (from SGI ) • Jfs (from IBM ) • 嵌入式小型文件系统 • CRAMFS • JFFS2

  3. linux文件系统目录布局 To comply with FSSTND(File System STaNDard): / - first of mount point in linux /etc - keep linux default configuration /boot - keep important linux booting files(can be a separate file system) /bin - Essential command binaries for both root and ord. users /sbin - Essential system binaries for administrator /dev - keep all device files /usr - keep all user binary and X library /home - keep user home directory /proc - is pseudo file system for tracking running process and state of linux system /var - keeping mail, log file and printer spooling /lib - contain shared library that is required by system program /tmp - contain system temporary file /opt - Add-on application software packages

  4. UNIX文件系统文件类型 • Directory--> catalogue of file name • Normal file--> format of data • source file • text file • Symbolic link--> a pointer to another file • Special file--> use for device controller in kernel • Named pipe--> communication channel which can be used by serveralprocesses(may be irrelevant) in order to exchange data

  5. inode /root/link a b 硬链接(Hard Link) [root@localhost link]# ls -l total 1 -rw-r--r-- 1 root root 667 Oct 15 13:39 a [root@localhost link]# ln a b [root@localhost link]# ls -l total 2 -rw-r--r-- 2 root root 667 Oct 15 13:39 a -rw-r--r-- 2 root root 667 Oct 15 13:39 b [root@localhost link]# rm a rm: remove `a'? y [root@localhost link]# ls -l total 1 -rw-r--r-- 1 root root 667 Oct 15 13:39 b

  6. inode /root/link a b 符号链接(Symbolic link) [root@localhost symlink]# ls -l total 1 -rw-r--r-- 1 root root 667 Oct 15 13:39 a [root@localhost symlink]# ln -s a b [root@localhost symlink]# ls -l total 1 -rw-r--r-- 1 root root 667 Oct 15 13:39 a lrwxrwxrwx 1 root root 1 Oct 15 14:20 b -> a [root@localhost yy]# rm a rm: remove `a'? y [root@localhost symlink]# ls -l total 0 lrwxrwxrwx 1 root root 1 Oct 15 14:20 b -> a [root@localhost symlink]# cat b cat: b: No such file or directory

  7. VFS(Virtual FileSystem)的作用 User Programs System Call Interface Inter-process communication Virtual File System Process Control Subsystem Ext2 Ext3 ... Scheduler Memory management Buffer Cache Device Driver Hardware

  8. 基于VFS的文件访问

  9. VFS的目录项(dentry) VFS的dentry定义在include/linux/dcache.h中 为了加快文件的查找,每一个曾被读取的目录或文件都可能在目录高速缓存(directory cache)中有一个dentry项;dentry描述了目录与文件的关系树。

  10. VFS的目录项(dentry) struct dentry { /*include/linux/dcache.h*/ atomic_t d_count; unsigned int d_flags; struct inode * d_inode; /* Where the name belongs to - NULL is negative */ struct dentry * d_parent; /* parent directory */ struct list_head d_hash; /* lookup hash list */ struct list_head d_lru; /* d_count = 0 LRU list */ struct list_head d_child; /* child of parent list */ struct list_head d_subdirs; /* our children */ struct list_head d_alias; /* inode alias list */ int d_mounted; struct qstr d_name; unsigned long d_time; /* used by d_revalidate */ struct dentry_operations *d_op; struct super_block * d_sb; /* The root of the dentry tree */ unsigned long d_vfs_flags; void * d_fsdata; /* fs-specific data */ unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ };

  11. 打开文件表 • linux系统运行期间维护一张以struct file (在include/linux/fs.h 中)作为节点的双向链表(系统打开文件表)。表头由first_file给出。 struct file *first_file = NULL; /* fs/file_table.c */ • 对于每个进程,struct task_struct中的files指向的files_struct结构中有一个fd指针数组,即维护一张进程打开文件表。数组元素即是指向系统打开文件表中某一节点的指针。

  12. VFS重要数据结构 • files_struct (在sched.h); • file (在fs.h); • dentry (在 dcache.h); • superblock(在 fs.h); • inode (在 fs.h)

  13. 文件系统类型 static struct file_system_type *file_systems = (struct file_system_type *) NULL; struct file_system_type { struct super_block *(*read_super)(); /* 读出该文件系统在外存的super_block */ const char *name; /* 文件系统的类型名 */ int requires_dev; /* 支持文件系统的设备 */ struct file_system_type * next; /* 文件系统类型链表的后续指针 */ };

  14. 文件系统注册与注销 • 文件系统类型的注册和注销函数 int register_filesystem(struct file_system_type * fs) int unregister_filesystem(struct file_system_type * fs) file_systems file_system_type file_system_type file_system_type

  15. 文件系统的安装(mount) / / bin dev etc usr bin lib man Rootfilesystem /usr filesystem / bin dev etc usr usr bin lib man Complete hierarchy after mounting /usr

  16. root 下挂文件系统 安装点vfsmount i_sb mnt_mountpoint mnt_root d_mounted!=0 文件系统的安装(mount) 安装点dentry

  17. 已安装文件系统的描述 static LIST_HEAD(vfsmntlist); struct vfsmount { struct list_head mnt_hash; struct vfsmount *mnt_parent; /* fs we are mounted on */ struct dentry *mnt_mountpoint; /* dentry of mountpoint */ struct dentry *mnt_root; /* root of the mounted tree */ struct super_block *mnt_sb; /* pointer to superblock */ struct list_head mnt_mounts; /* list of children, anchored here */ struct list_head mnt_child; /* and going through their mnt_child */ atomic_t mnt_count; int mnt_flags; char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ struct list_head mnt_list; };

  18. mnt_sb mnt_sb s_type 已安装文件系统的描述 file_system_type vfsmount super_block vfsmntlist file_systems

  19. 路径查找 • 系统调用open、mkdir、rename、stat等要查找路径 • open_namei() • path_init() • path_walk() • link_path_walk(); • 返回时,struct nameidata中的dentry和mnt标识找到的文件或目录 struct nameidata { /*include/linux/fs.h*/ struct dentry *dentry; /*找到的dentry指针*/ struct vfsmount *mnt; /*找到的文件所在文件系统*/ struct qstr last; unsigned int flags; int last_type;};

  20. ext2文件系统 • 支持UNIX所有标准的文件系统特征,包括正文、目录、设备文件和连接文件等,这使得它很容易被UNIX程序员接受。事实上,ext2的绝大多数的数据结构和系统调用与经典的UNIX一致 • 能够管理海量存储介质。支持多达4TB的数据,即一个分区的容量最大可达4TB • 支持长文件名,最多可达255个字符,并且可扩展到1012个字符 • 允许通过文件属性改变内核的行为;目录下的文件继承目录的属性 • 支持文件系统数据“即时同步”特性,即内存中的数据一旦改变,立即更新硬盘上的数据使之一致 • 实现了“快速连接”(fast symbolic links)的方式,使得连接文件只需要存放inode的空间 • 允许用户定制文件系统的数据单元(block)的大小,可以是 1024、2048 或 4096 个字节,使之适应不同环境的要求 • 使用专用文件记录文件系统的状态和错误信息,供下一次系统启动时决定是否需要检查文件系统

  21. ext2体系结构

  22. 内存中的ext2 inode • ext2_inode_info (在include/linux/ext2_fs_i.h) struct ext2_inode_info { __u32 i_data[15]; __u32 i_flags; __u32 i_faddr; __u8 i_frag_no; __u8 i_frag_size; __u16 i_osync; __u32 i_file_acl; __u32 i_dir_acl; __u32 i_dtime; __u32 i_block_group; __u32 i_next_alloc_block; __u32 i_next_alloc_goal; __u32 i_prealloc_block; __u32 i_prealloc_count; __u32 i_dir_start_lookup; int i_new_inode:1; /* Is a freshly allocated inode */ };

  23. 外存中的ext2 inode • struct ext2_inode(在include/linux/ext2_fs.h) • 内、外存inode的读写: ext2_read_inode() ext2_update_inode()

  24. Ext2_inode

  25. 文件读写 • read()和write() int read(int fd, void *buf,size_t nbytes); int write(int fd, void *buf,size_t nbytes); • read()调用generic_file_read(),再调用do_generic_file_read()读入内核缓冲区,然后调用file_read_actor()将读入内容传入用户空间。最后调用update_atime()修改inode • write()调用generic_file_write()写数据入缓冲区,如果是同步写(O_SYNC置位),则调用generic_osync_inode()将缓冲区中数据写入磁盘文件。 • 直接读写(read、write时将O_DIRECT置位) generic_file_read()先读page cache generic_file_write()先写入缓冲区 generic_file_direct_IO()直接读写(self-caching)

  26. ext3文件系统 • 日志文件系统(journaling file system) • 利用数据库的日志技术(log, checkpoint) • 3种日志方式:journal, ordered, writeback • 日志记录在/.journal中(隐藏的文件) • Kjournald—5s • Reiserfs

  27. proc文件系统 • /proc:一个虚拟文件系统,只存在于内存中,通过它可以查询、设置系统的运行情况及各种系统参数。 • 系统中的很多应用都依赖于proc文件系统,如命令lsmod等同于 cat /proc/modules。 • 文件的大小为0; • 很多文件名体现了内核的相应参数,可以通过这个文件名修改参数值。如#echo 2048 > /proc/sys/shmmni,修改共享内存段的限制。 • /proc下的“数字目录”指代了相应pid的进程,如目录“1”下的内容就是1#进程的各种信息。

  28. CRAMFS • 由Linus Torvalds 参与开发的小型只读压缩文件系统 • Inode、文件名称和目录信息不压缩 • 单个文件最大为16MB • 数据压缩存放 • 适合不需要写、且体积较大的文件系统,如/lib,/opt等 • 与JFFS2、Cloop相比,读取速度快 • 压缩率可以超过50% • 读取文件时,每次读取4k内容,解压缩到cache中 • Linux内核已提供了对cramfs的支持,只要编译时选中 • 创建文件系统(生成image文件) • #mkcramfs /lib lib.cramfs • #mkcramfs /usr usr.cramfs • 挂载文件系统 • #mount –t cramfs lib.cramfs /lib –o loop • #mount –t cramfs usr.cramfs /usr –o loop

  29. CRAMFS Super_block:76bytes, cramfs_inode:12bytes Cramfs_inode中的offset的单位为4字节

  30. CRAMFS 根目录的inode内容,根目录的内容在起始偏移19*4=76字节处 根目录下的子目录与文件 11*12 + 14*4 = 188

More Related