Khái niệm tạo một tệp có byte bằng 0 trong Linux là gì?


32

Nếu tôi làm như sau:

touch /tmp/test

và sau đó thực hiện

ls -la /tmp/

Tôi có thể thấy testtập tin có 0 Byte trong thư mục.

Nhưng làm thế nào để Hệ điều hành xử lý khái niệm 0 Byte . Nếu tôi đặt nó trong điều khoản cư sĩ:

0 Byte hoàn toàn không có bộ nhớ, do đó không có gì được tạo ra.

Tạo một tập tin, ít nhất phải hoặc nên yêu cầu bộ nhớ nhất định, phải không?


Câu trả lời:


63

Một tập tin là (khoảng) ba điều riêng biệt:

  • Một "inode", cấu trúc siêu dữ liệu theo dõi ai sở hữu tệp, quyền và danh sách các khối trên đĩa thực sự chứa dữ liệu.
  • Một hoặc nhiều mục nhập thư mục (tên tệp) trỏ đến nút đó
  • Các khối dữ liệu thực tế

Khi bạn tạo một tệp trống, bạn chỉ tạo inode và một mục nhập thư mục trỏ đến inode đó. Tương tự cho các tệp thưa thớt ( dd if=/dev/null of=sparse_file bs=10M seek=1).

Khi bạn tạo liên kết cứng đến một tệp hiện có, bạn chỉ cần tạo các mục nhập thư mục bổ sung trỏ đến cùng một nút.

Tôi đã đơn giản hóa mọi thứ ở đây, nhưng bạn có ý tưởng.


2
độc đáo tuyên bố. trong khi quảng bá một câu hỏi hóc búa nhỏ bằng đoạn "liên kết cứng" của bạn: nếu ai đó tạo liên kết cứng đến một tệp trống, mà bạn nêu không có danh sách các khối, làm thế nào mà liên kết cứng đó có thể trỏ đến danh sách các khối (cùng) cái nào không tồn tại
Theophrastus

4
@Theophrastus Điểm tốt. Tôi đã làm cho tôi có thể đơn giản hóa mọi thứ. Trên thực tế giữa danh sách các khối và các mục nhập thư mục, có siêu dữ liệu liên quan đến tệp (được gọi bằng số inode) và có chứa các thuộc tính tệp (chủ sở hữu, quyền, ...) và các thuộc tính mở rộng. Danh sách các khối là ở đó. Vì vậy, tất cả các mục nhập thư mục không trỏ trực tiếp vào danh sách các khối (cách FAT), mà là siêu dữ liệu.
xhienne

6
Nên có ba điều riêng biệt: Một danh sách các khối chứa dữ liệu; Các khối tự ; và một mục nhập thư mục (hoặc các mục) trỏ đến danh sách các khối.
tự đại diện

@Wildcard Tôi đã gửi một bản chỉnh sửa để thực hiện ba điều đó và được gọi là inode bằng tên của nó. Cả inode và thư mục đều là siêu dữ liệu; nhưng chúng là các loại siêu dữ liệu khác nhau. Một tệp luôn có một nút và ít nhất một mục nhập thư mục. Inode đó có thể bao gồm một danh sách trống các khối dữ liệu.
Monty Harder

1
@Wildcard Ngay cả khi bạn là người mới bắt đầu, việc hiểu sự khác biệt giữa inode và thư mục là rất quan trọng. Khi ai đó thay đổi quyền / quyền sở hữu "tên thư mục" và nghĩ rằng các liên kết khác đến cùng một nút sẽ giữ lại quyền / quyền sở hữu cũ, điều gì đó rất tệ có thể xảy ra. Chúng ta không cần phải đi sâu vào chi tiết về cách inodes các khối trực tiếp tham chiếu, các khối gián tiếp, các khối gián tiếp gấp đôi và ba lần để có được danh sách các khối đó. Hoặc là một danh sách có thể trống.
Monty Harder

24

touchsẽ tạo một nút , và ls -ihoặc statsẽ hiển thị thông tin về nút đó:

$ touch test
$ ls -i test
28971114 test
$ stat test
  File: ‘test’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 28971114    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/1000)   Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
 Birth: -

Lưu ý rằng testsử dụng 0 khối. Để lưu trữ dữ liệu được hiển thị, inode sử dụng một số byte. Các byte được lưu trữ trong bảng inode. Nhìn vào trang ext2 để biết ví dụ về cấu trúc inode .


19

ls(hoặc tốt, stat(2)cuộc gọi hệ thống) cho bạn biết kích thước của nội dung của tệp. Hệ thống tập tin cần bao nhiêu dung lượng để ghi sổ không phải là một phần của điều đó và như một chi tiết triển khai, đó không phải là điều mà các chương trình nói chung nên quan tâm hoặc thậm chí biết. Làm cho các chi tiết triển khai hiển thị sẽ làm cho hệ thống tập tin trừu tượng ít hữu ích hơn.


9

Bản thân tệp không chiếm bất kỳ dung lượng nào, nhưng hệ thống tệp thực hiện, lưu trữ tên tệp, vị trí, quyền truy cập vào tệp và tương tự.


4
Nếu bạn nhìn vào không gian bị chiếm bởi mục nhập thư mục, nếu bạn có một thư mục chứa một nghìn tệp có kích thước 0 byte, thư mục sẽ lớn hơn mục nhập thư mục chỉ có 2 tệp lớn.
Mark Stewart

2
đạo cụ để đề cập rằng một tệp là một khái niệm trừu tượng không được liên kết chặt chẽ với biểu diễn vật lý của nó trên ví dụ như một đĩa.
Florian Castellane

5

Câu trả lời đơn giản: Bởi vì nó được định nghĩa theo cách đó.

