2019-8-20 [Linux] 5.Linux文件与目录管理 文件基本属性 节点连结数 如何读取数据的 链接概念 ln命令

5.Linux文件与目录管理

5.1. Linux 文件基本属性

Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。

在Linux中我们可以使用ll或者ls –l命令来显示一个文件的属性以及文件所属的用户和组,如:

[root@localhost ~]# ls / -l
总用量 16
#文档的权限信息    文档的硬连接数量    #文档的归属用户       #文档的用户组        #文件大小      #问的的最后修改时间    #文档名称( ---> 某个目录 说明这是一个连接文档)
lrwxrwxrwx.       1                 root                 root                7             1119 17:41         bin -> usr/bin
#文档的权限信息    文档的硬连接数量    #文档的归属用户       #文档的用户组        #文件大小      #问的的最后修改时间    #文档名称(如果文件名称带.说明是隐藏文件)
dr-xr-xr-x.       5                 root                 root                4096          1119 17:45         boot
​
drwxr-xr-x.  20 root root 3220 1119 17:47 dev
drwxr-xr-x.  74 root root 8192 1120 06:15 etc
drwxr-xr-x.   3 root root   25 1120 04:40 home
lrwxrwxrwx.   1 root root    7 1119 17:41 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 1119 17:41 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 411 2018 media
drwxr-xr-x.   2 root root    6 411 2018 mnt
drwxr-xr-x.   2 root root    6 411 2018 opt
dr-xr-xr-x. 114 root root    0 1119 17:47 proc
dr-xr-x---.   2 root root  135 1119 17:48 root
drwxr-xr-x.  23 root root  720 1119 17:47 run
lrwxrwxrwx.   1 root root    8 1119 17:41 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 411 2018 srv
dr-xr-xr-x.  13 root root    0 1119 17:47 sys
drwxrwxrwt.   8 root root  211 1120 03:47 tmp
drwxr-xr-x.  14 root root  166 1120 04:48 usr
drwxr-xr-x.  19 root root  267 1119 17:47 var

在这里插入图片描述
实例中,bin文件的第一个属性用"d"表示。"d"在Linux中代表该文件是一个目录文件,换句话说bin是一个文件夹。

在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。

