linux---10-20

linux文件属性详解:

[root@robin robin]# ls -ihl /home/robin/test.txt
398606 -rw-r--r--. 1 root root 2315 Mar 13 21:00 /home/test.txt

各列对应的解释如下:

inode节点号 文件类型权限 硬链接数 属主 属组 文件/目录大小 最近修改日期 文件/目录名

398606       -rw-r--r--.  1       root root   4M        Mar 13 21:00   /home/test.txt

inode节点号:相当于一本书的目录,我们要看这本书,先看这本书的目录,对计算机而言,读取文件的时候先找inode节点号

文件类型权限:-/d//l/s/c/b 代表文件类型,后面的9位代表文件的基本权限 .在Centos 5中没有点。Centos 6中才有点,这个点是和Selinux相关的。如果把Selinux关掉,然后新创建文件就没有权限位后面的点了。??

硬链接数:注意不是软连接数

属主:文件所有者

属组:文件组

大小:目录默认大小为4K,(因为在linux中,文件系统格式化时,Centos6的非系统分区,它的块大小是4K)

时间:mtime修改时间(而不是atime、ctime)

############分隔符############

inode概述:

    硬盘要分区,然后格式化,创建文件系统。

    Inode,中文的意思是索引节点(Index node),在每个linux存储设备或存储设备的分区被格式化为ext3、ext4文件系统后,一般都有两部分:第一部分是Inode(很多个),第二部分是Block(很多个)---格式化的实质是:创建可以存放文件的格式(ext3、ext4)。

    Block 是用来存储实际数据用的。

    而inode就是用来存储这些数据属性信息的(也就是ls -l的结果),inode包含的属性信息包括文件大小、属主、归属的用户组、读写权限、文件类型、修改时间、还包含指向文件实体的指针的功能(inode节点--block的对应关系)等,但是,唯独不包含文件名。inode除了记录文件属性的信息外,还会为每个文件进行信息索引,所以就有了inode的数值。系统根据指令,即可通过inode的值最快的找到相应的文件实体。文件名、inodeblock之间的关系如下;

技术分享

这张图是linux的ext4文件系统,不同的文件系统,这种关系是不同的。oldboyfile是ls -l看到的文件名,这个文件在磁盘或者分区上对应唯一的一个inode,inode中存放ls -l 显示的属性信息,但是不包含文件名,文件名存放在文件名上级目录的block中,inode中还存放一个指向存放具体数据block的一个指向。所以读取文件时,先找文件名,然后找文件名对应的inode,在这根据文件的权限(rw-r--r--)判断你是否允许访问,如果允许,那么inode就带你找到存放文件对应数据的block。一个文件会唯一的对应一个inode,但是inode下面对应的block不只一个,因为block的大小,在Centos6中默认是4K,但是放一个视频4K明显装不下,所以就会有很多的block。

    举例理解:整本书就是一块磁盘或分区,首页的目录索引就相当于inode,每一页相当于一个block(这个页面存放具体的文字内容)。

    所以查看文件的时候,都是通过文件名找到inode,然后根据inode的信息再找到存放文件数据的block。

    因为inode要存放文件的属性信息,所以inode是有大小的,Centos5 inode的默认大小是128K,而Centos6 inode的默认大小是256字节(非/boot/分区是256K,/boot分区是128K),inode的大小在文件系统被格式化后就无法更改了,格式化前可以指定inode大小,但是一般工作环境没有这个需求。

查看Inode大小的命令

[root@C6]# dumpe2fs /dev/sda3 | grep -i "Inode size"  ----/dev/sda3是非/boot分区
dumpe2fs 1.41.12 (17-May-2010)
Inode size:               256

[root@C6]# dumpe2fs /dev/sda1 | grep -i "Inode size"  ----/dev/sda1是/boot分区
dumpe2fs 1.41.12 (17-May-2010)
Inode size:               128

注意/boot分区和非/boot分区的Inode size 和block size 可能是不一样的

查看磁盘的inode使用量

[root@robin ~]# df -i
Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/xvda2     1687552 81114 1606438    5% /
tmpfs           480300     1  480299    1% /dev/shm
/dev/xvda1       76912    38   76874    1% /boot

查看磁盘空间使用量

[root@robin ~]# df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/xvda2     ext4    26G  3.1G   21G  13% /
tmpfs          tmpfs  1.9G     0  1.9G   0% /dev/shm
/dev/xvda1     ext4   291M   34M  243M  13% /boot

小结:

1)、磁盘分区格式化后成为ext3/ext4后会生成一定数量的inode和block,

2)、inode是索引节点,作用是存放文件的属性以及作为文件的索引(指向文件的实体block)

3)、inode是一块存储空间,Centos 6非/boot分区大小默认是256K,Centos 5非/boot默认是128K

4)、inode是一串数字,对应不同的文件,inode在文件系统里是唯一不同的(文件系统中的***)

在文件系统中也有inode数字是一样的,那么及时硬链接文件,这样的文件可以认为是一个文件因为inode相同,所以可以这么说inode相同的文件为一个文件,或者互为硬链接文件

eg:

[root@robin robin]# touch a
[root@robin robin]# ln a b

[root@robin robin]# ll -ihl *
398607 -rw-r--r--. 2 root root  0 Mar 13 23:07 a
398607 -rw-r--r--. 2 root root  0 Mar 13 23:07 b

