Linux文件和目录的属性及权限

Posted zoe233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文件和目录的属性及权限相关的知识,希望对你有一定的参考价值。

1.Linux中的文件

1.1 文件属性概述

Linux系统中的文件或目录的属性主要包括:

  • 索引节点inode
  • 文件类型
  • 权限属性
  • 链接数
  • 所归属的用户和用户组
  • 最近修改时间 等内容:

下面我们看执行 ls -lih 命令的结果(共10列):

  • -l 长格式
  • -i 显示 索引节点 inode
  • -h 以人类熟悉的方式显示文件大小
[root@oldboy oldboy]# ls -lhi
total 32K
275427 -rw-r--r-- 1 root root    8 Sep  4 14:56 123.log
275423 -rw-r--r-- 1 root root    0 Sep  4 14:46 dd.tx
275576 drwxr-xr-x 3 root root 4.0K Oct  1  2019 ext
275695 -rw-r--r-- 1 root root   71 Sep  4 19:45 file.txt
275582 -rw-r--r-- 1 root root    0 Oct  1  2019 jeacen
275694 -rw-r--r-- 1 root root  101 Sep  4 18:30 nginx.conf
275583 -rw-r--r-- 1 root root    0 Oct  1  2019 oldboy
275424 -rw-r--r-- 1 root root    0 Sep  4 14:47 second
275578 drwxr-xr-x 2 root root 4.0K Oct  1  2019 test
275584 -rw-r--r-- 1 root root    0 Oct  1  2019 wodi.gz
275579 drwxr-xr-x 2 root root 4.0K Oct  1  2019 xiaodong
275580 drwxr-xr-x 2 root root 4.0K Oct  1  2019 xiaofan
275581 drwxr-xr-x 2 root root 4.0K Oct  1  2019 xingfujie
275585 -rw-r--r-- 1 root root    0 Oct  1  2019 yingsui.gz

 

索引节点inode文件类型文件权限硬链接个数文件属主文件所属用户组文件大小文件修改时间文件名
275581 d rwxr-xr-x 2 root root 4.0K Oct 1 2019 xingfujie

 

技术图片

 

 

文字解释

  • 第 1 列:inode 索引节点 编号(相当于身份证,唯一);
    • 系统读取文件时,首先通过文件名找到inode,然后才能读取到文件内容
  • 第 2 列:文件类型及权限(共10个字符)
    • 第一个字符为 文件类型
    • 后9个字符为 文件权限
  • 第 3 列:硬连接个数(详细看ln命令) 
  • 第 4 列:文件或目录所属的用户(属主)
    • 在Linux里面,文件和程序的存在必须要有用户和组,满足相应的存在需求。
  • 第 5 列:文件或目录所属的组
  • 第 6 列:文件或目录的大小
  • 第 7,8,9 列:文件或目录的修改时间
  • 第 10 列:实际的文件名或目录名
    • 严格来讲,文件名不算文件的属性

2. 索引节点

2.1 inode概述

硬盘要存储数据(房子要主人),首先要分区(隔断),然后格式化创建文件系统(装修),最后存数据。

 

Inode,中文意思是 索引节点(index node)。 

在每个Linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘、U盘...)被格式化为ext4文件系统 (CentOS6.7)后,一般都有两部分:

  • 第一部分是Inode(很多个)
  • 第二部分是Block(很多个)

 

Block 是用来存储实际数据用的,例如:照片,视频等普通文件数据。

而 inode 就是用来存储这些数据属性信息的(也就是 ls -l的结果),inode包含的属性信息包括

  • 文件大小、
  • 属主、
  • 归属的用户组、
  • 读写权限、
  • 文件类型、
  • 修改时间,
  • 还包含指向文件实体的指针的功能( inode节点--block的对应关系)等,

但是,inode 里面唯独不包含文件名

 

Inode 除了记录文件属性的信息外,还会为每个文件进行信息索引,所以就有了inode 的数值。
操作系统根据指令,即可通过 inode 的值最快的找到相对应的文件实体。 

 

文件,inode,block之间的关系如下:

技术图片

 

这就相当于,教室们门口贴一张纸(inode),有大家的位置信息,以及学生姓名,性别,座位就相当于block。 

 

打个比方,比如一本书,存储设备或分区就相当于这本书,Block相当于书中的每一页内容,而inode就相当于这本书前面的目录。
一本书有很多内容,一个知识点可能有很多页,如果想查找某部分或某知识点的内容,我们一般先查书的目录,通过目录能更快的找到我们想看的知识点的内容。
虽然不太恰当,但还是比较形象的。

技术图片

 

当我们用 ls 查看某个目录或文件时,如果加上 -i 参数,就可以看到 inode 节点了。

 

ls -li 查看目录下所有文件和目录的属性和inode节点

[root@oldboy oldboy]# ll -i /oldboy
total 32
275427 -rw-r--r-- 1 root root    8 Sep  4 14:56 123.log
275423 -rw-r--r-- 1 root root    0 Sep  4 14:46 dd.tx
275576 drwxr-xr-x 3 root root 4096 Oct  1  2019 ext
275695 -rw-r--r-- 1 root root   71 Sep  4 19:45 file.txt
275582 -rw-r--r-- 1 root root    0 Oct  1  2019 jeacen
275694 -rw-r--r-- 1 root root  101 Sep  4 18:30 nginx.conf
275583 -rw-r--r-- 1 root root    0 Oct  1  2019 oldboy
275424 -rw-r--r-- 1 root root    0 Sep  4 14:47 second
275578 drwxr-xr-x 2 root root 4096 Oct  1  2019 test
275584 -rw-r--r-- 1 root root    0 Oct  1  2019 wodi.gz
275579 drwxr-xr-x 2 root root 4096 Oct  1  2019 xiaodong
275580 drwxr-xr-x 2 root root 4096 Oct  1  2019 xiaofan
275581 drwxr-xr-x 2 root root 4096 Oct  1  2019 xingfujie
275585 -rw-r--r-- 1 root root    0 Oct  1  2019 yingsui.gz

 

查看指定某个文件的包括inode在内的所有属性的命令为:stat filename

  • 文件大小,
  • Block块数,
  • Inode索引节点, 
  • 链接数, 
  • 权限 
  • 访问时间atime,修改时间mtime,改变时间ctime
