¿Cómo es posible que se asignen 8 bloques pero el tamaño del archivo 0?

9

Alguien me pregunta en otro sitio sobre esta pregunta, es decir, un archivo llamado "abc.dat" tiene un tamaño de archivo de 0 pero 8 bloques, y esta es la salida que le pido que me dé (Algunos textos han sido traducidos del chino al inglés):

$ 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 18 de septiembre 19:11 abc.dat #sorry, este puede ser el resultado extra incorrecto que agregó

$ 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

Aprendí un poco sobre archivos dispersos, metadatos de archivos, casos de enlaces simbólicos, pero ninguno de esos casos causará un tamaño de archivo de 0 bytes con 8 bloques. ¿Hay alguna configuración de sistemas de archivos como el tamaño mínimo de bloque para CUALQUIER archivo?

Me dijo que sus sistemas son Ubuntu 16.04 y ext4.

[ACTUALIZAR]

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

[ACTUALIZACIÓN] Puedo reproducir con 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$
林果 皞
fuente
Estoy confundido. Es abc.daty abc2.datdirectorios? La ls -ls abc2.datsalida indica que es un directorio con dos entradas, y el stat abc.datindica que también es un directorio. ¿O has editado la salida?
Kusalananda
@Kusalananda Lo siento, traduje del chino y extraño la traducción del directorio.
林果 皞
@Kusalananda ls -ls abc2.dat, me mostró estas 2 líneas, muy probablemente pegó la salida incorrecta. Y la tercera salida sí muestra la salida correcta.
皞 皞
Lo único que se me ocurre es el bloque de atributos extendidos. ¿Está usando SELinux?
psusi

Respuestas:

16

Esto sucede si el sistema de archivos está encriptado; El FS necesita almacenar metadatos adicionales para el archivo, incluso si está vacío.

Como tengo una máquina a mano con una montura ecryptfs de vainilla (Ubuntu 12.04-LTS), puedo confirmar que un archivo vacío obtendrá 8 bloques:

$ touch test
$ ls -ls test

8 -rw-rw-r-- 1 admin admin 0 feb 27 16:45 test
LSerni
fuente
3
Valor de 32kB? Eso es bastante
hobbs
6

Puede obtener un archivo de tamaño cero con bloques si tiene atributos extendidos en el archivo, más de lo que cabe dentro del propio inodo:

$ 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

Pero, no puedo ver cómo obtendrías 8 kB de esa manera, ya que de acuerdo con la xattrpágina del manual , el tamaño está limitado al tamaño del bloque en ext2 / 3/4, y el tamaño del bloque está limitado por el tamaño de la página del sistema , entonces 4 kB en x86. Además, un archivo recién creado no debe tener ningún atributo extendido, a menos que esté ejecutando SELinux, pero en ese caso, ls -ldebe mostrar el punto al final de los bits de permiso para indicar la presencia de una etiqueta SELinux.

ilkkachu
fuente
He actualizado la pregunta, solo me muestra eso ecryptfsy no ext4esperaba, ¿está relacionado?
林果 皞