linux文件属性详解:
[[email protected] 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大小的命令
[[email protected]C6]# dumpe2fs /dev/sda3 | grep -i "Inode size" ----/dev/sda3是非/boot分区
dumpe2fs 1.41.12 (17-May-2010)
Inode size: 256
[[email protected]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使用量
[[email protected] ~]# 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
查看磁盘空间使用量
[[email protected] ~]# 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:
[[email protected] robin]# touch a
[[email protected] robin]# ln a b
[[email protected] 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相关的知识点就好。参考如下: