जब आप किसी मौजूदा फ़ोल्डर को सामग्री के साथ माउंट करते हैं तो क्या होता है?


80

अभी /tmpइसमें कुछ अस्थायी फाइलें हैं। जब मैं अपनी हार्ड ड्राइव ( /dev/sdc1) को शीर्ष पर रखता /tmpहूं, तो मैं हार्ड ड्राइव पर फाइलें देख सकता हूं। /tmpजब मेरी हार्ड ड्राइव आरोहित होती है तो वास्तविक सामग्री का क्या होता है? क्या /tmpहार्ड ड्राइव आरोहित होने की वास्तविक सामग्री पर आर / डब्ल्यू संचालन करना संभव है?

python@lanix / $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       286G   43G  229G  16% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            3.8G  4.0K  3.8G   1% /dev
tmpfs           766M  1.4M  765M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            3.8G   38M  3.8G   1% /run/shm
none            100M   24K  100M   1% /run/user
/dev/sdb1       7.5G  2.7G  4.9G  35% /mnt
/dev/sdc1       932G  242G  691G  26% /tmp

जवाबों:


117

जब मेरी हार्ड ड्राइव आरोहित होती है तो वास्तविक सामग्री / tmp का क्या होता है?

बहुत ज्यादा कुछ नहीं। वे केवल दृश्य से छिपे हुए हैं, सामान्य फ़ाइल सिस्टम ट्रैवर्सल के माध्यम से उपलब्ध नहीं हैं।

क्या हार्ड ड्राइव माउंट होने पर / tmp की वास्तविक सामग्री पर r / w संचालन करना संभव है?

हाँ। जिन प्रक्रियाओं में आपके "मूल" के अंदर खुले फ़ाइल हैंडल /tmpथे, वे उनका उपयोग करने में सक्षम रहेंगे। आप कहीं और "बाइंडिंग" भी बांध सकते /हैं।

# mount -o bind / /somewhere/else
# ls /somewhere/else/tmp  

यहाँ एक छोटा सा प्रयोग है जिसे आप एक बेहतर पाने के लिए चला सकते हैं (मुझे उम्मीद है) जो हो रहा है उसके लिए महसूस करें।

नोट: यह पूरी तरह से सही होने या वास्तव में क्या हो रहा है इसका विस्तृत विवरण देने का प्रयास नहीं है। हालांकि आपको बड़ी तस्वीर देने के लिए पर्याप्त सटीक होना चाहिए।

मैंने meअपनी मशीन पर एक उपयोगकर्ता और उसके घर में एक यादृच्छिक निर्देशिका बनाई , जिसमें एक फ़ाइल है:

me@home $ pwd
/home/me/tmp
me@home $ echo hello > some_file
me@home $ ls  
some_file
me@home $ cat some_file 
hello

इस बिंदु पर, कुछ भी असामान्य नहीं है - यह सिर्फ एक सादे फ़ाइल के साथ एक सादे निर्देशिका है। मैं उस सत्र को वैसे ही खुला छोड़ देता हूं जैसा cwdकि उस परीक्षण निर्देशिका के अंदर है।

रूट के रूप में, मैं एक छोटा फाइल सिस्टम बनाता हूं और इसे माउंट करता हूं /home/me/tmp

root@home # dd if=/dev/zero of=./fs bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.00467318 s, 2.2 GB/s

root@home # mkfs -t ext2 ./fs 
mke2fs 1.42.12 (29-Aug-2014)
[... snip ...]
Writing superblocks and filesystem accounting information: done

root@home # mount ./fs /home/me/tmp

मैं तब एक नया टर्मिनल खोलता हूं me, और चारों ओर देखता हूं :

me@home #2 $ cd tmp
me@home #2 $ ls
lost+found
me@home #2 $ cat some_file
cat: some_file: No such file or directory
me@home #2 $ echo bye bye > some_file
-su: some_file: Permission denied

इसलिए, हमारे द्वारा बनाई गई फ़ाइल स्पष्ट रूप से वहां नहीं है। lost+foundनिर्देशिका एक ext फाइल सिस्टम के रूट का संकेत है। और मैंने लिखने की अनुमति खो दी है, इसलिए यह स्पष्ट रूप से मूल निर्देशिका नहीं है।

पहले meसत्र में वापस , आइए देखें कि यह दुनिया कैसे देखती है:

me@home $ echo something else > other_file

लिखने में कोई दिक्कत नहीं।

me@home $ cat some_file other_file 
hello
something else

मूल फ़ाइल अभी भी है, नई फ़ाइल बिना किसी समस्या के बनाई गई है।

है ना? क्या चल रहा है?

पहले सत्र ने निर्देशिका में प्रवेश किया इससे पहले कि उस पर एक और फाइल सिस्टम बढ़ते रूट द्वारा ओवरले किया गया था। वह माउंट एक्शन मूल फाइल सिस्टम को बिल्कुल प्रभावित नहीं करता है। शेल प्रक्रिया में मूल फ़ाइल सिस्टम में निर्देशिका के लिए पूरी तरह से मान्य हैंडल है, और इसके साथ बातचीत जारी रख सकते हैं। यह एक तरह से चारों ओर चल रहा है नीचे कालीन माउंट बिंदु।

