पैकेज अपग्रेड के बाद केवल पढ़ने के लिए / वापस करने में असमर्थ


13

मैं डेबियन स्ट्रेच का उपयोग कर रहा हूं। मेरा रूट विभाजन माउंट किया गया है read-only। केवल जब मैं पैकेजों को स्थापित या अपग्रेड करता हूं, तो /उसे read-write(उपयुक्त हुक का उपयोग करके) रिमूव किया जाता है, और फिर वापस रिमाउंट किया जाता है ro

कभी-कभी पैकेज अपग्रेड के बाद मैं /केवल-पढ़ने के लिए वापस जाने में असमर्थ होता हूं :

mount -o remount,ro /
mount: / is busy

पुराने डेबियन संस्करणों (व्हीजी) पर, मैं उन खुली फाइलों को सूचीबद्ध कर सकता हूं, जिनके साथ अनलिंक किया गया है lsof:

 lsof +L1

या, अधिक विशेष रूप से, फ़ाइलें जो /आरओ पर वापस जाने से रोकती हैं :

{ lsof +L1 ; lsof|sed -n '/SYSV/d; /DEL|(path /p;' ; } | grep -Ev '/(dev|home|tmp|var)'

हालांकि, डेबियन स्ट्रेच पर, lsof +L1किसी भी फाइल को सूचीबद्ध नहीं करता है।

मैं में कोई परिवर्तन नहीं दिख रहा है +|-Lमें man lsofहै कि समझा जाएगा कारण है कि यह काम करना बंद कर।

Lsof + L1 अब उन खुली हुई फ़ाइलों की सूची क्यों नहीं देता जिन्हें अनलिंक किया गया है?

मैं उन फ़ाइलों को कैसे सूचीबद्ध कर सकता / सकती हूं, जिन्हें केवल पढ़ने-लिखने के लिए रोका जा सकता है?

अपडेट करें

मैं सभी प्रक्रियाओं है कि रोका जा सकता है बंद कर दिया है, और केवल है initऔर gettyअभी भी चल रहा है, लेकिन मैं अभी भी रिमाउंट नहीं कर सकते हैं /करने के लिए ro


अनलिंक की गई खुली फाइलें एकमात्र बाधा नहीं हैं। देखो के लिए wया uमें FDके स्तंभ lsofउत्पादन, या के लिए Fके उत्पादन में fuser -vm /, उदाहरण के लिए। मैं आपको एक संपूर्ण सूची नहीं दे सकता, हालांकि। आप जरूरतमंद पैकेज को स्थापित करना चाह सकते हैं ।
फेरेंक वाग्नर

बेवकूफ सवाल है, लेकिन आप के रूप में lsof निष्पादित कर रहे हैं root?
कीवी

1
कीवी - हाँ, मैं रूट के रूप में lsof निष्पादित कर रहा हूँ।
मार्टिन वेगाटर

1
यह नहीं fuser -m / बताता कि रूट का उपयोग क्या है?
रुई एफ रिबेरो

1
@ मारकस लिंसर - मैं सिस्टमड का उपयोग नहीं कर रहा हूं। मैं init का उपयोग कर रहा हूँ।
मार्टिन वेगाटर

जवाबों:


2

मैं उन फ़ाइलों को कैसे सूचीबद्ध कर सकता / सकती हूं, जिन्हें केवल पढ़ने-लिखने के लिए रोका जा सकता है?

ए) पैकेज fuserमें पाया जा सकता है psmisc; यह एक उपयोग का मामला है जहां मुझे fuserचमक मिलती है और की तुलना में अधिक उपयोगी है lsof

# fuser -v -m / 2>&1 | grep '[Ff]r.e'

यह उन सभी प्रक्रियाओं को दिखाएगा, जिनमें पठन (एफ) और लेखन (एफ) के लिए फाइलें खुली हों। वे फाइलें जो केवल पढ़ने के लिए रिमूव होने से / रोकती हैं, वे लेखन (एफ) के लिए खोली जाती हैं।

