ขนาดบล็อกไฟล์ - ความแตกต่างระหว่าง stat และ ls


9

ฉันสังเกตเห็นว่าเมื่อฉันทำ:

ls -ls file

มันให้นับบล็อกพูด 8 บล็อก

เมื่อฉันทำ:

stat file

ฉันสังเกตเห็นว่าการนับบล็อกเป็น 16 สองเท่าของจำนวนที่ได้รับ

ขนาดบล็อกในระบบไฟล์ของฉันคือ 4096 ฉันได้เรียนรู้ว่าหน่วยโดยพลการสำหรับบล็อกที่ใช้โดย ls คือ 1024 มันถูกต้องหรือไม่ที่จะบอกว่าสถิตินั้นใช้หน่วยโดยพลการขนาด 512 ไบต์เมื่อรายงานบล็อก?

ถ้าเป็นเช่นนั้นมีเหตุผลที่ไม่สอดคล้องกันหรือไม่?

ฉันใช้ Ubuntu 11.10 กับระบบไฟล์ ext4

คำตอบ:


9

ดิสก์จำนวนมากมีขนาดเซกเตอร์ 512 ไบต์ซึ่งหมายความว่าการอ่านหรือเขียนบนดิสก์จะถ่ายโอนเซกเตอร์ 512 ไบต์ทั้งหมด มันค่อนข้างเป็นธรรมชาติในการออกแบบระบบไฟล์ที่เซกเตอร์ไม่แยกระหว่างไฟล์ (ซึ่งจะทำให้การออกแบบและประสิทธิภาพการทำงานแย่ลง) ดังนั้นระบบไฟล์จึงมีแนวโน้มที่จะใช้ 512 ไบต์สำหรับไฟล์ ดังนั้นยูทิลิตี้แบบดั้งเดิมเช่นlsและduระบุขนาดในหน่วยของชิ้น 512 ไบต์

สำหรับมนุษย์นั้นหน่วยความจำขนาด 512 ไบต์นั้นไม่มีความหมายมากนัก 1kB นั้นมีขนาดเท่ากันและมีความหมายมากกว่ามาก บล็อกระบบไฟล์ (หน่วยที่เล็กที่สุดที่แบ่งไฟล์) มักประกอบด้วยหลายเซ็กเตอร์: 1kB, 2kB และ 4kB เป็นขนาดบล็อกระบบไฟล์ทั่วไป ดังนั้นหน่วย 512- ไบต์จึงไม่ได้รับการพิสูจน์อย่างชัดเจนจากการออกแบบระบบไฟล์และไม่มีเหตุผลที่ดีนอกจากประเพณีที่จะใช้หน่วยความจำ 512 ไบต์ที่ด้านนอกดิสก์ไดรเวอร์เลย

ดังนั้นคุณจึงมีประเพณีที่ไม่เกิดขึ้นมากมายและการประชุมที่อ่านง่ายขึ้น บิตเช่นฐานแปดและเลขฐานสิบหก: ไม่มีหนึ่งที่ถูกและผิดที่พวกเขากำลังวิธีการเขียนหมายเลขเดียวกันที่แตกต่างกัน

เครื่องมือหลายตัวมีตัวเลือกในการเลือกหน่วยแสดงผล: ls --block-size=512สำหรับ GNU lsการตั้งค่าPOSIXLY_CORRECT=1ในสภาพแวดล้อมสำหรับ GNU dfและ GNU duเพื่อรับหน่วย 512- ไบต์ (หรือส่งผ่าน-kเพื่อบังคับให้หน่วย 1kB) สิ่งที่statคำสั่งใน GNU coreutils ตีแผ่เป็น "ขนาดบล็อก" ( %Bค่า) เป็นค่าขึ้นอยู่กับระบบปฏิบัติการของอินเตอร์เฟซภายใน ขึ้นอยู่กับระบบปฏิบัติการอาจมีหรือไม่มีความเกี่ยวข้องกับขนาดที่ระบบไฟล์หรือรหัสดิสก์ใช้ (โดยปกติจะไม่ใช่ - ดูความแตกต่างระหว่างขนาดบล็อกและขนาดคลัสเตอร์ ) บน Linux ค่าเป็น 512 โดยไม่คำนึงถึงไดรเวอร์ที่ทำงานอยู่ คุณค่าของสิ่งที่%Bไม่สำคัญมันเป็นเพียงสิ่งแปลกประหลาดที่มีอยู่จริง


4

หลังจากขุดลงในซอร์สโค้ดและมาตรฐาน 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 ไบต์ตามที่อธิบายไว้ในคำถามนี้


1

statคำสั่งใช้บล็อคทางกายภาพของฮาร์ดดิสก์ โดยพื้นฐานแล้วฮาร์ดดิสก์ทั้งหมดตั้งแต่เริ่มก่อตั้งในปี 1956 ได้ใช้บล็อกขนาด 512 ไบต์ อย่างไรก็ตามสิ่งนี้เพิ่งเริ่มเปลี่ยนไปเมื่อเร็ว ๆ นี้ของรูปแบบขั้นสูง

ฉันสงสัยว่าls'1024byte-blockize นั้นมีเหตุผลในอดีต บางทีมันเคยเป็นเรื่องปกติที่ระบบไฟล์จะมีขนาดบล็อก 1024 หรือใช้เพื่อกำหนดขนาดเป็นกิโลไบต์ แต่ (อย่างน้อยด้วยGNU coreutils) คุณสามารถระบุขนาดบล็อกด้วย--block-size=ตัวเลือก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.