सबसे पहले /sys
एक छद्म फाइल सिस्टम है । यदि आप देखते हैं तो आपको /proc/filesystems
पंजीकृत फाइल सिस्टम की एक सूची मिलेगी, जहां काफी कुछ nodev
सामने हैं। यह इंगित करता है कि वे छद्म फाइलसिस्टम हैं । इसका मतलब है कि वे एक रैम-आधारित फाइल सिस्टम के रूप में चल रहे कर्नेल पर मौजूद हैं। आगे उन्हें ब्लॉक डिवाइस की आवश्यकता नहीं है।
$ cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
...
बूट पर कर्नेल इस सिस्टम को माउंट करता है और अनुकूल होने पर प्रविष्टियों को अपडेट करता है। उदाहरण के लिए, जब बूट या द्वारा नया हार्डवेयर पाया जाता है udev
।
में /etc/mtab
आप आमतौर पर खोजने के द्वारा माउंट:
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
विषय पर एक अच्छे पेपर के लिए पैट्रिक मोशेल के - द साइफ्स फाइलसिस्टम पढ़ें
।
/ एसआईएस फाइलों की प्रतिमा
यदि आप एक निर्देशिका के तहत जाते हैं /sys
और करते हैं तो ls -l
आप देखेंगे कि सभी फाइलों का आकार एक है। आमतौर पर 4096 बाइट्स। इसके द्वारा सूचित किया जाता है sysfs
।
:/sys/devices/pci0000:00/0000:00:19.0/net/eth2$ ls -l
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_assign_type
-r--r--r-- 1 root root 4096 Apr 24 20:09 address
-r--r--r-- 1 root root 4096 Apr 24 20:09 addr_len
...
इसके अलावा आप stat
एक फ़ाइल पर कर सकते हैं और एक अन्य विशिष्ट सुविधा को नोटिस कर सकते हैं ; यह 0 ब्लॉक पर है। जड़ (स्टेट / एसआईएस) का /stat/fs
भी इनोड है। आमतौर पर इनोड 2 है। आदि।
rsync बनाम cp
छद्म फ़ाइलों को सिंक्रनाइज़ करने की rsync विफलता के लिए सबसे आसान स्पष्टीकरण शायद उदाहरण के लिए है।
मान लें कि हमारे पास एक फाइल है जिसका नाम address
18 बाइट्स है। फ़ाइल की एक ls
या stat
4096 बाइट्स की रिपोर्ट करती है।
rsync
- फ़ाइल विवरणक, fd खोलता है।
- आकार जैसी जानकारी प्राप्त करने के लिए fstat (fd) का उपयोग करता है।
- साइज बाइट्स यानी 4096 को पढ़ने के लिए निर्धारित करें । यह @mattdm द्वारा लिंक किए गए कोड का 253 होगा ।
read_size == 4096
- पूछना; पढ़ें: 4096 बाइट्स
- एक छोटी स्ट्रिंग को 18 बाइट्स पढ़ा जाता है।
nread == 18
read_size = read_size - nread (4096 - 18 = 4078)
- पूछना; पढ़ें: 4078 बाइट्स
- 0 बाइट्स पढ़ें (जैसा कि पहले पढ़ा कि फाइल में सभी बाइट्स का सेवन किया गया है)।
nread == 0
, लाइन 255
4096
बाइट्स पढ़ने में असमर्थ । जीरो आउट बफर।
- त्रुटि सेट करें
ENODATA
।
- वापसी।
- त्रुटि की रिपोर्ट करें।
- पुन: प्रयास करें। (लूप के ऊपर)।
- असफल।
- त्रुटि की रिपोर्ट करें।
- ठीक।
इस प्रक्रिया के दौरान यह वास्तव में पूरी फाइल को पढ़ता है। लेकिन कोई भी आकार उपलब्ध नहीं होने के कारण यह परिणाम को मान्य नहीं कर सकता है - इस प्रकार विफलता केवल विकल्प है।
cp
- फ़ाइल विवरणक, fd खोलता है।
- St_size (lstat और stat का उपयोग करता है) जैसी जानकारी प्राप्त करने के लिए fstat (fd) का उपयोग करता है।
जाँच करें कि क्या फ़ाइल विरल होने की संभावना है। वह है फाइल में छेद आदि।
copy.c:1010
/* Use a heuristic to determine whether SRC_NAME contains any sparse
* blocks. If the file has fewer blocks than would normally be
* needed for a file of its size, then at least one of the blocks in
* the file is a hole. */
sparse_src = is_probably_sparse (&src_open_sb);
के रूप में stat
शून्य ब्लॉक करने के लिए रिपोर्ट फ़ाइल यह विरल के रूप में वर्गीकृत किया जाता है।
हद-कॉपी करके फ़ाइल पढ़ने की कोशिश करता है ( सामान्य
विरल फ़ाइलों को कॉपी करने का एक अधिक कुशल तरीका ), और विफल रहता है।
- विरल-कॉपी करके कॉपी करें।
- MAXINT के अधिकतम रीड आकार के साथ प्रारंभ होता है।
आमतौर 18446744073709551615
पर एक 32 बिट सिस्टम पर
बाइट्स।
- पूछना; 4096 बाइट्स पढ़ें। (स्टेटम आकार जानकारी से स्मृति में आवंटित आकार।)
- एक छोटी स्ट्रिंग को 18 बाइट्स पढ़ा जाता है।
- जांच लें कि क्या छेद की जरूरत है, नहीं।
- लक्ष्य पर बफर लिखें।
- अधिकतम रीड साइज से 18 घटाएं।
- पूछना; 4096 बाइट्स पढ़ें।
- 0 बाइट्स के रूप में सभी पहले पढ़ने में भस्म हो गया।
- सफलता लौटाओ।
- सब ठीक है। फ़ाइल के लिए झंडे अपडेट करें।
- ठीक।
/sys/
?