5)、inode相同的文件为一个文件,或者互为硬链接文件

6)、一个文件至少要占用一个inode和一个block

7)、ext3和ext4文件系统block存放的是文件的实际内容的、

8)、block的大小一般有1K,2K,4K其中引导分区等位1K,其他普通分区为4K(C6),

9)、如果一个文件很大,可以占用多个block;如果一个文件很小,至少占一个block,并且剩余空间浪费。

10)、inode 大小查看:dumpe2fs /dev/sda3 | grep -i "Inode size"

      inode 总量查看:dumpe2fs /dev/sda1 | grep -i "Inode count"            

      inode 总量和使用量查看:df -i

11)、如何生存及制定inode的大小

      mkfs.ext4 -b block-size -I inode-size /dev/sdb

      mkfs.ext4 -b 2048 -I 256 /dev/sd

有关block的知识

1,磁盘读取数据是按block为单位读取的,一次性要读就读一个block的内容。

2,一个文件可能占用多个block,每读取一个block就会消耗一次磁盘IO

技术分享

普通硬盘的延时很大,所以我们应该尽量不去访问磁盘IO,或者是一次性尽量读多的数据。这样磁盘IO才会更少。block的块大一些,一次性读取的数据就会多一些。



3,如果要提升磁盘IO,那么就要尽可能一次性读取数据尽量的多。

4,一个block只能存放一个文件的内容,无论内容有多小,如果block 4K存放1K的文件,那么剩余的3K就浪费了。

5,所以block并非越大越好,block太大,对于小文件就会浪费磁盘空间,例如:1000K的文件,4Kblock占用250个,1Kblock占用1000个,访问效率谁更高?消耗IO分别为250次和1000次(磁盘读取数据是按block为单位读取的,一次性要读就读一个block的内容)。

6,大文件(大于16K)一般设置block大一点,小文件(小于1K)一般设置block小一点。

7,block太大例如4K,文件都是0.1K的,大量浪费磁盘空间。

8,block的设置也是格式化分区的时候设置的。

      mkfs.ext4 -b block-size -I inode-size /dev/sdb

      mkfs.ext4 -b 2048 -I 256 /dev/sd

9,文件较大时,block设置大一些会提升磁盘访问效率,ext3/ext4一般设置为4K

10,查看block size 的大小

     dumpe2fs  /dev/sda3 | grep -i "block size"


    Block块越大对于单个小文件(0.5K)多的业务,会非常浪费磁盘空间,因为一个文件无论多大都会必须占用至少一个inode和一个block,磁盘读取数据是按block为单位读取的,但是对于大文件,可以提升读取的效率,因为如果block太小,就要读多个block,这样就消耗磁盘IO,如果block大,则会读较少的block就读完数据,从而减少磁盘IO。

当前的生产环境一般设置为4K,特殊的业务(比如视频),可以增大block(#注:ext4还不支持太大的block)

block分大了,浪费空间,分小了,影响磁盘读取性能。

技术分享

文件都是1M的情况下,如果block是4K,需250个,如果block是1K,则需要1000个,从读取速度来看,读一个block就是一个IO,则IO消耗分别为250和1000。所以可以归纳结论为:当文件本身比较大的时候,block设置的大点好,会提升磁盘访问效率。ext3、ext4一般设置为4K。

生产环境:block的大小如何配置?

如果是大文件的业务,block尽量设置大一点

如果是小文件的业务,block尽量设置小一点

实际:ext2、ext3、ext4最大只能4K,而工作中几乎没有小于4K的文件,所以ext2、ext3、ext4文件系统,block都分配为4K.

总的小结:

1)、磁盘分区格式化文件系统后,会分为inode和block两部分内容

2)、inode存放文件的属性以及指向文件实体的指针,文件名不在inode中,而是在上级目录的block中。

3)、访问文件,通过文件文件--->inode---->blocks

4)、inode一般情况下默认大小为256B,block大小1K、2K、4K,默认是4K,注意,引导分区等特殊分区除外。

5)、通过df -i 查看inode的数量及使用情况,dumpe2fs /dev/sda3查看inode及block的大小及数量。

6)、一个文件至少要占用一个inode及一个block,多个文件可以占用同一个inode(硬链接),相同文件

7)、一个block只能被一个文件使用,如果文件很小,block很大,剩余空间浪费,无法继续被其他文件使用。

实例演示:

新增加一块硬盘

fdisk -l  #查看磁盘的情况,发现有新加的盘/dev/sdb

fdisk /dev/sdb  #进行分区 

n:增加分区  p-主分区;e-逻辑分区  p:打印  w:写入分区表  partprobe:不重启分区表直接生效

mkfs.ext4 -b 8192 /dev/sdb1 ####因为大于4K,会有警告,实际使用过程中是否支持未知(所以不建议)

mkfs.ext4 -b 1024 -I 512/dev/sdb1

mount /dev/sdb1 /mnt/

touch /mnt/aaa.txt

df -Th

umount /mnt/

面试题:

一个100M(100000K)的磁盘分区,分别写入1K的文件或者写入1M的文件,分别可以写多少个?

错误解答:

1K的数量是 100M*1000/1K=100000个

1M的数量是 100M/1M=100个

这道题的答案其实就是答出inode和block相关的知识点就好。参考如下:




     

















郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。