Linux文件属性详解

一、文件属性结构

 

备注:b可以是内存,c可以是鼠标键盘

二、文件类型与权限

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

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

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

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

363003_1227493859FdXT

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

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

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

 

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

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

三、Linux文件属主和属组

[root@www /]# ls -l
total 64
drwxr-xr-x 2 root  root  4096 Feb 15 14:46 cron
drwxr-xr-x 3 mysql mysql 4096 Apr 21  2014 mysql

 

对于文件来说,它都有一个特定的所有者,也就是对该文件具有所有权的用户。

同时,在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。

文件所有者以外的用户又可以分为文件所有者的同组用户和其他用户。

因此,Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。

在以上实例中,mysql 文件是一个目录文件,属主和属组都为 mysql,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。

对于 root 用户来说,一般情况下,文件的权限对其不起作用。

更改文件属性

1、chgrp:更改文件属组

语法:

chgrp [-R] 属组名 文件名

 

参数选项

  • -R:递归(recurrence)更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

2、chown:更改文件属主,也可以同时更改文件属组

语法:

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名

进入 /root 目录(~)将install.log的拥有者改为bin这个账号:

[root@www ~] cd ~
[root@www ~]# chown bin install.log
[root@www ~]# ls -l
-rw-r--r--  1 bin  users 68495 Jun 25 08:53 install.log

 

将install.log的拥有者与群组改回为root:

[root@www ~]# chown root:root install.log
[root@www ~]# ls -l
-rw-r--r--  1 root root 68495 Jun 25 08:53 install.log

 

3、chmod:更改文件9个属性

Linux文件属性有两种设置方法,一种是数字,一种是符号。

Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限。

先复习一下刚刚上面提到的数据:文件的权限字符为:『-rwxrwxrwx』, 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:

  • r:4
  • w:2
  • x:1

每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是:

  • owner = rwx = 4+2+1 = 7
  • group = rwx = 4+2+1 = 7
  • others= --- = 0+0+0 = 0

所以等一下我们设定权限的变更时,该文件的权限数字就是770啦!变更权限的指令chmod的语法是这样的:

 chmod [-R] xyz 文件或目录

选项与参数:

  • xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
  • -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更

举例来说,如果要将.bashrc这个文件所有的权限都设定启用,那么命令如下:

[root@www ~]# ls -al .bashrc
-rw-r--r--  1 root root 395 Jul  4 11:45 .bashrc
[root@www ~]# chmod 777 .bashrc
[root@www ~]# ls -al .bashrc
-rwxrwxrwx  1 root root 395 Jul  4 11:45 .bashrc

 

那如果要将权限变成 -rwxr-xr-- 呢?那么权限的分数就成为 [4+2+1][4+0+1][4+0+0]=754。

符号类型改变文件权限

还有一个改变权限的方法,从之前的介绍中我们可以发现,基本上就九个权限分别是:

  • (1)user
  • (2)group
  • (3)others

那么我们就可以使用 u, g, o 来代表三种身份的权限!

此外, a 则代表 all,即全部的身份。读写的权限可以写成 r, w, x,也就是可以使用下表的方式来看:

 

chmod u
g
o
a
+(加入)
-(除去)
=(设定)
r
w
x
文件或目录

如果我们需要将文件权限设置为 -rwxr-xr-- ,可以使用 chmod u=rwx,g=rx,o=r 文件名 来设定:

#  touch test1    // 创建 test1 文件
# ls -al test1    // 查看 test1 默认权限
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1
# chmod u=rwx,g=rx,o=r  test1    // 修改 test1 权限
# ls -al test1
-rwxr-xr-- 1 root root 0 Nov 15 10:32 test1

 

而如果是要将权限去掉而不改变其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:

#  chmod  a-x test1
# ls -al test1
-rw-r--r-- 1 root root 0 Nov 15 10:32 test1

四、文件类型

