程序员必须了解的Linux基础(目录和磁盘)

925 阅读8分钟

本文主要介绍,Linux的目录标准,目录和文件常用操作命令,文件系统三部分

Linux目录标准:FHS

我们使用的Linux服务器,虽然有很多不同的发行版,但他们的文件目录都有一些相似性。Linux目录配置的依据是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文件系统,是一个日志文件系统。更适合一些高容量的磁盘和大型文件的存储。 使用: 磁盘在使用之前需要进行“挂载”,挂载就是把磁盘和目录建立联系。

挂载的具体命令是: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为单位,显示容量
egdu -sm /*:仅列出根目录下孩子目录的容量,不统计孙子目录

补充说明下/proc目录:/proc是进程文件系统,proc目录下的内容都是存储在内存中的,不占用磁盘详情参照

swap(内存交换分区)

image.png 我们执行free命令,会看到有一栏是Swap,swap是一个特殊的分区,称为内存交换分区,当系统内存不足的时候,可以当内存使用。其实对于绝大多数互联网的服务端开发场景,机器的内存配置往往很充足,再就是可以以来cgroups去分配合适的内存,swap可能没那么有必要了。

如果有的业务场景,不追求速率,只要进程不挂慢慢跑就可以,这种的话就可以设置swap。

如果排查swap开启之后,是否影响性能,可以使用vmstat 2命令,查看 si so 来观察对性能的影响,这两个值越大,对性能影响越严重。

image.png

总结

其实关于“Linux的目录和磁盘”需要学习的地方还有很多,这里仅仅列出来了一些常用的知识点,需要系统的了解的话,可以通过官网、源码、技术书籍等途径去学习。