Trước hết /sys
là một hệ thống tập tin giả . Nếu bạn nhìn vào, /proc/filesystems
bạn sẽ tìm thấy một danh sách các hệ thống tập tin đã đăng ký, nơi có khá nhiều hệ thống có nodev
ở phía trước. Điều này cho thấy chúng là các hệ thống tập tin giả . Điều này có nghĩa là chúng tồn tại trên một kernel đang chạy như một hệ thống tập tin dựa trên RAM. Hơn nữa họ không yêu cầu một thiết bị khối.
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
Khi khởi động, kernel gắn hệ thống này và cập nhật các mục khi phù hợp. Ví dụ: khi phần cứng mới được tìm thấy trong khi khởi động hoặc bởi udev
.
Trong /etc/mtab
bạn thường tìm thấy gắn kết bởi:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
Để có một bài viết hay về chủ đề này, hãy đọc
Patric Mochel's - Hệ thống tập tin sysfs .
stat của tập tin / sys
Nếu bạn đi vào một thư mục bên dưới /sys
và làm một ls -l
bạn sẽ nhận thấy rằng tất cả các tệp có một kích thước. Thông thường là 4096 byte. Điều này được báo cáo bởi sysfs
.
:/sys/devices/pci0000:00/0000:00:19.0/net/eth2$ ls -l
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_assign_type
-r--r--r-- 1 root root 4096 Apr 24 20:09 address
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_len
...
Hơn nữa bạn có thể làm stat
một tập tin và nhận thấy một tính năng khác biệt; nó chiếm 0 khối. Ngoài ra inode của root (stat / sys) là 1. /stat/fs
thường có inode 2. vv
rsync so với cp
Ví dụ, lời giải thích dễ nhất cho sự thất bại của rsync khi đồng bộ hóa các tệp giả.
Giả sử chúng ta có một tệp có tên address
là 18 byte. Một ls
hoặc stat
của tệp báo cáo 4096 byte.
rsync
- Mở mô tả tập tin, fd.
- Sử dụng fstat (fd) để lấy thông tin như kích thước.
- Đặt ra để đọc byte kích thước, tức là 4096. Đó sẽ là dòng 253 của mã được liên kết bởi @mattdm .
read_size == 4096
- Hỏi; đọc: 4096 byte.
- Một chuỗi ngắn được đọc tức là 18 byte.
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- Hỏi; đọc: 4078 byte
- 0 byte đọc (lần đọc đầu tiên đã tiêu thụ tất cả các byte trong tệp).
nread == 0
, dòng 255
- Không thể đọc
4096
byte. Không có bộ đệm.
- Đặt lỗi
ENODATA
.
- Trở về.
- Báo cáo lỗi.
- Thử lại. (Vòng lặp trên).
- Thất bại.
- Báo cáo lỗi.
- KHỎE.
Trong quá trình này, nó thực sự đọc toàn bộ tập tin. Nhưng không có kích thước có sẵn, nó không thể xác nhận kết quả - do đó, thất bại chỉ là tùy chọn.
cp
- Mở mô tả tập tin, fd.
- Sử dụng fstat (fd) để lấy thông tin như st_size (cũng sử dụng lstat và stat).
Kiểm tra nếu tập tin có khả năng là thưa thớt. Đó là tập tin có lỗ, v.v.
copy.c:1010
/* Use a heuristic to determine whether SRC_NAME contains any sparse
* blocks. If the file has fewer blocks than would normally be
* needed for a file of its size, then at least one of the blocks in
* the file is a hole. */
sparse_src = is_probably_sparse (&src_open_sb);
Khi stat
tệp báo cáo có khối không, nó được phân loại là thưa thớt.
Cố gắng đọc tệp theo mức độ sao chép (một cách hiệu quả hơn để sao chép
các tệp thưa thớt bình thường ) và không thành công.
- Sao chép bằng cách sao chép thưa thớt.
- Bắt đầu với kích thước đọc tối đa MAXINT.
Thông thường các
18446744073709551615
byte trên hệ thống 32 bit.
- Hỏi; đọc 4096 byte. (Kích thước bộ đệm được phân bổ trong bộ nhớ từ thông tin thống kê.)
- Một chuỗi ngắn được đọc tức là 18 byte.
- Kiểm tra nếu một lỗ là cần thiết, không.
- Viết bộ đệm vào mục tiêu.
- Trừ 18 từ kích thước đọc tối đa.
- Hỏi; đọc 4096 byte.
- 0 byte như tất cả đã tiêu thụ trong lần đọc đầu tiên.
- Trở về thành công.
- Tất cả ok. Cập nhật cờ cho tập tin.
- KHỎE.
/sys/
?