-:代表普通文件
d:代表目录
l:代表软连接(ln –s 源文件 链接文件)
b:块设备和其他外围设备,是特殊类型的文件
普通文件“—”又分为:(用file来查看)
1) 纯文本文件(ascll):文件内容可以直接督导数据
2) 二进制文件(binary):Linux中的命令程序就是这种格式
3) 数据格式文件(data):有些程序在运行的过程中会读取某些特定格式的文件,那些特定格式的文件被称为数据文件。
虽然Linux不按照后缀名区分文件,但是我们还是最好写上,以方便管理。
一般这样设置后缀名:

*.txt    文本文件
*.tar    打包文件
*.tar.bz  bzip2格式压缩打包文件(j)
*.tar.gz  gzip格式压缩打包文件(z)
*.py    表示python语言文件
*.sh    shell编程脚本
*.pl    表示perl文件
*.html,*.php,*.htm,*.php,*.jsp,*.do   网页语言文件
*.conf  配置文件
*.rpm  rpm安装包

五、inode

什么是inode

文件存储在硬盘上,硬盘的最小存储单位叫做"扇区"(sector)。每个"扇区"的大小为512字节(byte),
,操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太慢。他是一次性读取多个扇区,即一次性读取一个"Block块"。一个Block有8个连续的扇区(sector)组成。
数据都存在Block块里面,但是我们怎么知道一个数据存放在哪些Block块里面呢?这个时候就必须需要一个索引,引导我们去找到哪些存放在BLOCK块里面的额数据。这存放索引的地方我们称为索引节点(Inode),索引节点里面包括了:文件的类型,属主,属组,权限,和时间戳一些信息,但是不包括文件名,

inode包含的内容

在这里插入图片描述