当为[ d ]则是目录(文件夹)
当为[ - ]则是文件;
若是[ l ]则表示为链接文档(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
每个文件的属性由左边第一部分的10个字符来确定(如下图)。
在这里插入图片描述
从左至右用0-9这些数字来表示。

第0位确定文件类型,第1-3位确定属主(该文件的所有者)拥有该文件的权限。第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。

其中,

第1、4、7位表示读权限,如果用"r"字符表示,则有读权限,如果用"-"字符表示,则没有读权限;

第2、5、8位表示写权限,如果用"w"字符表示,则有写权限,如果用"-"字符表示没有写权限;

第3、6、9位表示可执行权限,如果用"x"字符表示,则有执行权限,如果用"-"字符表示,则没有执行权限。

5.2 inode 节点连结数

    在权限后面的数字代表这个文档的inode节点硬链接的数量

5.3 inode 是什么?

    理解inode,要从文件储存说起。
    文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
    操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。
    "块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
    文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。
    这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

5.4 inode 的内容

inode包含文件的元信息,具体来说有以下内容:
   * 文件的字节数
   * 文件拥有者的User ID
   * 文件的Group ID
   * 文件的读、写、执行权限
   * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
   * 链接数,即有多少文件名指向这个inode
   * 文件数据block的位置

一般情况下
创建一个文件默认的inode数量为 1
创建一个目录的默认inode数量为 2

为啥呢 ? 因为一个目录有两个隐藏的目录
一个叫 . 是当前目录的相对名称
一个叫 … 是当前目录的上一级目录的相对名称
linux中有几个相对目录的名称 需要大家注意

~ 指 家目录
. 指当前目录
… 指当前目录的上一级目录

并且在 UNIX 中创建一个文件系统时,将为 inode 表分配大约百分之一的总磁盘空间。每次在文件系统中创建一个文件时,都会为该文件分配一个 inode 。

通常,与一个文件系统相关联的 inode 的数目足够多,但耗尽 inode 的可能性始终存在。要监视是否发生了这种情况,您可以观察 df 的输出。

使用 df 命令,您可以查看所有已挂载的文件系统或者特定的文件系统。在该命令的输出中,您可以查看各个文件系统中已使用的 inode 的数目,以及文件系统中总体使用情况百分比

[root@localhost /]# df -i
文件系统                  Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 8910848   26101 8884747       1% /
devtmpfs                 121686     386  121300       1% /dev
tmpfs                    124744       1  124743       1% /dev/shm
tmpfs                    124744     728  124016       1% /run
tmpfs                    124744      16  124728       1% /sys/fs/cgroup
/dev/sda1                524288     326  523962       1% /boot
tmpfs                    124744       1  124743       1% /run/user/0

可以用stat命令,查看某个文件的inode信息:stat 文件名

[root@localhost /]# stat /bin
  文件:"/bin" -> "usr/bin"
  大小:7          块:0          IO 块:4096   符号链接
设备:fd00h/64768d Inode:18933       硬链接:1
权限:(0777/lrwxrwxrwx)  Uid:(    0/    root)   Gid:(    0/    root)
环境:system_u:object_r:bin_t:s0
最近访问:2019-05-30 12:25:05.325890519 +0800
最近更改:2019-05-30 12:25:01.735194422 +0800
最近改动:2019-05-30 12:25:01.735194422 +0800

5.5 Linux 是如何读取数据的?

Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。

实际上,系统内部这个过程分成三步:

  1. 首先,系统找到这个文件名对应的inode号码;
  2. 其次,通过inode号码,获取inode信息;
  3. 最后,根据inode信息,找到文件数据所在的block,读出数据。
    在这里插入图片描述

5.6 inode是干啥的呢?

    打个比方,在windows系统中,对于一个文件(或者文件夹)你可以有两种操作方式,第一种就是复制粘贴,第二种就是创建快捷方式来操作这些文件;
    第一种操作 对文件的粘贴复制可以产生很多文件,但是内容相同,浪费了空间,所以linux采用inode读取文件的形式,可以让两个不同的文件名指向同一个物理文件
    这个就好比我们使用maven仓库是一个道理的,每个项目引用这些共有资源,不会造成资源浪费;
    那么我们怎么利用这个inode呢?

5.7 Linux 链接概念

Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。

Linux 链接解决的就是一个数据块的共享问题

5.7.1 硬连接

硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。

在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

5.7.1 软连接

另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。

5.8 Linux ln命令

Linux ln命令是一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。

当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

语法

ln [参数][源文件或目录][目标文件或目录]

参数
必要参数:

-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程
选择参数:

-S "-S<字尾备份字符串> "或 “–suffix=<字尾备份字符串>”
-V “-V<备份方式>“或”–version-control=<备份方式>”
–help 显示帮助信息
–version 显示版本信息

实例操作

[root@localhost ~]# touch file1            # 创建 一个file1的文件
[root@localhost ~]# ln file1 lf1           # 给file1创建一个硬连接 lf1
[root@localhost ~]# ln -s file1 lf2        # 给file1创建一个软连接 lf2
[root@localhost ~]# ls -li                 # -li参数 查看文档的inode信息
总用量 8
33574978 -rw-------. 1 root root 1241 1119 17:45 anaconda-ks.cfg
33575015 -rw-r--r--. 2 root root    0 1120 09:54 file1
33575014 drwxr-xr-x. 2 root root    6 1120 08:23 hnxy
33575013 -rw-r--r--. 1 root root  363 1121 2018 isayme.xcs
33575015 -rw-r--r--. 2 root root    0 1120 09:54 lf1
33575016 lrwxrwxrwx. 1 root root    5 1120 09:55 lf2 -> file1

从上面的结果中可以看出,硬连接文件 lf1 与原文件 file1 的 inode 节点相同,均为33575015,然而符号连接文件的 inode 节点不同。

继续测试

[root@localhost ~]# echo "Hello,Linux">>file1             # 向file1添加一句话
[root@localhost ~]# cat file1                             # 查看file1的内容
Hello,Linux
[root@localhost ~]# cat lf1                               # 查看硬链接
Hello,Linux
[root@localhost ~]# cat lf2                               # 查看软连接
Hello,Linux
[root@localhost ~]# rm -f file1                           # 删除file1
[root@localhost ~]# cat lf1                               # 再次查看硬链接
Hello,Linux
[root@localhost ~]# cat lf2                               # 再次查看软连接
cat: lf2: 没有那个文件或目录

总结

  1. 删除软连接对原始文件没有影响,因为它只是一个快捷方式;
  2. 删除硬连接对原始文件和软连接没有影响,因为他是一个独立的文件;
  3. 删除原文件,对硬连接没有影响,导致软连接失效;
  4. 同时删除原始文件和所有的硬链接,整个文件会真正的被删除。
    以后我们会经常给某些文件或目录创建各种连接,所以ln命令大家要熟记;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值