Bagaimana mungkin 8 blok dapat dialokasikan tetapi ukuran file 0?

9

Seseorang bertanya kepada saya di situs lain tentang pertanyaan ini, yaitu file bernama "abc.dat" memiliki ukuran file 0 tetapi 8 blok, dan ini adalah output yang saya minta dia berikan kepada saya (Beberapa teks telah diterjemahkan dari Bahasa Mandarin ke Bahasa Inggris):

$ 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, ini mungkin hasil tambahan yang salah

$ 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

Saya telah belajar sedikit tentang file jarang, file metadata, kasus symlink, tetapi tidak ada kasus yang akan menyebabkan ukuran file 0 byte dengan 8 blok. Apakah ada pengaturan filesystem seperti ukuran blok minimum untuk file APA SAJA ?

Dia mengatakan kepada saya bahwa sistemnya adalah Ubuntu 16.04 dan ext4.

[MEMPERBARUI]

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

[PEMBARUAN] Saya dapat direproduksi dengan 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$
林果 皞
sumber
Saya bingung. Apakah abc.datdan abc2.datdirektori? The ls -ls abc2.datoutput menunjukkan bahwa itu sebuah direktori dengan dua entri, dan stat abc.datmenunjukkan bahwa itu juga adalah sebuah direktori. Atau sudahkah Anda mengedit output?
Kusalananda
@ Kusalananda Maaf, saya menerjemahkan dari bahasa Cina dan ketinggalan terjemahan direktori.
林果 皞
@ Kusalananda ls -ls abc2.dat, dia menunjukkan kepada saya 2 baris ini, paling mungkin dia menyisipkan output yang salah. Dan output ke-3 memang menunjukkan output yang benar.
林果 皞
Satu-satunya hal yang bisa saya pikirkan adalah blok atribut diperluas. Apakah dia menggunakan SELinux?
psusi

Jawaban:

16

Ini terjadi jika sistem file dienkripsi; FS perlu menyimpan metadata tambahan untuk file tersebut, walaupun itu kosong.

Ketika saya kebetulan memiliki mesin yang berguna dengan mount vanry ecryptfs (Ubuntu 12.04-LTS), saya dapat mengonfirmasi bahwa file kosong akan mendapatkan 8 blok:

$ touch test
$ ls -ls test

8 -rw-rw-r-- 1 admin admin 0 feb 27 16:45 test
LSerni
sumber
3
Senilai 32kB? Itu agak sedikit.
hobbs
6

Anda bisa mendapatkan file ukuran nol dengan blok jika Anda memiliki atribut yang diperluas pada file, lebih dari apa yang bisa muat di dalam inode itu sendiri:

$ 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

Tapi, saya tidak bisa melihat bagaimana Anda mendapatkan 8 kB seperti itu, karena menurut xattrhalaman manual, ukurannya terbatas pada ukuran blok pada ext2 / 3/4, dan ukuran blok dibatasi oleh ukuran halaman sistem , jadi 4 kB pada x86. Selain itu, file yang baru dibuat seharusnya tidak memiliki atribut tambahan, kecuali Anda menjalankan SELinux, tetapi dalam hal ini, ls -lharus menunjukkan titik di akhir bit izin untuk menunjukkan keberadaan tag SELinux.

ilkkachu
sumber
Saya telah memperbarui pertanyaan, dia hanya menunjukkan kepada saya itu ecryptfsdan tidak ext4saya harapkan, apakah itu terkait?
林果 皞