EXT3: यदि ब्लॉक का आकार 4K है, तो ls -l फ़ाइल का आकार नीचे क्यों दिखाता है?


16

यदि आप एक फ़ाइल में ls -l चलाते हैं जिसमें एक अक्षर है, तो यह आकार में 2B के रूप में सूचीबद्ध होगा। यदि आपकी फ़ाइल प्रणाली 4k ब्लॉक में है, तो मुझे लगा कि यह ब्लॉक आकार तक की फ़ाइलों को गोल कर सकता है? क्या यह इसलिए है क्योंकि ls -l वास्तव में इनोड से बाइट काउंट को पढ़ता है? लिनक्स 2.6 कर्नेल जीएनयू बर्तनों में वास्तविक बाइट गिनती उत्तर बनाम ब्लॉक करने के लिए आप किन परिस्थितियों में गोल हो जाते हैं?


2
ध्यान रखें, कि ext4 "छोटी फ़ाइल पैकिंग" की एक अवधारणा का परिचय देता है, जिसमें एक छोटी फ़ाइल उसी डिस्क ब्लॉक को अपने इनकोड
oakad

जवाबों:


20

मुझे लगता है कि आपको उस फ़ाइल में एक अक्षर मिला है echo a > fileया vim file, जिसका अर्थ है, आपके पास वह पत्र और उसमें एक अतिरिक्त नई पंक्ति होगी (दो वर्ण, इस प्रकार दो बाइट्स)। ls -lबाइट्स में फ़ाइल का आकार दिखाता है, ब्लॉक नहीं (अधिक विशिष्ट होने के लिए: फ़ाइल की लंबाई ):

$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$

(ध्यान दें कि चरित्र के cat -Aरूप में नई रूपरेखा प्रदर्शित करता है $)

इसके विपरीत ls -l, duडिस्क पर व्याप्त वास्तविक आकार दिखाएगा:

$ du testfile
4

(वास्तव में, du1kiB इकाइयों में आकार दिखाता है, इसलिए यहां आकार 4 × 1024 बाइट्स = 4096 बाइट्स = 4 kiB है, जो इस फ़ाइल सिस्टम पर ब्लॉक आकार है)

यह lsदिखाने के लिए, आपको -sइसके बजाय / के अलावा विकल्प का उपयोग करना होगा -l:

$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile

पहला कॉलम आवंटित आकार है, फिर से 1kiB की इकाइयों में। अंतिम को निर्दिष्ट करके बदला जा सकता है --block-size, जैसे

$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile

3
और, इसके अलावा, दो फ़ीचर होना अच्छा है। फाइलसिस्टम "पूंछ संघनन" (सपा?) कर सकते हैं (छोटी फ़ाइलों के बीच साझा किए गए एक ब्लॉक का उपयोग करें), "कॉपी पर लिखें" और "छेद छिद्रण" ... फ़ाइल का आकार बनाना <-> डिस्क स्थान संबंध एक जटिल।
रमानो

9

मुझे लगता है कि गहरा उत्तर निम्नलिखित है:

तार्किक फ़ाइल लंबाई और डिस्क स्थान पर कब्जा वास्तव में अलग चीजें हैं।

जैसा कि अन्य उत्तर दिखाते हैं, सिद्धांत रूप में दो बाइट्स के साथ बनाई गई एक फ़ाइल की लंबाई दो बाइट्स (शो द्वारा ls -l) और 4 KiB (शो द्वारा duया ls -ls) पर कब्जा है ।

देख:

1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test

ठीक है, testलंबाई 1 और आकार (डिस्क पर) 4 KiB है। परंतु:

1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4   test

(पहले कमांड 8191 जीरो बाइट्स को जोड़ते testहैं), अब परीक्षण की लंबाई 8192 है लेकिन डिस्क पर 4 कीबी (यह "छेद" है) पर कब्जा कर सकते हैं (1)।

कुछ फाइलसिस्टम छोटी फ़ाइलों को भी कॉम्पैक्ट कर सकते हैं ताकि वे ब्लॉक साझा करके कम जगह घेरें (उदाहरण के लिए टेल पैकिंग देखें ) और अन्य जैसे btrfs कॉपी पर लिखते हैं , इसलिए किसी फाइल के बीच का संबंध, उसकी तार्किक लंबाई और उस पर कितनी जगह होती है एक डिस्क एक जटिल एक है।

फुटनोट:

(1) यह वास्तव में एक छेद नहीं है , यह अंत में है ... लेकिन फिर भी, यह उदाहरण के अंत तक काम करता है।


5

ls -lसिर्फ एक लंबा प्रारूप है। ls -lsब्लॉक आकार प्रदर्शित करने के लिए उपयोग किया जाता है।

परिक्षण

echo "1" > 1.txt

bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

जैसा कि हम देख सकते हैं कि फ़ाइल का आकार 2 बी के रूप में सूचीबद्ध है। हालांकि, यदि आपको ब्लॉक आकार की जांच करने की आवश्यकता है, तो आपको नीचे दिए गए कमांड को चलाने की आवश्यकता है।

bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt

उपरोक्त 4 का उपयोग ब्लॉक आकार को प्रदर्शित करता है। हम statकमांड का उपयोग करके भी इसे सत्यापित कर सकते हैं ।

bash-3.2$ stat 1.txt
  File: `1.txt'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d      Inode: 48267720    Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  505/  ramesh)   Gid: (  508/  ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500

अब सवाल यह उठता है कि ls -lsब्लॉक आकार को 4 के रूप में क्यों सूचीबद्ध statकरता है जबकि ब्लॉक आकार को 8 के रूप में प्रदर्शित करता है। इस व्यवहार का कारण यहां उत्तर में स्पष्ट रूप से बताया गया है

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

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