व्यस्त डिवाइस को कैसे अनमाउंट करें


245

मुझे कुछ सांबा ड्राइव मिले हैं, जिन्हें रोजाना कई उपयोगकर्ताओं द्वारा एक्सेस किया जा रहा है। मेरे पास पहले से ही साझा ड्राइव (एक SQL तालिका से) को पहचानने के लिए कोड है और उन्हें एक विशेष निर्देशिका में माउंट करें जहां सभी उपयोगकर्ता उन्हें एक्सेस कर सकते हैं।

मैं जानना चाहता हूं, अगर मैं अपनी एसक्यूएल टेबल से एक ड्राइव हटाता हूं (प्रभावी रूप से इसे ऑफ़लाइन ले रहा हूं) कैसे, या यहां तक ​​कि, एक व्यस्त डिवाइस को अनमाउंट करने का एक तरीका है? अब तक मैंने पाया है कि किसी भी रूप मेंumount काम नहीं करता है।

डेटा को नष्ट करने की संभावना को अनदेखा करना - क्या यह संभव है कि एक उपकरण को अनमाउंट किया जाए जो वर्तमान में पढ़ा जा रहा है?



2
नमस्कार, शायद आप cdआरोहित डायर पर चढ़े हैं, फिर आप रूट हो गए या फिर लॉगिन हो गए, फिर दूसरा शेल फंसा हुआ है। exitसभी गोले पर करें ।
स्मिर्लिंक

जवाबों:


457

हाँ!! एक व्यस्त डिवाइस को तुरंत अलग करने का एक तरीका है (भले ही यह व्यस्त हो और जबरदस्ती नहीं किया जा सकता है)। आप बाद में सफाई कर सकते हैं:

umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS(NETWORK-FILE-SYSTEM)

ध्यान दें:

  1. ये आदेश एक चल रही प्रक्रिया को बाधित कर सकते हैं, डेटा हानि या भ्रष्ट खुली फ़ाइलों का कारण बन सकते हैं। लक्ष्य DEVICE / NFS फ़ाइलों तक पहुँचने वाले प्रोग्राम त्रुटियों को फेंक सकते हैं या बल के बाद ठीक से काम नहीं कर सकते हैं।
  2. जब माउंट किए गए फ़ोल्डर / ड्राइव / डिवाइस के अंदर नहीं इन कमांड को निष्पादित करने का प्रयास करें।

22
नोट: -lयहां एक लोअरकेस है L("आलसी अनमाउंटिंग" के लिए)। ( इस संबंधित जवाब देखें ।)
ー ジ '

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

वे काम नहीं करते। वे दोनों हमेशा के लिए लटके रहते हैं। (डेबियन 8, cifs-utils 2: 6.4-1)
हब्रो सेप

1
-l/ --lazyखुली फ़ाइलों को भ्रष्ट नहीं करेगा, लेकिन लिनक्स पर ऐसा लगता है कि आप यह नहीं जान सकते कि डिवाइस वास्तव में अनमाउंट है और हटाया जा सकता है
टॉम हेल

1
किंडा डरावना। मैं आलसी-बेशुमार था, फिर रिमाउंट किया गया, जबकि कुछ अन्य प्रक्रियाएं अभी भी इसे एक्सेस कर रही थीं। इसलिए मुझे लगता है कि मैंने इसे उसी स्थान पर अंत में दो बार घुड़सवार किया? यकीन नहीं होता कि क्या किया।
सूडो

120

यदि संभव हो तो, चलो व्यस्त प्रक्रिया का पता लगाएं / पहचानें, प्रक्रिया को मारें और फिर नुकसान को कम करने के लिए सांबा शेयर को अनमाउंट करें।

  • lsof | grep '<mountpoint of /dev/sda1>' (या जो भी माउंटेड डिवाइस है)

  • pkill target_process(व्यस्त proc को मारता नाम से |। kill PID| killall target_process)

  • umount /dev/sda1 (या जो भी माउंटेड डिवाइस है)


6
वह कुछ भी वापस नहीं करता है। मैं इसका अनुमान लगा रहा हूं क्योंकि इसका नेटवर्क ड्राइव है और मैं ड्राइव को एक्सेस करने वाले अन्य कंप्यूटरों की प्रक्रियाओं को नहीं देख सकता। "फ्यूज़र" कमांड के साथ एक ही सौदा।
मैक्स

ओह नरक ... आपको सांबा कमांड की आवश्यकता है ... / usr / bin / smbclient सेवा <पासवर्ड>: देखें कि क्या यह आपके द्वारा प्रारंभ किया गया है ... tldp.org/HOWTO/SMB-HOWTO-8.html
फ्रैंक ट्यूडर

