Как можно выделить 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 сен. 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

Я немного узнал о разреженном файле, метаданных файла, случаях символической ссылки, но ни один из этих случаев не приведет к 0-байтовому размеру файла с 8 блоками. Есть ли какие-либо настройки файловой системы, такие как минимальный размер блока для ЛЮБОГО файла?

Он сказал мне, что его системы - 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.datи abc2.datкаталоги? ls -ls abc2.datВыход указывает на то, что это каталог с двумя входами, а также stat abc.datуказывает на то, что это тоже является каталогом. Или вы редактировали вывод?
Кусалананда
@Kusalananda Извините, я перевёл с китайского и пропустил перевод каталога.
Фрукт
@Kusalananda ls -ls abc2.dat, он показывает мне эти 2 строки, скорее всего, он вставил неправильный вывод. И третий вывод показывает правильный вывод.
Фрукт
Единственное, о чем я могу думать, это блок расширенных атрибутов. Он использует SELinux?
psusi

Ответы:

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
LSerni
источник
3
Стоит 32кБ? Это совсем немного.
Хоббс
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 КБ таким образом, так как в соответствии с xattrman-страницей размер ограничен размером блока в ext2 / 3/4, а размер блока ограничен размером системной страницы , так 4 кб на х86. Кроме того, вновь созданный файл не должен иметь каких-либо расширенных атрибутов, если только вы не используете SELinux, но в этом случае он ls -lдолжен показывать точку в конце битов разрешения, указывающих на наличие тега SELinux.

ilkkachu
источник
Я обновил вопрос, он просто показывает мне это, ecryptfsа не ext4я ожидал, это связано?
Фрукт