'Rm -rf /' sistemdeki tüm dosyaları nasıl silebilir?


81

Bu komutu Ubuntu'da denemedim (açık nedenlerden dolayı) bu yüzden Ubuntu'nun yürütülmesine izin verip vermeyeceğinden emin değilim. Ama her şeyi silmekle ünlü. Sadece meraktan çekirdim, çekirdek /binsilindiğinde ne olur ? rmÇalışma zamanı yığınını nasıl korur? Nasıl yok rmdosya sistemi ve komple silinmesi ile iletişim kurmak için yönetmek? Donanım ile nasıl iletişim kurar?


18
rm -rf /olmadan hiçbir şey silmez --no-preserve-root.
muru,

47
Linux ile olan ilk deneyimim, "rm -rf /" yapabilmem için bir Ubuntu vm yapmaktı. Bunu denemenizi tavsiye ederim. Kurulumu oldukça hızlıdır, ana makinenizi güvende tutar ve işletim sisteminin farklı parçalarını gözlerinizden önce izlemek çok eğlencelidir. Çok tatmin edici.
DJMcMayhem

21
Bana en sevdiğimden anlaşılmayan hata raporumu hatırlatıyor: bugzilla.redhat.com/show_bug.cgi?id=1202858 "Beklenen sonuçlar: Kalamar yeniden başlatıldı. Gerçek sonuçlar: Makinede tüm dosyalar silindi."

9
Unix Recovery Legend'i okumalısınız . Hala bir kabuğa giriş yapmış olduğunuz sürece, sistem tamamen ölmedi!
200_success

2
@gerrit yaptım . :)
muru

Yanıtlar:


79

/bin/rmSilinen önemli değil . Sadece bir kez çalıştırılıyor ve o noktadan sonra hepsi belleğe yüklendi, dosya sistemine ve diske silmeyi sürdürmek için gereken her şey.


Kenar çubuğu / Güncelleme: Başına David Hoelzer cevabı (yorum olarak bahsedilen ve), inode'a hardlink /bin/rmsağ dek kalacağını işaret için kullanılan rmbitmiş (Linux açık durumda tutar çünkü) ama aslında önemsizdir; diskin durumu hiç önemli değil.

İkili çalıştırılmadan önce belleğe yüklenir. rmDisk verilerini el ile yok etseniz bile , silme işlemini etkilemez veya durdurmaz (diski kullanılamaz duruma getirmediğinizi varsayarsak).

Bir inode veya hardlink ne olduğu hakkında hiçbir fikrin yok mu? Çalıştığım cevap bu.


Her neyse, bu aynı zamanda mevcut çekirdeğin paketini bilgisayar yerleştirmeden silebilirsiniz . Farklı bir sürüm yüklediğiniz sürece önyüklenebilir.

Yine, bu işe yarıyor çünkü rmsadece bir kez çağrılıyor. Aşağıdaki olur sonra başarısız /bin/rmher dosya için bir kez çağırır çünkü öldü:

find / -exec rm {} \;

Yani, find / -exec rm -rf {} +ve find / -print0 | xargs -0 rm -rfikisi de argüman sınırları vardır çünkü aynı zamanda hem olasılıkla onlar sadece tekrar çağrıldığını önce dosyaların bir numarayı silmek istiyorsunuz anlamı başarısız olur. Yolculuk boyunca bir noktada , geri kalan dosyalar silinmeden önce /bin/rmsona erebilir ( ve serbest bırakılabilir). Yine de garanti edilmiyor. /bin/Girilen son dizin olsaydı , bu yöntemler işe yarayabilirdi.


7
@DavidHoelzer'in açıkladığı gibi, bağlantısız dosyaların çalışmaya devam etmesi için zaten bellekte olması gerekmez. Çekirdek, açık bir dosya tanıtıcısı olduğunu bilir, bu nedenle son tanıtıcı kapanana kadar her türlü isteği (sayfa dahil) karşılamak için dosya verilerini tutar.
Andrew Medico

4
@ Desty, hayır, /bin/rmson partide olmanın sonu olacak kadar yakın olmadıkça, bu başarılı olamazdı; -exec ... {} +(ters eğik çizgi kaçması gereksizdir) yine de çoklu işlemlerle sonuçlanır; her dosya için bir tane değil, ARG_MAX'a sığabilecek argüman sayısına göre toplu iş başına bir tane.
Charles Duffy

