Yanlışlıkla çıkarılmış / çöp kutusu. Nasıl geri yüklerim?


91

Ben bir dizinde çalışıyordum bin. İşim bittikten sonra, binyanlışlıkla sahip olduğum ve içerisindeki bazı dosyalardan dolayı yanlışlıkla koştum:

sudo rm -r /bin

Onun yerine:

sudo rm -r bin

Görünüşe göre ellerim yazdığım /her şeyin önüne bir ekliyordu.

Dizinimi nasıl geri yükleyebilirim /bin?

Ubuntu'uma ait aynı dosyaları istiyorum, bunları canlı bir diskten veya çalışan bir sistemden kopyalayıp yapıştırmak istemiyorum.


3
Is not /binUbuntu sadece sembolik bağ üzerinde /usr/binbugünlerde? Yani tek yapman gereken bağlantıyı geri koymak mı?
Muzer

3
@Muzer 16.04 kullanıyorum ve buranın /binsembolik bir bağlantısı /usr/bindeğil, bunun karşı olacağını düşünüyorum FHS. Ayrıca (burada) 'coreutils daki gibi önemsiz bir paketi kontrol edersek . Biz bir çok şey kurulacaktır görebileceğiniz yanında ben farkında değilim, ama yine de bir bağlantı olabilir. zesty /bin/usr/bin
Ravexina

2
@Ravexina Arch Linux zaten / usr / bin /
symlinks

1
İnsanların bir durumun ortaya çıktığını farkedeceğini düşündüm, aslında kaldırmadım /bin, başkasına olabilecek bir şey düşündüm (Yanıtladığım başka bir soruya dayanarak), Sonra bilgimi paylaşmak için bir talimat yazdım. diğerleri ile :), tüm yorumları takdir etmeme rağmen, bu soruyu okumak için gelen diğer insanlara da yardımcı oluyorlar.
Hepinize

1
Ne zaman bir "rm -r" komutu veya önemli sonuçlar doğurabilecek herhangi bir komutu ne zaman kullansam alışkanlık kazandım, komutu yazdım ve sonra en azından vurmadan önce ellerimi klavyeden yaklaşık 3 saniye uzaklaştırdım GİRİŞ. Bu bana bakmak ve her şeyi doğru yazdığımdan ve ne yapmayı planladığımı ne yapacağımı bildiğimden emin olmak için bana bir şans veriyor. Nadir durumlarda, bu duraklama sırasında, komutu silmeme karar verdim - her zaman yanlış komut olduğu için değil, bazen de önce bazı doğrulama işlemleri yapmam gerektiğine karar verdim.
ajb

Yanıtlar:


180

Mümkün mü?

Eh, en önemsiz ve önemli yardımcı programlar yüklenmiştir /binve şimdi hepsine erişiminizi kaybettiniz. Aslında, yeniden başlatırsanız, sisteminiz artık ön yükleme yapamaz.

Neyse, sorunu çözeceğiz ve /biniçeriğini mümkün olduğu kadar yakın hale getireceğiz . Tek fark, biz de düzelteceğimiz bazı sembolik bağlar olacaktır.


Nasıl?

İlk olarak, chrootkırık sisteminize girmeliyiz , ancak küçük bir farkla ! Ondan sonra sisteminizde /bindizinde kurulu bir dosya bulunan kurulu paketlerin bir listesini alacağız , o zaman sadece gerekli paketleri indirip gerekli dosyaları çıkaracağız /bin. O zaman bittik.

Örneğin, sonra chroot, dosyaları /binkullanarak yükleyen paketlerin bir listesini alabiliriz :

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

Ayrıca şunları da kullanabiliriz:

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

Bu paketler tarafından yüklenen dosyaları listelemek için /bin.

O zaman bizim için gerekli olan tüm paketlerin bir listesini oluşturduk, sonra indirip bunları aşağıdaki /bingibi bir şeyle çıkardık:

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

Bununla birlikte, sistemimizdeki kurulu tüm paketleri kontrol etmek için bir script kullanmalıyız, çünkü manuel olarak yapmak sadece delilik.

Böylece ihtiyacımız olan her şeyi yapan bir senaryo yazdım. Geri yüklemek için gerekli tüm paketleri bulur /bin, bize her bir paketin adını ve bunlara ait olan ilgili dosyaları gösterir /bin. İşte bir ekran görüntüsü:

Komutumun çıktısı olarak <code> / bin </code> paket listesinin ekran görüntüsü

Sonunda tüm paketleri yeniden kurmayı veya sadece gerekli dosyaları indirip çıkarmayı seçiyoruz /bin(önerilen seçenek):

Komut dosyası tarafından verilen seçeneklerin ekran görüntüsü