प्रक्रियाओं है कि एक कर रहे हैं को मारने के रूट निर्देशिका के साथ निष्पादन किया जा रहा रन फ़ाइलें लिखने के लिए खुला । अर्थात

# for fupid in $(fuser -v -m / 2>&1 | grep Fr.e | awk '{print $2}'); do kill $fupid; done

यह systemdएक चेतावनी के साथ टिप्पणियों के ऊपर है । यदि systemdहै initतो fuserइसे देखेंगे और अन्य विचार हैं। systemdदौड़ने के साथ , यह आपकी पीठ के पीछे की प्रक्रियाओं को फिर से शुरू कर सकता है, भले ही वे अभी पहचाने और मारे गए हों fusersystemdपारंपरिक की तुलना में बहुत अधिक उन्नत है sysvinit

बी) विवरण में अद्यतन केवल प्रणाली है ... initऔर gettyअभी भी चल रहा है ...

मैं उस टिप्पणी को देखता हूं जो कहती है कि सिस्टम उपयोग नहीं कर रहा है systemd, यह उपयोग कर रहा है init। खिंचाव पर, systemd है init । टिप्पणी ने स्पष्ट रूप से नहीं कहा sysvinit, इसलिए मैं मान रहा हूं कि सिस्टम विचाराधीन डिफ़ॉल्ट खिंचाव का उपयोग कर सकता systemdहै init। या कि अन्य लोग जो इस पोस्ट पर ठोकर खाते हैं, जो खिंचाव का उपयोग कर रहे हैं systemd, इस भाग को उपयोगी पाते हैं।

प्रति डेबियन विकी ,

सिस्टम इनिशियलाइज़ेशन प्रक्रिया को इनिट डेमॉन द्वारा नियंत्रित किया जाता है। निचोड़ और पहले रिलीज में, डेमॉन को सिसविनीट पैकेज द्वारा प्रदान किया जाता है, और कोई विकल्प समर्थित नहीं है। में खरखरा , डिफ़ॉल्ट init डेमॉन अब भी हैsysvinit , लेकिन systemd के एक "प्रौद्योगिकी पूर्वावलोकन" उपलब्ध है। में जेसी और खिंचाव , डिफ़ॉल्ट init प्रणाली हैsystemd , लेकिन sysvinit को स्विचिंग समर्थित है।

जेसी के बाद से, केवल सिस्टमड पूरी तरह से समर्थित है; सिसविनीट को ज्यादातर समर्थन दिया जाता है, लेकिन सिबिनिट स्टार्ट स्क्रिप्ट प्रदान करने के लिए डेबियन पैकेज की आवश्यकता नहीं होती है। रनिट को भी पैक किया गया है, लेकिन अन्य के समान परीक्षण और समर्थन नहीं मिला है, और वर्तमान में पीआईडी ​​1 के रूप में समर्थित नहीं है।

systemdरनिंग के साथ , कुछ अतिरिक्त चरण हैं जिन्हें मुक्त करने के लिए उठाया जाना चाहिए / ताकि इसे बिना समस्या के रिमूव किया जा सके।

यह संभावना system.sliceहै कि ( systemd-journald.serviceया systemd-udevd.serviceजिसमें सॉकेट निर्भरता है) दोनों के लिए खुली फाइलें हैं । या, यदि NetworkManagerयह चल रहा है , तो यह रिस्पना कर सकता है dhclientजो पट्टों को / var / ... (& / var / हमेशा अपना उपकरण नहीं है) लिखता है , आदि fuserहो सकता है कि आपको मिल जाए और आप उसे मार दें, dhclientलेकिन NetworkManagerइसे तुरंत शुरू करें।

नैतिक बहुत सी चीजें स्वचालित हैं जो 'चाहते हैं' / (और इससे भी अधिक systemd)।

यह सुनिश्चित करने के लिए, यदि यह संभव है, तो systemdरन स्तर 1 के बराबर का मिलान होता है rescue.target(और runlevel1.targetयह एक प्रतीकात्मक लिंक है rescue.target)।