माउंट नीचे रखे जाने के बाद दूसरे सत्र ने निर्देशिका में प्रवेश किया। तो यह नया, खाली फाइल सिस्टम देखता है। और sysadmin ने अनुमतियों को काट दिया, इसलिए यह अनुरोधित स्थान का उपयोग नहीं कर सकता ... ठीक करता है।

root@home # chown me:users /home/me/tmp
me@home #2 $ echo bye bye > some_file
me@home #2 $ ls 
lost+found  some_file
me@home #2 $ cat some_file 
bye bye

क्या सत्र 1 गलीचा के नीचे से बच सकता है? (यह मस्टी हो रहा है।)

ज़रूर! यदि सेशन 1 फाइलसिस्टम ट्री को माउंट से वापस ऊपर ले जाता है, तो यह उस हैंडल को अंदर तक खो देगा और बाकी सभी की तरह माउंट का पालन करेगा।

me@home $ cd
me@home $ pwd
/home/me
me@home $ cd tmp
me@home $ cat some_file other_file
bye bye
cat: other_file: No such file or directory

सत्र # 2 के समान दृश्य, हम सामान्य पर वापस आ रहे हैं।

लेकिन आपको कैसे पता चलेगा कि फाइलें गायब नहीं हुईं? अब किसी की तलाश नहीं!

यह उन क्षणों में से एक है जहां बाइंड माउंट्स काम में आते हैं। वे आपको कहीं और पहले से माउंट किए गए फ़ाइल सिस्टम को माउंट करने देते हैं।

me@home $ mkdir ~/bind
root@home # mount -o bind /home/me /home/me/bind

(हां, आप "अंदर ही अंदर" एक फाइलसिस्टम को बांध सकते हैं। कूल ट्रिक, एह?

me@home $ ls bind/tmp
other_file  some_file
me@home $ cat bind/tmp/*
something else
hello

तो वे वास्तव में वहाँ हैं, कार्रवाई के लिए तैयार हैं। यह बस इतना है कि वे अपने मूल स्थान पर दिखाई नहीं देते / पहुंच नहीं पाते हैं, माउंट उन्हें सामान्य निर्देशिका ट्रैवर्सल्स से छिपाता है।


मैं आपको इसके साथ खेलने के लिए प्रोत्साहित करता हूं, यह वास्तव में जटिल नहीं है जब आप "चाल" को समझ गए हैं जो खेला जा रहा है। और एक बार जब आप इसे पा लेते हैं, तो और भी कालीन खींचने के लिए संघ फाइलसिस्टम में देखें :-)

एक नोट हालांकि: बूट प्रक्रिया समाप्त होने के बाद बढ़ते /tmpया /var(या किसी भी कोर ओएस निर्देशिका में) वास्तव में एक अच्छा विचार नहीं है। बहुत सारे एप्लिकेशन उन निर्देशिकाओं में राज्य छोड़ देते हैं, और यदि आप उनके चारों ओर माउंट गेम खेलते हैं तो वे गंभीर रूप से भ्रमित हो सकते हैं।


4
यह एक महान जवाब है - आप जो मैंने आपसे पूछा उससे ऊपर और परे चला गया है। बाइंड-माउंट का विचार बहुत अच्छा है! विस्तृत उत्तर के लिए धन्यवाद। चीयर्स।
उपयोगकर्ता

11
यह डिस्क स्थान को रहस्यमय तरीके से खोने का एक बहुत ही सामान्य तरीका है। यदि कोई स्टार्टअप स्क्रिप्ट में किसी भी कारण से माउंट विफल हो जाता है, तो डेटा को रूट फाइल सिस्टम पर निर्देशिका में लिखा जा सकता है। यदि फिर से शुरू करने का प्रयास किया जाता है, तो माउंट सफल हो सकता है और शायद कोई भी नोटिस नहीं करेगा (उदाहरण के लिए, यदि फ़ाइल सिस्टम में tmp फाइलें या लॉग हैं), इसके अलावा यह अंतरिक्ष खाएगा, शायद बहुत कुछ।
दान शेपर्ड

2
@DanSheppard यह एक कारण है कि मैं अपने माउंट पॉइंट्स को chmod 000 सेट करना पसंद करता हूं। इसके अलावा अगर महत्वपूर्ण काउंट विफल रहता है तो सिस्टम बूट को क्यों विफल करता है।
ज़ैन लिंक्स

आप भी माउंट -bind सकता है /home/meपर /home/me"बाँध" फ़ोल्डर के बजाय? यानी कालीन के ऊपर एक और कालीन लगा दिया। या आपको fsपहले अनमाउंट करना होगा ?
जिग्गंजेर

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