2
Smb कमांड वास्तव में हटाए गए हैं और "umount.cifs" द्वारा प्रतिस्थापित किए गए हैं .... जो भी काम नहीं करता है। ऐसा प्रतीत होता है कि मैं व्यस्त रहते हुए भी ऑमाउंट नहीं कर पा रहा हूं।
मैक्स

यदि आप असूसरैट-मर्लिन का उपयोग कर रहे हैं, तो आपको स्थापित करने की आवश्यकता है lsof:# opkg install lsof
टन अनुपात

1
आपको कुछ परिणाम प्राप्त करने के लिए sudo lsof की आवश्यकता है
anheigins

78

सुनिश्चित करें कि आप अभी भी माउंटेड डिवाइस में नहीं हैं जब आप umount करने की कोशिश कर रहे हैं।


4
ठीक है, बस आपके टर्मिनल में चालू फ़ोल्डर (लक्ष्य डिवाइस पर स्थित) (उदाहरण के लिए cd कमांड के माध्यम से) खुलने की प्रक्रिया को रोकने के लिए पर्याप्त है :)
jave.web

2
हां, मेरे पास डिवाइस पर एक निर्देशिका में एक शेल चल रहा था। टर्मिनल विंडो और
वॉयला

इसके अलावा, सुनिश्चित करें कि आप जिस पर प्रयास कर रहे हैं उसके अंदर कोई अन्य माउंट बिंदु नहीं हैं umount
विजयी

@victe धन्यवाद; मैं pfexec माउंट -F vboxfs कारपेटकोम्पार्टिडा ~ / दस्तावेज़ों का उपयोग कर एक फ़ोल्डर का उच्चारण कर रहा था, Solaris 11 पर; लेकिन दस्तावेजों में सबफ़ोल्डर थे और यह मुद्दा था।
दानी आया

44

निम्नलिखित का प्रयास करें, लेकिन इसे चलाने से पहले ध्यान दें कि -kध्वज डिवाइस को व्यस्त रखते हुए किसी भी चलने वाली प्रक्रिया को मार देगा।

-iझंडा बनाता है fuserको मारने से पहले पूछना।

fuser -kim /address  # kill any processes accessing file
unmount /address

5
lsof | grep '/dev/<my-device>कुछ भी नहीं लौटा, लेकिन यह बहुत अच्छा काम करता है! fuser -m /dev/<my-device>यदि आप इसे मारने से पहले प्रक्रिया का पता लगाना चाहते हैं तो सुझाव देना चाहते हैं।
modulitos

3
फ़ुज़र कमांड चलाने से मुझे तुरंत VPS से हटा दिया गया।
जियोर्जियो g३०

21

बचें umount -l

लेखन के समय, शीर्ष मत वाले उत्तर का उपयोग करने की सलाह देते हैं umount -l

umount -lखतरनाक है या सबसे अच्छा असुरक्षित है । संक्षेप में:

  • यह वास्तव में डिवाइस को अनमाउंट नहीं करता है, यह सिर्फ नेमस्पेस से फाइल सिस्टम को हटा देता है। फ़ाइलें खोलने के लिए लेखन जारी रह सकता है।
  • यह btrfs फाइल सिस्टम भ्रष्टाचार का कारण बन सकता है

चारों ओर काम / विकल्प

का उपयोगी व्यवहार निरपेक्ष पाथनेम्स umount -lद्वारा एक्सेस से फाइल सिस्टम को छिपा रहा है , जिससे आगे के मॉउटपॉइंट का उपयोग कम से कम हो।

यह वही व्यवहार एक खाली निर्देशिका बढ़ते द्वारा हासिल किया जा सकता है जिसमें निर्देशिका की अनुमति के बिना अनुमति नहीं है 000

फिर माउंटपॉइंट के नीचे स्थित फ़ाइल नाम पर कोई भी नई पहुंच नए ओवरलेड डायरेक्टरी को शून्य अनुमतियों से टकराएगी - नए अवरोधकों को अनमाउंट करने से रोका जाता है।

पहले प्रयास करें remount,ro

अनलॉक किए जाने के लिए सबसे बड़ी उपलब्धि केवल पढ़ने वाला रिमाउंट है। जब आप remount,roबैज हासिल करते हैं , तो आप जानते हैं कि:

  1. सभी लंबित डेटा को डिस्क पर लिखा गया है
  2. भविष्य के सभी लिखित प्रयास विफल हो जाएंगे
  3. डेटा एक सुसंगत स्थिति में है, क्या आपको डिवाइस को शारीरिक रूप से डिस्कनेक्ट करने की आवश्यकता है।