1) सिस्टम को अलग-थलग करके शुरू करें rescue.target

# systemctl isolate rescue.target

यह आपको रूट पासवर्ड दर्ज करने के लिए संकेत देना चाहिए; स्क्रीन निर्देशों का पालन करें।

2) बचाव शेल में, पता करें कि क्या चाहिए /।

# systemctl show -p Wants /

आमतौर पर, यह system.slice; वह सब कुछ रोक देता है जो / चाहता है। जैसे

# systemctl stop system.slice

3) इस बिंदु पर, रिमाउंट को रिपोर्ट नहीं करना चाहिएmount: / is busy और काम mount -o remount,ro / करना चाहिए । यदि नहीं, तो फिर से जांचें fuser

4) एफडब्ल्यूआईडब्ल्यू; मैंने यह भी देखा है कि umountजब कोई अन्य डिवाइस किसी अन्य माउंट के उप-निर्देशिका पर आरूढ़ होता है, तो विफल रहता है, अर्थात नेस्टेड माउंट। उदाहरण के लिए, umount /विफल होगा अगर / var / या / boot / किसी अन्य डिवाइस (और घुड़सवार) पर है। हालांकि mount -o remount,ro /इस मामले में अभी भी काम करना चाहिए।

lsblk नेस्टेड mounts कल्पना करने के लिए सहायक हो सकता है।

Lsof + L1 अब उन खुली हुई फ़ाइलों की सूची क्यों नहीं देता जिन्हें अनलिंक किया गया है?

क्योंकि वे उपलब्ध नहीं हैं (सॉकेट या अधिकांश एफआईएफओ और पाइप), वे अब फाइलें नहीं खोल रहे हैं (मूल प्रक्रिया ने फ़ाइल विवरणक को बंद कर दिया है), या उनके पास (अभी भी) 1 से अधिक लिंक गिनती है।

आदमी lsof (8) विवरण ...

+ - -एल [एल]

यह विकल्प ('+') या निष्क्रिय करता है ('-') फ़ाइल लिंक की सूची गिना जाता है, जहां वे उपलब्ध हैं - उदाहरण के लिए, वे सॉकेट, या अधिकांश फीफो और पाइप के लिए उपलब्ध नहीं हैं।

जब + L को निम्नलिखित संख्या के बिना निर्दिष्ट किया जाता है, तो सभी लिंक काउंट सूचीबद्ध होंगे। जब -L निर्दिष्ट किया जाता है (डिफ़ॉल्ट), कोई लिंक मायने नहीं रखता है।

जब + L को एक नंबर से फॉलो किया जाता है, तो केवल उस संख्या से कम लिंक काउंट वाली फाइलें सूचीबद्ध की जाएंगी । (कोई संख्या नहीं हो सकती है -L।) '' + L1 '' फॉर्म का एक विनिर्देश उन खुली फ़ाइलों का चयन करेगा जिन्हें अनलिंक किया गया है। प्रपत्र का एक विनिर्देश +aL1 <file_system>निर्दिष्ट फ़ाइल सिस्टम पर अनलिंक की गई खुली फ़ाइलों का चयन करेगा।


0

क्या आपने /procमुहिम शुरू की है?

जाहिर तौर पर कोई ऐसा व्यक्ति है जो /केवल समय-समय पर पढ़े- लिखे हैं , मैं कल्पना करता हूं कि आप यह भी सोच सकते हैं कि आपने घोषणाएं नहीं की हैं। लेकिन lsofखुली फाइलों को खोजने के लिए इसकी आवश्यकता होती है ।

प्रक्रियाओं द्वारा खुली हुई फाइलों को कर्फ़ द्वारा प्रतीकात्मक लिंक के माध्यम से उजागर किया जाता है। निर्देशिका /proc/<pid>/fdमें प्रत्येक फ़ाइल के लिए एक सिम्लिंक होता है जिसे खुला रखा जाता है। सिम्लिंक का नाम फ़ाइल डिस्क्रिप्टर नंबर हैं, और सिमलिंक द्वारा संदर्भित पथ फ़ाइल पथ है।