Bu betiğin bir kopyasını alabilir veya doğrudan indirebilirsiniz .


Hadi başlayalım

chroot

Sisteminizi, kurulu Ubuntu'nuzla aynı mimariye sahip canlı bir diskle önyükleyin, bir terminal açın ve root erişimine erişin:

sudo -i

Senin monte root(benim için bu kadar dosya sistemi /dev/sda1):

mount /dev/sda1 /mnt

İnternet bağlantısına ihtiyacımız olacak, bu yüzden resolv.confcanlı Ubuntu'dan bağlı kök bölümünüze kopyalayın:

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

Şimdi betiği monte edilmiş bölümdeki bir yere kopyalayın, örneğin:

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

veya bunları kullanarak indirebilirsiniz wget.

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

Diğer gerekli yolları takın:

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

Ve burada küçük fark var : chrootorada bir /bindizin yokken bozuk bir sisteme nasıl gidebiliriz ? Hangi kabuğu çalıştırmalıyız?

Bu yüzden geçici bir bin dizini oluşturun. örneğin: bintmpbozuk sistem kök dizininizde:

mkdir /mnt/bintmp

Öyleyse canlıyı şuna bağla /bin:

mount --bind /bin /mnt/bintmp

/bintmp/bashGiriş kabuğunuzu ayarlarken sisteme chroot yapın:

chroot /mnt /bintmp/bash

Ortam değişkeniniz /bintmpolarak dışa aktarın PATH:

export PATH=/bintmp:$PATH

Komut dosyasına çalıştırılabilir bit verin:

chmod +x restore-bin.sh

Komut dosyasını çalıştırın:

./restore-bin.sh

Aramanın tamamlanmasını bekleyin, ardından ekran görüntüsünde gördüğümüz soruyu yanıtlayın. Geri yüklemeye başlayacak /binve neredeyse bitti.

İşlem bittikten sonra , ortamdan çıkmak ve takılı yolların bağlantısını kesmek için CTRL+ Dkullanın chroot:

umount -R /mnt

Sistemi yeniden başlatın.

İçindeki bağlantıları geri yükleme /bin

Artık, /bindizin tarafından yönetilen 5 sembolik bağ dışında, neredeyse tüm dosyalar dizin içinde update-alternatives.

Çalışan sisteminizde şunları çalıştırın:

sudo update-alternatives --all

Size bazı sorular sorar; ENTERhepsini kabul etmek için basabilirsiniz .

Ve şimdi bitti.


30
Bu, şüphesiz, Ask Ubuntu’da gördüğüm en iyi cevap. OP'nin uygunsuz bir durumda olduğunu bilerek bu kadar çok işe gitmeniz son derece nazik.
Nonny Moose

15
Oh bekleyin, dr. Bunu yaptığını anlamalıydım.
Nonny Moose

Bu harika. SE tasarımının kendinden cevaplı bir soru olduğu konusunda hiçbir ipucu vermediğini seviyorum.
Pedro,

5
@Hamsteriffic yapar: cevaplayıcı adını içeren dikdörtgeni görme (imza): OP tarafından yazılmayan yazıların koyu renkli bir arka planı vardır. Bu yorumlar, cevaplar ve sorular için geçerlidir.
Ruslan

27

Mevcut sisteminizde hala çalışan bir kabuk ve internet erişimi varsa, bu sistemde başka bir yerde bulunan araçlar kullanılarak yapılabilir. Sadece silindiğini farz ediyorum /bin. /binElbette böyle bir durumda (meşgul) kullanabileceğiniz en uygun yardımcı program vardır, ancak onsuz, biraz yaratıcı olmamız gerekir.


Zaten çalışan bir kabuğunuz olduğu için ve içinde olduğundan sudo, /usr/bindaha fazla hasar vermeden önce kendimize bir çalışan kök kabuğu alalım. Ancak /bin/bashve diğer kabukları bitti! Neyse ki, Linux hala kullandığınız kabuğun bellekte bir kopyasına sahip. Yani:

sudo /proc/$$/exe

Açıkçası, izleyenlerin çoğu için bir kök kabuğuna ihtiyacımız yok. Ama yine de.

Şimdi, dpkgen azından hangi paketlerin dosya içerdiğini bulmak için hala çalışıyor /bin:

dpkg -S /bin

Biz kullanabilirsiniz awkişlemesini ve paket adlarını almak ve xargsve apt-getpaketler (bütün indirmek için /usr/bin). cdGeçerli dizininiz biraz dağınık olacağından, kullanabileceğiniz geçici bir dizininiz varsa, burada:

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

