打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux文件系统的总体概况

1 文件


1.1 概述

一个关于UNIX系统的简单描述是这样的,也适用于Linux:

“在Unix系统中,一切皆文件;除此外就是进程”。

这一说法是正确的,虽然有些特殊的文件,不只是简简单单的文件(例如:管道、套接字),但是为了简变(keep it simple stupid),“一切皆文件”是可以接受的。作为列UNIX,Linux系统没有区分文件和目录,因为目录只是一个包含其他文件名的文件。程序、服务、文本、图像等等,都是文件。对于系统来说,输入输出设备和基本所有的设备都被认为是文件。

为了有序的管理这些文件,人们习惯认为它们在硬盘中是以有序的树状结构存储的,如我们知道的MS-DOS(磁盘操作系统)。大的分支包含更多的分支,而这些分支最后包含的是树的叶子节点或者普通文件。现在我们将使用树形存储结构,但是在以后我们会发现仅仅使用树形结构来描述文件的存储方式是不完全准确。

1.2 各种文件

大多数文件只是文件,称为常规文件。它们包含正常的数据,例如文本文件、可执行文件和输入输出程序等等。

虽然把Liunx系统上的一切看做文件是相当安全的,但是也有一些例外。

  • 目录:其他文件的列表(文件)。

  • 特殊文件:用于输入/输出的设备。大多数特殊文件都在/dev目录中,我们稍后将讨论。

  • 链接:对一个文件或目录,可以从系统文件树的多个部分都能访问(指向同一个文件或目录的文件);后面将详细的讨论它。

  • (域)套接字:一个特殊的文件类型,类似于TCP/IP 套接字,通过文件系统的访问控制提供进程间的网络保护。

  • 命名管道:或多或少有点像套接字,没有未使用网络套接字而建立的一个进程之间相互通信的方式。

ls -l 的结果中,每行的第一个字母表示文件的类型:

jaime:~/Documents> ls -l
total 80
-rw-rw-r-- 1 jaime jaime 31744 Feb 21 17:56 intro Linux.doc
-rw-rw-r-- 1 jaime jaime 41472 Feb 21 17:56 Linux.doc
drwxrwxr-x 2 jaime jaime 4096 Feb 25 11:50 course


下表概述了表述字符所代表的不同文件类型:

表3-1 文件类型的表

符号

意思

-

普通文件

d

目录

l

链接

c

特殊文件

s

套接字

p

命名管道

b

块设备

为了在看文件类型的时候不列出一长串的清单,许多系统默认发出的不单单是ls,而是ls -F命令,它使用文件名后缀字符'/=*|@'表示文件类型。为了对初级用户而言更简单操作一点,-F和-color操作通常合并起来,可以参考第3.3.11章。为了有更好的可读性,在本文档中我们将使用ls -F。

作为用户,你只需要处理纯文本文件、可执行文件、目录和链接。特殊文件是为了让系统做你所需求的,都是由程序和管理员操作的。

现在,在讨论一些重要文件和目录之前,我们需要了解一下分区。

2 关于分区


2.1 为什么要分区?

由于每个操作系统都可以创建和删除分区,所以大多数人都模糊的了解什么是分区。你可能会奇怪,在同一块磁盘上,Linux会有多个分区,即使是标准安装过程安装的系统也会有多个。所以下面我们给出一些解释。

具有不同分区的目标之一是在灾难发生的情况下实现更高的数据安全性。通过给磁盘分区,数据可以被分组和分离。当事故发生时,只有被损坏的分区的数据会被破坏,别的分无的数据仍然是安全的。

这个原则可以追溯到过去,那时由于Linux没有日志文件系统,而电源故障就能导致灾难发生。使用分区是为了安全性和鲁棒性,因为系统的某一部分出现问题并不意味着整个计算机处于危险之中。这是目前使用分区的最重要的原因。一个简单的例子:一个用户创建启动了一个脚本、程序或者web应用程序开始填充磁盘,如果只包含一个大的分区,当磁盘满的时候,整个系统将停止工作;而如果用户把数据存储在一个单独的分区,那么只有存放数据的分区会受到影响,系统分区和其他数据分区仍将正常运行。

记住,日志文件系统只提供电源故障和突然断开存储设备的情况下的数据安全机制,并没有提供机制免受文件系统中数据块损坏和逻辑错误影响。在这种情况下你应该使用RAID(廉价磁盘冗余阵列)解决方案。