1:文件的类型
2:文件的权限,属主、属组、其他人的权限(r:读;w:写;o:其他人)
3:文件的硬连接数
4:属主
5:属组
6:文件的大小,对于目录而言:只是目录本身的大小,而不是里面内容的大小
7:默认是文件的修改时间
[root@oldboy_50 ~]# stat /
  File: `/'                 #除了这个其他的都存放在inode里面
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 803h/2051d  Inode: 2           Links: 29
Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-12-13 08:11:33.331896121 -0500
Modify: 2018-07-27 00:10:10.415506122 -0400
Change: 2018-07-27 00:10:10.415506122 -0400

 

inode的大小

想一下,既然他要存放内容,所以他肯定也是需要占用磁盘空间大小的。所硬盘分区在创建文件系统(格式化)的时候自动把硬盘分区分成两个区域:

 1)Block块,数据区:存放实际的数据
 2)Inode块,索引区:存放inode所包含的信息(文件属性信息)
inode节点的大小和总数,是创建文件系统的时候就给定的,后期没办法更改,一般是128字节(byte)或者256字节(byte)。

如何查看inode的数量和大小:

 查看数量

df -i   
[root@oldboy_50 ~]# dumpe2fs   /dev/sda3 | grep -i "inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count:  

查看inode的大小:
[root@oldboy_50 ~]# dumpe2fs /dev/sda3 | grep -i "inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:           256

如果inode被占用完全,那么对这个文件里面写入数据的时候会提示磁盘已满,no space left on device

 inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。Linux不考文件名来区分文件,就像Linux不靠用户名来区分用户。文件名只是inode号码便于识别的绰号。
打开或编辑文件的过程:

在这里插入图片描述

目录文件

Linux下面一切皆文件,所以列出目录下的内容也相当于列出目录文件里面的内容,进入目录,就相当于进入目录文件里面。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表,每个目录项都有两部分组成:
1)所包含的文件名
2)所包含的文件名和inode(索引节点号)的对应关系
修改目录下面的文件名,实际上就是在修改目录文件本身的block块里面的对应信息。所以能不能改目录下面的文件的名称是根据目录的权限来的。而是不根据文件本省的的权限来的。

inode总结

磁盘被分区格式化为ext4文件系统后会生成一定数量的inode和block
1)inode被称为索引点,存放文件的属性信息及作为文件的索引(类似于C语言指针)
2)ext3/ext4文件系统的block存放的是文件的实际内容
3)inode是磁盘上的一块存储空间,CentOS5是128字节,CentOS6是256字节
4)inode的表现形式是一串数字,不同文件对应inode不相同
5)inode号相同的互为硬链接
6)ext3和ext4文件系统下,一个文件至少占用一个inode和block
7)ext3和ext4文件系统下,一个文件只能占用一个inode
改变inode大小,mkfs.ext4 –b 2048 –i 256#-b指定block大小,-i指定inode大小

block总结

1)用来实际存放数据的地方,如果是目录,里面存放下级文件的文件名称
2)磁盘读取数据是按照block为单位读取的
3)一个文件至少占用一个block,未用完的浪费,可以占用多个block
4)要提升磁盘I/O性能,那就要一次性读取数据尽量的多
5)block并非越大越好。block太大会对小文件存放浪费太多磁盘空间,太小对于大文件来说,会更大的消耗I/O。一般默认为4K(4096字节)

六、链接

6.1硬链接

一般情况下,文件名和inode号码是“一一对应”的关系,在同一个分区内不可能同时出现两个inode号相同的文件,但是Linux系统中存在一个inode 号对应多个文件名。这些文件互为硬链接。虽然他们的文件名不一样,但他们实际上操作的还是一个文件。
ln 源文件 链接后的文件
ln test.txt test.txt_ln
[root@oldboy_50 tmp]# ll -i
total 0
130937 -rw-r–r-- 2 root root 0 Jul 27 05:34 test.txt
130937 -rw-r–r-- 2 root root 0 Jul 27 05:34 test.txt_ln

6.2 总结

1)  inode号相同的,可以认为互为硬链接
2)  硬链接的创建不能跨越文件系统(跨越分区),目录不能创建硬链接
3)  删除源文件或链接文件,文件实例未被改变,只有删除所有的硬链接文件和源文件,文件的实体才会被改变。
4)  当所有的硬链接和源文件被删除,没有进程调用后,在存放新的数据会占用这个文件的空间或者磁盘fsck检查的时候,删除的数据才会被回收,
5)  可以通过文件设置硬链接文件,来防止重要文件被误删除
6)  每在目录下创建一个子目录,他的上级目录的硬连接数加1 
7)  目录硬链接的个数减去2代表他下面有多少个目录(减去他本身的1,和“.”)

6.3软链接

作用

当一个软件的编译路径变了,我们还希望使用以前的路径,这时候就需要用到软连接,软连接相当于一个传送门,删除软连接对源文件没影响,但删除源文件,软连接就失效了。

总结

1) 软链接类似于windows的快捷方式(可以用readlink查看指向) 2) 软连接类似于一个文本文件,里面存放的是源文件的路径,指向源文件实体 3) 删除源文件,软链接失效,一般显示白字红底闪烁提示 4) 软链接具备不同的inode号 5) 软链接和源文件属于不同类型的文件

七、常见问题 no space left on device

inode被占满

inode被沾满的原因,小文件过多,一个文件就要占用一个inode,inode的数量是有限的,所以小文件过多,很少消耗block,所以inode就被占满了。

模拟环境

[root@oldboy_50 mnt]# touch file_inode{1..100000}.txt
touch: cannot touch `file_inode27266.txt': No space left on device
touch: cannot touch `file_inode27267.txt': No space left on device

 

解决办法:

小文件多,说明他的所在的目录大小肯定大,因为文件名是存放在上级目录的block里面的,小文件多,就说明文件名多,文件名多,就说明占用上级目录的block多。解决思路就是用find查找目录大小大大的文件。

[root@oldboy_50 /]# find / -type d -size +1M
/mnt
[root@oldboy_50 /]# ls /mnt/ |xargs rm -rf

 

被进程占用,找到调用这个文件的进程,删除然后重启一下服务就行




 
posted @ 2020-06-29 15:42  卖雨伞的小男孩  阅读(1364)  评论(0编辑  收藏  举报