Şimdi, en büyük sorunumuzun /bin/tareksik olması ve onsuz dpkgarşivleri çıkaramaması. Oradaki yolun üçte ikisini alabiliriz, çünkü:

  1. .debdosyalar aslında ararşivlerdir (yine içinde /usr/bin):

    ar x tar_*.deb
    
  2. İki .tar.*arşivden oluşur datave control:

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. Gzip programları içinde iken /bin, unxziçindedir /usr/bin:

    unxz data.tar.xz
    

Şimdi ondan ayıklamadan bir data.tardosyamız var.tartar

Python kurtarmaya ! Burası sudogerçekten gerekli olan yer:

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

Şimdidpkg makul debiyi tamamlamak için kalan deb dosyalarını çıkarmak için kullanabiliriz /bin:

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

Bununla birlikte, deb dosyalarının düzgün bir kurulumunu yapmalıyız, böylece paketler tarafından oluşturulacak semboller vb. Yeniden yaratılır:

sudo apt install --reinstall ./*.deb

Veya:

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

Notlar:

  1. Python 2, data.tar.xzdosyayı doğrudan açmak için kullanamayız , çünkü Python 2 yalnızca gzip ve bzip2 sıkıştırmasını destekler. Ancak Python 3 bunu destekliyor, böylece Python 3'ü doğrudan kullanmadan kullanabilirsiniz unxz:

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. Geri döndükten sonra /bin/tar, kullanmadan önce bazı deb dosyalarını çıkarmanız gerekir apt-get: kabukları, coreutils vb. Bunların hepsini çıkarmak ve daha sonra tekrar yüklemek daha kolaydır.

Test etmedim, ama neredeyse tamamen okudum, harikaydı, aslında hafızada bir bash kopyasını bulmaya çalıştım, biraz aradım, ilginç bir şey bulamadım ve o katran olduğunu gördükten sonra değil /usr/bin, chroot ile ne gidersem gideyim dedim ... Başar.
Ravexina

1
Bir soru, /proc/$$/exebir bağlantı değil /bin/bashmi? /binkaldırıldığında nasıl çalışır ? (Çalışıyor, ama nasıl), bunun bozuk bir bağlantı olduğunu düşünmüştüm ... bu yüzden bu fikri geride bıraktım.
Ravexina


1
PATH = / usr / lib / klibc / bin: $ PATH kediyi koyacak ve yoluna geri dönecek
Joshua

@Joshua Ve her biri statik olarak birbirine bağlı! Güzel!
muru

7

Sen olabilir geçici SİZİN içine canlı CD veya başka bir sistemden dosya koymak /binsonra çalıştırarak Ubuntu yüklemesinden dosyalarla değiştirmek için sistem kullanılabilir hale getirmek için apt-get install --reinstallbir şeyler var paketleri /bin.


Ben de öyle yapardım. Aynı sürüm numarasına sahip olan canlı DVD, tam olarak yüklü olanla aynı değilse aynı olacaktır. Eğer bir diskim veya USB Live versiyonum olsaydı, onları karşılaştırabilir ve sizinki gibi bir cevap gönderebilirdim. Bu iş parçacığı, eğer OP ilk soruda asla silinmedi / silinmediyse, cevabı her ihtimalde soruyla aynı zamanda yazması olasılığı olan bir teoridir. Hala çok güzel düşünce deneyi ve mükemmel yazı stili.
WinEunuuchs2Unix

Bunun nasıl yapılacağı hakkında ayrıntılı bilgi vermek için bu cevabı düzenlemenizi öneririm . (Ayrıca bkz İyi bir cevap yazmak nasıl? Ask Ubuntu en değerli kabul edilen cevapların ne tür hakkında genel öneri niteliğinde değildir.)
David Foerster

1

Bazı eklemeler bu mükemmel cevap bu sorunu yaşamıştır, sonra (silme ile birlikte /boot, /etc, /libve /lib64):

  • chrootgerektirir /libve /lib64var olmak; Aksi takdirde aşağıdaki hatayı alırsınız:
    failed to run command ‘/bin/bash’: No such file or directory
    Bunları LiveCD işletim sisteminden kopyaladım ve geri yükleme konusunda herhangi bir sorun yaşamadım. Sisteme yüklediğiniz paketlere bağlı olarak YMMV
  • Yukarıda referans verilen cevabı düzenleyemiyorum, ancak bir yazım hatası var:
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    olmalıdır
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /bootgrub aletleri kullanılarak kolayca geri yüklenebilir. Buraya bakınız .
  • Bu yanıtın önerdiği gibi , ve apt install --reinstall <package>içindeki eksik dosyaları geri yüklemek için harika bir yoldur . /bin/lib/lib64
    • Yeniden kurulumu gerekli Bazı paketler: libaio1, mysql-server, openvpn,vsftpd

Kendime not:
rm -rf folder /*aynı değilrm -rf folder/*

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.