如何分配8个块但文件大小为0?


9

有人在其他站点上问我这个问题,即名为“ abc.dat”的文件的文件大小为0,但有8个块,这是我要他给我的输出(某些文本已从中文翻译成英文):

$ cp abc.dat abc2.dat; ls -ls abc2.dat #try to copy, it still 8 blocks but 0 byte
8 -rw-rw-r--  1 rokeabbey rokeabbey      0 Feb  27 19:39 abc2.dat 

8 -rw-rw-r-- 1 rokeabbey rokeabbey 0 Sep 18 19:11 abc.dat#抱歉,这可能是他添加的额外错误输出

$ stat abc.dat
  File: 'abc.dat'
  Size: 0           Blocks: 16          IO Block: 4096   regular empty file
Device: 32h/50d      Inode: 3715853    Links: 1
Access: (0664/-rw-rw-r--)  Uid:( 1000/rokeabbey)   Gid:( 1000/rokeabbey)
Access: 2018-02-26 21:13:57.640639992 +0800
Modify: 2017-09-18 19:11:42.221533011 +0800
Change: 2017-09-18 19:11:42.221533011 +0800
 Birth: -

$ touch abc3.dat ; ls -sl | grep abc #try to create new empty file, it still 8 blocks by default
8 -rw-rw-r--  1 rokeabbey rokeabbey      0 Feb  27 19:39 abc2.dat
8 -rw-rw-r--  1 rokeabbey rokeabbey      0 Feb  27 19:40 abc3.dat
8 -rw-rw-r--  1 rokeabbey rokeabbey      0 Sep  18 19:11 abc.dat

我已经了解了一些有关稀疏文件,文件元数据,符号链接的情况,但是这些情况都不会导致8块的0字节文件大小。是否有任何文件系统设置,例如ANY文件的最小块大小?

他告诉我说他的系统是Ubuntu 16.04和ext4。

[更新]

$ df -Th /home/rokeabbey
/home/rokeabbey/.Private ecryptfs  138G   39G   92G   30% /home/rokeabbey

[更新]我可以用ecryptfs复制

xb@dnxb:/tmp/test$ sudo mkdir /opt/data
xb@dnxb:/tmp/test$ sudo apt-get install ecryptfs-utils
...
xb@dnxb:/tmp/test$ sudo mount -t ecryptfs /opt/data /opt/data
Passphrase: 
...
Selection [aes]: 1
...
Selection [16]: 1
Enable plaintext passthrough (y/n) [n]: y
Enable filename encryption (y/n) [n]: y
...
Would you like to proceed with the mount (yes/no)? : yes
...
in order to avoid this warning in the future (yes/no)? : no 
Not adding sig to user sig cache file; continuing with mount.
Mounted eCryptfs
xb@dnxb:/tmp/test$ l /opt/data
total 8.0K
52953089 drwxr-xr-x 9 root root ? 4.0K Feb  27 23:16 ../
56369402 drwxr-xr-x 2 root root ? 4.0K Feb  27 23:16 ./
xb@dnxb:/tmp/test$ sudo touch /opt/data/testing
xb@dnxb:/tmp/test$ less /opt/data/testing      
xb@dnxb:/tmp/test$ sudo umount /opt/data
xb@dnxb:/tmp/test$ ls -ls /opt/data
total 8
8 -rw-r--r-- 1 root root 8192 Feb  27 23:42 ECRYPTFS_FNEK_ENCRYPTED.FWbECDhE0C37e-Skw2B2pnQpP9gB.b3yDfkVU5wk7WhvMreg8yVnuEaMME--
xb@dnxb:/tmp/test$ less /opt/data/ECRYPTFS_FNEK_ENCRYPTED.FWbECDhE0C37e-Skw2B2pnQpP9gB.b3yDfkVU5wk7WhvMreg8yVnuEaMME-- 
"/opt/data/ECRYPTFS_FNEK_ENCRYPTED.FWbECDhE0C37e-Skw2B2pnQpP9gB.b3yDfkVU5wk7WhvMreg8yVnuEaMME--" may be a binary file.  See it anyway? 
xb@dnxb:/tmp/test$ sudo mount -t ecryptfs /opt/data /opt/data
Passphrase: 
Select cipher: 
...
Selection [aes]: 1   
...
Selection [16]: 1
Enable plaintext passthrough (y/n) [n]: y
Enable filename encryption (y/n) [n]: y
...
Would you like to proceed with the mount (yes/no)? : yes
...
in order to avoid this warning in the future (yes/no)? : no 
Not adding sig to user sig cache file; continuing with mount.
Mounted eCryptfs
xb@dnxb:/tmp/test$ ls -ls /opt/data
total 8
8 -rw-r--r-- 1 root root 0 Feb  27 23:42 testing
xb@dnxb:/tmp/test$

我糊涂了。是abc.databc2.dat目录吗?该ls -ls abc2.dat输出表明它是有两个条目的目录,并且stat abc.dat表示那也是一个目录。还是您编辑了输出?
Kusalananda

@Kusalananda对不起,我从中文翻译而错过了目录翻译。
水果

@Kusalananda ls -ls abc2.dat,他确实向我显示了这2行,最有可能他粘贴了错误的输出。第三输出确实显示了正确的输出。
水果

我唯一能想到的就是扩展属性块。他在使用SELinux吗?
psusi

Answers:


16

如果文件系统被加密,则会发生这种情况。FS需要为该文件存储额外的元数据,即使该文件为空也是如此。

当我碰巧拥有一台带有普通ecryptfs挂载的机器(Ubuntu 12.04-LTS)时,我可以确认一个空文件将得到8个块:

$ touch test
$ ls -ls test

8 -rw-rw-r-- 1 admin admin 0 feb 27 16:45 test

3
值32kB?相当多。
hobbs

6

如果您在文件上具有扩展的属性,则可以获得带块的零大小文件,这超出了inode本身的容纳范围:

$ touch abc
$ setfattr -n user.test -v xyz abc        # this doesn't do it
$ ls -s abc                               # since the data fits in the inode
0 abc
$ setfattr -n user.test -v "$(printf %100s " ")"  abc
$ ls -s abc
4 abc

但是,我看不到您是如何得到8 kB的,正如xattr手册页所述,大小限制为ext2 / 3/4上的块大小,而块大小则受系统页面大小的限制,因此在x86上为4 kB。另外,除非您正在运行SELinux,否则新创建的文件不应具有任何扩展属性,但在这种情况下,ls -l应在权限位的末尾显示点以指示SELinux标签的存在。


我已经更新了问题,他只是向我展示了这一点,ecryptfsext4我预期的没什么关系吗?
水果
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.