一、文件系统特性
1.1 结构体
磁盘分区后还要进行格式化,操作系统才能使用这个文件系统。每个操作系统能识别和使用的文件系统不完全相同,如windows98以前支持FAT,Windows2000后支持NTFS。linux传统的操作系统是ext2(Linux second Extended file system,ext2fs)。以前一个分区只能格式化为一个文件系统,而一些新的技术可以将一个分区格式化为多个文件系统(如LVM 逻辑卷)。
较新的操作系统的文件会保存文件权限、文件所有者等信息,这些信息存放在inode,实际的文件数据保存到数据区块。 另外有一个超级区块记录整个文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量等。
每个inode和区块都有编号,每个文件都会占用一个inode,在inode内放置区块号码。超级区块定义:
1.2 读取文件流程(基于linux0.11)
一个普通用户要读取/etc/passwd :
- 看首字母是不是/,判断是绝对路径还是相对路径;绝对路径从root的inode开始找;
- 读root的inode数据块,从里面的dir_entry找有没有与/etc名称匹配的;
- 如果找到了,返回/etc的 inode_nr;
- 通过/etc的inode_nr,读取etc的inode;
- 通过etc的inode读取etc的数据块,etc是个目录,要查找目录里有没有和passwd匹配的名称;
- 如果找到了,返回passwd的inode_nr
- 通过passwd的inode_nr读取passwd中的数据。
1.2.1 打开文件源文件示例/fs/open.c
open源文件示例:
其它函数可逐步跟踪查看。
1.2.2 读取文件的入口/fs/read_write.c
1.2.3 fs/file_read.c普通文件读取示例
1.2.4 fs/buffer.c 缓存读取函数示例
1.2.5 kernel/blk_drv/ll_rw_blk.c到硬盘读数据
make_request请求
add_request
这里给一个队列插入了一个请求节点。
队列的结构:
struct blk_dev_struct {
void (*request_fn)(void);
struct request * current_request;
};
/* blk_dev_struct is:
* do_request-address
* next-request
*/
struct blk_dev_struct blk_dev[NR_BLK_DEV] = {
{ NULL, NULL }, /* no_dev */
{ NULL, NULL }, /* dev mem */
{ NULL, NULL }, /* dev fd */
{ NULL, NULL }, /* dev hd */
{ NULL, NULL }, /* dev ttyx */
{ NULL, NULL }, /* dev tty */
{ NULL, NULL } /* dev lp */
};
后面要进入硬盘驱动环节,暂且不继续向下分析细节了。
二、常用的本地文件系统
2.1 传统的文件系统,不带日志
2.1.1 ext
第一代扩展文件系统,于1992年4月发表,是为Linux核心所做的第一个文件系统。采用Unix文件系统(UFS)的元数据结构,以克服MINIX文件系统性能不佳的问题。
2.1.2 ext2
第二代扩展文件系统,LINUX内核所用的文件系统。它开始由Rémy Card设计,用以代替ext,于1993年1月加入linux核心支持之中。ext2 的经典实现为Linux内核中的ext2fs文件系统驱动,最大可支持2TB的文件系统,至Linux核心2.6版时,扩展到可支持32TB。
2.1.3 Minix
早期Linux支持的文件系统,性能低下,没有时间标记,文件名最长14个字符。只能使用64M硬盘分区。
2.1.4 Xia
Minix 修订的文件系统,解决文件名和支持的硬盘大小的问题。
2.1.5 Msdos
微软dos、windows和一些OS/2系统支持的文件系统,文件名格式是8.3。
2.1.6 umsdos
Linux兼容Msdos使用的文件系统,支持长文件名、权限、所有者设置。
2.1.7 ISO 9660
标准的CD-ROM文件系统。此标准有不同的说明级别,一级,文件必须是8.3格式(文件名不得多于8个字符,后缀名不得多于3个字符),并且都得是大写字母。目录也不得多于8个字符。在二级和三级中,文件名可以达到32个字符。
2.1.8 FAT16 FAT32
Windows较早支持的文件系统,以前软盘也一般使用FAT格式。 FAT16只支持2G磁盘空间,FAT32增加了管理能力。
2.2 日志文件系统
文件系统发生变化时,把相关信息写入一个日志区域,再把变化写入主文件系统。当文件系统发生故障时,日志文件辅助实现一致性,可以较快恢复。
2.2.1 ext3
EXT3是第三代扩展文件系统(英语:Third extended filesystem,缩写为ext3),是一个日志文件系统,常用于Linux操作系统,完全兼容ext2文件系统。它提供了高可用性、数据完整性、提高了文件系统的速度,支持多日志模式。
2.2.2 ext4
是ext3文件系统的后继版本。ext4是由ext3的维护者Theodore Tso领导的开发团队实现的,并引入到Linux2.6.19内核中。其与ext3兼容(可能指令将ext3在线升级到ext4)、支持无限数量的子目录。
2.2.3 VFAT
VFAT是“扩展文件分配表系统”的意思,它对FAT16文件系统进行扩展,并提供支持长文件名,文件名可长达255个字符,VFAT仍保留有扩展名,而且支持文件日期和时间属性,为每个文件保留了文件创建日期/时间、文件最近被修改的日期/时间和文件最近被打开的日期/时间这三个日期/时间。linux处理的时候把fat/vfat/fat32的文件系统统一用VFAT来表示。
2.2.4 XFS
XFS 最初是由 Silicon Graphics,Inc. 于 90 年代初开发的。SGI原有文件系统(existing filesystem,EFS)有一些缺陷,SGI 因此设计一种全新的高性能 64 位文件系统,并于 1994 年随 IRIX 5.3 的发布。它至今仍作为 SGI 基于 IRIX 的产品(从工作站到超级计算机)的底层文件系统来使用。现在,XFS 也可以用于 Linux。
2.2.5 reiserfs
Linux内核支持最久的日志文件系统之一,支持海量磁盘和磁盘阵列,开发团队大部分是在俄罗斯国内。2006年其作者被抓,2008年判处25年监禁,此系统随后丧失了竞争力。
2.2.6 Btrfs
Oracle于2007年写成在开发的文件系统,用以取代ext3,其改善ext3的限制,特别是单一文件大小的限制、总文件系统大小限制以及加入文件校验和特性。
2.2.7 JFS
IBM贡献到Linux内核,提供了基于日志的字节级文件系统,该文件系统是为面向事务的高性能系统而开发的。JFS 能够在几秒或几 分钟内就把文件系统恢复到一致状态。JFS能够保证数据在任何意外宕机的情况下,不会造成磁盘数据的丢失与损坏。
2.2.8 HPFS
高性能文件系统 (High Performance File System ,HPFS),HPFS是微软的LAN Manager中的文件系统,同时也是IBM的LAN Server和OS/2产品。在OS/2中,它就是HPFS,但是在LAN Manager和LAN Server产品中,它是HPFS386,这是HPFS的改进版本。HPFS提供了DOS文件系统中的文件分配表(FAT)所没有的长文件名和性能增强特性。另外,HPSF还能访问较大的硬盘驱动器,提供更多的组织特性并改善了文件系统的安全特性。HPFS386增加了对HPFS文件系统的32位访问,另外还增加了容错和安全性功能。
三、网络文件系统
3.1 NFS
NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
3.2 SMB
方便是windows和Unix系统之间共享文件的一种协议,主要用于Windows 和 Linux下的文件共享、打印共享,可以实现匿名与本地用户文件的共享、支持多节点挂载。
四、其它文件系统
4.1 Swap文件系统
swap(交互分区)一起就是把硬盘的一部分空间拿来作为内存使用,即虚拟内存。Linux上交换分区需要使用专门的文件系统,使用mkswap创建,命令选项:
- -c 检测坏块
- -f 强制创建swap分区
- -L 指定卷标
- -p 指定分页大小 不经常使用
- -u 指定UUID
通过 swapon 启用新的swap文件系统。
4.2 proc
文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux内核空间和用户间之间进行通信。
4.3 虚拟文件系统VFS
Linux文件系统的抽象层,向上提供了统一的文件访问接口,向下兼容了不同的文件系统,让Linux复杂的文件系统建立关联关系。
五、对文件系统操作的常用命令
1. fdisk
创建和维护分区表。必要参数:
- -l 列出素所有分区表
- -u 与-l搭配使用,显示分区数目
选择参数:
- -s<分区编号> 指定分区
- -v 版本信息
菜单操作说明
- m :显示菜单和帮助信息
- a :活动分区标记/引导分区
- d :删除分区
- l :显示分区类型
- n :新建分区
- p :显示分区信息
- q :退出不保存
- t :设置分区号
- v :进行分区检查
- w :保存修改
- x :扩展应用,高级功能
2. mkfs格式化 用于在特定的分区上建立 linux 文件系统
命令格式: mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
参数 :
- device : 预备检查的硬盘分区,例如:/dev/sda1
- -V : 详细显示模式
- -t : 给定档案系统的型式,Linux 的预设值为 ext2
- -c : 在制作档案系统前,检查该partition 是否有坏道
- -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
- block : 给定 block 的大小
实例
在 /dev/hda5 上建一个 msdos 的文件系统,同时检查是否有坏道存在,并且将过程详细列出来 :
mkfs -V -t msdos -c /dev/hda5
3. mount挂载命令 挂载Linux系统外的文件
命令格式:
mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir
参数说明:
- -V:显示程序版本
- -h:显示辅助信息
- -v:显示较讯息,通常和 -f 用来除错。
- -a:将 /etc/fstab 中定义的所有档案系统挂上。
- -F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
- -f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
- -n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
- -s-r:等于 -o ro
- -w:等于 -o rw
- -L:将含有特定标签的硬盘分割挂上。
- -U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
- -t:指定档案系统的形态,通常不必指定。mount 会自动选择正确的型态。
- -o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
- -o sync:在同步模式下执行。
- -o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选择把这个选项关闭以减少写入的次数。
- -o auto、-o noauto:打开/关闭自动挂上模式。
- -o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
- -o dev、-o nodev-o exec、-o noexec允许执行档被执行。
- -o suid、-o nosuid:允许执行档在 root 权限下执行。
- -o user、-o nouser:使用者可以执行 mount/umount 的动作。
- -o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
- -o ro:用唯读模式挂上。
- -o rw:用可读写模式挂上。
- -o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。
实例将 /dev/hda1 挂在 /mnt 之下。
mount /dev/hda1 /mnt
4. unmount 卸载
# umount -v /dev/sda1 通过设备名卸载
/dev/sda1 umounted
# umount -v /mnt/mymount/ 通过挂载点卸载
/tmp/diskboot.img umounted