หลังจากขุดลงในซอร์สโค้ดและมาตรฐาน POSIX ฉันจะบอกว่าคำตอบโดย @ antje-m และ @Gilles ส่วนใหญ่ถูกต้อง
มันมีค่าที่จะอ้างถึงความคิดเห็นจากPOSIX.1-2008เป็นบทสรุป:
การใช้หน่วย 512- ไบต์เป็นการฝึกประวัติและรักษาความเข้ากันได้กับ ls และโปรแกรมอรรถประโยชน์อื่น ๆ ในไดรฟ์ข้อมูลของ POSIX.1-2008 นี้ สิ่งนี้ไม่ได้บังคับว่าระบบไฟล์นั้นจะยึดตามบล็อกขนาด 512 ไบต์ อ็อพชัน -k ถูกเพิ่มเป็นการวัดการประนีประนอม เป็นที่ตกลงกันโดยนักพัฒนามาตรฐานว่า 512 ไบต์เป็นหน่วยเริ่มต้นที่ดีที่สุดเนื่องจากความสอดคล้องกันทางประวัติศาสตร์ที่สมบูรณ์บน System V (เทียบกับการใช้ 512/1024-byte แบบผสมบนระบบ BSD) และตัวเลือก -k เพื่อเปลี่ยนเป็น 1024- หน่วยไบต์เป็นประนีประนอมที่ดี ผู้ใช้ที่ต้องการปริมาณ 1024 ไบต์แบบลอจิคัลที่มากขึ้นสามารถตั้งชื่อแทน df เป็น df -k ได้อย่างง่ายดายโดยไม่ทำลายสคริปต์ประวัติจำนวนมากที่ต้องใช้หน่วย 512- ไบต์
สำหรับขนาดบล็อกในls -s
:
POSIX บอกว่าขนาดบล็อกเริ่มต้นกำหนดโดยการนำไปใช้เว้นแต่-k
จะมีการกำหนดตัวเลือกไว้
ขนาดบล็อกเริ่มต้นที่ใช้ในGNU coreutils
ls
ถูกกำหนดไว้ใน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
ซึ่งมาจากความมุ่งมั่นเก่า:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <jim@meyering.net>
Date: Mon Jun 29 15:23:04 1998 +0000
ข้อความยืนยันไม่ได้พูดอะไรเกี่ยวกับหมายเลข 1024
และโปรดทราบว่าขนาดบล็อกที่ใช้du
และdf
เป็น 1024 ls
เพียงแค่เลือกให้สอดคล้องกับพวกเขา แม้ว่าจะเป็นdu
และdf
มันเป็นความขัดแย้งกับมาตรฐาน POSIX (ดังนั้นที่นี่ตัวแปรสภาพแวดล้อมPOSIXLY_CORRECT
มา) ดูเหมือนว่านี่เป็นการตัดสินใจของทีม GNU ให้ดูหน้าวิกิพีเดียPOSIXเกี่ยวกับข้อโต้แย้งนี้
stat
สำหรับคำสั่ง
มันไม่ได้เป็นส่วนหนึ่งของมาตรฐาน POSIX แต่การเรียกของระบบคือ อย่างไรก็ตามหน่วยสำหรับขนาดบล็อกไม่ได้มาตรฐาน ( sys_stat.h ):stat
หน่วยสำหรับสมาชิก st_blocks ของโครงสร้าง stat ไม่ได้ถูกกำหนดภายใน POSIX.1-2008
stat
คำสั่งก็จะแสดงข้อมูลที่ได้รับจากstat
ระบบโทรและการใช้บล็อกขนาด 512 มีไม่กี่ข้อยกเว้น (พวกเขาจะไม่ใช่ลินุกซ์เช่น HP-UX, IBM AIX ฯลฯ ดูแมโครที่กำหนดไว้ในgnulib/lib/stat-size.h
)
ดังนั้นหมายเลข 512 จึงเป็นตัวเลือกในอดีตและแบบแผน Linux
GNU coreutils
(เพราะฉะนั้นls
คำสั่ง) ไม่ได้เป็นส่วนหนึ่งของลินุกซ์เคอร์เนล (เพราะฉะนั้นที่stat
โทร) พวกเขาจะกำหนดเป้าหมายด้านระบบที่แตกต่างกันGNU coreutils
มากขึ้นสำหรับมนุษย์ (ง่ายต่อการอ่าน) และลินุกซ์เคอร์เนลสำหรับฮาร์ดแวร์ที่เป็นนามธรรม (จึงใกล้ชิดกับฮาร์ดแวร์)
แก้ไข: ขนาดบล็อก 4096 เป็นขนาด "บล็อก IO" ขนาดบล็อกทางกายภาพจริงยังคงเป็น 512 ไบต์ตามที่อธิบายไว้ในคำถามนี้