zoukankan      html  css  js  c++  java
  • 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(最后修改时间)。

  • 相关阅读:
    HDU Railroad (记忆化)
    HDU 1227 Fast Food
    HDU 3008 Warcraft
    asp vbscript 检测客户端浏览器和操作系统(也可以易于升级到ASP.NET)
    Csharp 讀取大文本文件數據到DataTable中,大批量插入到數據庫中
    csharp 在万年历中计算显示农历日子出错
    csharp create ICS file extension
    CSS DIV Shadow
    DataTable search keyword
    User select fontface/color/size/backgroundColor设置 字体,颜色,大小,背景色兼容主流浏览器
  • 原文地址:https://www.cnblogs.com/shenjianping/p/13855277.html
Copyright © 2011-2022 走看看