[root@oldboy oldboy]# stat nginx.conf
  File: `nginx.conf‘
  Size: 101             Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 275694      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-09-04 18:30:51.437111190 +0800
Modify: 2019-09-04 18:30:51.422111642 +0800
Change: 2019-09-04 18:30:51.434111276 +0800

 

第1列inode值是 275694:查看一个文件或目录的inode,通过 ls命令的 -i 参数即可。 

因为 inode 要存放文件的属性信息,所以 inode 是有大小的。 

CentOS5 inode 的默认大小是128字节,而CentOS 6 inode 的默认大小是256 字节,inode的大小在分区被格式化创建文件系统之后就定下来了,格式化以后就无法更改inode大小了。格式化前可以通过参数指定 inode大小,但是一般工作环境没这个需求。

 

不同CentOS版本 inode 大小不同:

[root@oldboy oldboy]# dumpe2fs /dev/sda3|grep -i "Inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:               256

boot分区,inode大小默认128字节:

[root@oldboy oldboy]# dumpe2fs /dev/sda1|grep -i "inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:               128

 

查看文件系统inode总量以及剩余量:

[root@oldboy oldboy]# df -i
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/sda3      462384 56099 406285   13% /
tmpfs          127522     1 127521    1% /dev/shm
/dev/sda1       51200    38  51162    1% /boot

查看的对应信息为:文件系统名,Inode总数量,使用的Inode数量,剩余的Inode剩余量,使用的百分比占比,挂载所在分区。

 

查看磁盘的使用量:(其中,inode也算磁盘的空间)

[root@oldboy oldboy]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       6.9G  1.5G  5.1G  22% /
tmpfs           499M     0  499M   0% /dev/shm
/dev/sda1       190M   36M  145M  20% /boot

 

 

磁盘空间是否满了,由两项参数决定的:

  • 第一个是 inode 满了
  • 第二是是 block 满了

任何一项满了,都无法进行存储。

 

磁盘满的一个特征( no space left on device).

 

有关 inode 的小结:

  1. 磁盘被分区并格式化为 ext4 文件系统后,会生成一定数量的 inode 和 block
  2. inode 称为 索引节点,它的作用是存放文件的属性信息以及作为文件的索引(指向文件的实体)
  3. ext3/ext4 文件系统的 block存放的是文件的实际内容
  4. inode 是磁盘上的一块存储空间,CentOS 6 非启动分区 inode 默认大小 256 字节,CentOs5是128字节。
  5. inode 的表现是形式一串数字,不同的文件对应的inode(一串数字)在文件系统里是唯一的。
  6. inode 节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。
  7. ext3/ext4文件系统下,一个文件被创建后至少要占用一个 inode 和一个 block
  8. ext3/ext4文件系统下,正常情况,一个文件占用且只能占用一个 inode (人和身份证)
  9. block是用来存储实际数据的,每个block的大小一般有 1k,2k,4k几种。 其中引导分区等为 1k,其他普通分区为 4k(CentOS 6)
  10. 如果一个文件很大(几个G),可能占多个block;如果文件很小(0.01k),至少占一个,并且这个block的剩余空间就浪费了,即无法再存储其他数据了。
  11. inode大小和总量查看:
    • dumpe2fs /dev/sda3|egrep -i ‘inode count|block count‘
    • dumpe2fs /dev/sda3|egrep -i ‘inode size|block size‘ 默认 block count 一般会大于inode count的数量。
  12. 查看inode的总量和使用量:
    • df -i
  13. 查看文件的inode信息方法
    • ls -li
    • stat filename
  14. 如何生成及指定 inode 大小
    • mkfs.ext4 -b 2048 -l 256 /dev/sdb
[root@oldboy oldboy]# dumpe2fs /dev/sda3|egrep -i ‘block count|inode count‘
dumpe2fs 1.41.12 (17-May-2010)
Inode count:              462384
Block count:              1849088
Reserved block count:     92454

[root@oldboy oldboy]# dumpe2fs /dev/sda3|egrep -i ‘block size|inode size‘     
dumpe2fs 1.41.12 (17-May-2010)
Block size:               4096
Inode size:               256

有关block的知识小结:

  1. 磁盘读取数据是按 block为单位读取的
  2. 一个文件可能占用多个block。每读取一个block就会消耗一次 磁盘I/O.
  3. 如果要提升磁盘IO性能,那么就要尽可能一次性读取数据尽量的多
  4. 一个block只能存放一个文件的内容,无论内容有多小。如果block 4K,那存放1K的文件,剩余3K就不能存放被的文件,只能浪费了
  5. Block并非越大越好。Block太大对于小文件存放就会浪费磁盘空间,例如:1000k的文件,Block的大小为4k,占用250个block;如果block默认大小为1k,占用1000个block。访问效果谁更高?消耗IO分别为250次和1000次。
  6. 根据业务需求,确定默认的block大小。如果是大文件(大于16K)一般设置block大一点,小文件(小于1k)一般设置block小一点。
  7. block太大,例如4k,文件都是0.1k的,大量浪费磁盘空间,但是访问性能高
  8. block太小,例如1k,文件都是1000k,消耗大量磁盘IO
  9. block的设置也是格式化分区时候
    • mkfs.ext4 -b 2048 -I 256 /dev/sdb
  10. 企业里文件都会比较大(一般大于4k),block设置大一些会提升磁盘访问效率
  11. ext3/ext4 文件系统(CentOS 5和6),一般都设置为 4K
 

当前的生产环境一般设置为4k。特殊的业务,如视频可以加大block大小。


总体小结:

  1. 磁盘被分区格式化文件系统后,会分为 inode 和 block 两部分内容。
  2. inode 存放文件的属性以及指向文件实体的指针,文件名不在inode里,一般在上级目录的block里。
  3. 访问文件,原理通过文件名--> inode --> blocks
  4. inode一般情况下默认大小为256B,block大小1,2,4k,默认是4k,注意,引导分区等特殊分区除外
  5. 通过 df -i 查看inode的数量及使用情况,dumpe2fs /dev/sda3 查看inode和block的大小及数量
  6. 一个文件至少要占用inode 及一个block,多个文件可以占用同一个inode(硬链接),相同文件。
  7. 一个block 只能被一个文件使用,如果文件很小,block很大,剩余空间浪费,无法继续被其他文件使用
  8. block不是越大越好,要根据业务的文件大小进行选择,一般CentOS6 就是默认 4K
  9. 可以在格式化的时候改变inode和block的大小
    • mkfs.ext4 -b 2048 -I 2048 /dev/sdb

通过inode 删除文件

  1. 查看文件
    • ls -li
  2. 通过inode删除文件
    rm `find . -inum 159004`
    
    find . -inum 159004 -exec rm {} ;

     


文件删除恢复 ext3grep

数据恢复需要重启,恢复数据会影响生产环境。

所以,应该养成好习惯,先备份再操作,要能快速还原,不容易还原的,先通过多套测试环境测试,然后再操作。

 

企业面试题:一个100M(100000K)的磁盘分区,分别写入 1K 的文件或写入 1M 的文件,分别可以写多少个?

错误解答:1k的个数:100 x 1000=100000个,1M的文件个数:100/1=100个

 

正确答案 

假设 Block的默认大小为 4K,写入1k的文件的数量基本上就是block的数量: 

  • 假设 inode数量够多的情况下,就是Block的数量,浪费3/4的容量; 
  • 假设 inode 数量小于block的数量,就是inode的数量,浪费3/4的容量。
 

假设 Block的默认大小为 4K,写入1M的文件的数量:
总的block数量/ 250 block = 存放1M的数量

磁盘空间多大,基本就可以写入100/1M数量,一般情况下inode和block都是足够的。

 

知识点: 

  • 上面的考试题考察的是文件系统inode 和block的知识
  • inode是存放文件属性信息的(也包含指向文件实体的指针),默认大小128byte(CentOS58),256byte(CentOS64)
  • block是存放文件实际内容的,默认大小1k(boot)或4k(非系统分区默认给4k),一般企业多用4k的block
  • 一个文件至少要占用一个inode及一个block
  • 默认较大分区常规企业真实场景下,inode数量是足够的。而block数量消耗会更快。

企业面试题:一个100M(Block的总大小,个数和单个block大小有关)的磁盘分区,分别写入 0.5K 的文件,及写入 1M 的文件,分别可以写多少个?为什么?

 

答案相关知识点

  1. Inode 是存放文件属性信息的,默认大小为128byte(CentOS58), 256byte(CentOS64)
  2. block是存放文件实际内容的,默认大小为 1k(boot) 或 4k(非系统分区默认给4k)
  3. 一个文件至少要占用一个 inode 和一个block
  4. 默认分区常规情况下,inode数量是足够的。而 block数量消耗的会更快。
 

正确解答

  1. 默认分区常规情况下, 对大文件来讲 inode是足够的。而block数量消耗的会更快,Block为 4k的情况,1M的文件不会有磁盘浪费情况,所以文件数量大概为 100/1 =100个
  2. 对于小文件 0.1k, inode会消耗的更快。默认分区的时候block数量是大于inode数量的。
    • 每个小文件都会占用一个inode和一个block,所以最终文件数量:
      • inode会先消耗完,文件总量是 inode的数量。

企业案例:如果向磁盘写入数据提示如下错误:No space left on device,通过 df -h查看磁盘空间,发现没满,请问可能原因是什么?企业场景,什么情况下会导致这个问题发生呢?

 

答案

可能是inode数量被消耗尽了。

 

企业工作中邮件临时队列/var/spool/clientmqueue这里很容易被大量小文件占满导致No space left on device的错误。
Clientmqueue目录只有安装了sendmail服务,才会有,是sendmail邮件的临时队列。 

CentOS5.8默认就会安装sendmail服务,CentOS6.6 默认没有sendmail。


3.文件类型及文件扩展名

 

3.1 文件类型介绍 

Linux系统不同于Windows系统,两者的文件类型和文件扩展名也有很大的差异。 

Linux系统中的文件类型和文件扩展名所代表的意义和Windows系统中是不同的。

在Linux系统中,我们一般通过应用程序或命令创建的文件,如file.txt, file.tar.gz,这些文件的扩展名不同,且要用不同的程序或命令来打开,但都是常规文件(也被称为普通文件)。

后面附带的后缀文件扩展名(.txt,.tar.gz),除了让曾经习惯windows的用户易读外,大多数对于Linux系统来说没有特别实际的意义,在Linux系统中也是为了易读,而Windows系统中的扩展名就是实实在在表示文件的类型格式

 

例如: 

  • windows图片文件扩展名:jpg, jpeg, png, gif 等
  • 文本文件扩展名: doc, docx, txt, pdf等

3.2 Linux中的文件类型

在Linux系统中,可以说一切设备(包括目录、普通文件)皆为文件 

 

文件类型包含有:

  • 普通文件
  • 目录
  • 字符设备文件
  • 块设备文件
  • 符号链接文件
  • 管道文件等等
 

当执行 ls -l 或 ls -al 命令后显示的结果中:

[root@oldboy oldboy]# ls -al
total 40
drwxr-xr-x   7 root root 4096 Sep  4 19:45 .
dr-xr-xr-x. 28 root root 4096 Sep  5 04:54 ..
-rw-r--r--   1 root root    8 Sep  4 14:56 123.log
-rw-r--r--   1 root root    0 Sep  4 14:46 dd.tx
drwxr-xr-x   3 root root 4096 Oct  1  2019 ext
-rw-r--r--   1 root root   71 Sep  4 19:45 file.txt
-rw-r--r--   1 root root    0 Oct  1  2019 jeacen
-rw-r--r--   1 root root  101 Sep  4 18:30 nginx.conf
-rw-r--r--   1 root root    0 Oct  1  2019 oldboy
-rw-r--r--   1 root root    0 Sep  4 14:47 second
drwxr-xr-x   2 root root 4096 Oct  1  2019 test
-rw-r--r--   1 root root    0 Oct  1  2019 wodi.gz
drwxr-xr-x   2 root root 4096 Oct  1  2019 xiaodong
drwxr-xr-x   2 root root 4096 Oct  1  2019 xiaofan
drwxr-xr-x   2 root root 4096 Oct  1  2019 xingfujie
-rw-r--r--   1 root root    0 Oct  1  2019 yingsui.gz

第一列第2-10个字符(比如rw-r--r--)是用来描述文件权限的。
而一列的第一个字符就是描述文件类型的,比如上面结果中就有-, d两种类型。

文件类型标识符英文名称文件类型说明
     
     
d directory 表示这是一个目录,如上文ext,在ext2fs中,目录是一个特殊的文件
- regular file 表示这是一个普通的文件,如上文的oldboy
l link 表示这是一个符号链接文件,实际上它指向另一个文件
b block 表示块设备和其他的外围设备,是特殊类型的文件
c character 表示字符设备文件
s socket 表示socket文件
p named pipe 表示管道文件

 

find -type 的文件类型的参数:

File is of type c:

              b      block (buffered) special

              c      character (unbuffered) special

              d      directory

              p      named pipe (FIFO)

              f      regular file

              l      symbolic link; this is never true if the -L  option  or  the
                     -follow  option  is  in  effect, unless the symbolic link is
                     broken.  If you want to search for symbolic links when -L is
                     in effect, use -xtype.

              s      socket

              D      door (Solaris)

3.3 文件类型分别介绍

3.3.1 普通文件regular file

[root@oldboy oldboy]# ls -l nginx.conf
-rw-r--r-- 1 root root 101 Sep  4 18:30 nginx.conf

通过ls -l查看nginx.conf的属性,可以看到第一列内容为-rw-r--r--,值得注意的是第一个符号是-,在Linux中,以这样的字符开头的文件就表示普通文件

 

这些文件一般是用相关的应用程序或系统命令创建,比如:

  • touch
  • cp
  • tar
  • echo
  • cat
  • >, >> 等工具命令。
 

普通文件的删除方式可以使用 rm 命令。

 

windows下的doc,ppt,zip,jpg等格式的文档在Linux下都属于普通文件。
Linux下的二进制文件,各种服务的配置文件,如:/etc/exports,/etc/rc.local等都是纯文本文件。

 

普通文件(regular file):第一个属性为"-",按照文件内容,又大略可以分为:

  • 纯文本文件ascii:文件内容可以直接读取到数据,例如:字母、数字、特殊符号等。
    • 可以用cat命令读文件,比如配置文件几乎都是这种类型的
  • 二进制文件binary:linux的命令程序就是这种格式。
    • 例如:cat命令就是一个二进制文件
  • 数据格式文件data:有些程序在运行的过程中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件。 
    • 例如:linux在用户登录时,都会将登录的数据记录在/var/log/wtmp按个文件内,该文件是一个数据文件。通过last命令读出来。cat命令会读出乱码。因为它属于一种特殊格式的文件。
 

补充:通过 file 命令可以查看文件类型。

[root@oldboy oldboy]# file nginx.conf 
nginx.conf: ASCII text

[root@oldboy oldboy]# file ext
ext: directory

[root@oldboy oldboy]# file /var/log/wtmp
/var/log/wtmp: data

 

3.3.2 目录文件 directory

执行 ls -ld 查看当前目录的目录属性:

[root@oldboy oldboy]# ls -ld
drwxr-xr-x 7 root root 4096 Sep  4 19:45 .

我们在oldboy目录下执行 ls -ld 目录名 时,可以看到第一列内容为 drwxr-xr-x,这种开头带有 d 字符的文件就表示目录。 

目录在Linux中是比较特殊的文件。

 

创建目录的命令可以用 mkdir 命令 或 cp命令(带-r 或 -a 参数),cp可以把一个目录复制为另一个目录。 

删除目录用 rm -r 或 rmdir(删空目录才可以)命令。

 

提示:执行 ls -F的结果,在写脚本时可以直接区别目录和文件,注意,每个目录的后面多了斜线。

[root@oldboy oldboy]# ls -F
123.log  ext/      jeacen      oldboy  test/    xiaodong/  xingfujie/
dd.tx    file.txt  nginx.conf  second  wodi.gz  xiaofan/   yingsui.gz

在生产场景中,我们一般通过下面办法过滤出所有目录文件:

  • ls -F /etc/ |grep ‘/$‘
  • ls -F /etc/ |grep ‘^d‘

 

3.3.3 字符设备或块设备文件 character or block 

如果我们进入/dev 目录,列一下文件:

[root@oldboy dev]# ls -la /dev/tty
crw-rw-rw- 1 root tty 5, 0 Sep  5 05:25 /dev/tty

我们看到/dev/tty 的属性是 "c",表示这是 字符设备文件。

字符设备就是串行端口的接口设备,如猫等串口设备。

[root@oldboy dev]# ll /dev/sda
brw-rw---- 1 root disk 8, 0 Sep  4 21:25 /dev/sda

我们看到/dev/sda的属性是"b", 表示这是 块设备。 

块设备就是存储数据供系统及程序访问的接口设备,如:硬盘,光驱等都属于块设备。

 

以上种类的文件,一般可用 mknod (mknod - make block or character special files)来创建,用 rm 来删除。 

目前在最新的 Linux 发行版本中,我们一般不需要自己来创建 设备文件 了。
因为这些文件是和内核相关联的。

 

3.3.4 套接口文件 socket 

当我们启动 mysql 服务时,会产生一个 mysql.sock 文件。这个文件的属性的第一个字符是 s。

技术图片

 

 

.sock 文件也是一类特殊的文件,这类文件通常在网络之间进行数据连接,如:我们可以启动一个程序来监听客户端的请求,客户端可以通过套接字来进行数据通信:

 

mysql -uroot -ppass -S /data/3306/mysql.sock
这个就是mysql 数据库 客户端程序连接服务器端命令,通过套接字文件来和数据库服务器通信的例子。

 
 

符号链接文件 也被称之为 软链接文件

[root@oldboy /]# ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 Aug 30 07:19 /bin/sh -> bash

当我们查看文件属性时,第一个字符是‘l‘,这类文件标识链接文件(提示:上面的是软链接文件)。

[root@oldboy /]# ls -l /etc/rc.d/init.d /etc/init.d -d
lrwxrwxrwx. 1 root root   11 Aug 30 07:19 /etc/init.d -> rc.d/init.d
drwxr-xr-x. 2 root root 4096 Sep  5 01:05 /etc/rc.d/init.d

/etc/rc.d/init.d 是真实的文件,/etc/init.d指向的是/etc/rc.d/init.d

 

3.3.6 管道文件 FIFO,pipe 

FIFO 也是一个特殊的文件类型,主要是解决多个程序同时访问一个文件所造成的错误,第一个字符为p。
FIFO是fifo - first-in first out的缩写。

 

3.4 文件扩展名 

一般来说,Linux中的文件是不需要扩展名的。

Windows中可执行文件扩展名结尾通常是.ext, .com, .bat,而在Linux中文件可否执行就是看权限位的 x 位是否会有 x,图片文件扩展名结尾通常是.jpg, .gif, .bmp, .png等。

 

3.4.1 Linux下扩展名的作用

在Linux中,虽然扩展名没什么实际意义,但是为了兼容windows,同时,便于我们大部分习惯了windows的用户区分文件的不同,所以,我们还是习惯通过扩展名来表示不同文件的类型。

  1. .tar, .tar.gz, .tgz, .zip, .tar.bz 表示压缩文件,创建命令一般为 tar , gzip , unzip等
  2. .sh表示shell脚本文件,通过shell语言开发的程序
  3. .pl 表示perl语言文件,通过perl语言开发的程序
  4. .py 表示python语言文件,通过python语言开发的程序
  5. .html, .htm, .php, .jsp, .do 表示网页语言的文件
  6. .conf 表示系统的配置文件
  7. .rpm 表示rpm 安装包文件

 

4. 用户和用户组 

Linux/Unix 是一个多用户、多任务的操作系统。

 

用户user介绍:

Linux是一个多用户,多任务的分时操作系统,如果要使用系统资源,就必须向系统管理员申请一个账户,然后通过这个账户进入系统。 

这个账户和用户是一个概念,通过建立不同属性的用户,一方面,可以合理的利用和控制系统资源,另一方面也可以帮助用户组织文件,提供对用户文件的安全性保护。 

 

每个用户都有一个唯一的用户名和用户口令,在登录系统时,只有正确输入了用户名和密码,才能登入系统和相应的目录(除了密码验证外,还可以是密钥验证)。

 

在生产环境中,我们一般会为每个有权限管理服务器的运维人员分配一个独立的普通用户账号及8位(包含数字、字母、特殊字符)以上的密码,如oldboy。 

该人员只能通过建立的这个账号登录到系统中进行维护,当需要超级用户权限时,可以通过"sudo 命名名"的方法来执行仅有root用户才允许执行的权限。 

当然,sudo权限要尽量的小,还有,当运维人员人数不多时,如2-3个,也可以直接 su - 切换到超级用户root下,在执行相应的维护工作,在这里要特别提醒大家,维护时,如果不需要root权限,就不要进入root用户下操作,以减少误操作对系统带来的损失。

 

用户组介绍group

Linux系统中的用户组group,就是具有相同特征的用户user的集合。 

不设定组的话,默认的组和用户名相同,uid和gid也相同

[root@oldboy ~]# id oldboy
uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)
[root@oldboy ~]# id zoe
uid=501(zoe) gid=501(zoe) groups=501(zoe)

Linux系统中用户角色划分

在Linux系统中用户是分角色的,在Linux系统中,由于角色不同,权限和所完成的任务也不同;值得注意的是,对于Linux系统来说,用户的角色是通过UID和GID识别的
特别是UID,在Linux系统运维中座中,一个UID是唯一标识一个系统用户的账号(相当于我们的身份证)。用户系统账号的名称(如oldboy)其实就是给人(管理员)看的,linux系统能够识别的仅仅是UID和GID这样的数字。 

用户的UID就相当于我们的身份证一样,用户名就相当于我们的名字。 

  • UID:User Identify 用户ID,相当于各位的身份证,在系统中是唯一的
  • GID:Group Identify 组ID,相当于各位的家庭或者你们的学校ID
 

用户和组的关系:

  • 一对一
    • 即一个用户可以存在在一个组里,也可以是组中的唯一组员,如:root
  • 一对多
    • 即一个用户可以存在多个用户组中。
  • 多对一
    • 多个用户可以存在于一个组中,这些用户具有和组相同的权限
  • 多对多
    • 多个用户可以存在于多个组中,并且几个用户可以归属相同的组。其实多对多关系就是前面三条的扩展

 

技术图片

 

用户及用户组配置文件介绍

Linux系统下的账户文件主要有/etc/passwd, /etc/shadow, /etc/group,/etc/gshadow 四个文件。

 

与用户相关的配置文件: 

  • /etc/passwd
    • 用户的配置文件
  • /etc/shadow
    • 用户的影子口令文件
 

useradd username 添加用户,会对/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow这四个文件进行改动。

 

[root@oldboy ~]# useradd beaty
[root@oldboy ~]# tail -1 /etc/passwd
beaty:x:502:502::/home/beaty:/bin/bash
[root@oldboy ~]# tail -1 /etc/shadow
beaty:!!:18144:0:99999:7:::
[root@oldboy ~]# tail -1 /etc/group
beaty:x:502:
[root@oldboy ~]# tail -1 /etc/gshadow
beaty:!::

用户的配置文件/etc/passwd

/etc/passwd 文件中每行定义一个用户账号,有多少行就表示多少个账号,在一行中可以清晰地看出,各内容之间又通过":"号划分了多少个字段,共7部分,这7部分分别定义了账号的不同属性,passwd文件实际内容如下:

[root@oldboy ~]# head -5 /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
rootx00root/root/bin/bash
账号名称 账号密码 账号UID 账号组GID 用户说明 用户家目录 shell解释器

 

  • 账号名称:
    • 和用户UID对应,这是用户登录时使用的账号名称,在系统中是唯一的,不能重名
  • 账号密码:
    • 早期的UNIX系统中,该字段是存放账号密码的,由于安全原因,把这个密码字段内容移到了/etc/shadow中。这里可以看到一个字母x,表示该用户的密码是在/etc/shadwo文件中保护的
  • 账号UID:
    • 账号UID一般是由一个整数表示的,范围是0-65535
  • 账号GID:
    • 账号GID一般也是由一个整数表示的,范围也是0-65535,当添加账户时,默认情况下会同时建立一个与用户同名且UID和GID相同的组
  • 用户说明:
    • 这个字段是对这个账号的描述说明
  • 用户家目录:
    • 用户登录后首先进入的目录,一般为"/home/用户名"这样的目录
  • shell解释器:
    • 当前用户登录所使用的shell,在centos、redhat等Linux系统中,默认的shell为bash,就是在这里设置的。如果不希望用户登录系统,可以通过usermod或者手动修改passwd配置,将该字段改为/sbin/nologin即可。如果你仔细看passwd文件的话,会发现大部分内置系统虚拟账号的这个字段都是/sbin/nologin,表示禁止登陆系统,这是出于安全考虑的。
 

登陆的解释器:

[root@oldboy ~]# echo $SHELL
/bin/bash
 
[root@oldboy ~]# cat /etc/shells  # 前三个是常用的登录解释器
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

用户的影子口令文件/etc/shadow 

由于passwd文件必须要被所有的用户读,所以会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。

看/etc/shadow的文件属性,尤其是权限:

[root@oldboy ~]# ls -l /etc/shadow
---------- 1 root root 996 Sep  6 02:30 /etc/shadow

 

可以发现,/etc/shadow的读写执行权限都是关闭状态,其文件内容为:

[root@oldboy ~]# head -5 /etc/shadow
root:$6$a3Nz7mPHQhejVvc8$ulRgApnmQBjLbliTkD7/9BCjx2Ysy/EY7FQ2vIySBmo44dMOvM8VOqV0HNOgMaor1iHqwCM.K/dSmhvdayoY..:18137:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
lp:*:15980:0:99999:7:::
字段名称注释说明
账号名称 用户的账号名称
账号密码 用户密码,这是加密过的口令
最近修改密码的时间 从1970年1月1日起,到用户最近一次更改口令的天数
禁止修改密码的天数 从1970年1月1日起,到用户可以更改密码的天数
用户必须更改口令的天数 从1970年1月1日起,到用户必须更改密码的天数
警告更改密码的期限 在用户密码过期前多少天提醒用户更改密码
不活动时间 在用户密码过期之后到禁用账户的天数
失效时间 从1970年1月1日起,到用户被禁用的天数(useradd -f)
标志

保留

 

小结论:

  1. useradd 添加用户会更改/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow
  2. passwd 为用户设置密码会更改/etc/shadow
 

与用户组相关的配置文件

  • /etc/group # 用户组配置文件
  • /etc/gshaow # 用户组的影子文件
 

用户组配置文件/etc/group

/etc/group 文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户归属那个用户组,因为一个用户可以归属一个或多个不同的用户组;同一个用户组的用户具有相似的特征。
 

比如:
我们把某一用户加入到root用户组,那么这个用户就可以浏览root用户家目录的文件,如果root用户把某个文件的读写执行权限开放,root用户组的所有用户都可以修改此文件,如果是可执行的文件(比如脚本),root用户组的用户也是可以执行的。 

 

用户组的特性在系统管理中为系统管理员提供了极大的方便,但是安全性也是值得关注的,如:某个用户下有对系统管理有重要的内容,最好让用户拥有独立的用户组,或者是把用户下的文件的权限设置为完全私有;另外root用户组一般不要轻易把普通用户加入进去。

 
字段名称注释说明
用户组名 该组的名称
用户组密码 通常不需要设置该密码,由于安全原因,该密码被记录在/etc/gshadow中,因此,显示为‘x‘。这类似/etc/shadow
GID 该用户组的ID
用户组成员 加入这个组的所有用户账号
 

小结论:

  1. groupadd 添加用户组会更改/etc/group, /etc/gshadow
 

用户组的影子文件/etc/gshadow

/etc/gshadow 是/etc/group 的加密咨询文件,比如用户组Group管理密码就是存放在这个文件。 

/etc/gshadow 和 /etc/group 是互补的两个文件。 

对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置用户组密码是极有必要的。

 

比如,我们不想让一些非用户组成员永远拥有用户组的权限和特定,这时我们可以通过密码验证的方式来让某些用户临时拥有一些用户组特性,这时就要用到用户组密码:/etc/gshadow 

格式如下:每个用户组独占一行:

[root@oldboy ~]# ls -l /etc/gshadow
---------- 1 root root 509 Sep  6 02:30 /etc/gshadow
[root@oldboy ~]# head -5 /etc/gshadow
root:::
bin:::bin,daemon
daemon:::bin,daemon
sys:::bin,adm
adm:::adm,daemon

超级用户:

默认是root用户,其UID和GID均为0。

root用户在每台unix/Linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中任何文件和命令,拥有最高的管理权限。 

在生产环境中,一般会禁止root账号通过SSH远程连接服务器(保护好皇帝),当然了,也会更改默认的SSH端口(保护好皇宫),以加强系统安全。

 

企业工作中:没有特殊需求,应该尽量在普通用户下操作任务,而不是root。

在Linux系统中,UID为0的用户就是超级用户。但是通常不这么做,而是sudo管理提权,可以细到每个命令权限分配。

root比喻为皇帝,Root家目录就是皇宫。操作系统就是全国。

# 0 和 0 分别是UID 和 GID
[root@oldboy ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

普通用户:

这类用户一般是由具备系统管理员root的权限的运维或系统管理人员添加的。 

例如:
oldboy这类用户可以登录系统,但仅具备操作自己家目录中的文件及目录的权限,除此之外,还可以进入、或浏览相关目录(/etc, /var/log),但是无法创建、修改和删除;

 

普通用户:比喻皇帝的臣民,干坏事时,国家有法律管束你。 为普通用户授权sudo,封官。布衣也可以提权。

su -root,角色切换,农名起义,推翻皇帝,自己当皇帝。

sudo ls 授权、封官,尚方宝剑。可以为皇帝办事,有一定的权限,但还是自己。

 

虚拟用户: 

与真实普通用户区分开来,这类用户最大的特点是安装系统后默认就会存在,且默认情况大多数不能登录系统,但是,他们是系统正常运行不可缺少的,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。 

例如:
系统默认的bin, adm, nobody, mail用户等。 

由于服务器业务角色不同,有部分用不到的系统服务被禁止开机执行,因此,做系统安全优化时,被禁止开机启动的服务对应的虚拟用户也是可以处理掉的(删除或注释)

 

# 结尾是nologin的都是虚拟用户
[root@oldboy ~]# cat /etc/passwd|grep ‘nologin$‘
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin

虚拟用户角色傀儡:
linux安全优化:

  1. 安装系统后可以删除用不到的虚拟用户,但是最好不删,而是注释掉,万一出问题可以恢复过来。
  2. 我们自己部署服务的时候,也会创建虚拟用户,满足服务的需求!
    例如:apache, nginx, mysql, nfs, rsync, nagios, zabbix, redis
 

有关UID限制说明:

 
UID整数范围用户类型具备该UID用户特性
0 超级用户(皇帝) 当用户的UID为0时,表示这个账号为超级管理员账号;如果要增加一个系统管理员账号的话,只需要将该账号的UID改成0即可。不建议这样做,用sudo替代
1-499 虚拟用户(傀儡) 这个范围是保留给系统使用的UID,是为了防止认为建立账户的UID和系统的UID之间冲突,并没有其他特殊的含义。除了0之外,所有的UID在使用上没有任何区别
500-65535 普通用户(臣民) 普通账户UID,当使用useradd username建立账户时,默认情况下UID就是从500开始的。我们可以随时指定UID来创建账户
 

5. 文件的权限

5.1 文件权限概述

Linux中的文件或目录的权限和用户及用户组关联很大。
 

Linux中每个文件或目录都有一组共9个基础权限位,每三个字符被分为一组,他们分别是:

  • 属主权限位(占三个字符)
  • 用户组权限位(占三个字符)
  • 其他用户权限位(占三个字符)

技术图片

 

技术图片

  • - 没有权限,0
  • x 执行,1
  • w 写,2
  • r 读,4
[root@oldboy /]# ls -l
total 118
drwxr-xr-x   3 root root  4096 Sep  4 15:42 app
dr-xr-xr-x.  2 root root  4096 Aug 30 09:17 bin

最后一位的“.”和selinux的状态相关,selinux的开启状态下,创建的文件就有“.”,关闭状态下创建的文件就没“.”。

 

6.软硬链接

6.1 链接的概念

在Linux系统中,链接可分为两种:

  • 硬链接Hard Link
  • 软连接 或 符号链接 Symbolic Link or Soft Link
 

ln 这个命令就是创建 链接文件的,在默认不带参数的情况下,执行 ln 命令创建的链接 是硬链接。

如果使用 ln -s 创建链接则为 软连接,前面文件类型为l(字母L)的是软连接。

 

实践直观命令演示理解:

  • 硬链接
    • ln 源文件 目标文件
  • 软连接
    • ln -s 源文件 目标文件(目标文件不能事先存在)
 

硬链接 

硬链接是指通过索引节点Inode来进行链接。 

在Linux(ext2,ext3,ext4)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Index Inode)简称Inode,即在系统中文件的编号。

 

在Linux文件系统中,多个文件名指向同一个索引节点(Inode)是正常且允许的。这种情况的文件就称为硬链接 

提示:硬链接文件就相当于文件的另外一个入口。

技术图片

 

 

硬链接的作用之一是允许一个文件拥有多个有效路径名(多个入口),这样用户就可以建立硬链接到重要的文件,以防止“误删”源数据(很多硬件存储,如 netapp存储中的快照功能就应用了这个原理,增加了一个快照就多了一个硬链接)。 

 

为什么一个文件建立了 硬链接就会防止数据误删呢?

因为文件系统ext2的原理是,只要文件的索引节点还有一个以上的硬链接。
只删除其中一个硬链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其它的链接(即数据文件实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过类似 fsck 做磁盘检查的时候。被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。 此时,数据就再也无法找回了。

 

也就是说,在Linux系统中,删除静态文件(没有进程调用)(目录也是文件)的条件是与之相关的所有硬链接文件均被删除(暂时这样理解即可,后文会讲和进程的占用也有关)。

 

示例:

# 创建文件a
[root@oldboy oldboy]# echo 1 > a
[root@oldboy oldboy]# ls -l a 
-rw-r--r-- 1 root root 2 Sep  5 18:58 a
[root@oldboy oldboy]# cat a
1

# 创建a的硬链接b,两个互为硬链接
[root@oldboy oldboy]# ln a b
[root@oldboy oldboy]# cat a
1
[root@oldboy oldboy]# cat b
1

# 查看a和b文件的属性,索引节点inode相同,都显示2个硬链接数
[root@oldboy oldboy]# ls -li a b
275727 -rw-r--r-- 2 root root 2 Sep  5 18:58 a
275727 -rw-r--r-- 2 root root 2 Sep  5 18:58 b
[root@oldboy oldboy]# 
m -f a
[root@oldboy oldboy]# ls -li a 
ls: cannot access a: No such file or directory

# a 删除后,a的索引节点的另一个入口b仍然存在,文件内容仍然存在。
[root@oldboy oldboy]# ls -li b
275727 -rw-r--r-- 1 root root 2 Sep  5 18:58 b
[root@oldboy oldboy]# cat b
1

硬链接知识小结

  1. 具有相同inode节点号的多个文件是 互为硬链接文件
  2. 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除
  3. 只有删除了源文件及所有对应的硬链接文件,文件实体才会被删除
  4. 当所有的硬链接文件及源文件被删除后,再存放新的数据会占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收。
  5. 硬链接文件就是文件的另一个入口
  6. 可以通过给文件设置硬链接文件,来防止重要文件被误删
  7. 通过执行命令"ln 源文件 硬链接文件",即可完成创建硬链接
  8. 硬链接文件是普通文件“-”,因此 可以用 rm 命令删除
  9. 对于静态文件(没有进程正在调用的文件)来讲,当对应硬链接数为0(变量i_link),文件就被删除。i_link 的查看方法(ls -l 结果的第三列就是)
 

软链接 

软连接Soft Link 也称为 符号链接Symbolic Link。

Linux里的软链接文件就类似于 Windows系统中的快捷方式。

Linux里的软链接文件 实际上是一个特殊的文件,文件类型是 l。 

软链接文件实际上可以理解为一个 文本文件,这个文件中包含有软链接 指向另一源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接指向的源文件实体。

 

软链接原理图

技术图片

 

 

从oldboyfile_soft_link这个软链接文件进入,从软链接的inode找到对应的软链接的block。 软链接的block中存储着指向oldboyfile的源文件,读取源文件的inode,找到对应的block,读取block的数据内容。
文件内容的权限主要看源文件的权限。

 

查看软链接的value:

[root@oldboy newdir]# touch file 
[root@oldboy newdir]# ln -s file soft_file  # 创建软链接

# 软链接和源文件的inode、文件类型和权限都不同
[root@oldboy newdir]# ls -li file soft_file
275516 -rw-r--r-- 1 root root 0 Sep  5 20:03 file
275730 lrwxrwxrwx 1 root root 4 Sep  5 20:03 soft_file -> file

[root@oldboy newdir]# readlink soft_file
file

软链接的创建

    ln -s 源文件 软链接文件

 

误区: 创建软链接 源文件是需要存在的,要创建的软链接文件是不能存在的,是要用 ln 命令创建的。

 

软链接知识小结

  1. 软链接类似windows的快捷方式(可以通过 readlink 查看其指向)
  2. 软链接类似一个文本文件,里面存放的是源文件的路径,指向源文件实体
  3. 删除源文件,软链接文件依然存在,但是无法访问指向的源文件路径内容了。
  4. 失效的时候一般是白字红底闪烁提示。
  5. 执行命令“ln -s 源文件 软链接文件”,即可完成创建软链接(目标不能存在)
  6. 软链接和源文件是不同类型的文件,也是不同的文件。inode号也不一样
  7. 软链接的文件类型为l(link),删除 软链接 可以用 rm命令。

技术图片

 

操作示例:

[root@oldboy application]# mkdir /test/oldboy -p
[root@oldboy application]# cd /test/oldboy
[root@oldboy oldboy]# touch oldboyfile

# 创建硬链接和软链接
[root@oldboy oldboy]# ln oldboyfile oldboy_hard_link
[root@oldboy oldboy]# ln -s oldboyfile oldboy_soft_link

# 显示文件属性
[root@oldboy oldboy]# ls -li
total 0
275736 -rw-r--r-- 2 root root  0 Sep  5 21:35 oldboyfile
275736 -rw-r--r-- 2 root root  0 Sep  5 21:35 oldboy_hard_link
275737 lrwxrwxrwx 1 root root 10 Sep  5 21:36 oldboy_soft_link -> oldboyfile

有关文件的链接总结:

  1. 删除软链接文件对源文件及硬链接文件无任何影响。
  2. 删除硬链接文件对源文件及软链接文件无任何影响
  3. 删除源文件,对硬链接文件没有影响,但是会导致软链接失效,白底红字闪烁。
  4. 同时删除源文件,硬链接文件,整个文件会真正的被删除
  1. 源文件和硬链接文件具有相同的索引节点号,可以认为是同一个文件或一个文件的多个入口
  2. 源文件和软链接文件索引节点号不同,是不同的文件,软链接相当于源文件的快捷方式,含有源文件的位置指向。
 

有关目录链接小结: 

[root@oldboy oldboy]# mkdir oldboydir

# 无法创建目录硬链接
[root@oldboy oldboy]# ln oldboydir oldboydir_hard_link
ln: `oldboydir‘: hard link not allowed for directory