2.1.1 日志文件系统(穿插一下journaled fs)

日志文件系统就是通过维护一份日志来防止文件系统崩溃。

所谓日志就是一种特殊的文件,它会在一个循环的缓冲区内记录文件系统的修改,然后将其定期提交到文件系统。一旦系统发生崩溃,日志文件就会起到一个检查点的作用,用于恢复未保存的信息,防止损坏文件系统元数据。
总之,日志文件系统就是一种具有故障恢复能力的文件系统,它利用日志来记录尚未提交到文件系统的修改,以防止元数据破坏。


2.2 分区布局和类型


Linux系统中有主要有两种类型的分区:

  • 数据分区:正常的Linux系统数据,包括root分区中的所有与启动、运行系统有关的数据。

  • 交换分区:扩大计算机的物理内存,硬盘上的额外内存。

大多数系统有一个根分区,一个或多个数据分区,一个或多个交换分区。混合环境的系统可能包含其他系统的数据分区,例如包含支持MS Windows数据的FAT或VFAT文件系统分区。

大多数Linux系统在安装的时候设置分区类型为FDISK。或许您在第一章的练习中已经注意到了,这通常是自动发生的。然而,在某些情况下你不会这么幸运了,在这些情况下,你需要手动选择分区类型甚至手动进行分区。标准的Linux分区上,使用数字82表示交换分区,使用数字83表示数据分区,数据分区可以是日志文件系统(ext3)或者常规的系统(ext2,在旧系统上)。如果您忘记了这些值,可以使用FDISK内置帮助命令(l 命令)。

除了这两个,Linux支持多种其他类型的文件系统,如相对较新的Reiser文件系统,JFS、NFS、FATxx和许多其他操作系统自带的文件系统。

标准的根分区(用一个正斜杠/)大约是100-500MB,包含系统配置文件、大多数的基础命令和服务程序、系统函数库、一些临时空间和管理员(root)的主目录。标准安装大约需要root分区的250MB。

交换空间(swap)只允许系统本身访问,并且在正常操作的时候被隐藏。类似常见的UNIX系统,Linux上的swap是保证无论发生什么情况都可以继续工作的系统。因为这些额外的内存,在Linux系统上你几乎从不会看到讨厌的消息(如内存满了,请关闭一些应用程序后再尝试)。现在,交换分区和虚拟内存也早已被UNIX系统以外的其他系统所采用。

使用硬盘比存的访问速度慢,但额外内存能缓解内存不足的问题。

Linux硬盘上的交换空间是屋里内存的两倍。在安装系统的时候,你必须知道如何做到这一点。举一个512MB的RAM系统的例子:

  • 第一个可能性:一个1GB的交换分区

  • 第二个可能性:2个512MB的分区

  • 第三个可能性:两个硬盘:每个磁盘分区是521MB

在有大量的I/O时候,可以预料到最后一个选项的结果是最好的。

想要获得更多的指导方针请阅读软件文档。一些应用程序,例如数据库,可能需要更多的交换空间。其他的,例如一些处理系统,因为没有硬盘而没有交换空间。交换空间的设置还可能取决于你的内核版本。

在很多发型版本中说内核是一个单独的分区,因为它是最重要的文件系统。如果这样的话,你会发现你也有一个/boot分区保存你的内核数据和相应的数据文件。

虽然可以将非系统安全的数据放在一个分区上,如标准安装时所产生的结果,但磁盘上其他部分也通常会划成不同的分区。当非关键数据分开在不同的分区时,经常按照如下格式进行设置:

  • 用户程序分区(/usr)

  • 包含用户个人资料的分区(/home)

  • 存储临时数据,如打印和邮件队列的分区(/var)

  • 存放第三方和附加软件的分区(/opt)

一旦分区被创建,你能做的只是添加更多。改变现有分区的大小或属性是可能的,但不建议这么做。

对硬盘进行分区是由系统管理员决定的。在较大的系统,管理员可能会通过某些软件将一个分区划分到多个硬盘上。为了优化工作站和一般服务器,大多数的发行版本允许使用标准安装,当然也支持自定义安装。

在安装过程中,你可以使用特定的工具自定义分区布局,这个工具通常是一个简洁的图形界面,或者是fdisk,一个的基于文本的工具,用来创建分区和设置属性。

