du cho hai kết quả khác nhau cho cùng một tệp


23

Tôi là một sinh viên tốt nghiệp ngành hóa học tính toán với quyền truy cập vào một cụm Linux. Cụm này bao gồm một máy chủ tệp rất lớn (25 TB), trong đó vài chục nút tính toán được kết nối. Mỗi nút tính toán bao gồm 8 đến 24 lõi Intel Xeon. Mỗi nút tính toán cũng chứa một đĩa cục bộ khoảng 365 TB.

Do máy chủ tệp được truy cập thường xuyên bởi hàng tá người dùng trong nhóm nghiên cứu, nên máy chủ chủ yếu được sử dụng để lưu trữ tệp dài hạn (được sao lưu hàng đêm, trong khi các đĩa cục bộ của các nút tính toán không bao giờ được sao lưu). Do đó, quản trị viên hệ thống đã hướng dẫn chúng tôi chạy mô phỏng trên các đĩa cục bộ - có I / O nhanh hơn máy chủ tệp - để không làm chậm máy chủ tệp cho người dùng khác.

Vì vậy, tôi chạy mô phỏng trên các đĩa cục bộ và sau đó, sau khi chúng kết thúc, tôi sao chép các tệp quỹ đạo - Tôi đang chạy mô phỏng động lực phân tử (MD) - vào máy chủ để lưu trữ. Giả sử tôi có một tệp quỹ đạo được gọi traj.trrtrong một thư mục trên đĩa cục bộ của một nút , /home/myusername/mysimulation1/traj.trr. Để lưu trữ lâu dài, tôi luôn sao chép traj.trrvào một thư mục trong máy chủ tệp ~/mysimulation1/traj.trr, trong đó ~đại diện cho thư mục của tôi trong máy chủ tệp , /export/home/myusername. Sau khi sao chép nó, sau đó tôi thường xuyên sử dụng du -hđể xác minh rằng /home/myusername/mysimulation1/traj.trrcó cùng kích thước tệp như ~/mysimulation1/traj.trr. Bằng cách này, tôi ít nhất có thể chắc chắn một cách hợp lý rằng việc chuyển đến máy chủ tệp đã thành công. Ví dụ:

cd /home/myusername/mysimulation1/
cp -v traj.trr ~/mysimulation1/
du /home/myusername/mysimulation1/traj.trr -h
du ~/mysimulation1/traj.trr -h

Nếu hai cuộc gọi để du -hcung cấp cùng kích thước tệp có thể đọc được của con người, thì tôi có thể chắc chắn chắc chắn rằng việc chuyển / sao chép đã thành công. (Các traj.trrtệp điển hình của tôi có kích thước từ khoảng 15 đến 20 GB, tùy thuộc vào mô phỏng chính xác mà tôi đã chạy.) Nếu tôi chạy du(nghĩa là không có công -htắc) trên hai traj.trrtệp, kích thước của chúng theo byte thường rất, rất giống nhau - - thường chỉ trong một vài byte. Tôi đã sử dụng phương pháp tổng thể này trong một năm rưỡi qua, không có vấn đề gì.

Tuy nhiên, gần đây tôi gặp phải vấn đề sau: đôi khidu -hbáo cáo rằng haitraj.trrtệp có kích thước khác nhau khoảng vài GB. Đây là một ví dụ:

cd /home/myusername/mysimulation1/            # this is the local disk
cp -v traj.trr ~/mysimulation1/
du traj.trr -h
cd ~/mysimulation1/                           # this is the fileserver
du traj.trr -h

Đầu ra từ hai cuộc gọi đến du -hnhư sau, tương ứng:

20G     traj.trr
28G     traj.trr

Tôi tin rằng cái trước đây (tức là traj.trrtrong đĩa cục bộ /home/myusername/mysimulation1/) là kích thước tệp chính xác, vì quỹ đạo mô phỏng của tôi dự kiến ​​sẽ có khoảng 15 đến 20 GB mỗi cái. Nhưng làm thế nào để tập tin trên máy chủ tập tin thực sự lớn hơn ? Tôi có thể thấy làm thế nào nó có thể nhỏ hơn, nếu bằng cách nào đó việc cpchuyển tiền thất bại. Nhưng tôi không thấy làm thế nào nó thực sự có thể lớn hơn .

Tôi nhận được đầu ra tương tự khi tôi thực hiện các lệnh tương tự như trên, nhưng không có công -htắc được đưa ra cho du:

20717480        traj.trr
28666688        traj.trr

Bạn có thể nghĩ ra bất kỳ lý do cho sự khác biệt?