# 为目录创建软链接
[root@oldboy oldboy]# ln -s oldboydir oldboydir_soft_link

[root@oldboy oldboy]# ls -li
total 4
275736 drwxr-xr-x 2 root root 4096 Sep  5 21:55 oldboydir
275737 lrwxrwxrwx 1 root root    9 Sep  5 21:56 oldboydir_soft_link -> oldboydir
  1. 对于目录,不可以创建硬链接,但可以创建软链接
  2. 对于目录的软链接是生产场景运维中常用的技巧
    • 比如apache服务,版本更新,软链接名称固定,只要更新源文件重新指向该软链接名称即可更新服务
  3. 目录的硬链接不能跨越文件系统(从硬链接原理可以理解)
    • 硬链接本身是相同的inode,相同的block
  4. 每个目录下面都有一个硬链接".",和对应上级目录的硬链接".."
  5. 在父目录里创建一个子目录,父目录的链接数增加1(子目录里都有".."来指向父目录)。 但是在父目录里创建文件,父目录的链接数不会增加。
 

问:请问下面的目录的链接数为什么是3?

[root@oldboy oldboy]# ls -alid ../oldboy/
275735 drwxr-xr-x 3 root root 4096 Sep  5 21:56 ../oldboy/

答案

[root@oldboy test]# ls -ali /test/oldboy 
total 12
275735 drwxr-xr-x 3 root root 4096 Sep  5 21:56 .
275700 drwxr-xr-x 7 root root 4096 Sep  5 21:35 ..
275736 drwxr-xr-x 2 root root 4096 Sep  5 21:55 oldboydir
275737 lrwxrwxrwx 1 root root    9 Sep  5 21:56 oldboydir_soft_link -> oldboydir

