一、文件系统
文件系统(File System)是磁盘上有特定格式的一片区域,操作系统利用文件系统保存和管理文件。
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。
Linux系统支持数十种的文件系统,而最常见的文件系统如下所示。
(1)Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
(2)Ext4:Ext3的改进版本,作为RHEL 6系统中的默认文件管理系统,它支持的存储容量高达1EB(1EB=1 073 741 824GB),且能够有无限多的子目录。另外,Ext4文件系统能够批量分配block块,从而极大地提高了读写效率。
(3)XFS:是一种高性能的日志文件系统,而且是RHEL 7中默认的文件管理系统。它的优势在发生意外宕机后显得尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。它最大可支持的存储容量为18EB,这几乎满足了所有需求。
[root@rhel7-lzq-01 ~]# df -T 文件系统 类型 1K-块 已用 可用 已用% 挂载点 /dev/sda2 xfs 9754624 101720 9652904 2% / devtmpfs devtmpfs 918820 0 918820 0% /dev tmpfs tmpfs 933524 0 933524 0% /dev/shm tmpfs tmpfs 933524 25648 907876 3% /run tmpfs tmpfs 933524 0 933524 0% /sys/fs/cgroup /dev/sda5 xfs 7801856 3104784 4697072 40% /usr /dev/sda3 xfs 7801856 37976 7763880 1% /home /dev/sda6 xfs 7801856 172984 7628872 3% /var /dev/sda1 xfs 289444 159608 129836 56% /boot /dev/mapper/rhel_rhel7--01-tmp xfs 975524 33068 942456 4% /tmp tmpfs tmpfs 186708 36 186672 1% /run/user/0 /dev/sr0 iso9660 3963760 3963760 0 100% /run/media/root/RHEL-7.4 Server.x86_64
RHEL 7系统中一个比较大的变化就是使用了XFS作为文件系统,XFS文件系统可支持高达18EB的存储容量。
日常在硬盘需要保存的数据实在太多了,因此Linux系统中有一个名为super block的“硬盘地图”。Linux只是把每个文件的权限与属性记录在inode中,而且每个文件占用一个独立的inode表格。该表格的大小默认为128字节,里面记录着如下信息。
- 该文件的访问权限(read、write、execute)。
- 该文件的所有者与所属组(owner、group)。
- 该文件的大小(size)。
- 该文件的创建或内容修改时间(ctime)。
- 该文件的最后一次访问时间(atime)。
- 该文件的修改时间(mtime)。
- 文件的特殊权限(SUID、SGID、SBIT)。
- 该文件的真实数据地址(point)。
拓展知识:文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个block。
文件数据都储存在“块”中,那么很显然,我们还必须找到一个地方储存文件的“元信息”,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点“。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
[root@rhel7-lzq-01 ~]# xfs_info /dev/sda5 meta-data=/dev/sda5 isize=512 agcount=4, agsize=488256 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=1953024, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
dumpe2fs /dev/sda1 # tune2fs和dumpe2fs只能打开ext3/ext4等文件类型
文件的实际内容则保存在block块中(大小可以是1KB、2KB或4KB),一个inode的默认大小仅为128B(Ext3),记录一个block则消耗4B。当文件的inode被写满后,Linux系统会自动分配出一个block块,专门用于像inode那样记录其他block块的信息,这样把各个block块的内容串到一起,就能够让用户读到完整的文件内容了。
对于存储文件内容的block块,有下面两种常见情况(以4KB的block大小为例进行说明)。
- 情况1:文件很小(1KB),但依然会占用一个block,因此会潜在地浪费3KB。
- 情况2:文件很大(5KB),那么会占用两个block(5KB-4KB后剩下的1KB也要占用一个block)。
[root@rhel7-lzq-01 ~]# stat anaconda-ks.cfg 文件:"anaconda-ks.cfg" 大小:1704 块:8 IO 块:4096 普通文件 设备:802h/2050d Inode:16816723 硬链接:1 权限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root) 环境:system_u:object_r:admin_home_t:s0 最近访问:2024-09-09 19:16:17.438645964 +0800 最近更改:2024-09-09 19:13:04.498062870 +0800 最近改动:2024-09-09 19:13:04.498062870 +0800 创建时间:- [root@rhel7-lzq-01 ~]#
[root@rhel7-lzq-01 ~]# ls -i 16816723 anaconda-ks.cfg 8405783 公共 8405786 视频 16816731 文档 25167608 音乐 16816729 initial-setup-ks.cfg 138 模板 139 图片 25167607 下载 16816730 桌面
二、虚拟文件系统
计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写入文件时不用关心底层的硬盘结构,Linux内核中的软件层为用户程序提供了一个VFS(Virtual File System,虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。VFS的架构示意图如下。
编辑
三、Linux文件系统目录结构
在Linux系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件:Linux系统中一切都是文件。想要找到一个文件,我们要依次进入该文件所在的磁盘分区(假设这里是D盘),然后在进入该分区下的具体目录,最终找到这个文件。
在Linux系统中并不存在C/D/E/F等盘符,Linux系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(Filesystem Aierarchy Standard,FHS)采用树形结构来存放文件,以及定义了常见目录的用途。
Linux系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、rooT均代表不同的目录,并且文件名称中不得包含斜杠(/)。Linux系统中的文件存储结构如下图所示。
编辑
在Linux系统中,最常见的目录以及所对应的存放内容如下表所示。
目录名称 | 应放置文件的内容 |
/ | Linux文件的最上层根目录 |
/boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
/dev | 以文件形式存放任何设备与接口 |
/etc | 配置文件 |
/home | 用户家目录 |
/bin | Binary的缩写,存放用户的可运行程序,如ls、cp等,也包含其他shell,如bash和cs等 |
目录名称 | 应放置文件的内容 |
/lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 |
/sbin | 开机过程中需要的命令 |
/media | 用于挂载设备文件的目录 |
/opt | 放置第三方的软件 |
/root | 系统管理员的家目录 |
/srv | 一些网络服务的数据文件目录 |
/tmp | 任何人均可使用的“共享”临时目录 |
/proc | 虚拟文件系统,如系统内核、进程、外部设备及网络状态等 |
/usr/local | 用户自行安装的软件 |
/usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 |
/usr/share | 帮助与说明文件,也可放置共享文件 |
/var | 主要存放经常变化的文件,如日志 |
/lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
四、Linux文件权限
文件是操作系统用来存储信息的基本结构,是一组信息的集合。文件通过文件名来唯一地标识。Linux中的文件名称最长可允许255个字符,这些字符可用A~Z、0~9、.、_、-等符号来表示。
与其他操作系统相比,Linux没有“扩展名”的概念,也就是说文件的名称和该文件的种类并没有直接的关联。它的另一个特性是Linux文件名区分大小写。
在Linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。通过设定权限可以从以下3种访问方式限制访问权限。
- 只允许用户自己访问。
- 允许一个预先指定的用户组中的用户访问。
- 允许系统中的任何用户访问。
根据赋予权限的不同,3种不同的用户(所有者、用户组或其他用户)能够访问不同的目录或者文件。所有者是创建文件的用户,文件的所有者能够授予所在用户组的其他成员以及系统中除所属组之外的其他用户的文件访问权限。每一个用户针对系统中的所有文件都有它自身的读、写和执行权限。
- 第一套权限控制访问自己的文件权限,即所有者权限。
- 第二套权限控制用户组访问其中一个用户的文件的权限。
- 第三套权限控制其他所有用户访问一个用户的文件的权限。
这三套权限赋予用户不同类型(即所有者、用户组和其他用户)的读、写及执行权限,就构成了一个有9种类型的权限组。
我们可以用“ls -l”或者ll命令显示文件的详细信息,其中包括权限。如下所示:
编辑
文件属性示意图:
编辑
文件各种属性信息:
每一行的第一个字符一般用来区分文件的类型,一般取值为d、-、l、b、c、s、p。具体含义如下。
d:表示是一个目录,在ext文件系统中目录也是一种特殊的文件。
-:表示该文件是一个普通的文件。
l: 表示该文件是一个符号链接文件,实际上它指向另一个文件。
b、c:分别表示该文件为区块设备或其他的外围设备,是特殊类型的文件。
s、p:这些文件关系到系统的数据结构和管道,通常很少见到。
五、使用数字表示法修改权限
通常在权限修改时可以用两种方式来表示权限类型:数字表示法和文字表示法。
chmod命令的格式是:
chmod 选项 文件
所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以数字4、2、1来表示,没有授予的部分就表示为0,然后再把所授予的权限相加而成。
以数字表示法修改权限的例子:
原 始 权 限 | 转换为数字 | 数字表示法 |
rwxrwxr-x | (421) (421) (401) | 775 |
rwxr-xr-x | (421) (401) (401) | 755 |
rw-rw-r-- | (420) (420) (400) | 664 |
rw-r--r-- | (420) (400) (400) | 644 |
1.文字表示法
使用权限的文字表示法时,系统用4种字母来表示不同的用户。
u:user,表示所有者。
g:group,表示属组。
o:others,表示其他用户。
a:all,表示以上3种用户。
使用下面3种字符的组合表示法设置操作权限。
r:read,可读。
w:write,写入。
x:execute,执行。
操作符号包括以下几种。
+:添加某种权限。
-:减去某种权限。
=:赋予给定权限并取消原来的权限。
例子:
[root@RHEL7-1 ~]# chmod u=rw,g=rw,o=r /etc/file
小小案例,带你飞一下~!
假如我们要“设定”一个文件filesystem.text(没有的话可以自己创建文件)的权限为-rwxr-xr-x时,所表述的含义如下。
user (u):具有可读、可写、可执行的权限。
group与others (g/o):具有可读与执行的权限。
执行结果如下:
[root@rhel7-lzq-01 opt]# touch filesystem.text [root@rhel7-lzq-01 opt]# ll 总用量 8 -rw-r--r--. 1 root root 0 10月 28 10:46 filesystem.text drwxr-xr-x. 2 root root 19 9月 20 14:28 linux01 drwxr-xr-x. 2 root root 6 3月 9 2015 rh -rw-r--r--. 1 root root 15 10月 8 13:26 shuqing.log -rw-r--r--. 1 root root 2053 10月 8 13:28 tmp.log [root@rhel7-lzq-01 opt]# chmod u=rwx,go=rx filesystem.text [root@rhel7-lzq-01 opt]# ls -al filesystem.text -rwxr-xr-x. 1 root root 0 10月 28 10:46 filesystem.text
假如设置-rwxr-xr--这样的权限又该如何操作呢?可以使用“chmod u=rwx, g=rx,o=r filename”来设定。此外,如果不知道原先的文件属性,而想增加filesystem.text文件的所有人均有写入的权限,那么可以使用如下命令:
[root@rhel7-lzq-01 opt]# ls -al filesystem.text -rwxr-xr-x. 1 root root 0 10月 28 10:46 filesystem.text [root@rhel7-lzq-01 opt]# chmod a+w filesystem.text [root@rhel7-lzq-01 opt]# ls -al filesystem.text -rwxrwxrwx. 1 root root 0 10月 28 10:46 filesystem.text [root@rhel7-lzq-01 opt]#
如果要将权限去掉而不改动其他已存在的权限呢?例如,要去掉所有人的可执行权限,则可以使用如下命令:
[root@rhel7-lzq-01 opt]# ls -al filesystem.text -rwxrwxrwx. 1 root root 0 10月 28 10:46 filesystem.text [root@rhel7-lzq-01 opt]# chmod a-x filesystem.text [root@rhel7-lzq-01 opt]# ls -al filesystem.text -rw-rw-rw-. 1 root root 0 10月 28 10:46 filesystem.text [root@rhel7-lzq-01 opt]#