สูตร: ตัวเลขนั้นคืออะไร?
total int = ผลรวมของ(physical_blocks_in_use) * physical_block_size / ls_block_size)สำหรับแต่ละไฟล์
ที่ไหน:
ls_block_size
เป็นตัวแปรสภาพแวดล้อมโดยพลการ (ปกติ 512 หรือ 1024 bytes) ซึ่งเป็นอิสระที่สามารถแก้ไขได้ด้วย
--block-size=<int>
ธงls
ที่POSIXLY_CORRECT=1
ตัวแปรสภาพแวดล้อมของกนู (ที่จะได้รับหน่วย 512 ไบต์) หรือ-k
ธงที่จะบังคับให้หน่วย 1KB
physical_block_size
เป็นค่าที่ขึ้นกับระบบปฏิบัติการของอินเทอร์เฟซบล็อกภายในซึ่งอาจเชื่อมต่อกับฮาร์ดแวร์พื้นฐานหรือไม่ก็ได้ ค่านี้ปกติคือ 512b หรือ 1k แต่ขึ้นอยู่กับ OS โดยสมบูรณ์ มันสามารถนำมาเปิดเผยผ่าน%B
ค่าหรือ stat
โปรดทราบว่าค่านี้ (เกือบตลอดเวลา) ไม่เกี่ยวข้องกับจำนวนบล็อกทางกายภาพบนอุปกรณ์จัดเก็บข้อมูลสมัยใหม่fstat
ทำไมจึงสับสน?
ตัวเลขนี้ค่อนข้างแยกออกจากเมตริกทางกายภาพหรือที่มีความหมาย โปรแกรมเมอร์จูเนียร์หลายคนไม่ได้มีประสบการณ์กับหลุมไฟล์หรือยาก / การเชื่อมโยง นอกจากนี้เอกสารที่มีอยู่ในหัวข้อเฉพาะนี้แทบไม่มีอยู่จริง
ความไม่ปะติดปะต่อและความคลุมเครือของคำว่า"ขนาดบล็อก"เป็นผลมาจากมาตรการต่างๆมากมายทำให้สับสนได้ง่ายและระดับนามธรรมที่ค่อนข้างลึกซึ่งวนเวียนอยู่กับการเข้าถึงดิสก์
ตัวอย่างข้อมูลที่ขัดแย้งกัน: du
(หรือls -s
) เทียบกับstat
การรันdu *
ในโฟลเดอร์โปรเจ็กต์จะให้ผลลัพธ์ดังต่อไปนี้: (หมายเหตุ: ls -s
ส่งกลับผลลัพธ์เดียวกัน)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
รวม : 2 + 2 + 1 + 3 + 3 + 5 + 26 + 4 + 2 + 14 = 62 บล็อก
แต่เมื่อมีการเรียกใช้stat
เราจะเห็นชุดของค่าที่แตกต่างกัน การรันstat
ในไดเร็กทอรีเดียวกันให้ผล:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
รวม: 3 + 3 + 1 + 5 + 6 + 10 + 51 + 8 + 3 + 28 = 118 บล็อก
หมายเหตุ:คุณสามารถใช้คำสั่งstat * --printf="%b\t(%B)\t%n: %s bytes\n"
> เพื่อส่งออก (ตามลำดับ) จำนวนบล็อก (ใน parens) ขนาดของบล็อกเหล่านั้นชื่อของไฟล์และขนาดเป็นไบต์ดังที่แสดงด้านบน
มีประเด็นสำคัญสองประการ:
stat
รายงานทั้งphysical_blocks_in_use
และphysical_block_size
ตามที่ใช้ในสูตรด้านบน โปรดทราบว่าค่าเหล่านี้ขึ้นอยู่กับอินเทอร์เฟซของระบบปฏิบัติการ
du
เป็นการให้สิ่งที่ยอมรับกันโดยทั่วไปว่าเป็นการประมาณการการใช้งานดิสก์ทางกายภาพที่ถูกต้อง
สำหรับการอ้างอิงนี่คือls -l
ไดเรกทอรีของด้านบน:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
man ls
ในระบบของฉันไม่ได้พูดถึงบรรทัดนั้น แต่info coreutils ls
ทำ คำสั่งเดียวกันมีที่มาอย่างไรman ls
และinfo coreutils ls
มีข้อมูลที่แตกต่างกันอย่างไร เหตุใดจึงไม่มีการls
จัดทำเป็นเอกสารเพียงครั้งเดียว การมีเอกสารสองชุดที่แตกต่างกันสำหรับคำสั่งเดียวกันดูเหมือนว่าตั้งค่าไว้สำหรับความล้มเหลว