mount -o remount,ro /dev/device लिखने के लिए फ़ाइलें खुली हैं , तो विफल होने की गारंटी है , इसलिए कोशिश करें कि सीधे ऊपर जाएं। आप भाग्यशाली महसूस कर रहे होंगे, पंक!

यदि आप अशुभ हैं, तो लेखन के लिए खुली फाइलों वाली प्रक्रियाओं पर ध्यान दें :

lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'

आपको तब केवल पढ़ने योग्य डिवाइस को रिमूव करने और एक सुसंगत स्थिति सुनिश्चित करने में सक्षम होना चाहिए।

यदि आप इस बिंदु पर केवल रीड-रिमाउंट नहीं कर सकते हैं, तो यहां सूचीबद्ध कुछ अन्य संभावित कारणों की जांच करें

पढ़ें-केवल पुन: माउंट उपलब्धि अनलॉक mount

बधाई हो, माउंटपॉइंट पर आपका डेटा अब सुसंगत और भविष्य के लेखन से सुरक्षित है।

क्यों fuserहीन हैlsof

fuserपहले इस्तेमाल क्यों नहीं हुआ ? ठीक है, आप कर सकते हैं, लेकिन fuserएक निर्देशिका पर संचालित होता है , एक उपकरण नहीं , इसलिए यदि आप फ़ाइल नाम स्थान से माउंटपॉइंट निकालना चाहते हैं और अभी भी उपयोग करते हैं fuser, तो आपको निम्न की आवश्यकता होगी:

  1. mount -o bind /media/hdd /mntअन्य स्थान के साथ माउंटपॉइंट को अस्थायी रूप से डुप्लिकेट करें
  2. मूल माउंट बिंदु छिपाएं और नाम स्थान को अवरुद्ध करें:

ऐसे:

null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"

# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked.  https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"

# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"

# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"

फिर आपके पास होगा:

  1. मूल नाम स्थान छिपा हुआ है (कोई और फ़ाइल नहीं खोली जा सकती है, समस्या बदतर नहीं हो सकती है)
  2. डुप्लिकेट बाइंड माउंटेड डायरेक्टरी (एक डिवाइस के विपरीत) जिस पर चलना है fuser

यह अधिक जटिल है [1] , लेकिन आपको उपयोग करने की अनुमति देता है:

fuser -vmMkiw <mountpoint>

जो अंतःक्रियात्मक रूप से लिखने के लिए खुली फाइलों के साथ प्रक्रियाओं को मारने के लिए कहेगा। बेशक, आप माउंट पॉइंट को छिपाए बिना ऐसा कर सकते हैं, लेकिन ऊपर की मिमिक्रीumount -l , बिना किसी खतरे के।

-wप्रक्रियाओं लिखने के लिए स्विच प्रतिबंधित करता है, और -iकेवल पढ़ने के लिए रिमाउंट इंटरैक्टिव है, तो एक के बाद, यदि आप इसे जल्दी आप तो इस्तेमाल कर सकते हैं कर रहे हैं:

fuser -vmMk <mountpoint>

माउंटपॉइंट के तहत खुली फाइलों के साथ सभी शेष प्रक्रियाओं को मारने के लिए।

उम्मीद है कि इस बिंदु पर, आप डिवाइस को अनमाउंट कर सकते हैं। ( umountयदि आपने किसी मोड को बांध दिया है तो आपको दो बार माउंटपॉइंट पर चलने की आवश्यकता होगी000 शीर्ष पर निर्देशिका ।)

या उपयोग करें:

fuser -vmMki <mountpoint>

अंतःक्रियात्मक रूप से शेष पढ़ने के लिए केवल उन्मुक्त प्रक्रियाओं को मारना।

दमयन्ती, मुझे अभी भी मिलता है target is busy !

खुली फाइलें केवल अवरोधक नहीं हैं। यहाँ और यहाँ देखेंअन्य कारणों और उनके उपचार के लिए ।

यहां तक ​​कि अगर आपको कुछ लचरिंग ग्रेमलिन मिला है, जो आपको डिवाइस को पूरी तरह से अनमाउंट करने से रोक रहा है, तो आपको कम से कम एक सुसंगत स्थिति में अपना फाइल सिस्टम मिल गया है।

फिर आप lsof +f -- /dev/deviceफ़ाइल सिस्टम युक्त फ़ाइल पर खुली फ़ाइलों के साथ सभी प्रक्रियाओं को सूचीबद्ध करने के लिए उपयोग कर सकते हैं , और फिर उन्हें मार सकते हैं।


