फ़ाइल ब्लॉक का आकार - स्टेट और एलएस के बीच अंतर


9

मैंने देखा है कि जब मैं एक:

ls -ls file

यह ब्लॉक की संख्या प्रदान करता है, 8 ब्लॉक कहते हैं।

जब मैं करता हूं:

stat file

मैंने देखा कि ब्लॉक की संख्या 16 है, जो कि ls द्वारा दी गई संख्या से दोगुनी है।

मेरे फ़ाइल सिस्टम पर ब्लॉक का आकार 4096 है। मैंने सीखा है कि ls द्वारा उपयोग किए जाने वाले ब्लॉक के लिए मनमानी इकाई 1024 है। क्या यह कहना सही है कि स्टेट्स रिपोर्टिंग करते समय स्टेट 512 बाइट्स की मनमानी इकाई का उपयोग करता है?

यदि हां, तो क्या असंगति का एक कारण है?

मैं एक ext4 फाइल सिस्टम पर Ubuntu 11.10 चला रहा हूं।

जवाबों:


9

कई डिस्क में सेक्टर का आकार 512 बाइट्स होता है, जिसका अर्थ है कि डिस्क पर कोई भी पढ़ा या लिखा एक समय में पूरे 512-बाइट सेक्टर को स्थानांतरित करता है। फाइलसिस्टम को डिजाइन करना काफी स्वाभाविक है, जहां एक सेक्टर फाइलों के बीच विभाजित नहीं होता है (जो डिजाइन को जटिल करेगा और प्रदर्शन को चोट पहुंचाएगा); इसलिए filesystems फ़ाइलों के लिए 512-बाइट विखंडू का उपयोग करते हैं। इसलिए पारंपरिक उपयोगिताओं जैसे कि lsऔर du512-बाइट विखंडू की इकाइयों में आकार इंगित करते हैं।

मनुष्यों के लिए, 512-बाइट इकाइयां बहुत सार्थक नहीं हैं। 1kB परिमाण का एक ही क्रम है और बहुत अधिक सार्थक है। एक फाइलसिस्टम ब्लॉक (सबसे छोटी इकाई जिसे एक फाइल में विभाजित किया गया है) वास्तव में अक्सर कई क्षेत्रों से युक्त होता है: 1kB, 2kB और 4kB आम फाइलसिस्टम ब्लॉक आकार होते हैं; इसलिए 512-बाइट इकाई फ़ाइल सिस्टम डिज़ाइन द्वारा दृढ़ता से उचित नहीं है, और एक डिस्क चालक के बाहर 512-बाइट इकाई का उपयोग करने के लिए परंपरा के अलावा कोई अन्य अच्छा कारण नहीं है।

तो आपके पास एक परंपरा है जो इसके लिए बहुत कुछ नहीं है, और एक अधिक पठनीय सम्मेलन जो चल रहा है। ऑक्टल और हेक्साडेसिमल की तरह एक सा: वहाँ कोई नहीं है जो सही है और एक गलत है, वे एक ही नंबर लिखने के विभिन्न तरीके हैं।

कई उपकरणों में प्रदर्शन इकाइयों का चयन करने का विकल्प होता है: ls --block-size=512GNU के लिए ls, POSIXLY_CORRECT=1GNU dfऔर GNU के duलिए वातावरण में सेटिंग 512-बाइट इकाइयाँ प्राप्त करने के लिए (या -k1kB इकाइयों को बल देने के लिए)। क्या statजीएनयू में आदेश "ब्लॉक आकार" (के रूप में उजागर coreutils %Bमूल्य) एक आंतरिक इंटरफ़ेस का एक ओएस पर निर्भर मूल्य है, OS के आधार पर, यह फ़ाइल सिस्टम या डिस्क कोड द्वारा उपयोग किए जाने वाले आकार से संबंधित हो सकता है या नहीं भी हो सकता है (यह आमतौर पर नहीं है - ब्लॉक आकार और क्लस्टर आकार के बीच अंतर देखें )। लिनक्स पर, मान 512 है, चाहे कोई भी अंतर्निहित चालक कर रहा हो। मूल्य %Bकभी नहीं, यह सिर्फ एक विचित्रता है कि यह बिल्कुल मौजूद है।


4

स्रोत कोड और POSIX मानक में खुदाई करने के बाद, मैं कहूंगा कि @ antje-m और @Gilles द्वारा उत्तर अधिकतर सही हैं।

सारांश के रूप में POSIX.1-2008 की टिप्पणी को उद्धृत करना लायक है :

512-बाइट इकाइयों का उपयोग ऐतिहासिक अभ्यास है और इस POSIX.1-2008 की मात्रा में एलएस और अन्य उपयोगिताओं के साथ संगतता बनाए रखता है। यह अनिवार्य नहीं है कि फ़ाइल सिस्टम 512-बाइट ब्लॉक पर आधारित हो। -K विकल्प को एक समझौता उपाय के रूप में जोड़ा गया था। मानक डेवलपर्स द्वारा यह सहमति व्यक्त की गई थी कि 512 बाइट्स सिस्टम V पर पूर्ण ऐतिहासिक संगति (बनाम BSD सिस्टम पर मिश्रित 512/1024-बाइट उपयोग) के कारण सर्वश्रेष्ठ डिफ़ॉल्ट इकाई थी, और 1024- पर स्विच करने के लिए एक -k विकल्प बाइट यूनिट एक अच्छा समझौता था। जो उपयोगकर्ता अधिक तार्किक 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

POSIX.1-2008 के भीतर स्टेट स्ट्रक्चर के सदस्य st_blocks के लिए यूनिट परिभाषित नहीं है।

statआदेश बस द्वारा दी गई जानकारी को प्रदर्शित करता है statप्रणाली अधिकार, और कुछ अपवाद के साथ 512 ब्लॉक आकार का उपयोग करते हुए (वे कर रहे हैं गैर लिनक्स, जैसे HP-UX, IBM AIX आदि को देखने के मैक्रो में परिभाषित gnulib/lib/stat-size.h)।

तो 512 नंबर एक ऐतिहासिक विकल्प और लिनक्स सम्मेलन है।

GNU coreutils(इसलिए lsआदेश) लिनक्स कर्नेल (इसलिए का हिस्सा नहीं है statकॉल), वे अलग प्रणाली पहलू लक्षित कर रहे हैं, GNU coreutilsमानव के लिए और अधिक (पढ़ने में आसान) है, और हार्डवेयर सार के लिए लिनक्स कर्नेल (इसलिए हार्डवेयर के करीब)।

संपादित करें: 4096 ब्लॉक आकार "IO ब्लॉक" आकार है, वास्तविक भौतिक ब्लॉक का आकार अभी भी 512 बाइट है जैसा कि इस प्रश्न में बताया गया है


1

statआदेशों हार्ड डिस्क के भौतिक ब्लॉकसाइज उपयोग करता है। मूल रूप से 1956 में अपनी स्थापना के बाद से सभी हार्ड-डिस्क ने 512 बाइट्स ब्लॉक का उपयोग किया है। हालाँकि, यह हाल ही में उन्नत प्रारूप के आगामी के साथ बदलना शुरू हो गया है।

मुझे संदेह है कि ls'1024byte-blockize का एक ऐतिहासिक कारण भी है। शायद यह एक समय के लिए फाइलसिस्टम 1024 के लिए एक सामान्य था या इसका उपयोग किलोबाइट में आपको आकार देने के लिए किया जाता था। लेकिन (कम से कम GNU coreutils) आप --block-size=विकल्प के साथ ब्लॉक आकार निर्दिष्ट कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.