Comment est-il possible que 8 blocs soient alloués mais la taille de fichier 0?

9

Quelqu'un me pose des questions sur un autre site à propos de cette question, c'est-à-dire qu'un fichier nommé "abc.dat" a une taille de fichier de 0 mais 8 blocs, et c'est la sortie que je lui demande de me donner (du texte a été traduit du chinois vers l'anglais):

$ 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 #désolé, cela peut être la sortie incorrecte supplémentaire qu'il a ajouté

$ 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

J'ai appris un peu sur les fichiers clairsemés, les métadonnées de fichiers, les cas de liens symboliques, mais aucun de ces cas ne provoquera une taille de fichier de 0 octet avec 8 blocs. Existe-t-il une configuration de systèmes de fichiers telle qu'une taille de bloc minimale pour TOUT fichier?

Il m'a dit que ses systèmes étaient Ubuntu 16.04 et ext4.

[MISE À JOUR]

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

[MISE À JOUR] Je peux reproduire avec 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$
林果 皞
la source
Je suis confus. Est abc.datet abc2.datrépertoires? La ls -ls abc2.datsortie indique qu'il s'agit d'un répertoire avec deux entrées et le stat abc.datindique que c'est également un répertoire. Ou avez-vous modifié la sortie?
Kusalananda
@Kusalananda Désolé, j'ai traduit du chinois et j'ai raté la traduction du répertoire.
林果 皞
@Kusalananda ls -ls abc2.dat, il m'a montré ces 2 lignes, comme s'il avait collé la mauvaise sortie. Et la 3ème sortie montre la sortie correcte.
林果 皞
La seule chose à laquelle je peux penser est le bloc d'attributs étendus. Utilise-t-il SELinux?
psusi

Réponses:

16

Cela se produit si le système de fichiers est crypté; le FS doit stocker des métadonnées supplémentaires pour le fichier, même s'il est vide.

Comme il se trouve que j'ai une machine à portée de main avec un montage ecryptfs vanilla (Ubuntu 12.04-LTS), je peux confirmer qu'un fichier vide obtiendra 8 blocs:

$ touch test
$ ls -ls test

8 -rw-rw-r-- 1 admin admin 0 feb 27 16:45 test
LSerni
la source
3
32 Ko vaut la peine? C'est pas mal.
hobbs
6

Vous pouvez obtenir un fichier de taille nulle avec des blocs si vous avez des attributs étendus sur le fichier, plus que ce qui peut tenir à l'intérieur de l'inode lui-même:

$ 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

Mais, je ne vois pas comment vous obtiendriez 8 Ko de cette façon, car selon la xattrpage de manuel , la taille est limitée à la taille du bloc sur ext2 / 3/4, et la taille du bloc est limitée par la taille de la page système , donc 4 ko sur x86. De plus, un fichier nouvellement créé ne devrait pas avoir d'attributs étendus, sauf si vous exécutez SELinux, mais dans ce cas, il ls -ldevrait afficher le point à la fin des bits d'autorisation pour indiquer la présence d'une balise SELinux.

ilkkachu
la source
J'ai mis à jour la question, il me le montre ecryptfset ext4je ne m'y attendais pas, est-ce lié?
林果 皞