根据显示,/test/oldboy/ 目录下有两个隐藏文件,‘.‘指向/test/oldboy/,互为硬链接。 

还有一个子目录oldboydir,子目录下的隐藏文件‘..‘指向上一层目录,也就是/test/oldboy,也就是说,/test/oldboy/oldboydir/.. 与/test/oldboy/ 互为硬链接,所以总共是3个硬链接。

[root@oldboy test]# ls -alid /test/oldboy /test/oldboy/. /test/oldboy/oldboydir/..
275735 drwxr-xr-x 3 root root 4096 Sep  5 21:56 /test/oldboy
275735 drwxr-xr-x 3 root root 4096 Sep  5 21:56 /test/oldboy/.
275735 drwxr-xr-x 3 root root 4096 Sep  5 21:56 /test/oldboy/oldboydir/..

注意:由于每一个子目录中都有一个‘..‘硬链接文件指向父目录,所以每增加一个子目录,硬链接数就+1。

 
 

7.时间戳

[root@oldboy ~]# ll
total 40
-rw-------. 1 root root  1073 Aug 30 07:22 anaconda-ks.cfg
-rw-r--r--. 1 root root 22179 Aug 30 07:22 install.log
-rw-r--r--. 1 root root  5890 Aug 30 07:21 install.log.syslog

