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 的小结:
- 磁盘被分区并格式化为 ext4 文件系统后,会生成一定数量的 inode 和 block
- inode 称为 索引节点,它的作用是存放文件的属性信息以及作为文件的索引(指向文件的实体)
- ext3/ext4 文件系统的 block存放的是文件的实际内容
- inode 是磁盘上的一块存储空间,CentOS 6 非启动分区 inode 默认大小 256 字节,CentOs5是128字节。
- inode 的表现是形式一串数字,不同的文件对应的inode(一串数字)在文件系统里是唯一的。
- inode 节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。
- ext3/ext4文件系统下,一个文件被创建后至少要占用一个 inode 和一个 block
- ext3/ext4文件系统下,正常情况,一个文件占用且只能占用一个 inode (人和身份证)
- block是用来存储实际数据的,每个block的大小一般有 1k,2k,4k几种。 其中引导分区等为 1k,其他普通分区为 4k(CentOS 6)
- 如果一个文件很大(几个G),可能占多个block;如果文件很小(0.01k),至少占一个,并且这个block的剩余空间就浪费了,即无法再存储其他数据了。
- inode大小和总量查看:
- dumpe2fs /dev/sda3|egrep -i 'inode count|block count'
- dumpe2fs /dev/sda3|egrep -i 'inode size|block size' 默认 block count 一般会大于inode count的数量。
- 查看inode的总量和使用量:
- df -i
- 查看文件的inode信息方法
- ls -li
- stat filename
- 如何生成及指定 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的知识小结:
- 磁盘读取数据是按 block为单位读取的
- 一个文件可能占用多个block。每读取一个block就会消耗一次 磁盘I/O.
- 如果要提升磁盘IO性能,那么就要尽可能一次性读取数据尽量的多
- 一个block只能存放一个文件的内容,无论内容有多小。如果block 4K,那存放1K的文件,剩余3K就不能存放被的文件,只能浪费了
- Block并非越大越好。Block太大对于小文件存放就会浪费磁盘空间,例如:1000k的文件,Block的大小为4k,占用250个block;如果block默认大小为1k,占用1000个block。访问效果谁更高?消耗IO分别为250次和1000次。
- 根据业务需求,确定默认的block大小。如果是大文件(大于16K)一般设置block大一点,小文件(小于1k)一般设置block小一点。
- block太大,例如4k,文件都是0.1k的,大量浪费磁盘空间,但是访问性能高
- block太小,例如1k,文件都是1000k,消耗大量磁盘IO
- block的设置也是格式化分区时候
- mkfs.ext4 -b 2048 -I 256 /dev/sdb
- 企业里文件都会比较大(一般大于4k),block设置大一些会提升磁盘访问效率
- ext3/ext4 文件系统(CentOS 5和6),一般都设置为 4K
当前的生产环境一般设置为4k。特殊的业务,如视频可以加大block大小。
总体小结:
- 磁盘被分区格式化文件系统后,会分为 inode 和 block 两部分内容。
- inode 存放文件的属性以及指向文件实体的指针,文件名不在inode里,一般在上级目录的block里。
- 访问文件,原理通过文件名--> inode --> blocks
- inode一般情况下默认大小为256B,block大小1,2,4k,默认是4k,注意,引导分区等特殊分区除外
- 通过 df -i 查看inode的数量及使用情况,dumpe2fs /dev/sda3 查看inode和block的大小及数量
- 一个文件至少要占用inode 及一个block,多个文件可以占用同一个inode(硬链接),相同文件。
- 一个block 只能被一个文件使用,如果文件很小,block很大,剩余空间浪费,无法继续被其他文件使用
- block不是越大越好,要根据业务的文件大小进行选择,一般CentOS6 就是默认 4K
- 可以在格式化的时候改变inode和block的大小
- mkfs.ext4 -b 2048 -I 2048 /dev/sdb
通过inode 删除文件
- 查看文件
- ls -li
- 通过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 的文件,分别可以写多少个?为什么?
答案相关知识点:
- Inode 是存放文件属性信息的,默认大小为128byte(CentOS58), 256byte(CentOS64)
- block是存放文件实际内容的,默认大小为 1k(boot) 或 4k(非系统分区默认给4k)
- 一个文件至少要占用一个 inode 和一个block
- 默认分区常规情况下,inode数量是足够的。而 block数量消耗的会更快。
正确解答:
- 默认分区常规情况下, 对大文件来讲 inode是足够的。而block数量消耗的会更快,Block为 4k的情况,1M的文件不会有磁盘浪费情况,所以文件数量大概为 100/1 =100个
- 对于小文件 0.1k, inode会消耗的更快。默认分区的时候block数量是大于inode数量的。
- 每个小文件都会占用一个inode和一个block,所以最终文件数量:
- inode会先消耗完,文件总量是 inode的数量。
- 每个小文件都会占用一个inode和一个block,所以最终文件数量:
企业案例:如果向磁盘写入数据提示如下错误: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 | 表示管道文件 |