Linux文件系统介绍及管理
1.文件系统层级结构FHS
当我们使用root用户登录后切换到/目录下执行ls命令。
[root@Qi1 /]# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
[root@Qi1 /]#
我们会看到在/目录下有很多目录结构
Windows:以多根的方式组织文件C:\ D:\ E:\
Linux:以单根的方式组织文件 /
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N5KTo43t-1658562415314)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
1.1/目录结构:FHS
Linux文件系统的最顶层是由根目录开始的,系统使用/来表示根目录,在根目录下的既可以是目录,也可以是文件,而每一个目录有包含子目录文件。如此组成一个庞大的文件系统,
FHS定义了Linux系统中主要目录及存放的内容,多数Linux发行版遵从FHS标准。
在FHS中,所有的(包括存储于不同物理/虚拟设备中的)文件和目录都存在于根目录/下。其中,部分目录仅当特定系统安装后才会存在。
###1.2主要目录
####1./bin
是Binary的缩写,这个目录存放着所有用户在单用户模式中必须具备的二进制命令文件。
####2./sbin
这里存放的是管理员使用的命令。
####3./home
存放普通用户的主目录。
####4./root
该目录为系统管理员,也称作超级权限着的用户主目录。
####5./lib
系统开机所需要的最基本的动态连接共享库。 /bin/和/sbin/中必须的依赖库。
6./etc
所有的系统管理所需要的配置文件和子目录。
/etc/opt 保存在/opt/中的插件包的配置资源。
/etc/sgml 处理SGML的程序(如catalogs)的配置文件。
/etc/xml 处理xml的程序(如catalogs)的配置文件。
/etc/×11 × window System, version 11 的配置文件。
/etc/bashrc 用于系统内的别名和函数。
/etc/fstab 在引导期间挂载的文件系统的标准配置文件,指定启动时需要自动安装的文件系统列表。
/etc/group 用户组基本信息,包括用户组名称,GID,用户组支持的用户帐号等信息。
/etc/gshadow 组密码文件。
/etc/passwd 用户的基本信息,包括用户的用户名,UID,GID,用户信息说明,用户的主文件夹,用户的Shell等信息
/etc/ssh 存储SSH服务配置文件。
/etc/sysconfig/network-scripts/ 存储关于网络配置的脚本文件。
/etc/sysconfig/network-scripts/ ifcg-eth33 网卡地址信息。
/etc/hosts 保存了主机名和它们的IP地址。
7./usr
只读用户的次要层次,包含大部分(多)用户功能和应用。
/usr/bin 所有用户的非必要的二进制可执行文件(在单用户模式中不需要)。
/usr/lib /usr/bin/和/usr/sbin/中的二进制文件的依赖库。
/usr/local 仅针对当前主机的,本地数据的第三个层次。一般包含其他的子目录。
/usr/sbin 非必须的系统二进制文件,如多种网络的守护进程。
/usr/share 结构独立(共享)的数据。
/usr/src 源代码,如 内核的源代码和它的头文件。
8./boot
存放的是启动Linux时使用到的一些核心文件, 包括一些连接文件以及镜像文件。
9./proc
这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息。将进程和内核信息以文件形式呈现的虚拟文件系统。
/proc /bus/ 一些总线的设备,USB的设备也记录在此。
/proc /cpuinfo 处理器信息,如类型、制造商、型号和性能,
/proc /filesystems 核心配置的文件系统信息。
/proc /dma 显示当前使用的DMA通道
10./srv
该目录存放一些服务启动之后需要提取的数据。
11./sys
包含连接到本台计算机的设备信息,
12./tmp
这个目录是用来存放一些临时文件的,通常重启后清空,并且受到严格的大小限制。
13./dev
类似于windows的设备管理器,把所有的硬件用文件的形式储存。
14./media
Linux系统会自动识别一些设备,例如U盘、光驱,Linux会把识别的设备挂载到这个目录下。
15./mnt
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以把外部的存储挂载在/mnt/上,然后进入该目录就可以查看里面的内容了。
16./opt
这是给主机额外安装软件所摆放的目录。如安装ORACLE数据库就可以放在该目录下,默认为空。
17./var
这个目录存放着不断扩充着的东西,习惯将经常被修改的目录放在这个目录下,包括日志文件。
/var/cache 应用缓存数据。这类文件由于耗时的I/O或计算而被声称在本地。应用必须能够生成或转储这些文件,以保证这些数据被删除时不会造成数据丢失。(意思就是这些东西删了不会造成不良后果)
/var/lib 状态信息。程序运行时会改变的持久化数据。如:数据库。
/var/lock Lock files.追踪当前正在使用的资源的文件。
/var/log Log files.各种日志。
/var/opt 来自保存在/opt中的插件包的可变数据。
/var/run 这个目录包含描述系统的自启动以来的系统信息数据。
在FHS 3.0中,/var/run 被/run替代。系统不应该再使用/var/run或者提供/var/run到/run的符号连接,防止出现兼容性倒退。
/var/tmp 重启时会被保存的临时数据。
18./run
运行时变量数据:从本次启动到现在的数据信息。如当前登录的用户和正在运行的守护进程。
2.Linux文件目录管理命令
2.1.常见目录的命令:mkdir
命令语法:mkdir 【选项】 文件名
命令选项
- -m --mode=模式,设定权限<模式>
- -p 递归创建目录。
- -v 每次创建目录都显示信息。
2.2.逐屏显示内容的命令more
命令语法:more 【选项】 文件名
命令选项
- -num 一次显示的行数。
- -f 计算行数时,以实际的行数,而非自动换行后的行数。
- -s 当遇到连续两行以上的空白行,就带换成一行
操作命令
- enter 向下n行,需要定义。默认为1行
- ctrl+F 向下滚动一屏
- 空格键向下滚动一屏
- ctrl+B 返回上一屏
- = 输出当前行号
- :f 输出文件名和当前行的行号
- v 调用vi编辑器
- !命令 调用shell,并执行命令
- q 退出more
2.3.将文件的内容打印到标准输出的命令 cat
命令语法:cat 【选项】
命令选项
- -n 由1开始对所有输出的行号编号。
2.4.比较文件差异的命令diff
命令语法:diff 【选项】
命令选项
- -a diff预设只会逐行比较文本文件。
- -b 不检查空格字符的不同。
- -c 显示全部内文,并标出不同之处。
- -i 不检查大小写的不同。
- -p 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
- -r 表较子目录中的文件。
- -S 在比较目录时,从指定的文件开始比较。
- -y 以并列的方式显示文件的异同。
2.5.过滤文本的命令 grep
命令语法:grep 【选项】 查找内容,源文件
命令选项
- -n 显示匹配行及行号。
- -i 忽略字母大小写。
- -o 仅显示匹配到的字符串本身。
- -v 显示不能被匹配到的行。
- -E 支持使用扩展的正则表达式元字符。
grep命令一般与管道符“|”一起使用,管道符“|”表示前一个命令的处理结果输出传递给后面的命令处理。
基本正则表达式元字符:
分为四种:字符匹配,匹配次数,位置锚定,分组及引用
字符匹配:
- . :匹配任意单个字符
- [] :匹配指定范围内的任意单个字符。
- [^]:匹配指定范围外的任意单个字符。
- 脱字符 [:digit:]、数字[:lower:]、小写字母[:upper:]、大写字母[:alpha:]所有字母、数字和字母[:alnum:]、所有标点符号[:punct:]、空格[:space:]
匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数。
- *:匹配其前面的字符任意次:0,1,多次;
- .*:匹配任意长度的任意字符;
- \?:匹配器前面的字符0次或1次,其前面的字符是可有可无的。
- \ +:匹配其前面的字符出现1次或多次,即其前面的字符最少出现一次。
位置锚定:
- ^:行首锚定,用于模式的最左侧。
- $:行尾锚定,用于模式的最右侧。
- ^$:空白行。
- ^ [[:space:]]*$:空行或包含空白字符的行。
分组及引用:
- \(\):将一个或多个字符捆绑在一起,当作一个整体进行处理
- \(xy\)*ab : 命令行中括号有特殊意义所以用转义符\
2.6.rm命令,删除某个目录及所有文件及子目录
命令语法:rm 【选项】 文件
命令选项
- -f 强制删除,忽略不存在的文件,从不给提示。
- -i 交互式删除文件,删除时给出提示。
- -r 递归删除目录下面文件以及子目录下的文件。
- -v 显示运行时详细信息。
2.7.创建空文件的命令touch
命令语法:touch 【选项】 文件
命令选项
- -a 只修改文件的访问时间。
- -c 不创建不存在的文件。
- -t 将时间修改为参数指定的日期。
2.8.显示文件类型的命令 file
命令语法:file 【选项】 文件
命令选项
- -f 列出文件中文件名的文件类型。
- -L 查看对应软链接对应文件的文件类型。
- -z 尝试去解读压缩文件的内容。
2.9.拷贝文件或目录的命令 cp
命令语法:cp 【选项】 文件
命令选项
- -f 强制覆盖目标文件。
- -r 递归辅助目录。
- -d 赋值符号链接文件本身,而非其指向的源文件。
- -p 保留源文件或目录的属性,包括所有者、所属组、权限和时间。
2.10.在指定的路径下查找指定文件的命令find
命令语法:find 【选项】 【查找起始路径】 【查找条件】 【处理动作】
查找起始路径:指定具体搜索目标起始路径;默认为当前目录。
查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等;默认为找出指定路径下的所有文件。
处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出。
根据文件名查找:
-name 支持glob风格的通配符
-regex 基于正则表达式模式查看文件,匹配的是整个路径,而非其名。
根据文件从属关系查找:
-
-user 文件属主来找
-
-group 文件所属组来找
-
-uid 查找属主指定的uid的所有文件。
-
-gid 查找属组指定的gid的所有文件。
-
-nogroup 查找无有效所属组的文件
-
-nouser 查找无有效所属者的文件
根据文件类型查找:-type
文件类型选项:
- f 普通文件;
- d 目录文件;
- l 链接文件;
- b 块设备文件;
- c 字符设备文件;
- p 管道文件;
- s 套接字文件。
组合测试:
- 与:-a 默认组合逻辑
- 或:-o
- 非:-not , !
根据文件大小查找: -size
常用单位:k ,M ,G
根据时间戳查找:
- 以天为单位: -atime ;-mtime ;-ctime
- 以分钟为单位:-amin;-mmin ;-cmin
根据权限查找:-perm [/ | -]mode
mode:精确权限匹配
/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足。
9位权限之间存在“或”关系。
-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)符合条件即满足。
9位权限之间存在“与”关系。
处理动作:
- -print 输出至标准输出;默认的动作。
- -ls 类似于对查找的文件执行ls -l命令,输出文件的详细信息。
- -delete 删除查找到的文件。
- -fls 把查找的所有文件的长格式信息保存至指定文件中。
2.11.文件/目录改名或移动mv
命令语法:
- 重命名: mv 【选项】 源文件 新文件
- 移动并重命名: mv 【选项】 /目录/文件 /另一个目录/文件
- 移动整个目录: mv 【选项】 /目录/子目录 /另一目录/子目录
命令选项
- -b 当文件存在时,先进行备份再覆盖
- -f 当目标文件存在时,强制覆盖。
- -t 先指定目标,再指定源文件。
##3.Linux文件系统之inode,block,superblock
3.1 inode,block,superblock相关介绍
文件储存在硬盘上,硬盘的最小存储单位叫做==“扇区”(Sector)==。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
Linux文件系统可以简单分为inode table和data area,inode table中存有inode,每个inode中记录了文件的元数据。
文件系统通常会将权限与属性放置在inode中,实际的内容放置在data block区块中。另外,还有一个超级区块(superblock)会记录整个文件的整体信息,包括inode与block的总量、使用量、剩余量等。
3.2 inode详解
-
inode 中包含文件的元数据,可以通过stat命令查看文件的元数据。
-
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。每个inode节点的大小,一般是128字节或256字节。
-
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。(使用ls -i命令,可以看到文件名对应的inode号码)
3.3inode的特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
-
有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
-
移动文件或重命名文件,只是改变文件名,不影响inode号码。
-
打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
##4.硬链接和软链接
4.1 硬链接
一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为硬链接(hard link)。
ln命令可以创建硬链接
ln命令基本语法:ln 源文件 目标文件
运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。
硬链接知识小结:
- 具有相同inode节点号的多个文件互为硬链接文件
- 删除硬链接文件或者删除原文件任意之一,文件实体并未被删除。
- 只有删除了源文件及所有对应的硬链接文件,文件实体才会删除。
- 硬链接文件就是文件的另一个入口。
- 可以通过给文件设置硬链接文件,来防止重要文件被删除。
4.2软链接
除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的“软链接”(soft link)或者"符号链接(symbolic link)。
这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:“No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。
ln -s命令可以创建软链接。
基本语法:ln -s 源文文件或目录 目标文件或目录
软链接知识小结:
- 软链接类似于Windows的快捷方式。
- 软链接类似一个文本文件,里面存放的是源文件的路径,指向源文件实体
- 删除源文件,软连接文件依然存在,但无法访问指向的源文件路径内容
- 软链接与源文件是不同类型的文件,也是不同的文件,inode号也不相同
5.Linux文件删除原理
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link时,这个文件才会被删除。一般来说,每个文件都有两个link计数器:i_count和i_nlink。
i_count的意义时当前文件使用者(被调用)的数量,i_nlink的意义时介质连接的数量(硬链接的数量)。当一个文件被某一个进程引用时,对应的i_count数就会增加;当创建文件的硬连接的时候,对应的i_nlink 数就会增加。
所以删除文件时,只有当i_count 和 i_nlink都为0的时候这个文件才会被真正的删除。
6.Linux文件处理工具
6.1 cut ,数据剪切
命令语法:cut 【选项】 文件
命令选项:
- -b 以字节为单位切割。
- -c 以字符为单位切割。
- -d 自定义分隔符,默认为制表符。
- -n 取消分割多字节字符。仅和-b一起使用
6.2 sort 用于字段排序
命令语法:sort 【选项】 文件
命令选项:
- -f 忽略大小写的差异。
- -b 忽略最前面的空格符部分。
- -n 使用纯数字进行排序。
- -r 反向排序。
- -u 去重
- -t 分隔符,默认tab键来分割
- -k 以那个区间(field)来进行排序的意思
- -o 将结果写入到文件而非标准输出
6.3 uniq 去重,
命令语法:uniq 【选项】 …
uniq命令可以去除排序过的文件的重复行,因此经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须时相邻的。
命令选项:
- -c 在每行前面加上表示想应行且出现次数的前缀编号。
- -d 只输出重复的行。
- -D 显示所有重复的行。
- -i 在比较时不区分大小写。
- -u 至现时唯一的行
- -f 比较时跳过前N列
- -w 对每行第N个字符以后的内容不做对照。