• Linux下文件属性介绍


    一、文件属性概况

     Linu系统中的文件和目录的属性主要包括:

    • 索引节点(inode)
    • 文件类型
    • 权限属性
    • 连接数
    • 所归属的用户和用户组
    • 最近的修改时间

    ...

    可以通过 ls -lhi(ls -li与其区别是文件大小表示不同) 命令查看:

    [root@localhost project]# ls -lhi
    total 0
    25537624 -rw-r--r--  1 root root  0 Oct 26 23:05 1.txt
    25542507 drwxr-xr-x. 2 root root  6 Oct 13 22:58 test1
        2890 drwxr-xr-x. 3 root root 47 Oct 10 22:03 test3
    17290833 drwxr-xr-x. 2 root root  6 Oct 13 21:20 test4
    25542468 drwxr-xr-x. 2 root root  6 Oct 13 21:43 test5

    其上每一列说明如下:

     其中:

    • 第一列为inode索引号
    • 第二列为文件类型和权限(第1个字符为文件类型,2-10为权限)
    • 第三列为硬连接个数(通过ln命令创建)
    • 第四列为文件或目录的属主和属组
    • 第五列为文件或目录的大小
    • 第六列为文件或目录最近的修改时间
    • 第七列为文件或目录的名称

    举例说明:

    [root@localhost etc]# ls -lhi sysconfig/kdump 
    25399276 -rw-r--r--. 1 root root 1.5K Nov  7  2016 sysconfig/kdump
    • inode索引号为25399276 
    • 文件类型为普通文件,因为第二列第一个字符为“-”
    • 文件权限是第二列(2-10个字符查看),属主可读、可写、可执行(rw-),文件归属用户组可读(r--),其它用户可读(r--)
    • 硬连接个数为1(就是它本身)
    • 属主为root,属组为root
    • 文件大小为1.5k
    • 最近修改时间为Nov 7 2016
    • 文件名为kdump

    二、inode与block

     Linux的存储设备被格式化为文件系统后会被分为两部分:

    • inode(索引节点)
    • block

      其中inode是用来存储数据属性(文件类型、属主、文件大小等)信息的,但是不包含文件名;block是用来存储数据的。inode除了存储属性外,还会进行文件的索引,所以就产生了inode值,这也就是通过inode快速查找文件实体内容。

     举个例子就是inode相当于书的目录,block相当于每一页的内容,通过目录可以快速的翻到那一页的内容。通过 ls -li 既可以查看到inode信息:

    [root@localhost project]# ls -li
    total 0
    25537624 -rw-r--r--  1 root root  0 Oct 26 23:05 1.txt
    25542507 drwxr-xr-x. 2 root root  6 Oct 13 22:58 test1
        2890 drwxr-xr-x. 3 root root 47 Oct 10 22:03 test3
    17290833 drwxr-xr-x. 2 root root  6 Oct 13 21:20 test4
    25542468 drwxr-xr-x. 2 root root  6 Oct 13 21:43 test5

      其中第一列就是inode的值。inode存放的是文件的属性信息,所以它是有大小的。inode的大小是在文件系统被格式化就无法更改的,系统会根据磁盘大小自动给一个合适的大小(128或者256字节)。可以通过以下命令查看各分区inode的大小以及占用情况:

    [root@localhost project]# df -i
    Filesystem      Inodes IUsed   IFree IUse% Mounted on
    /dev/sda3      6712832 32055 6680777    1% /
    devtmpfs        230957   377  230580    1% /dev
    tmpfs           233408     1  233407    1% /dev/shm
    tmpfs           233408   447  232961    1% /run
    tmpfs           233408    16  233392    1% /sys/fs/cgroup
    /dev/sda1       102400   330  102070    1% /boot
    tmpfs           233408     1  233407    1% /run/user/0

    对于block系统也会给一个默认值(1k~4k),最大为4k,也就是说超过4k大小的文件,最少都需要两个以上的block来盛放它。

    一个block只能存放一个文件的内容,尽管这个block没有放满,新的文件也需要重新打开block来存放,block的大小需要根据具体的业务需求来适当的给定:

    • 对于业务中小文件比较多的需求,block小一些比较好,这样比较省空间,否则容易造成空间浪费;当然不利的就是读取效率低(磁盘I/O高)
    • 对于业务中大文件比较多的需求,block大一些比较好,这样效率比较高,因为减少了磁盘的I/O读写

      总之,block分大了容易造成空间浪费,分小了影响磁盘性能,在实际业务中应该根据当前需求来应对。Inode和block在磁盘格式化文件系统时可以指定其大小,一般也不太需要这样做。

      有时候,通过命令 df -h 查看磁盘空间没满,但是已经存不进数据了,这种情况是Inode已经耗尽了。所以确定一个磁盘分区究竟能放入多少个文件,需要分情况:

    • Inode先耗尽,以Inode来计算文件的个数
    • block先耗尽,以block来计算文件的个数(根据文件大小与block大小比较),如果文件大小小于block大小,文件个数就是block个数

    三、文件类型

    (一)文件类型介绍

    在Windows系统中,文件的扩展名就可以代表文件的类型,比如:

    • jpeg、png等扩展名就是图片类型
    • doc、docx等扩展名就是文档类型
    • mp4、avi等扩展名就是视频类型

    ...

    但是在Linux中文件类型与扩展名没有任何关系,之所以Linux中的文件有扩展名也是为了兼容Windows中用户的习惯。那么Linux中是如何查看文件类型呢?

    (二)文件类型的种类

     通过执行 ls -l 或者 ls -al 查看:

    [root@localhost /]# ls -l
    total 20
    lrwxrwxrwx.   1 root root    7 Oct  1 14:26 bin -> usr/bin
    dr-xr-xr-x.   4 root root 4096 Oct  1 14:46 boot
    drwxr-xr-x   19 root root 3180 Oct 26 22:43 dev
    drwxr-xr-x.  78 root root 8192 Oct 26 22:43 etc
    drwxr-xr-x.   4 root root   32 Oct 11 22:27 home
    lrwxrwxrwx.   1 root root    7 Oct  1 14:26 lib -> usr/lib
    lrwxrwxrwx.   1 root root    9 Oct  1 14:26 lib64 -> usr/lib64
    drwxr-xr-x.   2 root root    6 Nov  5  2016 media
    ...

    可以看到结果中的第一列一共有10个字符,其中2-10个字符是和权限相关的,第一个字符就是文件类型可以看到目前有l(符号链接类型)和d(目录类型)。当然Linux中还有其它一些类型,总的来说分文以下几类:

    • 普通文件(-)
    • 目录文件(d)
    • 字符设备或块设备文件(c/b)
    • 套接口文件(s)
    • 符号链接文件(l)
    • 管道文件(p)

    (三)文件类型详解

    1、普通文件

     通过ls -l查看文件属性:

    [root@localhost project]# ls -l
    total 0
    -rw-r--r--  1 root root  0 Oct 26 23:05 1.txt

    可以看到第一列第一个字符是“-”,这就是表示该文件类型是普通文件,一般通过touch、echo、tar等命令创建的文件。

     2、目录文件

    [root@localhost project]# ls -l
    total 0
    -rw-r--r--  1 root root  0 Oct 26 23:05 1.txt
    drwxr-xr-x. 2 root root  6 Oct 13 22:58 test1
    drwxr-xr-x. 3 root root 47 Oct 10 22:03 test2

    第一列第一个字符是“d”,表示该文件类型是目录文件,创建目录通过mkdir或者cp(-r或者-a参数)命令创建或者复制目录。那么如何通过名称来区分是文件还是目录呢?

    [root@localhost project]# ls -F
    1.txt  test1/  test3/  test4/  test5/

    通过 ls -F命令可以查看,如果名称后面跟着的是“/”那么就是目录,以此可以进行文件或者目录的过滤。

    # 方法一
    [root@localhost project]# ls -F | grep "/$"
    test1/
    test3/
    test4/
    test5/
    
    # 方法二
    [root@localhost project]# ls -l | grep "^d"
    drwxr-xr-x. 2 root root  6 Oct 13 22:58 test1
    drwxr-xr-x. 3 root root 47 Oct 10 22:03 test3
    drwxr-xr-x. 2 root root  6 Oct 13 21:20 test4
    drwxr-xr-x. 2 root root  6 Oct 13 21:43 test5

    3、字符设备及块设备

    [root@localhost ~]# ll -l  /dev/tty*
    crw-rw-rw- 1 root tty     5,  0 Oct 27 21:06 /dev/tty
    crw--w---- 1 root tty     4,  0 Oct 27 21:06 /dev/tty0
    crw--w---- 1 root tty     4,  1 Oct 27 21:06 /dev/tty1
    crw--w---- 1 root tty     4, 10 Oct 27 21:06 /dev/tty10
    ...

    在/dev下的上面的文件是第一个字符是以“c”开头,这种类型就是字符设备文件,是串行端口的接口设备。

    [root@localhost ~]# ll -l  /dev/sda*
    brw-rw---- 1 root disk 8, 0 Oct 27 21:06 /dev/sda
    brw-rw---- 1 root disk 8, 1 Oct 27 21:06 /dev/sda1
    brw-rw---- 1 root disk 8, 2 Oct 27 21:06 /dev/sda2
    brw-rw---- 1 root disk 8, 3 Oct 27 21:06 /dev/sda3

    上面的第一列的第一个字符是以“b”开头,这种文件类型是块设备文件,存储数据使用的接口设备,比如硬盘、光驱等。

     4、套接口文件

       假如安装了MySQL服务,它是有这个mysql.sock文件的,该文件属性的第一个字符是“s”,这类文件通常用于数据连接,比如MySQL服务启动后监听3306端口的请求连接,MySQL客户端通过mysql.sock套接字文件连接MySQL服务端。

     5、符号链接文件

    [root@localhost ~]# ll /
    total 20
    lrwxrwxrwx.   1 root root    7 Oct  1 14:26 bin -> usr/bin
    dr-xr-xr-x.   4 root root 4096 Oct  1 14:46 boot
    drwxr-xr-x   19 root root 3180 Oct 27 21:06 dev
    drwxr-xr-x.  78 root root 8192 Oct 27 21:06 etc
    drwxr-xr-x.   4 root root   32 Oct 11 22:27 home
    lrwxrwxrwx.   1 root root    7 Oct  1 14:26 lib -> usr/lib
    lrwxrwxrwx.   1 root root    9 Oct  1 14:26 lib64 -> usr/lib64
    ...

    符号链接文件通过“l”来表示,可通过ln命令创建软连接进行实现。

    6、管道文件

    [root@localhost ~]# find / -type p|xargs ls -l
    prw------- 1 root root 0 Oct 27 21:06 /run/systemd/inhibit/1.ref
    prw------- 1 root root 0 Oct 27 21:06 /run/systemd/initctl/fifo
    prw------- 1 root root 0 Oct 27 21:19 /run/systemd/sessions/2.ref

    管道文件属性的第一个字符是“p”,也就是说管道文件的类型是使用p来表示的。它是用来解决多个程序访问同一个文件所造成的错误问题。

    (四)文件扩展名

    Linux下文件扩展名没什么太大的实际意义,但是为了兼顾Windows下用户习惯,不同的文件类型还是会用不同的扩展名来表示。比如:

    • .conf 配置文件
    • .rpm rpm安装包文件
    • .tar、.tgz、.zip、.gz、.bz2等均是压缩文件
    • .py、.pl、.php、.html/htm等是脚本或者程序文件

    ...

    四、文件权限

    第二列共10个字符,其中第1个字符已经说明为文件类型,第2-9个字符文件权限,这里详细说明一下文件权限:

     权限位共9个字符被分成3组,每3个字符一组,分别对应的是属主的权限位、属组的权限位以及其它用户的权限位,其中:

    • r表示对该文件持有可读权限
    • w表示对该文件持有可写权限
    • x表示如果该文件为可执行文件,就是拥有该文件的可执行权限
    • -表示对该文件无任何权限

    五、用户和用户组

      Linux系统可以进行多用户同时登陆,多个用户可以通过ssh工具同时登录Linux处理不同的任务,所以Linux中有很多用户,但是为了进行用户管理以及用户权限的管理,就涉及到用户角色与用户组。

    (一)用户、角色管理

    在Linux中不同角色的用户,其拥有的权限是不同,通过uid与gid来进行识别:

    uid 角色 用户特性
    0 超级用户 如果设置一个用户为超级用户,可以修改uid为0,但尽量不要这样做,可以使用sudo代替
    1-499 虚拟用户 这个返回的uid是给系统使用的uid,避免人为创建的uid与系统的uid冲突
    500-65535 普通用户 当使用useradd命令创建用户时,其uid就从500开始的

      系统中为什么会有虚拟用户呢?因为系统运行服务时是需要用户角色的,比如运行httpd等服务都是在一个用户角色下运行的,所以系统会默认创建这样一个角色。再比如运行MySQL服务时,也会创建一个用户角色用于专门运行MySQL服务,当然这个角色可以没有登录系统的权限:

    # 添加用户组
    [root@localhost etc]# groupadd mysql -g 51
    
    # 添加用户mysql,并且指定属于mysql用户组
    [root@localhost etc]# useradd mysql  -u 51 -s /sbin/nologin -g mysql

    (二)用户组管理

    用户组就是具有相同特性用户的集合,它的作用就是方便用户权限的管控,只需要将权限分配给用户组,然后再将用户分配到某一组即可。用户和组的关系:

    • 一对一      一个用户可以属于一个用户组
    • 一对多      一个用户可以属于多个用户组
    • 多对一      多个用户可以属于一个用户组
    • 多对对      多个用户可以属于多个用户组

    用户和用户组是有配置文件,相关文件有:/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow

    1、/etc/passwd(用户基本配置文件)

    [root@localhost ~]# vim /etc/passwd
    
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    ...

    该配置文件中每一行表示一个账户信息,其中每一行有7列,中间以“:”分割:

    列(字段) 说明 举例
    账号名称 用户的账号名称,唯一的 root
    账号密码 出于安全考虑,该地方使用x代替,实际密码放置于/etc/shadow文件中 x
    uid 用户账号uid,范围为0-65535 0
    gid 用户组,创建用户时默认创建一个同名的用户组,gid的范围为0-65535 0
    用户说明 该字段是对该用户的描述说明 root
    用户家目录 用户登录后首先进入的目录,一般与用户名相同的目录 /root
    shell解释器 当前用户登录后使用的shell解释器,默认的shell为bash              /bin/bash

     2、/etcshadow

       该文件是用户存放系统账户密码的文件,那么为什么要分开放呢?因为每个用户登录都需要取得uid和gid用户判断权限,这样/etc/passwd文件的权限为644,所有的用户都是可读的,这样带来安全隐患。所以系统就把加密后的密码存放于/etc/shadow文件中。

    [root@localhost ~]# vim /etc/shadow
    
    root:$6$4njBFoI9/wZMbi35$Je3wm9auNKcYCfbjFkyWdhkC65NTrTMXtDFQxy
       NLW3vJd9LIu
    /rkkQzBzRp86CKqY94.nnQZMaKlMU0n3NDfV.::0:99999:7::: bin:*:17110:0:99999:7::: daemon:*:17110:0:99999:7::: adm:*:17110:0:99999:7::: lp:*:17110:0:99999:7::: ...

    该文件中每一行表示一个账户的密码信息,每一行中间以“:”隔离,共有9列:

    列(字段) 说明 举例
    账号名称 用户的账号名称,唯一的 root
    账号密码 加密后的账号密码 $6$4njBF...
    最近更改密码的天数 从1970年1月1日到最近用户更改密码的天数  
    禁止修改密码的天数 从1979年1月1日到用户可以更改密码的天数  
    用户必须更改密码的天数 从1979年1月1日到用户必须更改密码的天数  
    警告用户更改密码的天数 在密码即将过期的前多少天提醒用户更改密码的天数  
    禁用天数 密码过期后禁用账户的天数             
    标志 保留  

     3、/etc/group

     该文件是用户组的配置文件:

    [root@localhost ~]# vim /etc/group
    
    root:x:0:
    bin:x:1:
    daemon:x:2:
    sys:x:3:
    adm:x:4:
    tty:x:5:
    disk:x:6:
    ...

    每一行表示一个用户组的信息,每一行通过“:”被分成4个字段:

    列(字段) 说明 举例
    用户组名 用户组名称 root
    用户组密码 出于安全考虑,该地方使用x代替,实际密码放置于/etc/gshadow文件中 x
    gid 用户组id 0
    用户组成员 属于该用户组的所有用户账号  

    该文件中包括用户组和用户的信息,以及用户和用户组的关系,比如那些用户属于哪些组。

     4、/etc/gshadow

    [root@localhost ~]# vim /etc/gshadow
    
    root:::
    bin:::
    daemon:::
    sys:::
    adm:::
    tty:::
    ...

    该文件是用户组密码加密文件,每一行有4个字段:

     列(字段)  说明  举例
     用户组名  用户组名称  root
     用户组密码  用户组密码,可以为空  
     用户组管理员账号  用户组管理员,该字段可以为空。如果有多个管理员,中间以逗号隔开  
     用户组成员  加入这个组的所有用户账号。如果有多个用户,中间以逗号隔开  

    六、文件修改时间 

     在文件的属性中,第五列和第七列分别为文件或者目录的大小、文件或者目录的名称,第六列为文件修改时间。

    [root@localhost project]# stat test.txt 
      File: ‘test.txt’
      Size: 0             Blocks: 0          IO Block: 4096   regular empty file
    Device: 803h/2051d    Inode: 25537617    Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2020-10-31 13:22:46.743306208 +0800
    Modify: 2020-10-31 13:22:46.743306208 +0800
    Change: 2020-10-31 15:03:27.279981276 +0800
     Birth: -

    上面红色有三个时间分别是:

    • Access 最后访问时间
    • Modify 最后修改时间
    • Change 状态改变时间

    当做下面的操作后三个时间的变化如下:

    • 创建(比如:touch命令)一个文件后A、C、M三个时间一样
    • 读取(比如:cat命令等)文件,A变;C、M不变
    • 修改(比如:vim命令等)文件内容,C、M变;A不变

     文件属性中的时间就是上面三个时间中的Modify(最后修改时间)。

  • 相关阅读:
    计算机二级-C语言-程序修改题-190114记录-对整型变量进行取余操作可以取得各个位上的值。
    计算机二级C语言选择题错题知识点记录。
    计算机二级-C语言-对文件的读写操作。链表的定义与赋值。对字符串的遍历和处理。
    二十七、Java基础之数组的排列
    二十六、Java语言之二维数组
    二十五、Java基础之一维数组
    二十四、Java基础之自定义异常
    二十三、Java基础之异常及异常处理机制
    二十二、Java基础之内部类
    二十一、Java基础之访问控制权限
  • 原文地址:https://www.cnblogs.com/shenjianping/p/13855277.html
Copyright © 2020-2023  润新知