关于文件是否至少需要1个inode和1个block的问题

我方观点:一个文件的创建仅仅分配一个inode,不需要分配block,只有当文件有数据,才会分配block给文件存放数据。

论据1.我们可以touch一个空文件,然后看使用ll查看

[9 root@clone2 test]# ll
total 0
-rw-r--r-- 1 root root 0 May 30 11:35 haha

    大小为零,当然这里的大小是实际大小计算公式如下:

# define LONGEST_HUMAN_READABLE \
((2 * sizeof (uintmax_t) * CHAR_BIT * 146 / 485 + 1) * (MB_LEN_MAX + 1) \
- MB_LEN_MAX + 1 + 3)

    我们可以通过du查看

[10 root@clone2 test]# du -h haha
0       haha

可以查看du的man手册有这么一段描述

du - estimate file space usage
Summarize disk usage of each FILE, recursively for directories.

    也就是说du是查看文件的空间占用大小的所以du,所以du显示的都是block大小的倍数,比如

[13 root@clone2 test]# echo lala>>lala
[14 root@clone2 test]# ll
total 4
-rw-r--r-- 1 root root 0 May 30 11:35 haha
-rw-r--r-- 1 root root 5 May 30 11:40 lala
[15 root@clone2 test]# du -h lala
4.0K    lala

    可以看到写入内容到文件,ll的实际大小为5Bytes,空间占用大小为4.0K,也就是说,如果文件有内容,会分配到一个block,自然du就可以显示磁盘的用量,即空间占用大小。


论据2.我们可以通过关注磁盘的inode数和block数的使用情况,来确认我的观点 首先我们先找个文件系统,这里我使用/dev/sdb1,挂载在/media/keysrv上

[18 root@clone2 test]# mount|grep sdb1
/dev/sdb1 on /media/keysrv type ext4 (rw)

    这是状态1,已使用块5,已使用节点10:

[32 root@clone2 keysrv]# df /dev/sdb1
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb1 987 5 932 1% /media/keysrv
[33 root@clone2 keysrv]# df -i /dev/sdb1
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 128 10 118 8% /media/keysrv

    我们创建一个空文件,已使用块5,已使用节点11:

[35 root@clone2 keysrv]# df /dev/sdb1
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdb1 987 5 932 1% /media/keysrv
[36 root@clone2 keysrv]# df -i /dev/sdb1
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 128 11 117 9% /media/keysrv

    综上:说明创建一个空文件,只是分配了一个inode,没有数据,并不会分配block。


论据3.也许上面都是比较出来的,不够直观,这里使用debugfs工具,直接查看文件信息 为了对比,我们创建一个有内容的文件lala

[38 root@clone2 keysrv]# echo haha>>lala
[39 root@clone2 keysrv]# ls
haha  lala

    然后使用debugfs来调试文件系统:

[42 root@clone2 keysrv]# debugfs /dev/sdb1
debugfs 1.41.12 (17-May-2010)
debugfs:  ls  
 2  (12) .    2  (12) ..    11  (12) haha    12  (988) lala  #<============列出文件,以及inode号 
debugfs:  stat haha               #<=======使用stat查看
Inode: 11   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 2483332594    Version: 0x00000001
User:     0   Group:     0   Size: 0
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 0        #<============haha文件,block计数为0
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x556933a2 -- Sat May 30 11:50:58 2015
atime: 0x556933a2 -- Sat May 30 11:50:58 2015
mtime: 0x556933a2 -- Sat May 30 11:50:58 2015
EXTENTS:
debugfs:  stat lala
Inode: 12   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 2483332595    Version: 0x00000001
User:     0   Group:     0   Size: 5
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 2                 #<============lala文件,block计数为2
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x55693435 -- Sat May 30 11:53:25 2015
atime: 0x55693435 -- Sat May 30 11:53:25 2015
mtime: 0x55693435 -- Sat May 30 11:53:25 2015
EXTENTS:
(0): 54
debugfs:  q

    相当直观,空文件不占用block,有数据会分配block,而且数据在小也分配两个。 我的观点只是抱砖引玉的作用,欢迎大家前来讨论,评论中讨论啦@@

你可能感兴趣的:(文件系统,block,iNode)