6
@Oli, bu sayfalama ile ilgili değil; başvuru sayaçları, dizin girişine değil, inode'a bağlanır ve açık bir dosya tanıtıcısı referans olarak sayılır (sabit bir bağlantının yaptığı gibi), inode'un ayrılmasını önler. Dosya boyutu hiç bir faktör değildir ve bu, hiçbir takas alanı olmasa bile (yani, disk belleği yok) gerçekleşir.
Charles Duffy

2
@CharlesDuffy Takas alanınız olup olmadığına bakılmaksızın, bellek eşleştirilen tüm dosyalar için disk belleği kullanılır. Tüm çalıştırılabilir dosyaları ve kitaplıkları içerir. Aslında takas alanı eksikliği aslında hafıza haritalı dosyalar için daha fazla çağrı yapılması anlamına gelebilir.
kasperd

2
@CharlesDuffy Evet, boyut gerçekten alakasız. Bir dosyayı bellek eşleme, erişilene kadar dosyanın içeriğinin yüklenmesine neden olmaz. Dosyanın erişilen bölümlerini yüklemek için kullanılan bellek gerektiğinde tekrar serbest bırakılabilir, daha sonra tekrar erişilirse dosyadan yüklenir. Bu nedenle, dosya gerçekten harita üzerinde kaldığı sürece dosya sisteminde kalmalı ve bu da bir sayfa dosyası için tüm adres alanını kapsayacak kadar büyük bir dosya için olduğu gibi davranmalıdır. (Dinamik bağlantı için gerekli olan yazma-yazma eşlemeleri için detaylar biraz daha karmaşıktır.)
kasperd

57

Bu komutu Ubuntu'da denemedim (açık nedenlerden dolayı) bu yüzden Ubuntu'nun yürütülmesine izin verip vermeyeceğinden emin değilim.

Yaptım. rm -rf / --no-preserve-rootdoğrudan makinede açılan bir kök oturumunda koşuyordum, ben de sshkök hesabı kullanarak başka bir makineden bağlandım .

Olan şudur, şöyle bir sürü mesaj almaya başlarsınız :

rm: '/ ...' kaldırılamıyor: İşleme izin verilmedi

veya:

rm: '/ ...' kaldırılamıyor: Aygıt veya kaynak meşgul

görüntü tanımını buraya girin

Şaşırtıcı bir şekilde, sshişlemin sonuna kadar bağlantı açık kalmıştır. Sadece bağlantıyı kapattığımda ve bir hatanın ortaya çıktığını tekrar açmaya çalıştığımda:

Soketten okuma başarısız oldu: Bağlantı eş tarafından

Makinede dört dizin kalır:

  • /dev. Burası cihaz dosyalarının depolandığı yerdir.
  • /proc- çekirdek tarafından oluşturulan bellekte dosya sistemi.
  • /runDaemon'lar için standart bir dosya sistemi.
  • /sys. Bu, sistem ve bileşenleri hakkında bilgi edinmenizi sağlar.

Bu, çok fazla kalmayacağı ve orada yapacak çok şey olmadığı anlamına gelir. Yapamazsınız ls(kullanırken Tab, dizinlerin ve dosyaların adları hala görüntüleniyor olsa da). Sen olabilir cdfarklı dizinlere ve ayrıca içinde echomalzeme, ancak komutları gibi catartık kullanılamaz.

Hiçbiri de yok sudo.

shutdown -h nowve rebootortadan kayboldu, bu yüzden tek seçeneğin makineyi elle kapatması gibi görünüyor. Logout ( exit) çalışmıyor, güzel bir "logout" yazısı gösterse bile.

Makineyi yeniden başlatmayı denediğinizde, güzel bir GRUB hatası 15 ile karşılaşacaksınız ve daha sonra hiçbir şey olmuyor, bu noktada rmsisteminizin kötü bir şey yapmış olabileceğini düşünmeye başlayabilirsiniz .

görüntü tanımını buraya girin

sende yapabilirsin

Hayır, bekle, makinende yapma!

Bunun yerine, sanal bir makine çalıştırmak yerine yapabilirsiniz . VM'lerin deney yapmayı gerçekten kolaylaştırma avantajı vardır. Ubuntu kullandığınızdan, vmbuilder ile ilgilenebilirsiniz . Bu, sanal makineleri birkaç dakika içinde kullanmanıza izin veren bir araçtır (resmi belgeler "bir dakika içinde" yapılabileceğini iddia eder, ancak gerçek donanım, hızlı donanımda bile yaklaşık iki-üç dakikadır) .

Dağıtım sona erdiğinde, oynayabileceğiniz bir ortamınız olur. Eğer onu yok etmeye kalkarsanız, farketmez: makineyi tekrar dağıtırsınız ve iki dakika sonra devam edebilirsiniz.

