您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux

Linux必备知识之文件系统

时间:2020-07-28 14:44:34  来源:  作者:
Linux必备知识之文件系统

 

一、文件系统特性

1.1 结构体

磁盘分区后还要进行格式化,操作系统才能使用这个文件系统。每个操作系统能识别和使用的文件系统不完全相同,如windows98以前支持FAT,Windows2000后支持NTFS。linux传统的操作系统是ext2(Linux second Extended file system,ext2fs)。以前一个分区只能格式化为一个文件系统,而一些新的技术可以将一个分区格式化为多个文件系统(如LVM 逻辑卷)。

较新的操作系统的文件会保存文件权限、文件所有者等信息,这些信息存放在inode,实际的文件数据保存到数据区块。 另外有一个超级区块记录整个文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量等。

每个inode和区块都有编号,每个文件都会占用一个inode,在inode内放置区块号码。超级区块定义:

Linux必备知识之文件系统

 

1.2 读取文件流程(基于linux0.11)

一个普通用户要读取/etc/passwd :

  1. 看首字母是不是/,判断是绝对路径还是相对路径;绝对路径从root的inode开始找;
  2. 读root的inode数据块,从里面的dir_entry找有没有与/etc名称匹配的;
  3. 如果找到了,返回/etc的 inode_nr;
  4. 通过/etc的inode_nr,读取etc的inode;
  5. 通过etc的inode读取etc的数据块,etc是个目录,要查找目录里有没有和passwd匹配的名称;
  6. 如果找到了,返回passwd的inode_nr
  7. 通过passwd的inode_nr读取passwd中的数据。

1.2.1 打开文件源文件示例/fs/open.c

open源文件示例:

Linux必备知识之文件系统

 

其它函数可逐步跟踪查看。

1.2.2 读取文件的入口/fs/read_write.c

Linux必备知识之文件系统

 

1.2.3 fs/file_read.c普通文件读取示例

Linux必备知识之文件系统

 

1.2.4 fs/buffer.c 缓存读取函数示例

Linux必备知识之文件系统

 

1.2.5 kernel/blk_drv/ll_rw_blk.c到硬盘读数据

Linux必备知识之文件系统

 

make_request请求

Linux必备知识之文件系统

 


Linux必备知识之文件系统

 

add_request

Linux必备知识之文件系统

 

这里给一个队列插入了一个请求节点。

队列的结构:

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。

Linux必备知识之文件系统

 


Linux必备知识之文件系统

 

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 


Tags:Linux 文件系统   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、文件系统特性1.1 结构体磁盘分区后还要进行格式化,操作系统才能使用这个文件系统。每个操作系统能识别和使用的文件系统不完全相同,如Windows98以前支持FAT,Windows2000后...【详细内容】
2020-07-28  Tags: Linux 文件系统  点击:(116)  评论:(0)  加入收藏
磁盘为系统提供了最基本的持久化存储。文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构。那么,磁盘和文件系统是怎么工作的呢?又有哪些指标可以衡量它们的性能呢?索...【详细内容】
2020-07-08  Tags: Linux 文件系统  点击:(70)  评论:(0)  加入收藏
▌简易百科推荐
作用显示文件或目录所占用的磁盘空间使用命令格式du [option] 文件/目录命令功能显示文件或目录所占用的磁盘空间一些写法的区别du -sh xxx 显示总目录的大小,但是不会列出...【详细内容】
2021-12-23  mitsuhide1992    Tags:du命令   点击:(12)  评论:(0)  加入收藏
什么是linux内核linux就像是一个哲学的最佳实践。如果非要对它评价,我真的不知道该怎么赞叹,我只能自豪地说着:“linux的美丽简直让人沉醉。”我只能说是我处在linux学习的修炼...【详细内容】
2021-12-23  linux上的码农    Tags:linux内核   点击:(15)  评论:(0)  加入收藏
本文将比较 Linux 中 service 和 systemctl 命令,先分别简单介绍这两个命令的基础用法,然后进行比较。从 CentOS 7.x 开始,CentOS 开始使用 systemd 服务来代替 service服务(dae...【详细内容】
2021-12-23  软件架构    Tags:systemctl   点击:(13)  评论:(0)  加入收藏
mv是move的缩写,可以用来移动文件或者重命名文件名,经常用来备份文件或者目录。命令格式mv [选项] 源文件或者目录 目标文件或者目录命令功能mv命令中第二个参数类型的不同(...【详细内容】
2021-12-17  入门小站    Tags:mv命令   点击:(23)  评论:(0)  加入收藏
大数据技术AI Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料 98篇原创内容 -->公众号 Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处...【详细内容】
2021-12-17  仙风道骨的宝石骑士    Tags:sed命令   点击:(21)  评论:(0)  加入收藏
Node是个啥?  写个东西还是尽量面面俱到吧,所以有关基本概念的东西我也从网上选择性地拿了下来,有些地方针对自己的理解有所改动,对这些概念性的东西有过了解的可选择跳过这段...【详细内容】
2021-12-15  linux上的码农    Tags:node   点击:(21)  评论:(0)  加入收藏
难道只有我一个人觉得Ubuntu的unity桌面非常好用吗?最近把台式机上面的Ubuntu 16.04格式化了,装了黑苹果用了一周,不得不说,MacOS确实很精美,软件生态比Linux丰富很多,比Windows简...【详细内容】
2021-12-14  地球末日村    Tags:ubuntu   点击:(34)  评论:(0)  加入收藏
简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。输出信息含义执行net...【详细内容】
2021-12-13  窥镜天    Tags:Linux netstat   点击:(26)  评论:(0)  加入收藏
对于较多数量的文件描述符的监听无论是select还是poll系统调用都显得捉襟见肘,poll每次都需要将所有的文件描述符复制到内核,内核本身不会对这些文件描述符加以保存,这样的设计...【详细内容】
2021-12-13  深度Linux    Tags:Linux   点击:(16)  评论:(0)  加入收藏
今天,我们来了解下 Linux 系统的革命性通用执行引擎-eBPF,之所以聊着玩意,因为它确实牛逼,作为一项底层技术,在现在的云原生生态领域中起着举足轻重的作用。截至目前,业界使用范...【详细内容】
2021-12-10  架构驿站    Tags:eBPF   点击:(24)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条