第7,8,9列是时间(默认是修改时间mtime)。

  • modify 修改时间 -mtime
    • 一般是修改文件内容时,时间会改变
  • change 改变时间 - ctime
    • 文件的属性改变(文件大小等都是属性)
  • access 访问时间 - atime
    • 访问文件内容

用--time-style参数可以规范时间显示(格式化显示时间属性,可以做成别名):

[root@oldboy ~]# ls -l --time-style=long-iso /oldboy
total 4
drwxr-xr-x 3 root root 4096 2019-09-05 22:17 ett

[root@oldboy ~]# ls -l --time-style=full /oldboy    
total 4
drwxr-xr-x 3 root root 4096 2019-09-05 22:17:49.189994142 +0800 ett

用stat 查看文件的时间属性:

[root@oldboy ~]# stat /oldboy/ett
  File: `/oldboy/ett‘
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 803h/2051d      Inode: 275739      Links: 3
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-09-06 04:25:39.599000000 +0800
Modify: 2019-09-05 22:17:49.189994142 +0800
Change: 2019-09-05 22:17:49.189994142 +0800

实践演示:

# 创建time_test文件,atime,mtime和ctime都是一致的
[root@oldboy oldboy]# touch time_test
[root@oldboy oldboy]# stat time_test
  File: `time_test‘
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 803h/2051d      Inode: 275701      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-09-06 04:54:58.612994186 +0800
Modify: 2019-09-06 04:54:58.612994186 +0800
Change: 2019-09-06 04:54:58.612994186 +0800

