गलती से हटा दिया गया / बिन। मैं इसे कैसे पुनर्स्थापित करूं?


91

मैं नाम की एक निर्देशिका पर काम कर रहा था bin। के बाद मैं समाप्त हो गया था, के स्वामित्व की वजह से binऔर कुछ फ़ाइलों के भीतर मैं गलती से भाग गया:

sudo rm -r /bin

के बजाय:

sudo rm -r bin

ऐसा लगता है कि मेरे हाथ मेरे /हर चीज के सामने एक जोड़ दिया करते थे।

मैं अपनी /binनिर्देशिका को कैसे पुनर्स्थापित कर सकता हूं ?

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


3
क्या /binउबंटू /usr/binइन दिनों सिर्फ एक सिम्लिंक नहीं है ? तो आपको सिम्लिंक को वापस रखने की ज़रूरत है?
मुजेर

3
@Muzer मैं 16.04 रन कर रहा हूं, और यहां /binकोई प्रतीकात्मक लिंक नहीं /usr/binहै, मुझे लगता है कि इसके खिलाफ होगा FHS। भी हम जैसे एक छोटी सी पैकेज की जाँच करता है, तो coreutilsमें zesty (यहाँ) । हम देख सकते हैं कि बहुत सारी चीजें /binसाथ में स्थापित होंगी /usr/bin, लेकिन फिर भी यह एक कड़ी हो सकती है, मुझे इसकी जानकारी नहीं है।
रवेक्सिना

2
@ रेवेक्सिना आर्क लिनक्स पहले से ही सिम्लिंक / बिन / टू / यूएसआर / बिन
दिमित्री कुद्रियावत्सेव

1
मैंने सोचा था कि लोगों को एहसास होगा कि यह एक बनी हुई स्थिति है, मैंने वास्तव में अपना नहीं हटाया /bin, मैंने ऐसा कुछ सोचा जो किसी और के साथ भी हो सकता है (एक अन्य प्रश्न के आधार पर जो मैंने उत्तर दिया), फिर मैंने अपना ज्ञान साझा करने के लिए एक निर्देश लिखा दूसरों के साथ :), हालांकि मैं सभी टिप्पणियों की सराहना करता हूं, वे अन्य लोगों के लिए भी सहायक हैं जो इस प्रश्न को पढ़ने के लिए आते हैं। आप सभी का शुक्रिया;)
रवेक्सिना

1
जब भी मैं "rm -r" कमांड का उपयोग करता हूं, या जब कोई महत्वपूर्ण परिणाम हो सकता है, तो मैं आदत में पड़ गया हूं, मैं कमांड में टाइप करता हूं और फिर अपने हाथों को कीबोर्ड से दूर ले जाता हूं और कम से कम 3 सेकंड तक मारने से पहले दर्ज। इससे मुझे यह देखने का मौका मिलता है और सुनिश्चित करता हूं कि मेरे पास सब कुछ सही ढंग से टाइप किया गया है और मुझे पता है कि यह वही करेगा जो मैं करने की योजना बना रहा हूं। दुर्लभ अवसरों पर, उस ठहराव के दौरान, मैं यह तय करता हूं कि मुझे कमांड को मिटाने की आवश्यकता है - हमेशा नहीं क्योंकि यह गलत कमांड है, लेकिन कभी-कभी क्योंकि मुझे पहले कुछ सत्यापन करने की आवश्यकता है।
अंजब २३'१

जवाबों:


180

क्या यह संभव है?

खैर, सबसे तुच्छ और महत्वपूर्ण उपयोगिताओं में स्थापित हैं /bin, और अब आप उन सभी तक पहुंच खो चुके हैं। वास्तव में, यदि आप रिबूट करते हैं, तो आपका सिस्टम अब बूट-अप करने में सक्षम नहीं होगा।

वैसे भी, हम इस मुद्दे को ठीक करने जा रहे हैं और /binसामग्री को उतना ही पास कर सकते हैं जितना कि यह संभव था। एकमात्र अंतर कुछ प्रतीकात्मक लिंक होगा जो हम भी ठीक करेंगे।


कैसे?

पहले, हमें chrootआपके टूटे हुए सिस्टम में होना चाहिए , लेकिन एक मामूली अंतर के साथ ! उसके बाद हमें आपके सिस्टम पर स्थापित पैकेजों की एक सूची मिलेगी, जिनके पास /binनिर्देशिका में कोई भी स्थापित फ़ाइल है , तो हम केवल आवश्यक पैकेजों को डाउनलोड करने और आवश्यक फ़ाइलों को निकालने के लिए जा रहे हैं /bin। फिर हम कर लेंगे।

