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$

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

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.


Ich habe die Frage aktualisiert, er zeigt mir das nur ecryptfsund nicht ext4ich habe erwartet, ist es verwandt?
— 27 皞
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.