Nếu, bởi một số cơ hội không thể, dubằng cách nào đó bị trục trặc, tôi có thể ổn với điều đó. Nhưng tôi thực sự cần phải chắc chắn rằng bản sao của traj.trrmáy chủ tệp đã hoàn chỉnh và giống hệt với phiên bản nguồn của nó trên đĩa cục bộ. Tôi cần xóa tệp cục bộ để có đủ dung lượng đĩa cục bộ để chạy các mô phỏng mới, nhưng tôi không đủ khả năng để phiên bản traj.trrtrên máy chủ tệp bị hỏng.

Các định dạng tập tin .trr (từ động lực phân tử gói Gromacs) là một định dạng nhị phân, không phải văn bản. Vì vậy, tôi không chắc chắn nếu các tập tin có thể được so sánh đáng tin cậy bởi một chương trình như diff.


5
Hãy thử chạy md5sumhoặc sha1sumtrên các tập tin. Họ có hợp nhau không?
cjm

2
@cjm Mình mới chạy md5sumtrên hai file. Hai tổng kiểm khớp nhau. Vì vậy, tôi đoán điều này có nghĩa là hai tập tin là như nhau?
Andrew

3
Những kích thước được báo cáo bởi ls -l? Lệnh dubáo cáo có bao nhiêu dung lượng trên đĩa được sử dụng cho tệp của bạn, chứ không phải tệp của bạn lớn như thế nào. Kích thước trên đĩa có thể bị ảnh hưởng bởi hệ thống tệp của bạn và các chiến lược phân bổ của nó.
casey

2
@casey ls -l -hnói rằng cả hai tệp đều là 20 GB. Tương tự, ls -lnói rằng cả hai tệp là 21214683940 byte. Vì vậy, tôi đoán các tệp có cùng kích thước, nhưng không sử dụng cùng một dung lượng đĩa (theo du).
Andrew

2
@Andrew đưa ra các kích thước được báo cáo bởi ls là như nhau và băm là như nhau, bạn có thể kết luận các tệp là như nhau. Những công cụ này là thứ mang lại cho bạn sự tự tin mà bạn cần và cho bạn thấy rằng du không phải là công cụ để đáp ứng nhu cầu của bạn.
casey

Câu trả lời:


32

Bạn thực sự nên sử dụng một cái gì đó như md5sumhoặc sha1sumđể kiểm tra tính toàn vẹn.

Nếu bạn thực sự muốn sử dụng kích thước sử dụng ls -lhoặc du -b.

Các dutiện ích thông thường chỉ cho thấy việc sử dụng đĩa của tập tin, tức là bao nhiêu hệ thống tập tin được sử dụng bởi nó. Giá trị này hoàn toàn phụ thuộc vào hệ thống tệp sao lưu và các yếu tố khác như tệp thưa.

Thí dụ:

$ truncate -s 512M foo
$ cat foo >bar
$ ls -l foo bar
-rw-r--r-- 1 michas users 536870912 23. Dez 00:06 bar
-rw-r--r-- 1 michas users 536870912 23. Dez 00:03 foo
$ du foo bar
0       foo
524288  bar
$ du -b foo bar
536870912       foo
536870912       bar

Chúng tôi có hai tệp chứa 512MB số không. Cái đầu tiên được lưu trữ thưa thớt và không sử dụng bất kỳ dung lượng đĩa nào, trong khi cái thứ hai lưu trữ rõ ràng từng byte trên đĩa. - Cùng một tệp, nhưng cách sử dụng đĩa hoàn toàn khác nhau.

Các -btùy chọn có thể là tốt cho bạn:

   -b, --bytes
          equivalent to '--apparent-size --block-size=1'

   --apparent-size
          print apparent sizes, rather than disk usage; although the apparent
          size is  usually  smaller,  it  may  be  larger  due  to  holes  in
          ('sparse')  files, internal fragmentation, indirect blocks, and the
          like

8

Đây là một vấn đề phổ biến khi bạn đặt cùng một dữ liệu trên 2 ổ cứng khác nhau. Bạn sẽ muốn chạy dulệnh với và chuyển đổi bổ sung, giả sử nó có lệnh - mà nó nên được cung cấp đây là các nút Linux.

Công tắc?

   --apparent-size
          print  apparent  sizes,  rather  than  disk  usage;  although the 
          apparent size is usually smaller, it may be larger due to holes in
          ('sparse') files, internal fragmentation, indirect blocks, and the 
          like

Thí dụ

$ du -sh --apparent-size /home/sam/scsconfig.log ~/scsconfig.log 
93K /home/sam/scsconfig.log
93K /root/scsconfig.log

Các hệ thống tập tin ở trên là một đĩa cục bộ ( /root) trong khi các hệ thống khác /home/samlà chia sẻ NFS từ NAS của tôi.

$ df -h . /home/sam
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      222G  118G   92G  57% /
mulder:/export/raid1/home/sam
                      917G  566G  305G  65% /home/sam

Sao, có chuyện gì?