उदाहरण के लिए, बाद में chroot, हम उन पैकेजों की एक सूची प्राप्त कर सकते हैं, जिन्होंने /binउपयोग में फ़ाइलें स्थापित की हैं :

dpkg --search /bin | cut -f1 -d: | tr ',' '\n'

और हम भी उपयोग कर सकते हैं:

dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/

इन पैकेजों द्वारा स्थापित फाइलों को सूचीबद्ध करने के लिए /bin

फिर हम बस उन सभी पैकेजों की एक सूची बनाते हैं जो हमारे लिए आवश्यक हैं, फिर उन्हें डाउनलोड करें और उन्हें /binकुछ इस तरह से निकालें :

xargs apt download < list-packages
dpkg-deb -x PACKAGE .
mv ./bin/* /bin

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

इसलिए मैंने एक स्क्रिप्ट लिखी, जो हमें चाहिए वह सब कुछ करती है। यह हमें पुनर्स्थापित करने के लिए सभी आवश्यक पैकेजों का पता लगाता है /bin, हमें प्रत्येक पैकेज और उनके संबंधित फाइलों का नाम दिखाता है /bin। यहाँ एक स्क्रीनशॉट है:

मेरी स्क्रिप्ट द्वारा आउटपुट के रूप में <code> / bin </ code> पैकेज सूची का स्क्रीनशॉट

अंत में हम सभी पैकेजों को पुनर्स्थापित करने के लिए चुनते हैं या केवल आवश्यक फ़ाइलों को डाउनलोड करने और निकालने के लिए /bin(जो अनुशंसित विकल्प है):

मेरी स्क्रिप्ट द्वारा दिए गए विकल्पों का स्क्रीनशॉट

आप इस स्क्रिप्ट की एक प्रति ले सकते हैं या इसे सीधे डाउनलोड कर सकते हैं


चलो शुरू करते हैं

chroot

अपने सिस्टम को एक लाइव डिस्क के साथ बूट करें जिसमें आपके स्थापित उबंटू के समान आर्किटेक्चर है, एक टर्मिनल खोलें और रूट एक्सेस प्राप्त करें:

sudo -i

अपने rootफ़ाइल सिस्टम को माउंट करें (मेरे लिए यह /dev/sda1):

mount /dev/sda1 /mnt

हमें इंटरनेट से कनेक्टिविटी की आवश्यकता होगी, इसलिए resolv.confलाइव उबंटू से अपने माउंटेड रूट विभाजन की प्रतिलिपि बनाएँ :

cp /etc/resolv.conf /mnt/etc/resolv.conf

अब स्क्रिप्ट को माउंटेड पार्टीशन पर कहीं कॉपी करें, जैसे:

cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh

या आप इसका उपयोग कर डाउनलोड कर सकते हैं wget, आदि जैसे:

wget https://git.io/v9fRm -O /mnt/restore-bin.sh

अन्य आवश्यक पथ माउंट करें:

mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc /proc /mnt/proc

और यहाँ मामूली अंतर है : chrootजब कोई /binनिर्देशिका नहीं होती है तो हम एक टूटी हुई प्रणाली के लिए कैसे कर सकते हैं ? हमें कौन सा खोल चलाना चाहिए?

इसलिए एक अस्थायी बिन निर्देशिका बनाएं। उदाहरण: bintmpआपके टूटे हुए सिस्टम रूट में नाम :

mkdir /mnt/bintmp

फिर उस में लाइव बाँध /bin:

mount --bind /bin /mnt/bintmp

/bintmp/bashअपने लॉगिन शेल को सेट करते समय सिस्टम में चुरोट करें:

chroot /mnt /bintmp/bash

/bintmpअपने PATHपर्यावरण चर के रूप में निर्यात करें :

export PATH=/bintmp:$PATH

स्क्रिप्ट को निष्पादन योग्य बिट दें:

chmod +x restore-bin.sh

स्क्रिप्ट चलाएँ:

./restore-bin.sh

खोज पूरी होने तक प्रतीक्षा करें फिर उस प्रश्न का उत्तर दें जो हमने स्क्रीनशॉट में देखा था। यह बहाल करना शुरू कर देगा /binऔर हम लगभग पूरी हो चुकी हैं।

ऐसा होने के बाद, पर्यावरण से बाहर निकलने के लिए CTRL+ Dका उपयोग करें chrootऔर माउंट किए गए रास्तों को अनमाउंट करें:

umount -R /mnt

सिस्टम को रिबूट करें।

भीतर लिंक बहाल /bin

अब लगभग /bin5 प्रतीकात्मक लिंक को छोड़कर, निर्देशिका के भीतर लगभग सभी फाइलें वापस आ गई हैं, जो प्रबंधित हैं update-alternatives

अपने रनिंग सिस्टम में, रन करें:

sudo update-alternatives --all

यह आपसे कुछ प्रश्न पूछता है; आप बस ENTERउन सभी को स्वीकार करने के लिए दबा सकते हैं ।

और अब हम कर रहे हैं।


30
यह एक शक के बिना है, सबसे अच्छा जवाब जो मैंने उबंटू से देखा है। ओपी एक असुविधाजनक स्थिति में है, यह जानने के लिए आपको बहुत काम करना है।
नानी मोसे

15
ओह, रुको, डॉ। मुझे एहसास होना चाहिए कि आपने ऐसा किया।
नॉन मोसे

ये अद्भुत है। मुझे पसंद है कि कैसे एसई डिजाइन कोई संकेत बिल्कुल नहीं देता है कि यह एक स्व-उत्तरित प्रश्न है।
पेड्रो ए

5
@ जींसिफ़िक यह करता है: उत्तरदाता के नाम (हस्ताक्षर) वाली आयत देखें: इसमें एक गहरा पृष्ठभूमि है, जो कि ओपी द्वारा पोस्ट नहीं करता है। यह टिप्पणियों, उत्तरों और प्रश्नों पर लागू होता है।
रुस्लान

27

यदि आपके वर्तमान सिस्टम में अभी भी एक रनिंग शेल और इंटरनेट एक्सेस है, तो सिस्टम पर अन्यत्र मौजूद उपकरणों का उपयोग करके ऐसा किया जा सकता है। मैं आपको केवल हटा दिया गया मान रहा हूं /bin/binबेशक सबसे सुविधाजनक उपयोगिता है जिसे आप ऐसी स्थिति में उपयोग कर सकते हैं (बिजीबॉक्स), लेकिन इसके बिना, हमें थोड़ा रचनात्मक होना पड़ेगा।


चूँकि आपके पास पहले से ही एक रनिंग शेल है, और चूंकि sudoअंदर है /usr/bin, तो इससे पहले कि हम आगे की क्षति करें, अपने आप को एक रनिंग रूट शेल प्राप्त करें। लेकिन /bin/bashऔर अधिकांश अन्य गोले चले गए हैं! सौभाग्य से, लिनक्स में अभी भी आपके द्वारा उपयोग किए जा रहे शेल की इन-मेमोरी कॉपी है। इसलिए:

sudo /proc/$$/exe

कड़ाई से बोलते हुए कि हमें इस प्रकार के रूट रूट की आवश्यकता नहीं है। लेकिन वैसे भी।

अब, dpkgअभी भी काम करता है, कम से कम यह खोजने के लिए कि किन पैकेजों में फाइलें हैं /bin:

dpkg -S /bin

हम उपयोग कर सकते हैं awkइसे संसाधित करने और पैकेज का नाम मिलता है, और xargsऔर apt-getपैकेज (सभी में डाउनलोड करने के लिए /usr/bin)। यदि आपके पास एक अस्थायी निर्देशिका है, जिसका आप उपयोग कर सकते हैं, cdतो क्योंकि आपकी वर्तमान निर्देशिका थोड़ी गड़बड़ हो रही है:

dpkg -S /bin | awk -F '[, :]' '{NF--}1' | xargs apt-get download

अब, हमारे पास सबसे बड़ी समस्या यह है कि /bin/tarयह गायब है, और इसके बिना, dpkgअभिलेखागार नहीं निकाल सकता है। हम वहां दो-तिहाई रास्ता पा सकते हैं, क्योंकि:

  1. .debफ़ाइलें वास्तव में arअभिलेखागार (फिर से /usr/bin):

    ar x tar_*.deb
    
  2. दो .tar.*अभिलेखागार से मिलकर , dataऔर control:

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. जबकि gzip उपयोगिताओं में हैं /bin, unxzमें है /usr/bin:

    unxz data.tar.xz
    

अब हमारे पास इससे निकालने के data.tarबिना एक फाइल है।tartar

बचाव के लिए अजगर ! यह वह जगह है जहाँ sudoवास्तव में जरूरत है:

$ sudo python -c 'import tarfile; tarfile.open("data.tar").extractall("/")'
$ echo /bin/*
/bin/tar

अब हम dpkgएक पूरी तरह से प्राप्त करने के लिए शेष डिबेट फ़ाइलों को निकालने के लिए उपयोग कर सकते हैं /bin:

for i in *.deb; do dpkg-deb -x "$i" /; done

हालाँकि, हमें अभी भी डिबेट फ़ाइलों की एक उचित स्थापना करनी चाहिए, ताकि पैकेज द्वारा बनाए जाने वाले सिमिलिंक आदि को फिर से बनाया जा सके:

sudo apt install --reinstall ./*.deb

या:

sudo dpkg -i *.deb
sudo apt-get install -f

टिप्पणियाँ:

  1. हम सीधे data.tar.xzफाइल निकालने के लिए पायथन 2 का उपयोग नहीं कर सकते , क्योंकि पायथन 2 केवल gzip और bzip2 संपीड़न का समर्थन करता है। पाइथन 3, हालांकि, इसका समर्थन करता है, इसलिए आप सीधे पायथन 3 का उपयोग कर सकते हैं unxz:

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. वापस जाने के बाद /bin/tar, आपको अभी भी उपयोग करने से पहले कुछ डिबेट फ़ाइलों को निकालने की आवश्यकता है apt-get: गोले, कोरुटिल्स, आदि। उन सभी को निकालने के लिए आसान है और बाद में फिर से स्थापित करें।

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

1
एक सवाल, /proc/$$/exeएक लिंक नहीं है /bin/bash? जब /binयह निकाला जाता है तो यह कैसे काम करता है? (यह काम कर रहा है, लेकिन कैसे), मैंने सोचा कि यह एक टूटी हुई कड़ी होनी चाहिए ... यही कारण है कि मैंने इस आइडिया को पीछे छोड़ दिया।
रवेक्सिना

3
@ रेवेक्सिना को एक पूर्ण उत्तर नहीं मिला, लेकिन: कैसे / proc / <pid> / exe symlink साधारण सीलिंक से भिन्न होता है?
मूरू

1
PATH = / usr / lib / klibc / bin: $ PATH आपके रास्ते में बिल्ली डाल देगा और वापस आ जाएगा
यहोशू

@ जोशुआ और उनमें से हर एक स्टेटिकली जुड़ा हुआ है! अच्छा!
मूरू

7

आप अस्थायी रूप से /binअपने सिस्टम को प्रयोग करने योग्य बनाने के लिए लाइव सीडी या किसी अन्य सिस्टम से फाइल डाल सकते हैं , फिर उन्हें उन apt-get install --reinstallपैकेजों के लिए चलाकर अपने उबंटू इंस्टॉलेशन की फाइलों के साथ बदलें, जिनमें सामान होता है /bin


क्या यही मुझे करना होगा। एक ही संस्करण संख्या होने वाली लाइव डीवीडी लगभग समान होगी यदि वर्तमान स्थापित के समान नहीं है। अगर मेरे पास एक डिस्क या यूएसबी लाइव संस्करण था, तो मैं उनकी तुलना कर सकता हूं और आपकी तरह एक उत्तर पोस्ट कर सकता हूं। यह थ्रेड अधिक एक सिद्धांत है यदि ओपी को पहले कभी नहीं हटाया गया / बिन जो कि एक संभावना है क्योंकि उसने उसी समय का उत्तर लिख दिया था जब प्रश्न सभी संभावना में था। अभी भी बहुत अच्छा सोचा प्रयोग और उत्कृष्ट लेखन शैली।
WinEunuuchs2Unix

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

1

करने के लिए कुछ अतिरिक्त इस उत्कृष्ट जवाब , के बाद मैं इस मुद्दे का सामना करना पड़ा (हटाने के साथ-साथ /boot, /etc, /libऔर /lib64):

  • chrootआवश्यकता है /libऔर /lib64उपस्थित होने के लिए; अन्यथा आपको निम्न त्रुटि मिलेगी:
    failed to run command ‘/bin/bash’: No such file or directory
    मैंने इन्हें LiveCD OS से कॉपी किया है और इसे पुनर्स्थापित करने में कोई समस्या नहीं है। YMMV आपके द्वारा सिस्टम पर स्थापित पैकेजों पर निर्भर करता है
  • मैं ऊपर उल्लिखित उत्तर को संपादित नहीं कर सकता, लेकिन एक टाइपो है:
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    होना चाहिए
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /bootआसानी से ग्रब टूल का उपयोग करके बहाल किया जा सकता है। देखें यहाँ
  • जैसा कि यह उत्तर सुझाता है, apt install --reinstall <package>लापता फ़ाइलों को पुनर्स्थापित करने का एक शानदार तरीका है /bin, /libऔर /lib64
    • कुछ संकुल कि पुनर्स्थापना की आवश्यकता: libaio1, mysql-server, openvpn,vsftpd

स्वयं पर ध्यान दें:
rm -rf folder /*जैसा नहीं हैrm -rf folder/*

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