文件系统是操作系统中的负责控制硬盘的一个软件。
文件系统的运行主要与三部分有关:inode区
、block区
、和superblock
inode
,inode
是一种数据结构,记录文件的属性,一个文件占用一个inode
,指向存放文件数据的block
在实际的操作系统中,单一的文件系统区块并不容易管理,所以一个文件系统包含了很多个区块,每个区块包含单独的inode
和block
以及对照表,形成一个block group
。
文件和目录的数据都是存放在block块中的,文件的block块存放的是文件数据,目录的block块存放的是文件名/目录名
和文件名/目录名
所在的inode
编号。
stat
inode中存放的是文件或目录的属性,即权限,属主,属组,大小,类型等信息,这些信息也称为元数据。
使用 stat [文件/目录]
命令可以查看文件或目录的元数据,其中除了基本属性之外,还包括三种时间属性
1 | ctime: 无论是修改文件的元数据还是修改文件内容,都会更新。 |
df
使用 df -Th
命令可以查看文件系统信息,包含文件系统类型,block块总容量、已用容量、可用容量、挂载目录等。(disk-free
)
使用 df -i
命令可以查看inode块的总量和剩余用量。
1 | while true; do df -i; sleep 0.5; clear; done; # 动态查看inode块使用变化 |
磁盘满了有两种情况,一种是inode号用完了,另一种是磁盘空间用完了,可以通过这两个命令查看。
lsblk
使用 lsblk -a
命令可以查看磁盘中目录信息,使用 lsblk -f
m命令可以查看磁盘中文件系统相关信息。(list-block
)
查看文件系统详细信息:dumpe2fs
使用 dumpe2fs -h [路径]
命令可以查看文件系统的详细信息,包括超级块的信息,包括文件系统名称、已使用以及未使用的 inode 和 block 的数量、每个 block 和 inode 的大小,文件系统的挂载时间等。-h
选项表示只显示超级块的信息。[路径]需要是文件系统的挂载点。
查看xfs文件系统信息:xfs_info
使用 xfs_info [路径]
可以查看xfs文件系统的详细信息,[路径]需要是文件系统的挂载点。
查看设备的UUID:blkid
UUID 是全域单一识别码 (universally unique identifier),使用 blkid
可以显示设备的 UUID和文件系统类型
查看磁盘分区类型及分区信息:parted
使用parted [设备名] print
可以查看磁盘的分区表类型以及分区信息。
文件系统读取一个文件数据的流程:
1 | 先通过挂载点的信息找到根目录的inode编号,然后访问inode, 链接到根目录的block块,访问block得知下一层目录的inode编号,访问inode,链接到再下一层目录的block块,在此block块中找到再下一层目录的inode编号,然后访问inode,再链接到下一层目录的block块…… 直到链接到的block是文件的block块。 |
软链接
1 | ln -s [源路径] [目标路径] |
软链接又称为符号链接,相当于Windows系统的快捷方式,有自己的文件属性及权限等。软链接包含原文件的路径信息,指向原文件。
创建软链接不会增加原文件的链接数。
删除原文件,则软链接变成了一个死链接。
硬链接
1 | ln [源路径] [目标路径] |
硬链接相当于给原文件起了一个别名,与原文件具有相同的inode号及data block。
不能对目录创建硬链接,只能对文件创建。
特性 | 软链接 | 硬链接 |
---|---|---|
本质 | 与原文件不是同一个文件 | 与原文件是同一个文件 |
跨设备 | 支持 | 不支持 |
inode | 不同 | 相同 |
链接数 | 不变 | 变化 |
文件夹 | 支持 | 不支持 |
删除原文件 | 无法访问 | 链接数减一,正常访问 |
文件类型 | 链接文件 | 与原文件相同 |
文件大小 | 文件路径的长度 | 和原文件相同 |
针对磁盘满了的两种情况,如果是inode号用完,需要清理文件。如果磁盘空间用完了,则需要扩容。
以下是给服务器扩容并且创建文件系统的方法。
给虚拟机添加一块硬盘,使用
lsblk
命令可以查看到新添加磁盘的设备名,可以看到并没有挂载任何目录
给新分区创建一个文件系统,使用
mkfs.文件系统类型 设备名
命令可以创建一个新文件系统,.
之后接文件系统的类型,比如xfs,ext4等。可设置其他文件系统参数,参照mkfs
的命令手册。
使用
mount 分区名 目录
命令挂载到一个目录上。使用umount 分区名
可以解除一个分区的挂载。
这种情况是给虚拟机添加了一个整体分区,分区表为loop类型,但是实际上很少使用。更加常用的磁盘分区将在后面章节介绍
具体用法:
1 | find [路径] [-options] '表达式' |
按照文件名:-name
1 | find /etc -name "ifcfg-ens33" # 在 /etc 目录下寻找文件名为 ifcfg-ens33 的文件 |
按照文件大小-size
:
1 | find /etc -size +3M # 在/etc目录下寻找文件大小大于3M的文件 |
指定查找的目录深度:-maxdepth
1 | find / -maxdepth 3 -name "ifcfg-ens33" # 在根目录下寻找文件名为 ifcfg-ens33 的文件,最多寻找三层 |
按照时间查找:-mtime,-ctime,-atime
1 | find /etc -mtime +3 # 修改时间超过三天 |
按文件的属主、属组找:-user,-group
1 | find /etc -user dengpangpang # 属主是dengpangpang的文件 |
按文件类型找:-type
1 | find /etc -type f # 普通文件 |
多条件的”和”与”或”:-a
和-o
1 | 并列的多个条件时,-a表示逻辑与,-o表示逻辑或,没有这两个选项,默认是-a |
find
命令结合xargs
1 | find /etc -nouser -o -nogroup | xargs rm -rf # 利用管道符找到文件并删除, rm-rf 原生并不支持管道符,需要加 xargs |
下载文件到本地:wget
1 | wget -O [路径] URL |
测试能否下载:curl
1 | curl -o [路径] URL |
把Linux设备上的文件传输到Windows设备:sz
1 | sz [路径] # 需要事先安装lszrz包,receive zmodem,zmodem是一种传输协议 |
把Windows设备上的文件传输到Linux设备上:rz
1 | rz [路径] # send zmodem |
覆盖输出:内容 > 文件
1 | 把产生的内容覆盖到文件中 |
追加输出:内容 >> 文件
1 | 把产生的内容追加到文件中 |
区分内容是否正确:0:标准输出;1: 标准正确输出;2:标准错误输出
1 | 1和2可以把正确和错误的内容分别输出到不同的文件中 |
不区分内容是否正确:&
1 | ifconfig ensxx &> a.txt # 不区分内容是否正确,全都输出到a.txt中 |
输出到文件中并且打印到屏幕上:tee
1 | ifconfig | tee a.txt |
从文件输入:<
1 | cat > a.txt < /etc/hostname # 把文件的内容输入到a.txt中 |
从键盘输入:<<
1 | cat > a.txt << EOF # 把键盘的内容输入到a.txt中 |
排序 :sort
1 | sort [文件] # 按照文本文件的每行首字母的ASCII顺序升序排序 |
1 | sort -t ":" -k2 [文件] # -t ":" 表示将文本文件的每行内容按照 : 分段,-k2 代表按照第二段的首字母排序 |
1 | sort -t ":" -k2 -n [文件] # -n 表示将每行的第二段看作一个整数,按照整数的自然数大小排序升序排序 |
1 | sort -t ":" -k2 -n -r [文件] # -n 表示将每行的第二段看作一个整数,-r 表示按照整数的自然数大小排序降序排序 |
去重:uniq
1 | uniq [文件] # 将文本文件中重复的行删除,即去重 |
1 | uniq -c [文件] # -c 表示在每行的行首,将每行重复的次数显示出来 |
1 | uniq -d [文件] # -d 表示只显示重复的行 |
1 | uniq -u [文件] # -u 表示只显示不重复的行 |
1 | uniq通常与sort联用,排序后去重 |
分割文件:cut
1 | cut -d ":" -f1 [文件] # -d ":" 表示以 : 为分隔符,-f1 表示显示第一段 |
替换:tr
1 | tr [文件] "xxx" "yyy" # 把文件中的 xxx 替换为 yyy |
1 | tr 支持管道符 |
统计:wc
1 | wc -c [文件] # 统计文件的字符数 |
1 | wc 支持管道符 |
打包:tar c
1 | tar cvf [文件名] 文件1 文件2 文件3 # cvf都是选项,c表示新建一个打包文件,v表示显示打包细节,f表示给打包文件命名 |
解包:tar x
1 | tar xvf [包名] -C [目录] # 可以解包,也可以解压,默认解压到当前目录,-C 表示解压到指定目录 |
了解:tar x
的解包分为解压和拆包两个动作,解压的过程会调用gunzip
和bunzip2
两种解压工具,前者针对gzip
压缩包,后者针对bzip2
压缩包。
压缩:gzip
和bzip2
1 | gizp [文件] # 生成一个压缩文件,后缀名为gz |
1 | bzip2 [文件] # 与 gzip 的用法相同,生成一个后缀名为bz2的压缩文件 |
补充:以当前时间命名压缩包文件名,完成文件打包:
1 | tar cvzf `date "+%Y_%m_%d_%H_%M_%S"`_etc_bak.tar.gz /etc/ # ` ` 表示取其内部的命令结果 |
压缩:zip
1 | zip [文件名] 文件1 文件2 文件3 # 一般指定 .zip 结尾 |
解压:unzip
1 | unzip [包名] -d [路径] # -d 表示指定解压后的路径 |