Files
怎麼可能分配了 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#sorry,這可能是他添加的額外錯誤輸出$ 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。
$$ UPDATE $$
$ df -Th /home/rokeabbey /home/rokeabbey/.Private ecryptfs 138G 39G 92G 30% /home/rokeabbey
**$$ UPDATE $$**我可以用 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$
如果文件系統被加密,就會發生這種情況;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
如果您在文件上具有擴展屬性,則可以獲得帶有塊的零大小文件,而不是 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 kB 的,根據
xattr
手冊頁,大小限制為 ext2/3/4 上的塊大小,塊大小受系統頁面大小的限制,所以在 x86 上是 4 kB。此外,除非您正在執行 SELinux,否則新創建的文件不應具有任何擴展屬性,但在這種情況下,ls -l
應在權限位末尾顯示點以指示 SELinux 標記的存在。