引言:本文主要介绍,Linux的目录标准,目录和文件常用操作命令,文件系统三部分
Linux目录标准:FHS
我们使用的Linux服务器,虽然有很多不同的发行版,但他们的文件目录都有一些相似性。Linux目录配置的依据是FHS(https://www.pathname.com/fhs/)标准。FHS建议根目录最好单独分区,尤其与安装的应用程序分开,这样根目录所在的文件系统不容易发生问题。
FHS标准里主要定义了 1:根目录/ 2:/usr 3:/var 三个目录应该放置的内容。下面分别列举三个目录下比较常用的目录及存放的文件内容,详情还请参照FHS官方文档:
一:根目录 / 下必须存在的目录及作用
- /bin:系统的可执行文件存放在这里,比如常用的:cd cp find chmod chown等命令们
- /boot:存放系统启动使用的文件
- /dev:设备和接口设备都以文件的形式存在此目录下,其中还包括,标准输入:stdin 标准错误:stderr 标准输出:stdout
- /etc:系统主要的配置文件,比如用户的账号密码和各服务的启动文件等
- /lib:系统的函数库
- /media:软盘、光盘、DVD等临时设备挂载目录
- /mnt:暂时挂载一些额外的目录
- /opt:第三方辅助软件放置的目录
- /run:系统启动之后的一些信息
- /sbin:启动过程中需要的命令
- /srv:一些网络服务启动之后的数据存放位置
- /tmp:临时文件存放
- /usr:第二层有更多目录要求
- /var:第二层有更多目录要求
二:/usr目录下必须存在的目录
- /usr/bin/:所有用户能够使用的命令。Centos7已经把全部的用户能够使用的命令都放在了这里,根目录下的/bin链接到这里
- /usr/lib/:根目录的lib链接到此目录
- /usr/local/:系统管理员给自己本机下载的软件
- /usr/sbin/:根目录的sbin链接到此
- /usr/share:放置一些可以共享的只读数据文件,比如一些帮助文档、说明文档
三:/var目录:主要存放一些经常变动的文件,比如MySQL、Redis数据库文件
- /var/cache/:应用程序本身运行过程中产生的一些缓存
- /var/lib/:应用程序执行过程中需要使用的数据文件
- /var/log/:日志文件存放目录
- /var/run/:某些程序启动之后的PID放在此目录下,链接到/run目录
目录和文件常用操作命令
文件目录查看:ls [-alSt]
- a:全部的文件连同隐藏文件
- l:详细显示信息包含文件的属性和权限等数据
- S:依文件容量大小排序
- t:依时间排序
切换目录:cd 目录
显示当前目录:pwd
创建目录:mkdir 目录
删除目录:rmdir 目录
复制:cp [-rip] 源文件 目标文件
- r:递归复制
- i:若目标文件已存在,询问是否覆盖
- p:连同文件的(权限、用户、时间)一起复制,通常在备份时使用
删除:rm [-fr] 目录/文件
- f:强制删除
- r:删除目录时,递归删除
移动:mv [-fi] 源文件 目标文件
- f:强制移动
- i:目标文件已存在时,询问是否覆盖
查看文件内容:
显示全部文件内容:cat [-n] 文件
n:打印行号
查看前n行文件:head [-n 数值] 文件
-n 数值:前n行,默认是10行
查看倒数前n行:tail [-n 数值] 文件
-n 数值:前n行,默认是10行
创建文件:touch [-m] 文件
m:修改文件的mtime(上次被修改的时间)
文件打包tar命令:
打包并压缩:tar [-z|-j|-J] [cv] [-f 打包完的文件名] 需要压缩的目录/文件
解压缩:tar [-z|-j|-J] [xv] [-f 需要解压的文件] -C 目录
查看:tar [-z|-j|-J] [tv] [-f 需要查看的压缩文件]
z,j,J代表三种压缩方式,分别为:z:gzip j:bzip2 J:xz
bzip2的压缩比通常优于gzip,xz的压缩比又优于bzip2,但是xz的压缩效率很低,很小的文件要比较久的时间才能生成压缩包
这么多参数有时候不好记忆,其实用的最多的就是:
- 压缩:tar -zcv -f file1.gz /home
- 解压:tar -zxv -f file1.gz -C /home
查找执行文件:which [-a] command
a: 将所有由PATH目录中找到的命令都列出,默认只列出第一个
查找命令:whereis [-l] 文件或目录名
l:列出查找了多少目录
查找命令:local [-ir] 文件/目录
i:忽略大小写差异
r:文件/目录可以写正则表达式
查找命令:find [目录] [option] [action]
eg:
- find / -user xingzhou 属于用户xingzhou的所有文件
- find / -name xingzhou 查找文件名为xingzhou的文件
- find / -name "*xingzhou*"查找文件名包含xingzhou的文件
- find / -mtime 0 24小时内有修改的文件
- find / -mtime 3 3天前的那一天24小时内有修改的文件
- find / -mtime -3 小于等于三天内有修改的文件
- find / -mtime 3 大于等于四天前有修改的文件
说明:find命令是从磁盘上直接查找文件会比较耗时。whereis只是查找系统中的特定目录,local从系统的数据库中查找所以这两个命令会比较快。但是系统的文件存储信息数据库并不是实时更新的,所以local查询的文件结果可能没那么准确。
文件系统
概要:
操作系统为了管理和使用磁盘,发明了文件系统。Linux常用的文件系统有ext2 ext3 ext4 ,这些都是索引式文件系统。所谓的索引式文件系统就是给存储在磁盘上的文件内容建立索引。建立索引的目的当然是为了更快的查找文件内容。索引式文件系统通常有三类区块来存放不同的数据:超级区块、inode区块、数据区块。超级区块里存放文件系统的属性,还有inode和数据区块的总量、使用量、剩余量等信息inode:记录文件的属性,同时记录文件内容存放的数据区块(可以认为是文件系统的索引)数据区块:存放具体的文件内容。不同的文件系统对于区块的划分细节会有些差异,但原理是一致的。Centos7默认开始使用xfs文件系统,xfs文件系统,是一个日志文件系统。(https://baike.baidu.com/item/XFS#ref_[2]_1222157)更适合一些高容量的磁盘和大型文件的存储。
使用:
磁盘在使用之前需要进行“挂载”,挂载就是把磁盘和目录建立联系。
挂载的具体命令是:mount
依照/etc/fstab的配置挂载所有磁盘:mount -a
查看当前的挂载信息:mount
挂载某个目录:
- mount [-t 文件系统] LABEL='' 目录
- mount [-t 文件系统] LABEL='' 目录
- mount [-t 文件系统] LABEL='' 目录
mount --bind 目录1 目录2:把目录1挂载到目录2下,挂载的是目录而不是文件系统,此时目录1和目录2链接到了同一个inode。
取消挂载:umount [-fnl] 设备文件名/目录
- f:强制取消
- n:卸载但是不更新/etc/mtab文件
- l:立刻卸载文件系统
几个查看命令:
df [-ahi] [目录/文件]
- a:列出所有的文件系统,包括/proc(等下再解释这个目录)
- h:以易读的形式显示
- i:显示inode的数量,而不是磁盘容量
du [-sham] 文件/目录
- s:仅显示总量
- h:以易读的容量显示
- a:列出所有文件和目录的容量
- m:以M为单位,显示容量
eg:du -sm /*:仅列出根目录下孩子目录的容量,不统计孙子目录
补充说明下/proc目录:/proc是进程文件系统,proc目录下的内容都是存储在内存中的,不占用磁盘(https://zh.wikipedia.org/wiki/Procfs)
swap(内存交换分区)
我们执行free命令,会看到有一栏是Swap,swap是一个特殊的分区,称为内存交换分区,当系统内存不足的时候,可以当内存使用。其实对于绝大多数互联网的服务端开发场景,机器的内存配置往往很充足,再就是可以以来cgroups去分配合适的内存,swap可能没那么有必要了。
如果有的业务场景,不追求速率,只要进程不挂慢慢跑就可以,这种的话就可以设置swap。
如果排查swap开启之后,是否影响性能,可以使用vmstat 2命令,查看 si so 来观察对性能的影响,这两个值越大,对性能影响越严重。
总结:其实关于“Linux的目录和磁盘”需要学习的地方还有很多,这里仅仅列出来了一些常用的知识点,需要系统的了解的话,可以通过官网、源码、技术书籍等途径去学习。