Pazartesi sabahı hatası: sudo rm -rf - no-preserve-root /


146

Lütfen aklınızda bulundurun: Bu soruya verilen cevaplar ve yorumlar, dış medyadan çok fazla dikkat çeken, ancak bir çeşit viral pazarlama programında aldatmaca olduğu ortaya çıkan benzer bir sorudan daha fazla içeriğe sahiptir. ServerFault'un bu şekilde kötüye kullanılmasına izin vermediğimiz için, orijinal soru silindi ve cevaplar bu soru ile birleştirildi.


İşte eğlenceli bir trajedi. Bu sabah, yanlışlıkla aşağıdaki komutu yerine getirdiğimde, üretim sunucum üzerinde bir miktar bakım yapıyordum:

sudo rm -rf --no-preserve-root /mnt/hetznerbackup /

Son boşluğu daha önce /ve birkaç saniye sonra görmedim , uyarılar komut satırımı doldururken, kendimi imha et düğmesine bastığımı fark ettim. İşte gözlerime yakılanların bir kısmı:

rm: cannot remove `/mnt/hetznerbackup': Is a directory
rm: cannot remove `/sys/fs/ecryptfs/version': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/inode_readahead_blks': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_max_to_scan': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/delayed_allocation_blocks': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/max_writeback_mb_bump': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_stream_req': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_min_to_scan': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_stats': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/trigger_fs_error': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/session_write_kbytes': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/lifetime_write_kbytes': Operation not permitted
# and so on..

Görevi durdurdum ve üretim hizmetinin hala çalıştığını öğrendiğimde rahatlamıştım. Ne yazık ki, sunucu artık SSH üzerinden herhangi bir kullanıcı için genel anahtarımı veya şifremi kabul etmiyor.

Buradan nasıl ileriye gidebilirsin? SSH erişimini geri almak için bir dikenli tel okyanusunda yüzeceğim.

Sunucu Ubuntu-12.04 kullanıyor ve Hetzner'de barındırılıyor.


48
Yedeklerden geri yükle. Dürüst olmak gerekirse, bu geri dönüşü kolay olmayan senaryolardan biridir.
MadHatter

310
--no-preserve-rootYanlışlıkla nasıl yazıyorsun ? : -o
ThatGraemeGuy

144
Greame, anahtarlar hemen yan yana.
MadHatter

38
Salı çalışması: Yeni iş arayın;) Neden yedeklemeye ihtiyaç duyulduğunu bir ders olarak alın.
TomTom

43
Bu kesinlikle bana trolling gibi görünüyor. Yanlışlıkla --i-really-mean-delete-my-root-yazamazsınız.
psusi

Yanıtlar:


95

Hetzner tarafından sağlanan kurtarma sistemini devreye alın ve ne gibi bir hasar verdiğinizi kontrol edin.
Herhangi bir dosyayı güvenli bir yere aktarın ve ardından sunucuyu yeniden konuşlandırın.

Korkarım bu, sizin durumunuzdaki en iyi çözüm.


102
parlak tarafa bakın, en azından kalp atışlarında bir sorunu yok!
metacom

222

Gerçek? Bu noktada, bunun için basit / kolay bir otomatik düzeltme yoktur. Veri kurtarma bir bilimdir ve temel, ortak araçların bile oturup oturup verinin orada olmasını sağlamak için birine ihtiyacı vardır. Bundan büyük miktarda kesinti olmadan bu durumdan kurtulmayı bekliyorsanız hayal kırıklığına uğrayacaksınız.

Testdisk veya bir dosya sistemine özel kurtarma aracı kullanmanızı öneririm . Bir sistemi deneyin, çalışıp çalışmadığını görün vb. Süreci otomatikleştirmek için gerçek bir yol yoktur, ancak büyük olasılıkla dikkatli bir şekilde gruplar halinde yapabilirsiniz.

Bununla birlikte, aksiyon raporlarınızda yer alması gereken soru ve yorumlarınızda çok korkutucu şeyler var.

İlk önce, komutu kontrol etmeden her yere koştunuz. Bir kutuda bir komut çalıştırın. Sonra birkaç, daha sonra. Temel olarak eğer bir şeyler ters giderse, tüm sistemlerinizi değil bir kaçını etkilemesi daha iyidir.

