Wie ist es möglich, dass 8 Blöcke zugewiesen werden, aber die Dateigröße 0?

9

Jemand fragt mich auf einer anderen Site nach dieser Frage, dh eine Datei mit dem Namen "abc.dat" hat eine Dateigröße von 0, aber 8 Blöcke, und dies ist die Ausgabe, die ich von ihm fordere (einige Texte wurden vom Chinesischen ins Englische übersetzt):

$ 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 #sorry, dies könnte die zusätzliche falsche Ausgabe sein, die er hinzugefügt hat

$ 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

Ich habe etwas über spärliche Dateien, Dateimetadaten und Symlink-Fälle gelernt, aber keiner dieser Fälle verursacht eine Dateigröße von 0 Byte mit 8 Blöcken. Gibt es Dateisystem-Setups wie die Mindestblockgröße für JEDE Datei?

Er sagte mir, dass seine Systeme Ubuntu 16.04 und ext4 sind.

[AKTUALISIEREN]

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

[UPDATE] Ich kann mit ecryptfs reproduzieren

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$
林果 皞
quelle
Ich bin verwirrt. Ist abc.datund abc2.datVerzeichnisse? Die ls -ls abc2.datAusgabe zeigt an, dass es sich um ein Verzeichnis mit zwei Einträgen handelt, und die stat abc.datzeigt an, dass auch dies ein Verzeichnis ist. Oder haben Sie die Ausgabe bearbeitet?
Kusalananda
@Kusalananda Sorry, ich habe aus dem Chinesischen übersetzt und vermisse die Verzeichnisübersetzung.
27 皞
@Kusalananda ls -ls abc2.dat, er hat mir diese 2 Zeilen gezeigt, am wahrscheinlichsten hat er die falsche Ausgabe eingefügt. Und die 3. Ausgabe zeigt die richtige Ausgabe.
27 皞
Das einzige, woran ich denken kann, ist der erweiterte Attributblock. Benutzt er SELinux?
Psusi

Antworten:

16

Dies geschieht, wenn das Dateisystem verschlüsselt ist. Der FS muss zusätzliche Metadaten für die Datei speichern, auch wenn diese leer ist.

Da ich zufällig eine Maschine mit einem Vanilla Ecryptfs-Mount (Ubuntu 12.04-LTS) zur Hand habe, kann ich bestätigen, dass eine leere Datei 8 Blöcke erhält:

$ touch test
$ ls -ls test

8 -rw-rw-r-- 1 admin admin 0 feb 27 16:45 test
LSerni
quelle
3
32kB wert? Das ist ziemlich viel.
Hobbs
6

Sie können eine Datei mit der Größe Null mit Blöcken erhalten, wenn Sie erweiterte Attribute für die Datei haben, mehr als das, was in den Inode selbst passen kann:

$ 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

Aber ich kann nicht sehen, wie Sie auf diese Weise 8 kB erhalten würden, da laut xattrManpage die Größe auf die Blockgröße in ext2 / 3/4 begrenzt ist und die Blockgröße durch die Größe der Systemseite begrenzt ist , also 4 kB auf x86. Außerdem sollte eine neu erstellte Datei keine erweiterten Attribute haben, es sei denn, Sie führen SELinux aus. In diesem Fall ls -lsollte jedoch der Punkt am Ende der Berechtigungsbits angezeigt werden, um das Vorhandensein eines SELinux-Tags anzuzeigen.

ilkkachu
quelle
Ich habe die Frage aktualisiert, er zeigt mir das nur ecryptfsund nicht ext4ich habe erwartet, ist es verwandt?
27 皞