[१] यह उपयोग करने के लिए कम जटिल है mount --move, लेकिन इसके लिए mount --make-private /parent-mount-pointइसके निहितार्थ हैं । मूल रूप से, यदि माउंट पॉइंट /फाइल सिस्टम के तहत माउंट किया गया है , तो आप इससे बचना चाहेंगे।


1
यदि --lazyइतना खतरनाक है, तो umountमैन पेज में चेतावनी क्यों नहीं है ? यह सब कहते हैं, " आलसी अनमाउंट। अब फाइल पदानुक्रम से फाइलसिस्टम को अलग करें, और इस फाइलसिस्टम के सभी संदर्भों को जल्द से जल्द साफ करें क्योंकि यह अब व्यस्त नहीं है। "
बिट्रेनेंट

7

एक्सपोर्ट्स -v के साथ एक्सपोर्टेड एनएफएस फाइल सिस्टम की जांच करें। यदि पाया जाता है, तो Exportfs -d शेयर: / निर्देशिका के साथ हटा दें। ये fuser / lsof लिस्टिंग में दिखाई नहीं देते हैं, और umount को सफल होने से रोक सकते हैं।


1
इस सलाह के लिए धन्यवाद। मुझे लॉक हटाने के लिए Exportfs -ua का उपयोग करना पड़ा।
फुएपी

6

देखें umount2:

Linux 2.1.116 ने umount2 () सिस्टम कॉल जोड़ा, जो umount () की तरह है, लक्ष्य को अनमाउंट करता है, लेकिन ऑपरेशन के व्यवहार को नियंत्रित करने वाले अतिरिक्त झंडे को अनुमति देता है:

MNT_FORCE (लिनक्स 2.1.116 के बाद से) बल व्यस्त होने पर भी अनमाउंट करें। (केवल NFS mounts के लिए।) MNT_DETACH (लिनक्स 2.4.11 के बाद से) एक आलसी अनमाउंट करें: नए एक्सेस के लिए आरोह बिंदु को अनुपलब्ध बनाएं, और माउंट बिंदु के व्यस्त होने पर वास्तव में अनमाउंट करें। MNT_EXPIRE (लिनक्स 2.6.8 के बाद से) माउंट बिंदु की समय सीमा समाप्त हो गई है। यदि कोई माउंट पॉइंट वर्तमान में उपयोग में नहीं है, तो इस ध्वज के साथ umount2 () के लिए एक प्रारंभिक कॉल त्रुटि EAGAIN के साथ विफल हो जाती है, लेकिन माउंट बिंदु की समय सीमा समाप्त हो जाती है। माउंट पॉइंट तब तक एक्सपायर रहता है जब तक कि वह किसी भी प्रक्रिया द्वारा एक्सेस नहीं किया जाता है। एक दूसरा umount2 () कॉल MNT_EXPIRE निर्दिष्ट करता है जो एक समय सीमा समाप्त माउंट बिंदु को अनमाउंट करता है। यह ध्वज MNT_FORCE या MNT_DETACH के साथ निर्दिष्ट नहीं किया जा सकता है। प्रतिलाभ की मात्रा

सफलता मिलने पर शून्य वापस कर दिया जाता है। त्रुटि पर, -1 लौटा दिया जाता है, और इरनो को उचित रूप से सेट किया जाता है।


दुर्भाग्य से ये NFS माउंट नहीं हैं, लेकिन CIFS। मैं हालांकि MNT_DETACH की कोशिश करूंगा। हालाँकि, अगर umount -l ने काम नहीं किया, तो मैं सोच भी नहीं सकता कि यह बहुत अलग होगा। हालांकि धन्यवाद!
मैक्स

2

किसी ने उल्लेख किया है कि यदि आप टर्मिनल का उपयोग कर रहे हैं और आपकी वर्तमान निर्देशिका उस पथ के अंदर है जिसे आप अनमाउंट करना चाहते हैं, तो आपको त्रुटि मिलेगी।
एक पूरक के रूप में, इस मामले में, आपका lsof | grep path-to-be-unmountedउत्पादन से नीचे होना चाहिए:

bash ... path-to-be-unmounted

1

एक अन्य विकल्प जब कुछ भी काम करता है /etc/fstab, तो noautoझंडा जोड़ना और मशीन को रिबूट करना। डिवाइस को माउंट नहीं किया जाएगा, और जब आप जो कुछ भी कर रहे हों, तो ध्वज को हटा दें और फिर से रीबूट करें।


0

आला जवाब:

यदि आपके पास उस उपकरण पर एक zfs पूल है, तो कम से कम जब यह एक फ़ाइल-आधारित पूल होता है, lsofतो उपयोग नहीं दिखाएगा। लेकिन आप बस चला सकते हैं

sudo zpool export mypoo

और फिर अनमाउंट करें।

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