Linux 系列之七目录结构、文件属性及链接

教程 海牛博士 ⋅ 于 2021-06-10 20:14:01 ⋅ 1307 阅读

1 linux目录结构

file

bin: 存放二进制可执行文件(ls,cat,mkdir等)

boot: 存放用于系统引导时使用的各种文件

dev: 用于存放设备文件

etc:存放系统配置文件 /etc/profile, /etc/passwd ,/etc/shadow

home: 存放所有用户(除了root)文件的根目录

lib:存放跟文件系统中的程序运行所需要的共享库及内核模块

mnt:系统管理员安装临时文件系统的安装点

opt:额外安装的可选应用程序包所放置的位置

proc:虚拟文件系统,存放当前内存的映射

root:超级用户目录

sbin:存放系统管理命令

tmp:用于存放各种临时文件 ,可以存放一些不重要的文件

usr:用于存放系统应用程序,比较重要的目录/usr/local 本地管理员软件安装目录

/usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据;

= windows Program Files

var:用于存放运行时需要改变数据的文件

2 linux 文件基本属性

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

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

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

2.1 文件及详细信息

file

2.2 文件类型及权限

实例中,bin文件的第一个属性用"d"表示。"d"在Linux中代表该文件是一个目录文件,换句话说bin是一个文件夹。

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

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

接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。

每个文件的属性由左边第一部分的10个字符来确定(如下图)。

file

从左至右用0-9这些数字来表示。

第0位确定文件类型,

第1-3位确定属主(该文件的所有者)拥有该文件的权限。

第4-6位确定属组(所有者的同组用户)拥有该文件的权限,

第7-9位确定其他用户拥有该文件的权限。

其中,

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

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

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

2.3 inode详解

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

2.3.1 inode 是什么

​ 理解inode,要从文件储存说起。

​ 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

​ 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。

​ "块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

​ 文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。

​ 这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

2.3.2 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

2.3.3 linux 内部是如何读取数据的?

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

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

​ 1)首先,系统找到这个文件名对应的inode号码;

​ 2)其次,通过inode号码,获取inode信息;

​ 3)最后,根据inode信息,找到文件数据所在的block,读出数据。

file

其实说白了 inode是干啥的呢?

​ 打个比方,在windows系统中,对于一个文件(或者文件夹)你可以有两种操作方式,第一种就是复制粘贴,第二种就是创建快捷方式来操作这些文件;

​ 第一种操作 对文件的粘贴复制可以产生很多文件,但是内容相同,浪费了空间,所以linux采用inode读取文件的形式,可以让两个不同的文件名指向同一个物理文件

​ 这个就好比我们使用maven仓库是一个道理的,每个项目引用这些共有资源,不会造成资源浪费;

​ 那么我们怎么利用这个inode呢?

3 linux的链接

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

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

3.1 硬连接

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

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

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

3.2 软连接

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

3.3 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 11月 19 17:45 anaconda-ks.cfg
33575015 -rw-r--r--. 2 root root    0 11月 20 09:54 file1
33575014 drwxr-xr-x. 2 root root    6 11月 20 08:23 hnxy
33575013 -rw-r--r--. 1 root root  363 11月 21 2018 isayme.xcs
33575015 -rw-r--r--. 2 root root    0 11月 20 09:54 lf1
33575016 lrwxrwxrwx. 1 root root    5 11月 20 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: 没有那个文件或目录

3.4 总结

  • 1).删除软连接对原始文件没有影响,因为它只是一个快捷方式;
  • 2).删除硬连接对原始文件和软连接没有影响,因为他是一个独立的文件;
  • 3).删除原文件,对硬连接没有影响,导致软连接失效;
  • 4) 同时删除原始文件和所有的硬链接,整个文件会真正的被删除。

以后我们会经常给某些文件或目录创建各种连接,所以ln命令大家要熟记;

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-海牛博士,http://hainiubl.com/topics/75684
点赞
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter