linux 文件管理

45
LINUX 文文文文

Upload: orsin

Post on 21-Jan-2016

86 views

Category:

Documents


0 download

DESCRIPTION

LINUX 文件管理. Linux 支持的常见的文件系统类型. Linux 自身提供的缺省文件系统: ext2fs (一般根文件系统 / 使用此文件系统);新增的自身提供的文件系统: ext3fs 、 ReiserFS 、 IBM JFS 等 其它 UNIX 使用的文件系统: minix,ext,xiafs 等 DOS/Windows 使用的文件系统: FAT-12,FAT-16,FAT-32,VFAT,NTFS (只读) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: LINUX 文件管理

LINUX 文件管理

Page 2: LINUX 文件管理

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 (用于内核和进程信息)

Page 3: LINUX 文件管理

Linux 专用文件系统 Minix 是 Linux 的第一个文件系统,有局

限,性能比较差。文件名不能长于 14 个字符,最大的文件大小是 64M 字节

在 1992 年 4 月引入第一个专为 Linux 设计的文件系统 -- 扩展文件系统或 EXT ( Extend File System )

1993 年,增加了扩展文件系统第二版,或 EXT2

Page 4: LINUX 文件管理

虚拟文件系统 VFS

Page 5: LINUX 文件管理

虚拟文件系统 现在的系统大多都在系统内核和文件系统之间提供一

个标准的接口,真实的文件系统通过一个接口层从操作系统和系统服务中分离出来,这样不同文件结构之间的数据可以十分方便地交换。

Linux 也在系统内核和文件系统之间提供了一种叫做虚拟文件系统 VFS ( virtual file system )的标准接口。

VFS 允许 Linux 支持许多(通常是不同的)文件系统,每一个都向 VFS 表现一个通用的软件接口。 Linux 文件系统的所有细节都通过软件进行转换,所以所有的文件系统对于 Linux 核心的其余部分和系统中运行的程序显得一样。

Page 6: LINUX 文件管理

虚拟文件系统转换

Linux 文件管理程序系统调用接口

VFS 转换

FAT 文件系统 Ext2 文件系统 /proc 文件系统

Page 7: LINUX 文件管理

VFS 和实际文件系统的关系

Page 8: LINUX 文件管理

实际文件系统和 VFS 的转换 当每一个文件系统初始化的时候,自身向 VFS 登

记。 ( 在系统启动操作系统初始化自身时 ) 真实的文件系统自身建立在内核中或者是作为可加

载的模块。文件系统模块在系统需要的时候加载。 当一个块设备文件系统安装的时候,(包括 root

文件系统), VFS 必须读取它的超级块。每一个文件系统类型的超级块的读取例程必须找出这个文件系统的拓扑结构,并把这些信息映射到一个 VFS 超级块的数据结构上。

VFS 保存系统中安装的文件系统的列表和它们的 VFS 超级块列表。

Page 9: LINUX 文件管理

VFS 超级块 每一个安装的文件系统都用 VFS 超级块 参见 include/linux/fs.h

Page 10: LINUX 文件管理

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 指向这个文件系统需要的信息的一个指针

Page 11: LINUX 文件管理

The VFS Inode 同 EXT2 文件系统, VFS 中每一个文件、目录等等都用一个且只用一个 VFS inode 代表。每一个 VFS inode 中的信息使用文件系统相关的例程从底层的文件系统中获取。 VFS inode 只在核心的内存中存在,只要对系统有用,就一直保存在 VFS inode cache 中。

参见 include/linux/fs.h

Page 12: LINUX 文件管理

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 是否被写过,如果这样,底层的文件系统需要更新。

Page 13: LINUX 文件管理

登记文件系统 当核心建立的时候,文件系统初始化代码调用所

有内建的文件系统的初始化例程的。 当加载一个文件系统模块的时候,它自身向核心

登记,当卸载的时候,它就注销。 每一个文件系统的初始化例程都向虚拟文件系统注册自身,并用一个 file_system_type 数据结构代表,这里面包括文件系统的名称和一个指向它的 VFS 超级块的读取例程的指针。

参见 fs/filesystems.c sys_setup() 参见 include/linux/fs.h file_system_type

Page 14: LINUX 文件管理

file_system_type 数据结构

*read_super()

name

requires_dev

next

*read_super()

name

requires_dev

next

*read_super()

name

requires_dev

next

file_system_typefile_systems

ext2 proc iso9660

Page 15: LINUX 文件管理

检查 /proc/filesystems 可以检查 /proc/filesystems 来查看登记了哪些

文件系统

Page 16: LINUX 文件管理

安装一个文件系统 # mount –t iso9660 –o ro /dev/cdrom /m

nt/cdrom mount 命令会传递给核心三部分信息:文

件系统的名称、包括这个文件系统的物理块设备和这个新的文件系统要安装在现存的文件系统拓扑结构中的哪一个地方。

Page 17: LINUX 文件管理

Mount 的步骤 VFS首先查看 file_systems指向的列表中的每一个 file_sy

stem_type 数据结构,查看所有已知的文件系统。若找到了一个匹配的名称,并得到了文件系统相关例程的地址,即去读取此文件系统的超级块。

第二步,如果 mount 传递的物理设备还没有安装,须找到即将成为新的文件系统的安装点的目录的 VFS inode 。一旦找到了这个 inode ,就检查它是否是一个目录,而且没有其他文件系统安装在那里。

VFS 安装代码必须分配以一个 VFS 超级块并传递安装信息给这个文件系统的超级块读取例程。系统所有的 VFS 超级块都保存在 super_block 数据结构组成的 super_blocks 向量表中,必须为这次安装分配一个结构。超级块读取例程必须根据它从物理设备读取得信息填充 VFS 超级块的域。

