Taşıma kutusu ve diğer klasörler! Onları nasıl geri getirebilirim?


13

Tüm klasörleri yanlışlıkla kökten bir alt klasöre taşıdım. ( /bin, /etc, /home, /lib, /usrKullanımda beri, taşınan değil sadece olanları ... bütün taşındı) vardır /bak, /boot, /dev, /proc, /sys.

Şimdi, yürütmeye çalıştığım herhangi bir komut gerçekleşmeyecek. Sürekli "Böyle bir dosya veya dizin yok" alıyorum.

Ssh ve ftp aracılığıyla bağlıyım, ancak doğrudan SU girişi devre dışı olduğundan dosyaları ftp üzerinden taşıyamıyorum. Doğrudan oradan bir şey yapmam gerekirse gerçek sunucuya da erişebilirim.

/binKlasörü nerede bulacağımı ve tekrar erişmeme yardımcı olacağını söylemek için bir yapılandırma dosyasını düzenlemeniz gerektiğini varsayıyorum , ancak hangi dosyanın olacağını veya nasıl yapılacağını bilmiyorum (çünkü chmodizinleri değiştirmek için bile çalışamaz ).

Yeniden kurulum dışında bundan kurtulmanın bir yolu var mı?

CentOS'un eski bir sürümü üzerinde çalışıyorum.

Linux dünyasında son derece yeniyim, dolayısıyla bu eylem ve soru ...


Sorununuza bir çözüm olmasa da bunu okumanızı tavsiye ederim: lug.wsu.edu/node/414 Benzer durum ama aslında / bin sildi.
stribika

Yanıtlar:


33

Hala bir kök kabuğunuz varsa, sisteminizi onarma şansınız olabilir. Diyelim ki tüm ortak dizinleri taşındı diyelim ( /bin, /etc, /lib, /sbin, /usr- bunlar kurtarma zorlaştıracak olanlar) altında /oops.

