8개의 블록이 할당되었지만 파일 크기가 0인 것은 어떻게 가능합니까?

8개의 블록이 할당되었지만 파일 크기가 0인 것은 어떻게 가능합니까?

누군가가 다른 웹사이트에서 나에게 "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 Sep 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

나는 희소 파일, 파일 메타데이터, 심볼릭 링크 상황에 대해 조금 배웠지만 이러한 상황 중 어느 것도 8블록의 0바이트 파일 크기로 이어지지 않습니다. 최소 블록 크기와 같은 파일 시스템 설정이 있습니까?어느문서?

그는 자신의 시스템이 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$

답변1

이는 파일 시스템이 암호화된 경우 발생할 수 있습니다. 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

답변2

파일에 확장 속성이 있는 경우 inode 자체가 보유할 수 있는 것 이상의 블록이 포함된 크기가 0인 파일을 얻을 수 있습니다.

$ 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

그러나 나는 어떻게 이런 식으로 8kB를 얻는지 이해하지 못합니다.xattr매뉴얼 페이지, 크기는 ext2/3/4의 블록 크기로 제한되며 이는 시스템 페이지 크기로 제한되므로 x86에서는 4kB입니다. 또한 새로 생성된 파일에는 SELinux를 실행하지 않는 한 확장된 속성이 없어야 합니다. 그러나 이 경우 ls -lSELinux 플래그가 있음을 나타내기 위해 권한 비트 끝에 점이 표시되어야 합니다.

관련 정보