Page 18: LINUX 文件管理

vfsmount 数据结构 每一个安装的文件系统用一个 vfsmount 数据结构描述。它们在 vfsmntlist 指向的一个列表中排队。

每一个 vfsmount 结构包括存放这个文件系统的块设备的设备编号,文件系统安装的目录和一个指向这个文件系统安装时所分配的 VFS 超级块的指针。

VFS 超级块指向这一类型的文件系统的 file_system_type 数据结构和这个文件系统的 root inode 。这个 inode 在这个文件系统加载过程中一直驻留在 VFS inode cache 中。

参见 fs/super.c add_vfsmnt()

Page 19: LINUX 文件管理

第二代扩展文件系统 (EXT2)

Page 20: LINUX 文件管理

第二代扩展文件系统 (EXT2)

ext2fs由 Rey Card 设计,其目标是为 Linux 提供一个强大的可扩展文件系统

支持标准 unix 文件类型 管理大的分区,达 4TB 支持长文件名, 255字符 为超级用户保留 5%数据块

Page 21: LINUX 文件管理

EXT2 文件系统的物理结构 数据被保存在数据块中,每一个文件的长度都按照块取整 。

引导块 块组 1 … 块组 i … 块组 n

超级块 块组描述结构

块位示图

索引节点位示图

索引节点表 数据块

Page 22: LINUX 文件管理

索引节点 inode EXT2 用一个 inode 数据结构描述系统中的每一

个文件,定义了系统的拓扑结构。 一个 inode 描述了一个文件中的数据占用了哪些

块以及文件的访问权限、文件的修改时间和文件的类型。

EXT2 文件系统中的每一个文件都用一个 inode 描述,而每一个 inode 都用一个独一无二的数字标识。文件系统的 inode 都放在一起,在 inode 表中。

EXT2 的目录是简单的特殊文件(它们也使用 inode 描述),包括它们目录条目的 inode 的指针。

Page 23: LINUX 文件管理

Ext2 文件系统的索引节点

12个直接指针

Page 24: LINUX 文件管理

索引节点 (ext2_inode)

Page 25: LINUX 文件管理

EXT2 超级块 超级块包括这个文件系统基本大小和形状

的描述。它里面的信息允许文件系统管理程序用于维护文件系统。

通常文件系统安装时只有块组 0 中的超级块被读取,但是每一个块组中都包含一个复制的拷贝,用于系统崩溃的时候。

Page 26: LINUX 文件管理

超级块 (ext2_super_block)

Page 27: LINUX 文件管理

EXT2 组描述符 每个数据块组都拥有一个描叙它结构。象超级块

一样,所有数据块组中的组描叙符被复制到每个数据块组中以防文件系统崩溃。

组描述符依次排列,它们一起组成了组描述符表( group descriptor table )。每一个块组包括块组描述符表和它的超级块的完整拷贝。只有第一个拷贝(在块组 0 )实际被 EXT2 文件系统使用。其他拷贝,象超级块的其他拷贝一样,只有在主拷贝损坏的时候才使用。

Page 28: LINUX 文件管理

块组描述符 (ext2_group_desc)

Page 29: LINUX 文件管理

EXT2 目录 目录是特殊文件,用来创建和存放对于文

件系统中的文件的访问路径。

Page 30: LINUX 文件管理

目录和索引节点之间的关系

Page 31: LINUX 文件管理

目录( ext2_dir_entry )

Page 32: LINUX 文件管理

目录项布局

Page 33: LINUX 文件管理

文件的定位过程

Page 34: LINUX 文件管理

内核中用于文件的数据结构

Page 35: LINUX 文件管理

相关命令

Page 36: LINUX 文件管理

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 选項將某个一般的文件當成硬盤機分割掛上系統。

Page 37: LINUX 文件管理

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

Page 38: LINUX 文件管理

umount 命令 umount [-hV]

umount -a [-f] [-r] [-n] [-v] [-t vfstypes] [-O opts]umount [-f] [-r] [-n] [-v] special | node...

Page 39: LINUX 文件管理

df 命令 命令格式: df [ 选項 ]... [FILE]... 功能:显示文件系統的狀況,或是看所有文件系統

的狀況 ( 缺省值 ) 常用选项 -a, 包含所有的具有 0 Blocks 的文件系統

--block-size={SIZE} 使用 {SIZE} 大小的 Blocks -h, --human-readable 使用人可讀的格式-H, 很像 -h, 但是用 1000 为單位而不是用 1024 -i, 列出 inode 信息,不列出已使用 block

Page 40: LINUX 文件管理

常用选项-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 輸出版本信息並且離開

Page 41: LINUX 文件管理

sync 命令 使用权限 : 系統管理者

使用方式 : sync 说明 :Linux 系統中欲寫入硬盤的資料有的时候會了效率起見,會寫到 filesystem buffer 中,這个 buffer 是一塊記憶體空間,如果欲寫入硬盤的資料存此 buffer 中,而系統又突然斷電的話,那資料就會流失了, sync 指令會將存 buffer 中的資料強制寫入硬盤中

Page 42: LINUX 文件管理

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

Page 43: LINUX 文件管理

fsck 命令 使用权限 : 超級使用者

使用方式 : fsck [-sACVRP] [-t fstype] [--] [fsck-options] filesys [...] 说明 : 检查与修復 Linux 文件系統,可以同时检查一个或多个 Linux 文件系統

注意 : 此指令可与 /etc/fstab 相互参考操作來加以了解。

Page 44: LINUX 文件管理

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

Page 45: LINUX 文件管理