Điều này khiến nhiều người bối rối nhưng hãy nhớ rằng khi các tệp được lưu trữ vào đĩa, chúng sẽ tiêu tốn các khối không gian ngay cả khi chúng chỉ sử dụng một phần của các khối đó. Khi bạn chạy dumà không có --apparent-sizekích thước dựa trên dung lượng khối đĩa được sử dụng, chứ không phải không gian thực tế được sử dụng bởi (các) tệp.

sử dụng tổng kiểm tra thay thế?

Đây có thể là một lựa chọn tốt hơn nếu bạn quan tâm đến việc so sánh 2 cây tệp. Bạn có thể sử dụng lệnh này để tính toán tổng kiểm tra cho tất cả các tệp và sau đó tính toán tổng kiểm tra cuối cùng. Ví dụ này sử dụng sha1sumnhưng bạn có thể dễ dàng sử dụng md5sumthay thế.

$ cd /some/dir
$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum

Thí dụ

$ cd ~/dir1
$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum
55e2672f8d6fccff6d83f0bffba1b67aeab87911  -

$ cd ~/dir2
$ find . -type f \( -exec sha1sum "{}" \; \) | sort -k2,2 | sha1sum
55e2672f8d6fccff6d83f0bffba1b67aeab87911  -

Vì vậy, chúng ta có thể thấy rằng 2 cây giống hệt nhau.

(Lưu ý: lệnh find sẽ liệt kê các tệp khi chúng xuất hiện trong hệ thống tệp. Vì vậy, nếu bạn đang so sánh hai thư mục từ hệ thống tệp khác nhau (ví dụ: Ext3 so với APFS), bạn cần sắp xếp trước trước sha1sum cuối cùng. Tây An


5

Câu trả lời ngắn: không kiểm tra kích thước tệp, kiểm tra trạng thái trả về của lệnh. Trạng thái trả về chỉ là một dấu hiệu đáng tin cậy về việc bản sao có thành công hay không (so sánh hai tệp byte theo byte, trực tiếp gián tiếp - là dự phòng nếu bản sao thành công).

Kiểm tra kích thước tệp không phải là một cách rất hữu ích để kiểm tra xem một bản sao có thành công hay không. Trong một số trường hợp, nó có thể là một kiểm tra vệ sinh hữu ích, ví dụ như khi bạn tải xuống một tệp từ web. Nhưng ở đây có một cách tốt hơn.

Tất cả các lệnh Unix trả về một trạng thái để cho biết liệu chúng có thành công hay không: 0 cho thành công, 1 hoặc nhiều hơn cho các lỗi. Vì vậy, kiểm tra trạng thái thoát của cp. cpthông thường sẽ in một thông báo lỗi nếu nó không thành công, cho biết lỗi là gì. Trong một tập lệnh, trạng thái thoát của lệnh cuối cùng nằm trong biến ma thuật $?.

cp -v traj.trr ~/mysimulation1/
if [ $? -ne 0 ]; then
  echo 1>&2 "cp failed due to the error above"
  exit 2
 fi

Thay vì kiểm tra xem $?có bằng không, bạn có thể sử dụng các toán tử boolean.

cp -v traj.trr ~/mysimulation1/ || exit 2

Nếu bạn đang chạy tập lệnh và muốn tập lệnh dừng nếu có bất kỳ lệnh nào bị lỗi, hãy chạy set -e. Nếu bất kỳ lệnh nào không thành công (nghĩa là trả về trạng thái khác không), tập lệnh sẽ thoát ngay lập tức với trạng thái giống như lệnh.

set -e
…
cp -v traj.trr ~/mysimulation1/

Vì lý do tệp sao chép của bạn lớn hơn, nó phải là vì nó là một tệp thưa thớt . Tệp thưa là một dạng nén thô trong đó các khối chỉ chứa byte rỗng không được lưu trữ. Khi bạn sao chép một tệp, cplệnh sẽ đọc và ghi các byte rỗng, do đó, bản gốc bị thiếu các khối, bản sao có các khối chứa đầy các byte rỗng. Trong Linux, cplệnh cố gắng phát hiện các tệp thưa thớt, nhưng không phải lúc nào cũng thành công; cp --sparse=alwayslàm cho nó cố gắng hơn với chi phí tăng thời gian CPU rất nhẹ.

Tổng quát hơn, ducó thể trả về các kết quả khác nhau do các hình thức nén khác. Hệ thống tập tin nén là rất hiếm, mặc dù. Nếu bạn muốn biết kích thước của tệp như số byte trong tệp, trái ngược với số khối đĩa mà nó sử dụng, hãy sử dụng ls -lthay vì du.


Cám ơn rất nhiều! Bạn có biết nếu có một tiện ích (riêng biệt) có thể cho tôi biết liệu tập tin của tôi có thưa thớt hay không?
Andrew

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.