一个工作站或客户端安装主要是为了让同一个人或同一类人使用。可选的软件安装正好反映了这一点,它主要是对于普通用户包,例如漂亮的桌面主题,开发工具,电子邮件,多媒体软件,网络和其他服务的客户端程序。将这一切都放在一个大分区里,设置swap为RAM数量的两倍,这样添加您的通用工作站完全够了,它提供最大数量的磁盘空间可能为个人使用,但缺点是在遇到问题时数据的完整性可能会损坏。

在服务器上,系统数据往往是和用户数据分开的。提供服务的程序和被这个服务处理的数据分别保存在不同的地方。在这样的系统上会创建不同的分区:

  • 存放启动计算机所需要的全部数据的分区。

  • 存放配置数据和服务器程序的分区。

  • 包含服务数据,例如数据库表、用户邮件、FTP服务等的一个或多个分区。

  • 存放用户程序和应用程序的分区。

  • 存放用户的特定文件的一个或多个分区(主目录)。

  • 一个或多个交换分区(虚拟内存)。

服务器通常有更多的内存从而有更多的交换空间。某些服务进程,例如数据库,可能比别的程序需要更多交换空间,如果想了解更多细节请看专业文档。为了更好的性能,交换空间通常被划分为不同的交换分区。

2.3 挂载点

所有的分区都是通过挂载点连接到系统。挂载点在文件系统中定义了一个特定数据的集合。通常,所有分区都通过root分区连接。在该分区上用斜杠(/)表示目录被创建。这些空目录将连接这些分区的起点。举个例子:给定一个包含以下目录的分区:

videos/ cd-images/ pictures/

我们想把这个分区和文件系统中/opt/media的目录关联起来。为了做到这一点,系统管理员必须保证系统中存在/opt/media目录,它最好是个空目录。如何做到这一点将在本章的后面解释。然后使用mount命令,管理员可以连接到系统的分区。当你再看原来为空目录的/opt/media的内容时,它将包含安装介质中的文件和目录(硬盘或者硬盘分区,CD,DVD,闪存卡,USB或者其他存储设备)。

在系统的启动过程中,所有的分区都是这么挂载的,按照/etc/fstab文件中描述的一样。当然也有一些分区在启动时默认没有挂载,这样分区经常不会连接到系统,像数码相机所使用的存储。如果配置好,系统发现它有链接时就会挂载该设备,也可以是用户自己挂载的,因此不需要是系统管理员每次都手动的挂载和卸载这个设备。

在正在运行的系统中,可以使用df命令显示分区和挂载点的信息(df表示 disk full或disk free)。在Linux中,df是GNU的,并通过支持-h和一些可读的选项来大大提高了可读性。需要注意的是商业的UNIX及其通常有它们自己版本的df命令和其他命令。它们的作用通常是相似的,然而GNU版本的通用工具往往功能更好。

df命令只能显示活动的非swap分区的信息。这些可能包括其他网络系统的分区,就像在下面的例子中,home目录是从网络文件服务挂载的,这种情况在企业环境中经常遇到。


freddy:~> df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda8 496M 183M 288M 39% /
/dev/hda1 124M 8.4M 109M 8% /boot
/dev/hda5 19G 15G 2.7G 85% /opt
/dev/hda6 7.0G 5.4G 1.2G 81% /usr
/dev/hda7 3.7G 2.7G 867M 77% /var
fs1:/home 8.9G 3.7G 4.7G 44% /.automount/fs1/root/home


3 更多的文件系统布局


3.1 视图

为了方便起见,Linux文件系统通常被认为是树状结构。在一个标准的Linux系统中,你会发现文件的布局一般类似下面的方案。

图3-1 Linux文件系统布局

这是一个RedHat系统的文件布局。由于系统管理员的不同、UNIX机器的操作系统和任务的不同,某些目录可能会被排除在外或是随意增加,导致这个结构可能会有所不同。这个文件系统没有固定的名字,它只是一个习惯。

树形文件系统以斜杠(/)开始。这个目录包含所有相关的目录和文件,也被称为根目录或文件系统的根。

比根目录低一个级别的目录之前经常有一个斜杠,这是为了与其他名字一样的目录区分开来防止混乱。当开始使用一个新系统之前,看一看根目录是个好主意。让我们看看运行结果:

