Sau khi đào sâu vào mã nguồn và tiêu chuẩn POSIX, tôi sẽ nói câu trả lời của @ antje-m và @Gilles là chính xác.
Thật đáng để trích dẫn nhận xét từ POSIX.1-2008 , như một bản tóm tắt:
Việc sử dụng các đơn vị 512 byte là thông lệ lịch sử và duy trì khả năng tương thích với ls và các tiện ích khác trong tập POSIX.1-2008 này. Điều này không bắt buộc rằng chính hệ thống tệp phải dựa trên các khối 512 byte. Tùy chọn -k đã được thêm vào như một biện pháp thỏa hiệp. Các nhà phát triển tiêu chuẩn đã đồng ý rằng 512 byte là đơn vị mặc định tốt nhất vì tính nhất quán lịch sử hoàn chỉnh của nó trên Hệ thống V (so với việc sử dụng 512/1024 byte hỗn hợp trên các hệ thống BSD) và tùy chọn -k để chuyển sang 1024- đơn vị byte là một sự thỏa hiệp tốt. Người dùng thích số lượng 1024 byte hợp lý hơn có thể dễ dàng đặt bí danh df thành df -k mà không phá vỡ nhiều tập lệnh lịch sử dựa trên các đơn vị 512 byte.
Đối với kích thước khối trong ls -s
:
POSIX nói rằng kích thước khối mặc định được xác định theo triển khai, trừ khi -k
được cung cấp tùy chọn.
Kích thước khối mặc định được triển khai trong GNU coreutils
ls
được xác định trong GNU gnulib
:
gnulib/lib/human.c
/* The default block size used for output. This number may change in
the future as disks get larger. */
#ifndef DEFAULT_BLOCK_SIZE
# define DEFAULT_BLOCK_SIZE 1024
#endif
xuất phát từ một cam kết cũ:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date: Mon Jun 29 15:23:04 1998 +0000
Bản thân thông điệp cam kết không nói gì về số 1024.
Và lưu ý rằng kích thước khối được sử dụng trong du
và df
cũng là 1024, ls
chỉ cần chọn để phù hợp với chúng. Mặc dù du
và df
đó là một mâu thuẫn với tiêu chuẩn POSIX (vì vậy ở đây có biến môi trường POSIXLY_CORRECT
). Đây có vẻ là một quyết định của nhóm GNU, xem trang POSIX của wikipedia về tranh cãi này.
Đối với lệnh stat
.
Nó không phải là một phần của tiêu chuẩn POSIX, nhưng cuộc gọi hệ thống là. Tuy nhiên, đơn vị cho kích thước khối không được tiêu chuẩn hóa ( sys_stat.h ):stat
Đơn vị cho thành viên st_blocks của cấu trúc stat không được xác định trong POSIX.1-2008.
Các stat
lệnh đơn giản hiển thị thông tin được cung cấp bởi stat
cuộc gọi hệ thống, và sử dụng 512 Kích thước khối với vài ngoại lệ (họ đều là phòng không Linux, ví dụ như HP-UX, IBM AIX, vv thấy các macro quy định tại gnulib/lib/stat-size.h
).
Vì vậy, số 512 là một sự lựa chọn lịch sử và một quy ước của Linux.
Các GNU coreutils
(do đó ls
lệnh) không phải là một phần của Linux kernel (do đó stat
gọi), họ đang nhắm mục tiêu khía cạnh hệ thống khác nhau, GNU coreutils
được nhiều hơn cho con người (dễ đọc), và Linux kernel cho phần cứng trừu tượng (do đó gần gũi hơn với phần cứng).
Chỉnh sửa: kích thước khối 4096 là kích thước "Khối IO", kích thước khối vật lý thực có khả năng vẫn là 512 Byte như được giải thích trong câu hỏi này .