VMWare gibi bir yazılım kullanıyorsanız, anlık görüntülerle de ilgilenebilirsiniz (ücretsiz VMWare Player'ın bu özelliğe sahip olmadığını; VMware Workstation satın almanız gerektiğini unutmayın). Hyper-V'nin ücretsiz olduğunu ve anlık görüntüleri desteklediğini unutmayın (ancak Windows'u çalıştırmanız gerekir).

Anlık görüntülerin faydası, milisaniye meselesinde bir tane alabilmenizdir. Bir anlık görüntüye geri dönmek daha uzun sürer, ancak genellikle birkaç saniye sorunudur. Bu, deneyi daha kolay ve daha hızlı hale getirir.

Bu deneme, işletim sisteminin kendisi ile sınırlı değildir. Yazılımla ilgili her türlü şeyi yapabilirsiniz. Şüpheli bir uygulamanız var mı? Bir VM'de test edin - eğer bir virüsse, zarar vermez. Çevreyi etkileyebileceği düşünülerek bir işlemi bir veritabanında test etmek ister misiniz? Bir VM'de test edin.

Ya bunu test dışı bir makinede yaptıysanız?

Kötü şeyler olur. Not rmseni kendinden korur: rm -rf /çalışmaz: Kullanmak gerek --no-preserve-root. Yine de, aslında, yanlışlıkla her şeyi kaldırmayı başaramazsanız?

rmsadece dosyaların işaretlerini kaldırır , ancak veriler hala oradadır, sabit diskinizde. Bu, daha sonra kurtarmayı mümkün kılar (bu nedenle artık çalışmadığınız zamanlarda sabit disklerinizi hassas verilerle atmamalısınız).

Bu, neredeyse tüm dosyaları gerçekten kurtarmak için sabit disk muhafazasına sahip yedek bir PC'niz olması gerektiği anlamına gelir . Önemli olan, kurtarılacak sabit diske herhangi bir şey yazmaktan kaçınmaktır: yazdığınız veriler bağlantısız dosyaların üzerine yazacaktır.

200_success 'in yorumundaki makalede belirtildiği gibi , akıllı davranırsanız, makineyi yedek bir PC olmadan bile geri alabilirsiniz. Sadece veriyi umursuyorsan, rahatsız olmazdım - onu yedek bir PC ile kurtarmak çok daha kolay.


VirtualBox disk anlık görüntülerini destekler.
Nathan Osman

1
Virüslerin genellikle VM'leri tespit etmek üzere tasarlandığından, bu virüs algılama işlemini önermeyeceğimi unutmayın. Küçük bir soru: Geride kalan dört klasörde "gerçek" klasör değil, değil mi? Aslında sabit diskte değiller mi? Bu komutu çalıştırdıktan sonra sabit sürücüde neler kalır?
raptortech97

2
@ raptortech97 bir rmşeyleri sabit diskten silmiyor, sadece diskteki dosya sistem ağacındaki gerçek verileri "bağlantısını kesiyor" (serbest bırakıyor). Öyleyse, rm -rf ~hızlı bir şekilde hareket ettiğiniz sürece , örneğin, hepsi kaybolmaz extundelete. Bunu, posta kutunuzdaki "deleted" klasörünün daha da güvenilmez bir sürümü olarak düşünebilirsiniz, çok uzun süre beklemezseniz geri alabilirsiniz, ancak sonunda temizlenir.
Thomas,

@ raptortech97 Öte yandan, bir nedenden ötürü kullanmadıysanız, rmancak shredoyun oldukça uzadı , ancak muhtemelen parçalama daha uzun sürdüğü için yanlışlığınızı fark etmek ve iptal etmek için zamanınız olacak.
Thomas

5
Tutulmakta olan dizinler büyük olasılıkla bir şekilde ya da başka biçimdeki bağlama noktalarıdır. Ve çalışmaya devam eden komutlar ayrı ikililere değil, bash yerleşik komutlarıdır. Öyleyse lsgittiğinde, for i in /*; do echo $i; doneçalışması gerekir. Ve değiştirmek için catgibi bir komut kullanabilirsiniz while read i; do echo $i; done < /proc/self/maps.
MvG

25

Bunun nedeni, dosya adlandırma katmanının (ne gördüğünüz ls) gerçekten rahatınız için olmasıdır. Dosya sistemi sürücüsü ve çekirdeği yalnızca inode'un ne olduğuna dikkat eder. Bir dosya adına göre başvurulduğunda, derhal izinler, diskteki veri blokları, sahip kimliği, grup kimliği ve bağlantı sayısını içeren tüm meta verileri içeren inode'a çevrilir.

Bağlantı sayısı burada gerçekten önemli olan şey. Bir UNIX sistemindeki bir dosyayı sildiğinizde, gerçek sistem çağrısı bir olur unlink. Kaputun altında olan şey, bu inode'a işaret eden bağlantı sayısının (dosya adlandırma katmanındaki dosya adlarının sayısı) azalmasıdır. Dosya sistemi, bağlantı sayısı sıfıra ulaştığında bir dosyanın silindiğini bilir.

Bir dosya tarafından silindiğinde rm, dizin dosyasını da düzenleyecektir (evet, bu cevap için önemli olmayan birkaç bitin yanı sıra dosya adını ve inode'u içeren bir dosyadır). Ancak, aslında disk kaynaklarını serbest bırakan bağlantıyı keser.

Bu başka ilginç etkilere yol açar. İlk önce, link sayısı sıfır olan bir dosyayı açmak mümkündür. Bu rm -rf /, girişi silerken olur /bin/rm. Dosya açık (bir dosya tanıtıcısı var) ancak inode silinmiş olarak işaretlendi (bağlantı sayısı = 0). Disk tanıtıcısı dosya tanıtıcısı kapanana kadar serbest bırakılmayacak ve yeniden kullanılmayacaktır.

Bir başka ilginç etki, dosya adlandırma katmanında işaret eden ve hiçbir şeyi sıfırdan büyük olan bir sayıma sahip bir inode olduğunda olan şeydir. Bu, bir anlamda, çok iyi gizlenmiş bir dosyadır :). Buna erişmek için ad yerine (inode değil) inode numarasına atıfta bulunmak için düşük seviyeli bir şey kullanmanız veya onaltılı bir editör kullanarak inode'da işaret edecek bir dizin girişini düzenlemeniz gerekir.

Üçüncü ilginç bir etki, bağlantı sayısını sıfıra indirir ancak yine de inode'da bir dizin girişini gösterirseniz ne olur. İsterseniz deneyip bunu size bırakacağım. Açıkçası, bu son ikisi de dosya sisteminin tutarsız bir durumda olmasına yol açıyor.


Başka bir yolla baktığımızda, bağlantı sayımı sıfır değildir, çünkü bir dosyayı açmak / proc içine bir bağlantı ekler.
OrangeDog

@OrangeDog, bu davranış procfs bağlantısı kesilmiş olsa bile hala mevcuttur.
Charles Duffy

1
@OrangeDog Charles Duffy doğru. Dosya yok / proc kolları olmayan bağlantı sayısını ayarlayarak inode'ları değiştirin.
David Hoelzer

/ proc ve / sys, mevcut sistemin (çekirdek) durumunun yansımalarıdır. Yalnızca orada bulunan dosyalara ve dizinlere yapılacak eylemleri seçmek sistem durumunu değiştirir.
CVn

18

Önceki cevaplar iyi, ama bir detayı açıklığa kavuşturmak istiyorum:

rmsadece bir komut değil. Bu bulunan bir programdır PATH.

Bu nedenle, yürütürken ne olur:

  • sen ara (kök) rm -rf /
  • program örneği rmargümanlar ile hafızaya yüklenir -rfve/
  • Bu argümanlara dayanarak program rmfaaliyetlerine başlar (monte edilmiş / bölümlenmiş her şeyden geçerek ve referansları tekrarlı bir şekilde kaldırarak [teknik olarak üzgünüm;)]
  • Tamamlandığında, rmprogramın örneği kaldırıldı
  • Bu noktada bellekteki tek şey daha önce yüklenmiş olan programlardır (örn. Ubuntu'da terminalin açık olması durumunda bash, Desktop ortamı, çekirdek, sürücüler vs.).
  • başka bir komut çağırmaya çalışırsanız (Linux'ta bağımsız bir program yaparsa), başarısız olur çünkü PATH konumlarında böyle bir program bulunmaz (ve PATH konumları artık yoktur). Ancak bir kez yüklenen her şey hala çalışacak

Nasıl çalıştığını anlamak için sadece ubuntu (Virtualbox'da), bazı script ve PHP opcode önbellekte LAMP'i yüklemeyi deneyin, sonra bu kötü komutu çağır. Şaşırtıcı bir şekilde (eğer yeterince şanslıysanız ve opcode önbellekiniz php dosyasının silindiğini farketmiyorsa) yine de dışarıdan php komut dosyalarına apache web sunucusu ile erişebilirsiniz!

Not: Bu kötü komut, kök silme bile çalıştırmamış everything, çekirdeğin ayrıcalıklı işlemlerini /procsilemiyor /devve sisteminizde dosya gibi görünen aygıtlardan bazı şeyleri silemiyor . Aslında, kök düşündüğümüz kadar kudretli değildir, öte yandan çekirdek.

PPS: Ayrıca, ikinci bir düşünce olarak locked, silme girişimi sırasında başka bir işlem tarafından kaydedilmiş dosyalara sahip olacağınızı da düşünüyorsunuz .


Linux'ta root olarak çalışırken cihaz düğümlerini kesinlikle kaldırabilirsiniz. Ancak evet, /procsalt okunur bir dosya sistemi olduğu için hiçbir şeyi silemezsiniz . Aynı şekilde /sys. Ayrıca bağlama noktalarını silemediğinize inanıyorum.
Brian

@AlexKey "Çekirdek olmayan gömülü komut" ile ne demek istediğinizi netleştirmek için düzenleme yapmayı (veya bu ifadeyi tamamen önlemek için) düzenlemeyi öneririm. Doğrudan çekirdeğe uygulanan bir kabuğun içinden geçebileceğiniz komutlar olduğunu söylüyorsunuz , böylece ne olursa olsun her zaman çalışırlar. (Büyük olasılıkla bildiğiniz gibi, ancak birçok okuyucu olmayabilir, durum böyle değil: böyle bir komut çalıştırdığınızda cd, bu isim bu adı taşıyan kabuğu çağırır - bu komut çekirdek içine değil kabuk içine yerleştirilir.) Alt + SysRq "komutları" ne demek?
Eliah Kagan

@Brian dağıtıma bağlı mı? Çeşitli dağıtımlarda çalıştım ve komik göründüğü kadarıyla bu hatayı defalarca yaptım. Kalıntıları inceledikten sonra hatırladığım gibi / dev içinde hala bir şey vardı, ama cdrom veya disket gibi şeyler olabilir ...
Alexey Kamenskiy

@EliahKagan Distro bağımsız kalmaya çalıştığım için, bu terimi kullandım. Bütün sistemlerde cli komutunun harici program anlamına gelmediği anlamına gelir. Ama bunu işaret ettiğin için teşekkürler, konuyu açıklığa kavuşturacağım.
Alexey Kamenskiy

@AlexKey /dev/ptsBir bağlama noktası olduğu için çıkaramayacağınıza inanıyorum . (Ve salt okunur bir dosya sistemi de.)
Brian

1

Her şey sabit disklerden silindikten sonra, çekirdek hala çalışıyor ancak cihaz ve program, komut, vb. Kalmadığından sıkışmış durumda.

İşletim sistemi artık çalışmayacak.

Ve Oli'nin söylediği doğrudur, komut belleğe yüklenir / yürütülür ve siz bu işlemi öldürmeden hiçbir şey durduramaz (tabii ki, eğer öldür komutu hala mevcut ise ^^).


4
Çekirdek neden sıkışıyor? MainMa'nın cevabı aksini öneriyor ve beklediğim şeyi destekliyor.
MvG

4
Programlar sabit sürücüden değil bellekten çalışır. Çekirdek yeniden başlatılıncaya kadar hiçbir şeyin yanlış olduğunu bilemezdi.
phyrfox

Belki de kullandığım kelimeleri değiştirmem gerekiyor, çekirdek aygıtlar, programlar vb. Olmadan "az çok sıkışmış" ve kök konsolun önünde değilseniz kötü şeyler yapamazsınız. Konsol kötü şeyler yapamazsın. Fakat cevabımdaki ifademi yanıltıcı olduğu için değiştireceğim, katılıyorum.
s1mmel

0

Lütfen, sistemde selinux ve selinux'un zorlama modunda olduğunu ve selinux'un politikalarının doğru şekilde kurulduğunu unutmayın; o zaman pek bir şey olmayacak.

Selinux, zorunlu erişim kontrolüdür; bu, birçok şey arasında, kök kullanıcının, sistemi yok etmek için sistemdeki diğer kullanıcılardan daha fazla gücünün olmadığı anlamına gelir.

Selinux çekirdeğe zorlanır; Etrafta dolaşmak için çekirdeği tehlikeye atmanız gerekir.

İyi Selinux politikalarına sahip iyi tasarlanmış bir sistemde, kök sistem üzerinde çok fazla şey yapamaz.

Android'in sonraki revizyonları sadece bu sebepten ötürü Selinux'u zorladı.

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.