Câu trả lời dài hơn: Nó được định nghĩa theo cách đó bởi vì một số hoạt động đơn giản hơn về mặt khái niệm:

  • Nếu một tệp chứa 20 chữ cái "A" và bạn xóa tất cả "A", thì tệp sẽ trở nên ngắn hơn 20 byte. Hoạt động tương tự trên một tệp chỉ bao gồm "AAAAAAAAAAAAAAAAAAAA" sẽ phải xử lý trường hợp đặc biệt của tệp biến mất.
  • Thực tế hơn, việc xóa dòng cuối cùng của tệp văn bản sẽ cần phải được đặc biệt.
  • Các trình soạn thảo văn bản thường xuyên tạo bản sao lưu sẽ cần mã trường hợp đặc biệt để xử lý tình huống người dùng có thể xóa dòng cuối cùng, đi ăn trưa, sau đó quay lại và thêm một dòng khác. Các biến chứng tiếp theo phát sinh nếu một số người dùng khác tạo một tệp có tên đó trong thời gian trung bình.

Bạn có thể làm nhiều việc hơn: * Các tệp nhật ký lỗi có xu hướng được tạo trống, sẽ được điền nếu và chỉ khi xảy ra lỗi. * Để tìm hiểu có bao nhiêu lỗi xảy ra, bạn đếm số dòng trong tệp nhật ký. Nếu tệp nhật ký trống, số lỗi bằng 0, điều này có ý nghĩa hoàn hảo. * Đôi khi bạn thấy các tệp trong đó tất cả các văn bản có liên quan nằm trong tên tệp, ví dụ hoặc .this-is-the-logging-directory . Điều này ngăn quản trị viên quá mức xóa các thư mục trống sau khi cài đặt và nó cũng ngăn các lỗi trong đó chương trình hoặc người dùng vô tình tạo một tệp mà chương trình muốn xem thư mục sau. Các gitchương trình (và những người khác) có xu hướng bỏ qua các thư mục rỗng, và nếu một dự án / administrator / người dùng muốn có một kỷ lục mà các thư mục tồn tại mặc dù nó không có nội dung hữu ích (chưa), bạn có thể thấy một tập tin rỗng tênemptyempty.directory

Không có hoạt động nào trở nên phức tạp hơn:

  • Ghép các tệp: đây chỉ là một no-op với một tệp trống.
  • Tìm kiếm một chuỗi trong một tệp: điều này được bao phủ trong trường hợp tiêu chuẩn là "nếu tệp ngắn hơn cụm từ tìm kiếm, thì nó không thể chứa cụm từ tìm kiếm".
  • Đọc từ tệp: các chương trình cần xử lý việc nhấn vào cuối tệp trước khi chúng nhận được những gì chúng mong đợi, vì vậy một lần nữa trường hợp tệp có độ dài bằng 0 không liên quan đến suy nghĩ thêm cho lập trình viên: anh ta sẽ chỉ nhấn vào cuối -file ngay từ đầu.

Trong trường hợp tệp, khía cạnh "có một tệp được ghi ở đâu đó" (inode và / hoặc tên tệp) xuất hiện trên các cân nhắc ở trên, nhưng các hệ thống tệp sẽ không làm điều đó nếu các tệp trống là vô dụng.

Nói chung, tất cả các lý do trên trừ những lý do liên quan đến tên tệp áp dụng cho chuỗi. Đáng chú ý nhất là các chuỗi, là chuỗi các ký tự: Chuỗi có độ dài bằng không là phổ biến bên trong các chương trình. Chuỗi thường không được phép ở cấp độ người dùng nếu chúng không có ý nghĩa: tên tệp là một chuỗi và hầu hết các hệ thống tệp không cho phép một chuỗi trống làm tên tệp; Trong nội bộ, khi tạo tên tệp từ các đoạn, chương trình có thể có một chuỗi trống là một trong các đoạn.


1

Sử dụng phép loại suy đơn giản nhất:

Chúng ta hãy so sánh một tập tin với một ly nước.

'Touch / tmp / test' rất giống với việc tạo ra một chiếc cốc rỗng, không có nước trong đó. Kính trống rỗng, vì vậy kích thước của nó bằng không. Nhưng kính không tồn tại.

Theo cách nói của hệ thống tập tin, kính là siêu dữ liệu, trong khi nội dung của kính là dữ liệu. Dữ liệu meta chứa tất cả các loại nội dung như được đề cập trong các bài viết trước.

Các tập tin có kích thước bằng không có thể hữu ích. Một ví dụ là sử dụng chúng như một mẩu bánh mì, trong đó sự tồn tại đơn thuần của nó có thể được sử dụng để chỉ ra một loại trạng thái nào đó (nghĩa là, nếu tệp tồn tại: thì hãy làm gì đó; nếu không: bỏ qua).


0

Nghĩ về nó theo cách này: giả sử rằng một chương trình đang theo dõi các truy vấn SQL được gửi đến máy chủ của bạn. Chương trình muốn chỉ ra rằng nó đang ghi các yêu cầu vào một tệp văn bản thuần túy, nhưng chưa có yêu cầu nào được ghi lại. Nó nên như thế nào? Tôi cho rằng nó phải là một tệp có kích thước bằng 0 tại /var/log/acme-sql-server/queries.log. Bằng cách đó, bạn có thể tìm ra khi đăng nhập bắt đầu (thời gian tạo tệp), khi nó được cập nhật lần cuối (tức là khi nó được tạo), có bao nhiêu truy vấn được ghi lại (số dòng mới trong tệp = 0) và ai đang thực hiện ghi nhật ký (Máy chủ SQL Acme). Đối với những trường hợp như thế này, thật hữu ích khi có khái niệm về một tệp trống vẫn tồn tại ở một vị trí cụ thể.

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.