mvTam yolu belirtmiş olsanız bile komutu doğrudan veremezsiniz /oops/bin/mv. Çünkü mvolduğunu dinamik bağlantılı ; çünkü /libdizini taşıdınız, mvçalışamaz çünkü kodunun bir parçasını oluşturan kütüphaneleri bulamaz. Aslında, bundan daha da kötü: dinamik yükleyiciyimv bulamıyorum (ad, mimarinize ve unix varyantınıza bağlı olarak değişebilir ve dizin veya gibi farklı bir ad olabilir ). Bu nedenle, dizini geri taşıyana kadar, bağlayıcıyı açıkça çağırmanız ve taşınan kitaplıkların yolunu belirtmeniz gerekir. İşte Debian squeeze i386 üzerinde test edilen komut. /lib/ld-linux.so.2/lib32/lib64/lib

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/i386-linux-gnu
/oops/lib/ld-linux.so.2 /oops/bin/mv /oops/* /

Diğer dağıtımlar veya mimariler için bunu biraz ayarlamanız gerekebilir. Örneğin, x86_64'teki CentOS için:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib64
/oops/lib64/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

Bir şeyi batırdığınızda /lib, statik olarak bağlı bir araç kutusunun etrafta kalmasına yardımcı olur. Bazı dağıtımlar (CentOS hakkında bilmiyorum), Busybox'ın statik olarak bağlı bir kopyasını sağlar . Ayrıca birçok komut içeren yerleşik bir kabuk olan kanat var . Bunlardan birine sahipseniz, iyileşmenizi oradan yapabilirsiniz. Onları gerçeklerden önce kurmadıysanız, çok geç.

# mkdir /oops
# mv /lib /bin /oops
# sash
Stand-alone shell (version 3.7)
> -mv /oops/* /
> exit

Artık bir kök kabuğunuz yoksa, ancak hala bir SSH artalan dinlemeniz varsa ve doğrudan ssh üzerinden root olarak giriş yapabilirsiniz ve bu statik olarak bağlı araç kutularından birine sahipseniz, ssh yapabilirsiniz. taşındıysanız eğer çalışabilir /libve /binancak /etc.

ssh root@broken.example.com /oops/bin/sash
root@broken.example.com's password:
Stand-alone shell (version 3.7)
> -mv /oops/* /

Bazı yöneticiler, statik olarak bağlı bir kabukla alternatif bir hesap oluşturur veya kök hesabın yalnızca bu tür bir sorun için statik olarak bağlı bir kabuk kullanmasını sağlar.

Bir kök kabuğunuz yoksa ve önlem almadıysanız, bir Linux canlı CD / USB'den önyükleme yapmanız gerekir (herhangi biri disklerinize ve dosya sistemlerinize erişebilecek kadar yeni olduğu sürece) ve dosyaları geri taşıyın.


1
Teşekkürler Gilles. Gelecekte nelere dikkat etmem gerektiği konusunda çok faydalı bilgiler verdiniz.
Menelaos

Teşekkürler Gilles! Bu beni kurtardı. 64 bit linux env için bir düzenleme ekledim. Benim durumumda, 64-bit CentOS 7
CompEng88

@ ComputerEngineer88 Teşekkürler, ancak düzenlemeler yaparken lütfen “EDIT” işaretlerini eklemeyin ya da ait olmadıkları gönderinin sonuna ekleyin. Metnin akışını koruyun. Kullanıcılar daha önce yayının ne içerdiğini bilmek isterse yayınların düzenleme geçmişi vardır. Kullanıcılar postayı normal olarak okuduklarında, daha sonra biraz eklenmesi umurumda değil.
Gilles 'SO- kötü olmayı kes'

Gerçekten mi? Her zaman düzenlemelere odaklanıyorum. Yeni bir şey öğrenilmiş demektir ve benim için en önemli şey budur. Hepsi aynı - insanlar yarar sağladığı sürece!
CompEng88

@ ComputerEngineer88 Stack Overflow kullanmaya başladığımda aynı refleksi geri aldım. Ancak aslında bir Stack Exchange yazısı, Wikipedia makalesine bir tartışma forumundaki bir gönderiye göre daha yakındır. Kullanıcıların gönderildikten kısa bir süre sonra forum gönderilerini okumasını beklersiniz, bu nedenle düzenlenmişlerse görünür bir gösterge olması mantıklıdır. Ama diyelim ki birisi 2027'de bu konuyu görüyor: 2011'den beri bir paragrafın var olup olmaması ya da 2019'da eklenmiş olması umurumda değil.
Gilles 'SO- kötü olmayı bırak'

11

Büyük olasılıkla yeniden başlatmadan kurtarabilirsiniz, bu yüzden başka şeyler denemeden yeniden başlatmayın çünkü önyükleme yapmaz. Hala SSH oturumunuz açıksa şunu deneyin:

  • Programların çalıştığı yer $ PATH değişkeni kullanılarak ayarlanır. Yeni kutu konumunuzu çalıştırarak yola ekleyebilirsiniz export PATH="$PATH:/newpath/to/bin:/newpath/to/usr/bin". İlgili sbin dizinlerini de eklemeniz gerekebilir . Ayrıca programları tam yolu üzerinden manuel olarak da çalıştırabilirsiniz /path/to/mv [from] [to], örneğin mv farklı bir konumda olsa bile çalışmalıdır. Zor kısmı, çoğu komutun ortak kütüphanelere erişmek isteyeceği ve /libtaşındığını söylediğiniz için, bunun için de bir değişken ayarlamanız gerekir.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/newpath/to/lib/:/newpath/to/usr/lib

  • Bazı temel komutları yürütebildiğinizde, dosyaları geri taşıyın! mv /path/to/subfolder/* /sırayla olurdu! Her şey yerine oturduğunda, sistem normal davranmalıdır.

Bu başarısız olursa, HERHANGİ BİR LiveCD'yi başlatmak ve sürücüyü monte etmek klasörleri ait oldukları yere geri taşımanıza izin vermelidir. Dağıtım livecd'inizi yeniden yüklemenize veya hatta kullanmanıza gerek yoktur, sadece sürücüyü bağlamanız ve klasörleri diskte doğru konuma geri taşımanız yeterlidir. Linux tabanlı kurtarma diski bir sürü size bu tür onarım yapmak için sadece birkaç temel konsol araçları vermek konusunda uzmanım.


SSH aracılığıyla çalışma başarısız oldu, bu yüzden bir liveCD indirdim ve işe yaramaya çalışıyorum. Grubtayım ve sürücüyü monte etmeye çalışıyorum, ancak çekirdek yüklü olmadığından bana izin vermiyor. ve mevcut yolların tam yolunu görememek bunu zorlaştırıyor ...
Menelaos

1
Yaşamak için önyükleme yapın, diskinizi takın, işleri uygun yerlerine geri taşıyın, sisteminize yeniden başlatın ... ve iyi şanslar.
Caleb

2
Ayarlamak yeterli değildir LD_LIBRARY_PATH, dinamik yükleyiciyi açıkça çağırmanız gerekir, örn LD_LIBRARY_PATH=/newpath/to/lib /newpath/to/lib/ld-linux.so.2 /newpath/to/bin/mv.
Gilles 'SO- kötü olmayı kes

4

Bilgisayarı bir kurulum CD'si ile tek kullanıcı modunda yeniden başlatabilmeli, kök dosya sistemini bağlayabilmeli ve dosyaları tekrar Linux'ta taşıyabilmelisiniz. Fazla centos bilmiyorum, ama RHEL gibi, bu yüzden bu işe yaramalı.


Konuştuğumuz gibi indiriyorum. Canlı cd veya tüm kurulum dvd'si bir fark yaratır mı?
Menelaos

@Menelaos: Yüklemek istemiyorsunuz, bu çözüm için canlı olarak çalıştırabileceğiniz bir şey istiyorsunuz. Bazı kurulum disklerinin canlı sürümleri vardır, ancak bazıları hemen hemen istemek istemektedir. Bazılarının aslında istediğiniz şey olan "kurtarma" modları vardır, ancak adanmış linux kurtarma diskleri de vardır. Bu sizin dağıtımınız olmak zorunda değil, sadece bir linux dosya sistemini monte edebilecek ve klasörleri geri taşıyabilecek bir şey olmalı. Cevabımı gör.
Caleb

İsterseniz kurtarma CD'lerinden birini görmek için sysresccd.org'a bakar. Nasıl kullanılacağını görmek için kapsamlı belgelere sahiptir. Bu sorunu gidermek için kullanılmasına yardımcı olmak bu forumda ve uygun zamanımın ötesinde zor olabilir. Yoksa centos CD'leri yardımcı olacaktır. En son canlı CD çalışabilir veya çalışmayabilir ... Bu tür sorunları göz önünde bulundurarak, her zaman yüklediğiniz bir yükleme ortamını / iso sürümünü tutmalısınız. Ayrıca tüm dosya sistemlerinin bir yedeğini oluşturun.
Jamess

2

5 yıl sonra Gilles'e çok teşekkürler ve gönderileriniz hafta olmasa bile günümü kurtardı.

Bir alt klasörün içeriğini geçerli klasöre taşımak mv sub/* .istedim, ama yerine, mv sub /* .her şeyi geçerli klasöre taşıdım. Neyse ki bu cevabı buldum ve makinemi göreceli olarak kolayca düzeltebiliyordum. Ancak Ubuntu 16.04 çalıştıran bir x86_64 makinesinde çalıştığım için komutları biraz ayarlamam gerekiyordu. Herkesin mücadele etmesi durumunda talimatları burada bırakmak istiyorum:

export LD_LIBRARY_PATH=/oops/lib:/oops/lib/x86_64-linux-gnu
/oops/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /oops/bin/mv /oops/* /

0

Modern sistemlere (Unix çalışan x86_64 makineleri) Ktipr'ın cevabını uyguladıktan sonra yapmak için birkaç komut daha eklemek istiyorum , hata gösterdiğinden mv ile taşınan dizinleri "vb" alamadım

Error : Directory not empty

bu yüzden kullanmak zorunda kaldım

rsync -a source_file target_location

her şeyi sırayla geri alabildiğimden emin olmak için. Zaten kurulu değilse, önce kurmanız gerekir.

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.