ikinci olarak

@ Sunucuya uzak bir sürücü takmadan yedekleme nasıl yapılır?

Beni korkutuyor. Dosya seviyesi tek yönlü yedeklemeler çözülmüş bir problemdir . Rsync, izinleri korumak ve dosyaları bir şekilde bir yedekleme sitesine kopyalamak için kullanılabilir . Yanlışlıkla bir şey mi? Yeniden yükleyin (tercihen otomatik olarak) rsync'i geri yükleyin ve işler işe yarayacak. Gelecekte, dosya sistemi düzeyinde anlık görüntüleri btrfs veya zfs anlık görüntüleriyle kullanabilir ve bunları sistem düzeyinde yedeklemeler için gönderebilirsiniz. Aslında uygulama sunucularını, veritabanlarını ve depolamayı ayıran oyuncaklarla oynardım ve en az ayrıcalık ilkesini ortaya koyardım, böylece böyle bir şeyin riskini bölersiniz ..

Yapabileceğim bir şey olduğunu biliyorum. Şimdi kendimi nasıl koruyacağımı düşünmem gerekiyor

Bir şey olduktan sonra bunu düşünmek için en kötü zaman.

Bundan ne öğrenebiliriz?

  1. Yedeklemeler veri tasarrufu sağlar. Muhtemelen kariyer
  2. Bir aracınız varsa ve ne yapabileceğini bilmiyorsanız, tehlikelidir. Bir jedi ışın kılıcıyla harika şeyler yapabilir. Işın kılıcına sahip bir oda dolusu şempanze ... dağınık olurdu.
  3. Asla her yerde aynı anda bir komut çalıştırma. Test ve üretim makinelerini ayırın ve tercihen üretim makinelerini aşama aşama yapın. 100 veya 1000 yerine 1 veya 10 makineyi tamir etmek daha iyidir.

  4. İkili ve üçlü kontrol komutları. Bir ortak çalışandan "hey, bir sürücü kullanmak üzereyim, bunu kontrol edebilir misiniz böylece bir sürücüyü silmeye kalmaz mıyım?" Diye iki kez kontrol etmesini istemekten utanç yoktur. Bir sarmalayıcı da yardımcı olabilir, ancak hiçbir şey daha az yorgun bir göze çarpamaz.

Şimdi ne yapabilirsin? Müşterilere bir e-posta gönderin. Arıza süresi ve felaket hataları var. Daha yüksek, yasal, satış ve benzeri şeylerle konuşun ve hasarı nasıl azaltabileceğinizi görün. İyileşmeyi planlamaya başlayın ve gerekirse, en iyi ihtimalle ekstra el kiralamak zorunda kalacaksınız. En kötüsü, iyileşme için çok para harcamayı planlayın. Bu aşamada, teknik düzeltmelerle birlikte düşüşü azaltmak için çalışacaksınız.


9
@MarcoMarsala rsync'i kullanmadan önce herhangi bir şeyi monte ettiyseniz, doğru şekilde yapmıyordunuz. Ssh üzerinden rsync kullanıyor olmalısınız.
Michael Hampton,

67
Bu mükemmel cevaba eklerim: Bilgisayardan uzak dur. Sakinleşene kadar hiçbir şeyi düzeltmeye çalışmayın. Zaten bazı ciddi aksama sürelerine bakıyorsunuz; Sistemlerinizi daha fazla mahvetmek yerine bir şeyleri düşünmek için zaman ayırmak ( ddyukarıdaki sorundaki gibi) daha da kötüleşmeyecektir.
Jenny D

