Làm thế nào có thể 8 khối được phân bổ nhưng kích thước tệp 0?


9

Có người hỏi tôi ở trang khác về câu hỏi này, tức là một tệp có tên "abc.dat" có kích thước tệp 0 nhưng 8 khối và đây là đầu ra tôi yêu cầu anh ấy đưa cho tôi (Một số văn bản đã được dịch từ tiếng Trung sang tiếng Anh):

$ 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 rokablesbey rokablesbey 0 tháng 9 18 19:11 abc.dat # xin lỗi, đây có thể là đầu ra sai thêm anh ấy đã thêm

$ 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

Tôi đã tìm hiểu một chút về tệp thưa, siêu dữ liệu tệp, trường hợp liên kết tượng trưng, ​​nhưng không trường hợp nào trong số đó sẽ gây ra kích thước tệp 0 byte với 8 khối. Có bất kỳ thiết lập hệ thống tập tin như kích thước khối tối thiểu cho bất kỳ tập tin nào không?

Anh ấy nói với tôi rằng hệ thống của anh ấy là Ubuntu 16.04 và ext4.

[CẬP NHẬT]

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

[CẬP NHẬT] Tôi có thể sao chép bằng 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$

Tôi bối rối. Là abc.databc2.datthư mục? Đầu ls -ls abc2.datra chỉ ra rằng đó là một thư mục có hai mục nhập và stat abc.datchỉ ra rằng đó cũng là một thư mục. Hoặc bạn đã chỉnh sửa đầu ra?
Kusalananda

@Kusalananda Xin lỗi, tôi đã dịch từ tiếng Trung Quốc và bỏ lỡ bản dịch thư mục.
林果

@Kusalananda ls -ls abc2.dat, anh ấy đã cho tôi xem 2 dòng này, giống như anh ấy đã dán sai sản lượng. Và đầu ra thứ 3 đã cho thấy đầu ra chính xác.
林果

Điều duy nhất tôi có thể nghĩ là khối thuộc tính mở rộng. Có phải anh ấy đang sử dụng SELinux?
psusi

Câu trả lời:


16

Điều này xảy ra nếu hệ thống tập tin được mã hóa; FS cần lưu trữ siêu dữ liệu bổ sung cho tệp, ngay cả khi nó trống.

Khi tôi có một máy tiện dụng với ngàm ecryptfs vanilla (Ubuntu 12.04-LTS), tôi có thể xác nhận rằng một tệp trống sẽ nhận được 8 khối:

$ touch test
$ ls -ls test

8 -rw-rw-r-- 1 admin admin 0 feb 27 16:45 test

3
Giá trị 32kB? Đó là một chút.
hobbs

6

Bạn có thể nhận được tệp có kích thước bằng 0 với các khối nếu bạn có các thuộc tính mở rộng trên tệp, nhiều hơn những gì có thể nằm trong chính nút 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

Nhưng, tôi không thể thấy cách bạn nhận được 8 kB theo cách đó, vì theo xattrtrang man , kích thước được giới hạn ở kích thước khối trên ext2 / 3/4 và kích thước khối bị giới hạn bởi kích thước trang hệ thống , vì vậy 4 kB trên x86. Ngoài ra, một tệp mới được tạo không nên có bất kỳ thuộc tính mở rộng nào, trừ khi bạn đang chạy SELinux, nhưng trong trường hợp đó, ls -lsẽ hiển thị dấu chấm ở cuối các bit cho phép để biểu thị sự hiện diện của thẻ SELinux.


Tôi đã cập nhật câu hỏi, anh ấy chỉ cho tôi thấy điều đó ecryptfsext4tôi không mong đợi, nó có liên quan không?
林果
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.