/procपहले से हटाई गई खुली फ़ाइलों के लिए अब भी डेंग्लिंग सिमिलिंक बने हुए हैं। और फ़ाइल का संदर्भित पथ "(हटाए गए)" के साथ समाप्त हो जाता है।

क्या lsof +L1अनिवार्य रूप से एक त्वरित एक लाइनर से अलग नहीं है जैसे:

stat -c%N /proc/[0-9]*/fd/* | grep deleted

इसलिए, आप सभी खुली फ़ाइलों को सूचीबद्ध करने के लिए एक समान एक-लाइनर का उपयोग कर सकते हैं जो रूट फाइल सिस्टम को रीमाउंट होने (कार्य करने के लिए /proc) प्रदान करने से रोक सकता है ।

हालाँकि, अगर आपने किया / /procमाउंट किया है, तो केवल अन्य कारण जो मैं सोच सकता हूं कि वे कीड़े हैं ... वैसे भी, मेरे वर्तमान डेबियन स्ट्रेच सिस्टम पर FYI करें। lsof +L1उम्मीद के मुताबिक काम करता है।

bash# lsb_release -d
Description:    Debian GNU/Linux 9.5 (stretch)

bash# uname -a
Linux bwp-249-8 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64 GNU/Linux

bash# lsof -v
lsof version information:
    revision: 4.89
    [...]

हां, मैंने /procमुहिम शुरू की है। मैं आपके तर्क का पालन नहीं करता कि मेरे पास क्यों नहीं हो सकता है। वैसे भी, stat -c%N /proc/[0-9]*/fd/* | grep deletedमुझे कुछ नहीं दिखा ।
मार्टिन वेग्टर

0

मैं केवल एक बार इस समस्या को पुन: उत्पन्न कर सकता था, और इसे केवल -n विकल्प के mountसाथ उपयोग करके हल किया ।

कोटिंग मैन माउंट :

-n, --no-mtab
      Mount without writing in /etc/mtab.  This is necessary for example when /etc is on a read-only filesystem.

रूट फाइल सिस्टम में लिखने केmount लिए फ़ाइल (एस) को खोलने का कार्यक्रम मेरे लिए एक प्रशंसनीय स्पष्टीकरण की तरह लग रहा था। विशेष रूप से सभी के बाद लिखते हैं और अक्सर रूट फाइल सिस्टम का हिस्सा होते हैं। हालाँकि मैंने इसे एक बार करने के बाद दोबारा उसी मशीन पर दोबारा नहीं लगाया ...mount/etc/mtab/etc

क्या इससे आपकी समस्या हल हो सकती है?


नहीं, -nमाउंट के साथ उपयोग करने से कोई फर्क नहीं पड़ता।
मार्टिन वेगाटर

0

आपके सिस्टम में दृश्यता के बिना, आपको यह बताना बहुत मुश्किल है कि वास्तव में समस्या क्या है। टिप्पणियाँ और पिछले उत्तर अच्छी शुरुआत हैं।

उस ने कहा, मैं डेबियन विकी के माध्यम से सभी तरह से वापस जाऊंगा जो कि केवल बढ़ने / पढ़ने के लिए प्रेरेक का वर्णन करता है।

प्रलेखन का लिंक यहाँ है: https://wiki.debian.org/ReadonlyRoot

मैं आपके माध्यम से यहां से चलूंगा

1 - इसके अंतर्गत विशिष्ट स्थान हैं / जिन्हें पढ़ना लिखा जाना चाहिए। प्रलेखन के आधार पर यह कुछ इस तरह दिखता है:

डेबियन आरओ रूट

आपके स्टोरेज स्टैक कॉन्फ़िगरेशन (विभाजन, विभाजन रहित lvm, आदि ..) के आधार पर आपके ब्लॉक डिवाइस संभवतः भिन्न होंगे, लेकिन मुख्य विचार यह है कि आपको आरडब्ल्यू माउंटिंग विकल्प के लिए अपने बाद के माउंट किए गए फाइल सिस्टम के लिए उन 4 माउंट बिंदुओं की आवश्यकता है।

2 - वहाँ / आदि में विशेष फ़ाइलों की एक संख्या है कि आप या तो के लिए एक प्रतीकात्मक लिंक बनाने की जरूरत है या कुछ अन्य परिवर्तन (विशेष रूप से जुड़े लेख में विस्तृत।) लागू करने के लिए। आपके लिनक्स सर्वर के चलने वाले अनुप्रयोगों के आधार पर ये लागू हो सकते हैं या नहीं भी। कुछ फाइलें आपकी मशीन पर मौजूद नहीं हो सकती हैं, लेकिन मैंने डॉक्स में सब कुछ शामिल किया है। ध्यान रखें, मैं इन बदलावों को लागू करने की दृढ़ता से सलाह देता हूं यदि आपने प्रक्रिया के पीआईडी ​​को मार दिया है। यहाँ डेबियन विकी से सीधे रास्ते हैं:

  • adjtime
  • init.d / alsa-utils
  • / Etc / कूरियर / साझा / सूचकांक
  • किसी भी कप राज्य फाइलें, classes.conf, cupd.conf, printer.conf सदस्यताएँ .conf
  • /etc/lvm/lvm.conf
  • mtab (जो ऐसा लगता है कि आपने माउंट-एन ध्वज को संबोधित करने की कोशिश की)
  • नेटवर्क / रन (ifup और ifdown द्वारा उपयोग किया जाता है, निचोड़ में। खिंचाव, ymmv पर लागू नहीं हो सकता है)
  • nologin
  • resolv.conf
  • दोनों पासवार्ड और शैडो फाइलें
  • साम्बा / dhcp.conf
  • चूसना
  • udev

एक बार जब आप सभी उपरोक्त जाँच कर लेते हैं और पुष्टि कर लेते हैं कि वे विकि में युक्ति के अनुरूप हैं, तो जाँचने के लिए अगली चीज़ है /etc/apt/apt.conf

DPkg {
// Auto re-mounting of a readonly /
Pre-Invoke { "mount -o remount,rw /"; };
Post-Invoke { "test ${NO_APT_REMOUNT:-no} = yes || mount -o remount,ro / || true"; };
}; 

आपकी त्रुटि के आधार पर, अंतिम चीज़ जिसे आप दस्तावेज़ के आधार पर देख सकते हैं, नीचे से आती है:

"संकुल के उन्नयन के बाद आपको उस समस्या का सामना करना पड़ सकता है, जो फाइल सिस्टम को आसानी से बताने से इंकार कर देती है, जो आपको बता रही है कि / / व्यस्त है।" यह हटाए गए फ़ाइलों के कारण होता है जो वे अभी भी एक प्रक्रिया द्वारा उपयोग किए जाते हैं। यह जानने के लिए कि कौन सी प्रक्रियाएं हटाए गए फ़ाइलों का उपयोग पैकेज डेबियन-उपहारों से टूल चेकरेस्ट (1) का उपयोग करती हैं या निम्न कमांड का उपयोग करती हैं। अक्सर ये अपग्रेड किए गए पुस्तकालयों का उपयोग करके डेमन होते हैं। फ़ाइलों को जारी करने के लिए उन्हें पुनः आरंभ करना होगा। "

डॉक्टर में दी गई कमांड:

{lsof +L1; lsof|sed -n '/SYSV/d; /DEL\|(path /p;'} |grep -Ev '/(dev|home|tmp|var)'

आपके सटीक फाइलसिस्टम विन्यास, विभाजन, और भंडारण युक्ति विन्यास को जाने बिना, आपको इसका अनुसरण करना बहुत मुश्किल है। मैं वापस जाने के साथ शुरू करूँगा और प्रलेखन में (और ऊपर उल्लिखित) आपके प्रेरेक को फिर से देखूंगा।

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