22
Komutun gerçekten neden çalıştığı hakkında bir fikrin var mı? Eğer $foove $barikisi de tanımlanmamış olan, rm -rf /hata bildiren gereken --no-preserve-rootmesajın. Bunun aslında bir CentOS7 makinesinde çalışabileceğini düşünebilmemin tek yolu, $bardeğerlendirilip değerlendirilmediği *, yani neyin yapıldığıydı rm -rf /*.
terdon

9
"Yanlışlıkla bir şey?" Deki stilizmi seviyorum. Bu, "Kaldırıldı" kelimesinin yanlışlıkla silindiği veya "düşürüldüğü" anlamına gelmelidir.
saat

20
Şimdi ünlüsün iyi en azından @MarcoMarsala independent.co.uk/life-style/gadgets-and-tech/news/...
Martin Smith

92

rm -rf --no-preserve-rootİle bir şeyler sildiğinizde , kurtarmak hemen hemen imkansızdır. Bütün önemli dosyaları kaybettin.

@ Faker'in cevabında söylediği gibi , en iyi eylem yolu, dosyaları güvenli bir yere aktarmak ve ardından sunucuyu yeniden dağıtmaktır.

Gelecekte benzer durumlardan kaçınmak için size şunu öneririm:

  • Yedekleri haftada bir veya en az iki haftada bir alın. Bu, etkilenen hizmetin mümkün olan en az MTTR ile yedeklenmesinde size yardımcı olacaktır.

  • Gerekmediğinde kök olarak çalışma . Ve bir şey yapmadan önce daima iki kez düşün. Güvenli rm de yüklemenizi öneririm .

  • İstemediğiniz , örneğin --no-preserve-rootveya --permission-to-kill-kittens-explicitly-grantedbunun gibi seçenekleri yazmayın .


18
Benzer şekilde, GERÇEKTEN BÜTÜNLENDİRMEYİNİZ sürece, --please-destroy-my-driveparametreyi eklemeyin hdparm.
MikeyB

3
Eklemek isterim; "Kök olarak çalışırken argümanlarınızı (ve seçeneklerinizi) üç kez kontrol edin", "CurrentWorkingDirectory'inizi kontrol edin (rm -rf * gibi bir şey yapmadan önce)" ve "Komutlarda tam yolları kullanın ($ PATH'a aktarmayın).
Baard Kopperud

47

Aynı sorunu yaşadım ama sadece bir harddrive ile test ettim, her şeyimi kaybettim. İşe yarayacak mı bilmiyorum ama hiçbir şey yüklemeyin , verilerinizin üzerine yazmayın, sabit disklerinizi monte etmeniz ve otopsi, photorec, Testdisk gibi bazı adli tıp araçlarını başlatmanız gerekir.

Testdisk'i şiddetle tavsiye ediyorum, bazı temel bilgiler komutuyla üzerine yazmadıysanız verilerinizi kurtarabilirsiniz.


8
Mümkünse depolamanın çevrimdışı yapılmasını kesinlikle öneririm ve eğer mümkünse 'salt okunur' olarak yeniden monte etmenizi tavsiye ederim. Bir canlı veya başka bir sunucu örneği ile olsun.
mhouston100

2
Orijinal diskin dd bitcopy'sini, sadece güvenli olması için orijinal diskin salt okunur bir bağından yeni bir diske yapmayı bile düşünürdüm.
Jim,

3
«Bu araçlar dosya adını ve yolunu kurtarmaz» Evet, yaparlar. Bahsedilen 3 araçtan sadece bir tanesi (Photorec) oymacılık yapıyor.
Andrea Lazzarotto

34

Böyle bir sorunu çözmenin en iyi yolu, en başta bunun olmamasıdır.

Bağımsız değişkenler arasında eğik çizgi bulunan bir "rm -rf" komutunu el ile girmeyin. (Böyle komutları, sizi aptalca bir şey yapmaktan korumak için gerçekten iyi doğrulama / akıl yürütme yordamlarına sahip bir kabuk betiğine koymak farklıdır.)

Sadece yapma.
Hiç. Yapman gerektiğini düşünüyorsan, yeterince zor düşünmüyorsun.

Bunun yerine, çalışma dizini, kaldırmayı başlatmak istediğiniz dizinin ebeveyni ile değiştirin, böylece rm komutunun hedefi eğik çizgi gerektirmez:

cd / mnt

sudo rm -rf hetznerbackup


31
Ben her zaman -rf'yi argüman listesinin sonuna koyarım rm /bla/foo/bar -rf. En azından bu şekilde, rm /parçayı yazdıktan sonra yanlışlıkla geri dönüşe bastığımda başım çok fazla belaya girmiyor .
Jens Timmerman

5
Benzer şekilde, "* ~" dosyalarını kaldırırken, önce tilde yazın, sonra yıldız işaretini ekleyin.
tekknolagi

4
Yani evinizi geçerli dizindeki her şeyden daha çok silmek ister misiniz?
greg0ire

@ greg0ire Hayır, sanırım, /mnt/hetznerbackupiçindeki klasördeki her şeyi işaretlemek için "/" kullanmak zorunda kaldığını söylemek istemişti .. ama ebeveynden, sadece hetznerbackup, eğik çizgiler olmadan yeterli.
T.Todua,

1
@tazotodua: Tekknolagi'nin yorumuna atıfta bulundum
greg0ire

16

Tüm kopyaların saklandığı yedekleme makinesini kurtarmayı denerdim:

  • 1. adım - Silinen bu "yedekleme makinesi" sürücülerinin ddkomutlarını yedekleyin .
  • 2. adım - testdiskDosyaları kurtarmak için kullanın .

Yani 1TB'yi kurtarmak istediğinizi varsayalım, Yedekleme için ekstra 2 TB, yedekleme için 1 TB (1. adım) ve kurtarma için 1 TB (2. adım) gerekir.

Rm -fr [phone rang] ve cd ile değerli dizine benzer bir hata yaptım. Şimdi her zaman iki kere düşünüyorum ve rm veya dd komutunu kullanmadan önce birkaç kez tekrar kontrol ediyorum.


6
Bunu yaparak diskinizi hemen hemen sıfırladı. Bu ciddiyetle kurtarmayı çok zorlaştırıyor. OP'nin test diskini kullanmaya çalışmanızı ve ilk önce kurtarmayı önermesinin iyi bir nedeni var ve dd'nin sözdizimi biraz tuhaf olsa da, komutu çalıştırmadan önce denetimi iki ya da üçe katlamak için iyi bir neden. Sadece bir sunucuyu sildin, değil mi?
Journeyman Geek

1
Hala iyileşebilirsin, ddson şansını silmek için ne kadar zaman kaldığına bağlı .
Abc Xyz

129
Bunu söylediğim için üzgünüm, ama bu soruda büyük troll hissediyorum ...
tymik

3
cevabında küçük troll hissedersiniz umarım :)
Abc Xyz

5
Dürüst olmak gerekirse. Gerçek olduğuna emin değilim. Eğer öyleyse, muhtemelen yanlış
iştesin

7

Başka bir cevapta belirtildiği gibi, Hetzner bir kurtarma sistemine sahiptir. Hem ssh erişimli bir netboot seçeneği hem de vserver'ınızda ekran ve klavye vermek için bir java uygulaması içerir.

Mümkün olduğu kadar kurtarmak istiyorsanız, sunucuyu netboot sistemine yeniden başlatın ve ardından oturum açarak uygun aygıttan inode'dan okuyarak dosya sisteminin bir görüntüsünü indirin.

Ben böyle bir şey çalışması gerektiğini düşünüyorum:

ssh root@host cat /dev/sda > server.img

Elbette, yönlendirme ssh komutu çağrılmadan önce kabuk tarafından yapılır, bu nedenle server.img yerel bir dosyadır. Sadece kök dosya sistemini değil, tam diski istiyorsanız, yerine sdagöre sda3sen de benim gibi görüntüyü kullanarak varsayarak.


belki olabilir: ssh root@host cat /dev/sda | gzip -c - > /path/to/dir_on_huge_partition/server.img.gz(Anında çalışan gzip dosya sisteminin içeriğinin ne olduğuna bağlı olarak yardım eder ya da yardım etmez ...)
Olivier Dulac

@OlivierDulac Bu şekilde gzip kullanmak, verileri ağ üzerinden sıkıştırılmamış olarak gönderir ve ardından alıcı tarafa sıkıştırır. Ulaşmak istediğiniz sonucun aktarılırken verileri sıkıştırmak olduğunu farz ediyorum. Yerel resim sıkıştırılmış olarak saklanabilir veya saklanabilir, ancak daha sonra uygulamak istediğiniz araçlar daha sonra sıkıştırılmış sürümle çalışmaz. Ulaşmak istediğiniz tek şey, taşıma sırasında verilerin sıkıştırılması ise, ssh içindeki sıkıştırma özelliğini kullanabilirsiniz. Bu ile etkinleştirilebilir -Czaten Yapılandırmanızda etkin değilse.
kasperd

2
Daha çok dosyanın boyutunu küçültmeye çalışıyordum. Ancak, bant genişliğinden tasarruf etmek istiyorsanız (iyi fikir): sadece alıntılar ekleyin: ssh root@host "cat /dev/sda | gzip -c - " > /path/to/dir_on_huge_partition/server.img.gz(ssh'nin -c seçeneği de genellikle iyidir, ancak ssh sadece tünelin girişinde sıkıştıracağından hala sıkıştırmanız gerekir. ve stdout'a göndermeden önce sıkıştırmasını açın)
Olivier Dulac

2

Buradan nasıl ileriye gidebilirsin?

Hayatımın rmgeri kalanında kullanmaya yemin ederdim ve tix-cli'nin nix sistemlerinde varsayılan kaldırma komutunun olmaması deliliğin olduğunu düşünüyorum.

https://github.com/andreafrancia/trash-cli

Yepyeni bir sisteme ilk kurduğum şeyin ve bunun yerine alias rminsanlara kullanmalarını söyleyen bir şey olduğundan emin olurdum trash-cli. Ayrıca, gerçekten çalışan /bin/rmancak çoğu durumda kullanmamalarını söyleyen başka bir takma ad hakkında bir not da içerir .

:( Gerçek hikaye


2
Tecrübelerime göre, bu tür araçlar er ya da geç, asıl yardımdan ziyade sıkıntıya benzer ve küfür ettikten sonra onu kaldıracaksınız. Bir iş istasyonu için uygun olabilir, ancak çoğu durumda bir sunucu üzerinde idari iş yaparken çoğu durumda değilse, verileri silmeniz gerekir, yalnızca başka bir yere taşımakla kalmazsınız (ve durum buysa, mv kullanın. yerine). Ayrıca, verilerin otomatik olarak bir çöp klasörüne taşınması, ciddi sorunlara yol açabilir (örn. Aynı dosya sisteminde olmayan güvenlik, güvenlik).
maetthu

@maetthu Oh tabii ki, çöpler belirli günlerde çöktükten sonra şeyler silinir. Ubuntu masaüstünde bunu 30 günden fazla süredir çöpe atılan öğelere yapıyor. Bir sunucuda daha kısa bir şey isteyebilirsiniz, örneğin. trash-empty 5Bir cronda. Mesele şu ki, sana zarafet süresi vermek, çünkü insanlar hata yapar.
Gerry

Temel sistem araçlarını yasaklamak yerine çalışan bir felaket kurtarma planına sahip olmak daha iyi değil mi?
user292812,

@ user292812 / bin / rm 'nin yasaklanmasını önermedim, çoğu durumda ilk seçenek olmaması gerektiğini söyledi (/ bin / rm takma adını not alın). Sorunuz ayrıca felaket kurtarma ve insan dostu bir silme seçeneği arasında yanlış bir seçim olduğunu gösteriyor. İkisine de sahip olmalısın.
Gerry

1
İki adımlı bir çıkarma işlemi çok fazla sorundan tasarruf etmenizi sağlar: 1. çöp kutusuna (ayrıntılı), 2. boş çöp kutusuna. Böyle bir betiği "rm" olarak değiştiriyorum ve bu beni önemli şeyleri yanlışlıkla silmekten kurtardı.
Sam Watkins,

1

Böyle durumda bağlantısını kesmesine olduğunu tavsiye ve kullanmak debugfs ve yardımıyla lsdel Eğer dergilerden temizlediğini değil tüm yakın zamanda kaldırılan dosyaları, listeleyebilir ve sonra olabilir dökümü gerekli dosyaları. Aynı hızlı arama bağlantısı: http://www.linuxvoodoo.com/resources/howtos/debugfs

Birine yardım edeceğini umuyorum. ;)

Ve evet, öneri kez delmek taşındı senaryoyu, yapmaktır rm için real.rm ve symlinc mv için rm );


-2

Tüm sunucu işlemlerini ve g / ç disklerine neden olabilecek her şeyi durdurun ... sonra testdisk'i çalıştırın, yazılım yığınınızda olmalıdır. Fiziksel erişiminiz varsa testdisk ile bir canlı kullanın.


1
Tam olarak aynı öneriyi sağlayan üç cevabın yeterli olmadığını düşündüğünüzü anlamıyorum?
kasperd
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.