四、linux文件系统
一切皆文件
4.1linux文件系统及目录结构
多数linux的系统目录划分按照的是FHS标准,该标准规定了linux系统中每个二级目录的用途
以下是对这些目录的解释:
- /bin 存放最常用的命令
- /boot 存放启动linux的核心文件
- /dev 存放外部设备
- /home 存放系统管理所需的配置文件和子目录
- /lib 存放动态链接共享库
- /lost+found 一般为空目录,当系统非法关机时,这里会存放一些文件
- /media 自动挂载外部设备
- /mnt 手动挂载
- /opt 安装软件的目录
- /proc 系统内存的映射
- /root 管理员目录
- /sbin 系统管理员使用的系统管理程序
- /srv 存放一些服务启动后需要提取的数据
- /sys 文件系统存放目录
- /tmp 存放临时文件
- /usr 存放用户的应用程序和文件
- /usr/bin 系统用户使用的应用程序
- /usr/sbin 超级用户使用的管理程序所在的目录
- /usr/src 内核源代码默认放置目录
- /var 存放日志文件
4.2 linux常见的文件系统
Ext、Ext2、Ext3、Ext4、xfs、swap、NFS、iso9660、
fat、vfat、NTFS、ufs、proc、sysfs、tmpfs
4.3 inode、block、superblock
4.3.1inode是linux文件系统的基础
磁盘的自小存储单位是扇区(sector),操作系统在读取硬盘中的数据时,并不是单一扇区进行读取,而是一次性读取多个扇区,即一次性读取一块数据,这种扇区组成的块(block),是文件的最小存储单位,最常见的块大小为4KB,约为8个连续的扇区组成(每个扇区存储512字节)。一个文件可能会占用多个block,但是一个块只能存放一个文件
linux系统可以简单的分为inode table和data area,inode记录着文件的元数据,所以说inode是独一无二的,每个文件都有一个inode,文件实际内容存储在data block区块中,而硬盘中还有一个超级区块(superblock),超级区块回纪录整个文件系统的整体信息,比如:indoe和block的总量,使用量,剩余量等
inode包含的信息有以下:
- 文件的类型
- 文件的访问权限
- 文件的所有者与组
- 文件的大小
- 链接数,即指向inode的文件名总数
- 文件的状态改变时间(ctime)、最近访问时间(atime)和最近修改时间(mtime)
- 文件特殊属性,SUID、SGID和SBIT
- 文件内容的真正指向
如果发生inode已用光的情况,则无法在硬盘上创建新文件,即使磁盘还未存满
NO space left on device ##磁盘空间已满
inode爆满如何解决
在服务器上有时存在许多日志文件,这些日志文件可能记载着用户信息而不能删除,这时因为占用太多节点号而使磁盘还有盈余但是却无法创建新文件,我们可以使用tar打包命令把它们打包为一个文件而使他们只占用一个节点号
有时也会有许多已经不重要的小文件,这是我们可以删除掉这些文件来释放inode,如果用rm -rf 直接删除基本是行不通的,会显示
Argument list too long ##参数列表过长
删除的文件太多了
我们可以使用组合命令,例如
find . -ctime +7 -name "*" |xargs -i rm -rf {}
这条命令的意思为,删除当前目录下7天前所有数据,如果还报出参数列表过长就把时间调前一些,比如30天前 -ctime +30
4.3.2 block
存储着文件的实际内容,block对的大小可以自己设定
若文件太大,则一个文件会占用多个block,文件读取效率会降低
若文件很小,而block又打,则block剩下的空间将会浪费,磁盘利用率会降低
4.3.3 superblock
记录着文件的整体信息,包括inode和block的总量,使用量,剩余量等信息
4.3.4文件读取流程
首先,系统会找到文件名对应的inode号码
其次,通过inode号码,获取inode信息
最后,根据inode信息,找到文件数据所在的block,读出数据
4.4 硬链接,软链接
4.4.1硬链接
一般情况下一个文件只有一个inode号,但是linux系统允许多个文件名指向同一个inode号码,我们可以用不同的文件名访问同样的内容;对文件进行修改,会影响到所有文件名;但是删除其中一个文件名不影响另一个文件名的访问,这种情况就被称为"硬链接"(hard link)
ln 源文件 目标文件 ##创建硬链接
可以看到file3和file4节点号是相同的
4.4.2软链接
软链接类似于硬链接,但是相比于硬链接,软链接使用的是不同的节点号;软链接依赖于源文件,当我们删除了源文件,软链接则会报错
ln -s 源文件 目标文件 ##创建软链接
可以看到file5指向file3,这是我们删除file3
发现file5变红,使用cat 查看file5和file4
可以正常查看file4但是显示file5不存在
4.5文件删除原理
linux是通过link的数量来删除文件的,只有当一个文件不存在任何的link时,文件才会被删除,一般来说,每个文件都会有两个link计数器:i_count和i_nlink
i_count:当前文件被调用的次数(内存计数器)
i_nlink:当前文件硬链接的数量(磁盘引用计数器)
rm命令原理:
通过rm删除命令删除文件,实际上就是减少文件的磁盘引用计数i_nlink的数量(即硬链接的数量)
4.6文本处理工具命令
4.6.1grep
grep用于进行文件搜索,使用格式为 grep [选项] 参数 文件名
常用选项:
- -a 全部文件,不忽略二进制数据
- -d 查找目录
- -i 忽略字符大小的差别
- -l 列出符合文件内容的文件名称
- -q 不显示任何信息
- -v 反转查找
- -V 显示版本信息
- -w 只显示全字符合的列
- -x 只显示全列符合的列
常用参数:
- ^ 锚定行的开始
- $ 锚定行的结束
- . 匹配一个非换行符的字符
- * 匹配任意数量的先前字符
- .* 匹配任意字符
- [] 匹配一个指定范围内的字符
- [^] 匹配一个不在指定范围内的字符
- \(..\) 标记匹配字符
- \< 锚定单词的开始
- \> 锚定单词的结束
- x\{m\} 重复字符x,m次
- x\{m,\} 重复字符x,至少m次,
- x{m,n\} 重复字符x,至少m次,不多于n次
- \w 匹配文字和数字字符[A-Z a-z 0-9]
- /w 匹配一个或多个非单词字符
- \b 单词锁定符 只匹配
POSIX字符
- [:alnum:] 文字数字字符
- [:alpha:] 文字字符
- [:digit:] 数字字符
- [:graph:] 非空字符
- [:lower:] 小写字符
- [:cntrl:] 控制字符
- [:print:] 非空字符(包括空格)
- [:punct:] 标点符号
- [:space:] 所有空白字符(新航,空格,制表符)
- [:upper:] 大写字符
- [:xdigit:] 十六进制数字(0-9、a-f、A-F)
4.6.2cut
cut用于截取文本,处理的对象是一行文本,使用格式
cut -f 显示的列数 -d '分割符' ## -f后跟逗号 表示具体的哪一列 用-连接表示范围 -f 1,3 表示截取第一行和第三行 -f 1-3 表示截取1到3行
参数
- -b 以字节为单位进行分割
- -c 以字符为单位进行分割
- -d 自定义分割符,默认为制表符
- -f 与-d一起使用,指定显示哪个区域
- -n 取消分割多字节字符,仅和-b 标志一起使用
4.6.3 sort
sort命令用于将文本内容加以排序,sort可针对文本文件的内容,以行为单位来排序,shell种sort命令有三种模式,分别是排序文本,检查文件是否已经排序,合并文件
使用格式 sort [选项] 文件名
选项:
- -f 忽略大小写
- -b 忽略每行前面的空白部分
- -n 以数值型进行排序,默认使用字符串排序
- -r 反向排序
- -u 删除重复行,就是uniq命令
- -t 指定分隔符,默认分隔符是制表符
- -k [n,m] 按照指定的字段范围排序,从第n个字段开始,到第m个字
4.6.4 uniq
uniq命令用于检查及删除文本文件中重复出现的行列,一般与sort命令结合使用。使用格式
uniq [选项] 参数 文本文件
选项:
- -c 在每行开头增加重复次数
- -d 所有临近重复行只被打印一次
- -D 所有临近重复行全部打印
- -i 忽略大小写差异
- -s 跳过对前n个字符的比较
- -u 只打印费邻近的重复行
- -w 只对每行前n个字符进行比较
4.6.5 wc命令
wc命令用于统计指定文件中的字节数、字数、行数,并将统计结果显示输出
使用格式 wc [-选项] 文件名
选项:
- -c 统计字节数
- -l 统计行数
- -m 统计字符数,不能与-c一起使用
- -w 统计字数
- -L 打印最长行的长度
4.6.6 paste
paste 命令用于合并文件,合并格式为以列对列,一列列合并,
使用格式 paste [选项] 文件1 文件2
常用选项:
- -d 改用指定列表里的字符替代制表分割符
- -s 不使用平行的行目输出模式,而是每个文件占用一行
4.6.7 tr
tr命令只要用于删除文件中的控制字符或进行字符替换,使用格式 tr [-选项] [参数] 字符串1 字符串2
选项:
- -c 用字符串1中字符集的补集替换此字符集
- -d 删除字符串1中的所有字符
- -s 删除所有重复出现的字符序列,只保留一个
4.7 文件搜索命令
4.7.1 which
which 可以查看某个系统命令是否存在,以及命令所在位置,所以它只适用于二进制命令
使用格式 which 命令名称
4.7.2 whereis
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)、源代码文件(参数-s)如果省略参数,则返回所有信息
使用格式 whereis [-选项] [参数]
4.7.3 locate
locate命令用于查找符合条件的文档,查找文件或目录,locate要比find -name 快得多,因为它不搜索具体目录,而是搜索一个数据库 、var/lib/mlocate/mlocate.db 这个数据库中含有本地文件所有文件信息,linux系统自动创建这个数据库,并且每天更新一次,因此用whereis和locate查找文件时,有时会找到已经被删除的数据
使用格式 locate [-选项] 文件名
注意使用locate前需要下载该命令
[root@localhost /]# yum install mlocate -y
再使用命令 updatedb 更新数据库才可以使用locate
4.7.4 find
find 命令用来在指定目录下查找文件。find 命令具有很大的灵活性,可以向其指定丰富的搜索条件(如文件权限、属主、属组、文件类型、日期、大小等)来定位系统中的文件和目录
使用格式 find [路径] [选项] [操作]
选项:
- -name 根据文件名查找
- -perm 根据文件权限查找
- -user 根据文件属主查找
- -group 根据文件属组查找
- -mtime -n/+n 根据文件更改时间查找
- -newer file1 !file2 查找更改时间比file1新但是比file2旧的文件
- -type 按文件类型查找
- -size -n/+n 按文件大小查找
- -mindepth n 从n级子目录开始搜索
- -maxdepth n 最多搜索到n级子目录
逻辑运算符
-a 与
-o 或
-not | ! 非