• 1. LINUX文件管理
  • 2. Linux支持的常见的文件系统类型Linux自身提供的缺省文件系统:ext2fs(一般根文件系统/使用此文件系统);新增的自身提供的文件系统:ext3fs、ReiserFS、IBM JFS等 其它UNIX使用的文件系统:minix,ext,xiafs等 DOS/Windows使用的文件系统:FAT-12,FAT-16,FAT-32,VFAT,NTFS(只读) HPFS(OS/2使用、只读)、HFS(Macintosh使用、只读);AFFS(Amiga);System V,Coherent,Xenix;CD-ROM(ISO 9660) UMSDOS(UNIX-like FS on MS-DOS);NFS(网络文件系统);SMBFS(Windows共享文件系统)、NCPFS(Novell Netware共享文件系统) /proc(用于内核和进程信息)
  • 3. Linux 专用文件系统Minix 是 Linux 的第一个文件系统,有局限,性能比较差。文件名不能长于 14 个字符,最大的文件大小是 64M 字节 在 1992 年 4 月引入第一个专为 Linux 设计的文件系统--扩展文件系统或 EXT ( Extend File System ) 1993 年,增加了扩展文件系统第二版,或 EXT2
  • 4. 虚拟文件系统VFS
  • 5. 虚拟文件系统现在的系统大多都在系统内核和文件系统之间提供一个标准的接口,真实的文件系统通过一个接口层从操作系统和系统服务中分离出来,这样不同文件结构之间的数据可以十分方便地交换。 Linux也在系统内核和文件系统之间提供了一种叫做虚拟文件系统VFS(virtual file system)的标准接口。 VFS 允许 Linux 支持许多(通常是不同的)文件系统,每一个都向 VFS 表现一个通用的软件接口。 Linux 文件系统的所有细节都通过软件进行转换,所以所有的文件系统对于 Linux 核心的其余部分和系统中运行的程序显得一样。
  • 6. 虚拟文件系统转换Linux 文件管理程序系统调用接口VFS 转换FAT文件系统Ext2文件系统/proc文件系统
  • 7. VFS和实际文件系统的关系
  • 8. 实际文件系统和VFS的转换当每一个文件系统初始化的时候,自身向 VFS 登记。(在系统启动操作系统初始化自身时) 真实的文件系统自身建立在内核中或者是作为可加载的模块。文件系统模块在系统需要的时候加载。 当一个块设备文件系统安装的时候,(包括 root 文件系统), VFS 必须读取它的超级块。每一个文件系统类型的超级块的读取例程必须找出这个文件系统的拓扑结构,并把这些信息映射到一个 VFS 超级块的数据结构上。 VFS 保存系统中安装的文件系统的列表和它们的 VFS 超级块列表。
  • 9. VFS 超级块每一个安装的文件系统都用 VFS 超级块 参见 include/linux/fs.h
  • 10. VFS 超级块包含的信息Device 这是包含文件系统的块设备的设备标识符。例如,/dev/hda1,设备标识符是 0x301 Inode pointers 其中的mounted inode指针指向该文件系统的第一个inode。Covered inode指针指向文件系统安装到的目录的 inode 。 Blocksize 文件系统块的字节大小。 Superblock operations 指向一组本文件系统超级块例程的指针。除了其他类型之外, VFS 使用这些例程读写 inode 和超级块 File System type 指向这个安装的文件系统的 file_system_type 数据结构的一个指针 File System Specific 指向这个文件系统需要的信息的一个指针
  • 11. The VFS Inode同 EXT2 文件系统,VFS 中每一个文件、目录等等都用一个且只用一个 VFS inode 代表。每一个 VFS inode 中的信息使用文件系统相关的例程从底层的文件系统中获取。 VFS inode 只在核心的内存中存在,只要对系统有用,就一直保存在 VFS inode cache 中。 参见 include/linux/fs.h
  • 12. The VFS Inode 包含的信息device 存放这个文件的设备的设备标识符。 Inode nunber 这个 inode 的编号。 Mode 象 EXT2 一样,这个域描述这个 VFS inode 代表的东西和对它的访问权限。 Inode operations 指向一组例程地址的指针。例程和文件系统相关,执行对于此inode的操作 Count 系统组件当前使用这个 VFS inode 的数目。 Count 0 意味着这个 inode 是空闲,可以废弃或者重用。 Lock 这个域用于锁定这个 VFS inode 。例如当从文件系统读取它的时候。 Dirty 显示这个 VFS inode 是否被写过,如果这样,底层的文件系统需要更新。
  • 13. 登记文件系统当核心建立的时候,文件系统初始化代码调用所有内建的文件系统的初始化例程的。 当加载一个文件系统模块的时候,它自身向核心登记,当卸载的时候,它就注销。 每一个文件系统的初始化例程都向虚拟文件系统注册自身,并用一个 file_system_type 数据结构代表,这里面包括文件系统的名称和一个指向它的 VFS 超级块的读取例程的指针。 参见 fs/filesystems.c sys_setup() 参见 include/linux/fs.h file_system_type
  • 14. file_system_type 数据结构*read_super()namerequires_devnext*read_super()namerequires_devnext*read_super()namerequires_devnextfile_system_typefile_systemsext2prociso9660
  • 15. 检查 /proc/filesystems可以检查 /proc/filesystems 来查看登记了哪些文件系统
  • 16. 安装一个文件系统# mount –t iso9660 –o ro /dev/cdrom /mnt/cdrom mount 命令会传递给核心三部分信息:文件系统的名称、包括这个文件系统的物理块设备和这个新的文件系统要安装在现存的文件系统拓扑结构中的哪一个地方。
  • 17. Mount 的步骤VFS首先查看file_systems指向的列表中的每一个 file_system_type 数据结构,查看所有已知的文件系统。若找到了一个匹配的名称,并得到了文件系统相关例程的地址,即去读取此文件系统的超级块。 第二步,如果 mount 传递的物理设备还没有安装,须找到即将成为新的文件系统的安装点的目录的 VFS inode 。一旦找到了这个 inode ,就检查它是否是一个目录,而且没有其他文件系统安装在那里。 VFS 安装代码必须分配以一个 VFS 超级块并传递安装信息给这个文件系统的超级块读取例程。系统所有的 VFS 超级块都保存在 super_block 数据结构组成的 super_blocks 向量表中,必须为这次安装分配一个结构。超级块读取例程必须根据它从物理设备读取得信息填充 VFS 超级块的域。
  • 18. vfsmount 数据结构每一个安装的文件系统用一个 vfsmount 数据结构描述。它们在 vfsmntlist 指向的一个列表中排队。 每一个 vfsmount 结构包括存放这个文件系统的块设备的设备编号,文件系统安装的目录和一个指向这个文件系统安装时所分配的 VFS 超级块的指针。 VFS超级块指向这一类型的文件系统的 file_system_type 数据结构和这个文件系统的root inode。这个inode 在这个文件系统加载过程中一直驻留在 VFS inode cache 中。 参见 fs/super.c add_vfsmnt()
  • 19. 第二代扩展文件系统(EXT2)
  • 20.  第二代扩展文件系统(EXT2)ext2fs由Rey Card设计,其目标是为Linux提供一个强大的可扩展文件系统 支持标准unix 文件类型 管理大的分区,达4TB 支持长文件名,255字符 为超级用户保留5%数据块
  • 21. EXT2文件系统的物理结构数据被保存在数据块中,每一个文件的长度都按照块取整 。 引导块块组1…块组i…块组n超级块块组描 述结构块位 示图索引节点 位示图索引 节点表数据块
  • 22. 索引节点inodeEXT2 用一个 inode 数据结构描述系统中的每一个文件,定义了系统的拓扑结构。 一个 inode 描述了一个文件中的数据占用了哪些块以及文件的访问权限、文件的修改时间和文件的类型。 EXT2 文件系统中的每一个文件都用一个 inode 描述,而每一个 inode 都用一个独一无二的数字标识。文件系统的 inode 都放在一起,在 inode 表中。 EXT2 的目录是简单的特殊文件(它们也使用 inode 描述),包括它们目录条目的 inode 的指针。
  • 23. Ext2 文件系统的索引节点12个直接指针
  • 24. 索引节点(ext2_inode)
  • 25. EXT2 超级块超级块包括这个文件系统基本大小和形状的描述。它里面的信息允许文件系统管理程序用于维护文件系统。 通常文件系统安装时只有块组 0 中的超级块被读取,但是每一个块组中都包含一个复制的拷贝,用于系统崩溃的时候。
  • 26. 超级块(ext2_super_block)
  • 27. EXT2 组描述符每个数据块组都拥有一个描叙它结构。象超级块一样,所有数据块组中的组描叙符被复制到每个数据块组中以防文件系统崩溃。 组描述符依次排列,它们一起组成了组描述符表( group descriptor table )。每一个块组包括块组描述符表和它的超级块的完整拷贝。只有第一个拷贝(在块组 0 )实际被 EXT2 文件系统使用。其他拷贝,象超级块的其他拷贝一样,只有在主拷贝损坏的时候才使用。
  • 28. 块组描述符(ext2_group_desc)
  • 29. EXT2 目录目录是特殊文件,用来创建和存放对于文件系统中的文件的访问路径。
  • 30. 目录和索引节点之间的关系
  • 31. 目录(ext2_dir_entry)
  • 32. 目录项布局
  • 33. 文件的定位过程
  • 34. 内核中用于文件的数据结构
  • 35. 相关命令
  • 36. mount 命令mount [-hV] mount -a [-fFnrsvw] [-t vfstype] mount [-fnrsvw] [-o options [,...]]  device | dir mount [-fnrsvw] [-t vfstype] [-o options] device dir 使用权限 : 系統管理者或/etc/fstab中允許的使用者 说明 :  這个命令可以被用來掛上任何的文件系統,甚至可以用 -o loop 选項將某个一般的文件當成硬盤機分割掛上系統。
  • 37. mount 命令参數 -h 显示輔助訊息 -t 指定文件系統的型態 -o defaults 使用缺省的选項 rw, suid, dev, exec, auto, nouser, async. -o ro 用只读模式掛上。 -o rw 用可讀寫模式掛上。 -o loop= 使用 loop 模式用來將一个文件當成硬盤分割掛上系統。 范例:將 /tmp/image.iso 這个光碟的 image 檔使用 loop 模式掛在 /mnt/cdrom之下。用這種方法可以將一般網絡上可以找到的 Linux 光 碟 ISO 檔在不燒錄成光碟的情況下检視其內容。 #mount -o loop /tmp/image.iso /mnt/cdrom
  • 38. umount 命令umount [-hV] umount -a [-f] [-r] [-n] [-v] [-t vfstypes] [-O opts] umount [-f] [-r] [-n] [-v] special | node...
  • 39. df 命令命令格式:df [选項]... [FILE]... 功能:显示文件系統的狀況,或是看所有文件系統的狀況(缺省值) 常用选项 -a, 包含所有的具有 0 Blocks 的文件系統  --block-size={SIZE} 使用 {SIZE} 大小的 Blocks  -h, --human-readable 使用人可讀的格式 -H, 很像 -h, 但是用 1000 为單位而不是用 1024  -i, 列出 inode 信息,不列出已使用 block 
  • 40. 常用选项 -k, --kilobytes 就像是 --block-size=1024  -l, --local 限制列出的文件結構  -m, --megabytes 就像 --block-size=1048576  --no-sync 取得信息前不 sync (缺省值)  -P, --portability 使用 POSIX 輸出格式  --sync 在取得信息前 sync  -t, --type=TYPE 限制列出文件系統的 TYPE  -T, --print-type 显示文件系統的形式  -x, --exclude-type=TYPE 限制列出文件系統不要显示 TYPE  -v (忽略)  --help 显示這个幫手並且離開  --version 輸出版本信息並且離開
  • 41. sync 命令使用权限 : 系統管理者 使用方式 : sync 说明 : Linux 系統中欲寫入硬盤的資料有的时候會了效率起見,會寫到 filesystem buffer 中,這个 buffer 是一塊記憶體空間,如果欲寫入硬盤的資料存此 buffer 中,而系統又突然斷電的話,那資料就會流失了,sync 指令會將存 buffer 中的資料強制寫入硬盤中
  • 42. mkfs 命令使用权限 : 超級使用者 使用方式 : mkfs [-V] [-t fstype] [fs-options] filesys [blocks] 说明 : 建立 linux 文件系統在特定的分区上 参數 : device :預備检查的硬盤分区 -V : 詳細显示模式 -t : 給定文件系統的型式,缺省值为 ext2  -c : 在制做文件系統前,检查該分区是否有壞軌 block : 給定 block 的大小 例子 : 在 /dev/hda5 上建一个 msdos 的文件系統,同时检查是否有壞軌存在,並且將過程詳細列出來 :  mkfs -V -t msdos -c /dev/hda5
  • 43. fsck 命令使用权限 : 超級使用者 使用方式 : fsck [-sACVRP] [-t fstype] [--] [fsck-options] filesys [...] 说明 : 检查与修復 Linux 文件系統,可以同时检查一个或多个 Linux 文件系統 注意 : 此指令可与 /etc/fstab 相互参考操作來加以了解。
  • 44. fsck 命令参數 filesys : device 名称,mount 點 -t : 給定文件系統的型式 -s : 依序一个一个地執行 fsck 的指令來检查 -A : 对/etc/fstab 中所有列出來的分区做检查 -C : 显示完整的检查進度 -d : 列印 e2fsck 的 debug 結果 -V : 詳細显示模式 -a : 如果检查有錯則自动修復 -r : 如果检查有錯則由使用者回答是否修復 例子 : 检查 msdos 文件系統的 /dev/hda5 是否正常,如果有异常便自动修復 :  fsck -t msdos -a /dev/hda5
  • 45. (本页无文本内容)