emmy:~> cd /
emmy:/> ls
bin/ dev/ home/ lib/ misc/ opt/ root/ tmp/ var/
boot/ etc/ initrd/ lost+found/ mnt/ proc/ sbin/ usr/
表3-2所示 根目录的子目录
目录内容
/bin被系统、系统管理员和用户共享的通用程序
/boot启动文件和内核,例如:vmlinuz。在最近的一些版本也grub的数据。GRUB是GRand统一引导加载程序,它尝试摆脱了各种我们所知的boot-loader。
/dev包含的所有CPU外围的硬件,它表示具有特殊属性的文件。
/etc最重要的系统配置文件在/etc这个目录中,这个目录中包含与Windows控制面板中的数据相同的数据。
/home普通用户的主目录。
/initrd一些分布信息来启动系统。不要删除!
/lib库文件,包括系统和用户所需要的各种程序的文件。
/lost + found每个分区都有一个在其上目录的lost + found。故障期间已保存的文件都在这里。
/misc杂项用途。
/ mnt标准的外部文件系统的挂载点,如CD-ROM或数码相机。
/net整个远程文件系统的挂载点的标准
/opt通常包含额外的第三方软件。
/proc一个虚拟的文件系统,其中包含有关系统资源的信息。通过在windows终端窗口中输入命令man proc获得更多信息。
/root管理用户的主目录。记住/和根目录和/root的不同,/root是 root用户的主目录。
/sbin由系统和系统管理员使用的程序。
/tmp临时空间,为系统使用,重新启动会clean掉,所以不保存任何工作!
/usr程序,库,文档等所有与用户相关的程序。
/var存储由用户创建的所有变量的文件和临时文件,如日志文件,邮件队列,打印后台处理程序区,从互联网上下载的文件的临时存储空间。

你怎么能找到的目录是在哪个分区?使用df命令与一个句点(.)可以显示当前目录所属的分区,以及这个分区上使用的空间量:

sandra:/lib> df -h .Filesystem            Size  Used Avail Use% Mounted on/dev/hda7             980M  163M  767M  18% /

作为一般规则,根目录下的每个目录都是在根分区下,除非在df的全部清单中它有一个单独的条目(或df -h没有其他选项)。

更多信息参考“man hier”

3.2 现实中的文件系统

对于大多数用户和任务管理系统来说,用树形结构来排列文件和目录是可以接受的。但是,计算机却不明白树或树形结构。
每个分区都有自己的文件系统。将所有的文件系统都以此类比,我们就能创立一个树的概 念,进而能够把整个系统包含在内,当然实际上还不止这么简单。在一个文件系统中,一个文件用一个索引节点来表示。索引是一种连串的数字其中包含了组成文件的实际数据信息:这个文件属于哪个文件夹,以及位于硬盘的哪一部分。
每个分区都有自己的索引集合,所以在有多个分区的系统中, 存在有相同的节点号的文件。

每一个inode都描述了一个存在于硬盘上的数据的特性,也储存了文件的属性,包括文件数据的物理位置。当硬盘要开始接受新的数据储存时(通常在系统安装的初始化过程中或添加额外磁盘时),在每个分区上就会创建一组索引节点。这组数字是分区上能同时存在的所有文件数量的最大值。通常每2至8千字节会对应一个节点以用于储存。

在创建一个新的文件时,它会得到一个空闲的文件索引。这个文件索引包含如下信息:

  • 文件的所有者和群组所有者。

  • 文件类型(普通,目录,...)

  • 文件的权限

  • 日期和创建的时间,最后读取和更改的时间。

  • 这个信息在文件索引中被改变的日期和时间。

  • 此文件的链接数目。

  • 文件的大小

  • 定义了文件的实际位置的地址。

文件索引中不包含的信息是文件名和目录信息。这些信息是被储存在特殊的目录文件中。通过比较文件名称和文件索引号,系统就可以组成用户可以理解的树形结构。用户通过‘ls -i’可以读出索引节点的数目。这些节点在硬盘上使用独特的储存空间。

文章转自公司wiki《酒店开发组的一千零一夜》,Qunar小伙伴可以登录wiki查看更多文章

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux服务器使用df和du查看磁盘大小不一致的问题和解决办法
Linux文件系统(二)—— Linux上三个主要文件系统(EXT2、EXT3和ReiserFS)介绍和比较
linux 硬盘满了如何处理
Redhat Linux 硬盘挂载方法!!!
linux下挂载新的虚拟磁盘
Linux常用硬盘管理命令详解!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服