누군가가 다른 웹사이트에서 나에게 "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 -l
SELinux 플래그가 있음을 나타내기 위해 권한 비트 끝에 점이 표시되어야 합니다.