# 修改time_test文件内容,mtime和ctime一起发生变化(由于文件大小发生了变化,ctime也随之相应改变)
[root@oldboy oldboy]# echo 1234556788gaga>time_test
[root@oldboy oldboy]# stat time_test
  File: `time_test‘
  Size: 15              Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 275701      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-09-06 04:54:58.612994186 +0800
Modify: 2019-09-06 04:55:41.054000828 +0800
Change: 2019-09-06 04:55:41.054000828 +0800

# 仅访问读取time_test 文件内容,仅atime发生变化
[root@oldboy oldboy]# cat time_test
1234556788gaga
[root@oldboy oldboy]# stat time_test
  File: `time_test‘
  Size: 15              Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 275701      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-09-06 04:57:12.595999043 +0800
Modify: 2019-09-06 04:55:41.054000828 +0800
Change: 2019-09-06 04:55:41.054000828 +0800

# 将time_test的属主和属组改为zoe,只有ctime发生变化
[root@oldboy oldboy]# chown zoe.zoe time_test
[root@oldboy oldboy]# stat time_test
  File: `time_test‘
  Size: 15              Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d      Inode: 275701      Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/     zoe)   Gid: (  501/     zoe)
Access: 2019-09-06 04:57:12.595999043 +0800
Modify: 2019-09-06 04:55:41.054000828 +0800
Change: 2019-09-06 04:58:20.355991099 +0800

 

8. 文件名

第10列,文件名不在文件inode里,而是在上级目录的block里。

 

以上是关于Linux文件和目录的属性及权限的主要内容,如果未能解决你的问题,请参考以下文章

08-Linux基础入门-文件和目录的属性及权限之文件类型文件扩展名及文件权限基础

Linux 文件和目录的属性及权限

06-Linux基础入门-文件和目录的属性及权限之inode与block

linux修改文件及文件夹读写权限

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

09-Linux基础入门-文件和目录的属性及权限之链接(综合网络整理)