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

80

Ubuntu'da bu komutu denemedim (belli sebeplerden dolayı) bu yüzden Ubuntu'nun idam edilmesine izin verip vermeyeceğinden emin değilim. Ama herşeyi silmekle ünlüdür. Sadece meraktan dolayı, çekirdek ve /bin silindiğinde ne olur? % Co_de% çalışma zamanı yığınını nasıl korur? % Co_de% dosya sistemi ile iletişim kurmayı ve silme işlemini nasıl tamamlar? Donanım ile nasıl iletişim kurar?

    
sordu Muye 02.04.2015 10:13

6 cevap

76

/bin/rm öğesinin silinmesi önemli değil. Sadece bir kez çalıştırılıyor ve bu noktaya kadar hepsi belleğe yüklenir, çünkü silmeyi dosya sistemine ve diske göndermeye devam etmek için gereken her şey vardır.

Kenar Çubuğu / Güncelleme: David Hoelzer'in cevabı (ve yorumlarda belirtilen) başına, inode, /bin/rm işaretini işaret etmek için kullanılan hardlink rm 'nın (Linux açık bir durumda olduğu için) bitmesini bekleyecektir. ancak bu durumun alakasız olduğu; diskin durumu hiç önemli değil.

İkili çalıştırılmadan önce belleğe yüklenir. % Co_de% disk verilerini manuel olarak imha etseniz bile, silme işleminin tamamlanmasını etkilemez veya durdurmaz (diski başka bir şekilde kullanamazsınız).

Bir inode veya hardlink'in ne olduğu hakkında bir fikriniz yok mu? Çalıştığım cevap budur.

Yine de, bu durum, current çekirdeğinin paketini bilgisayar patlamasız da silebilmeniz de budur. Farklı bir sürüm kurduğunuz sürece, önyükleme yapabilir.

Yine, bu rm 'nin yalnızca bir kez çağrıldığından çalışmaktadır. Aşağıdakiler, rm ölümünden sonra olur başarısız olur çünkü her dosya adı için bir kez çağırır:

find / -exec rm {} \;

Bununla birlikte, /bin/rm ve find / -exec rm -rf {} + 'nin de her ikisi de, her ikisi de bağımsız değişkenlere sahip oldukları için başarısız olabilir. Bu, tekrar çağrılmadan önce yalnızca birkaç dosyayı silecekleri anlamına gelir. Yolculuk boyunca bir noktada, dosyaların geri kalanı silinmeden önce find / -print0 | xargs -0 rm -rf 'nin süresinin dolması ( ve yayınlanabilir) olabilir. Yine de garanti edilmez. Girilen son dizin /bin/rm ise, bu yöntemler çalışabilir .

    
verilen cevap Oli 02.04.2015 10:26
54
  

Ubuntu'da bu komutu denemedim (belli sebeplerden dolayı) bu yüzden Ubuntu'nun infazına izin verip vermeyeceğinden emin değilim.

Yaptım. Ayrıca, rm -rf / --no-preserve-root doğrudan makine üzerinde açılan bir kök oturumunda çalışıyordu; ayrıca, diğer bir makineden de ssh yoluyla, kök hesabı kullanılarak da bağlandım.

Olan şey şu gibi çok mesajlaşmaya başlamanızdır:

  

rm: '/ ...' kaldıramaz: İşlem izin verilmiyor

veya

  

rm: '/ ...' öğesini kaldıramaz: Cihaz veya kaynak meşgul

Şaşırtıcı şekilde, işlemin sonuna kadar ssh bağlantı açık kaldı. Sadece bağlantıyı kapattığımda ve bir hata oluştuğunu tekrar açmaya çalıştığımda:

  

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

Makinede dört dizin kalır:

  • /dev . Bu, cihaz dosyalarının saklandığı yerdir.
  • /proc -in-bellek dosya sistemi.
  • /run , daemonlar için standart bir dosya sistemi konumu.
  • /sys . Bu, sistem ve bileşenleri hakkında bilgi almanızı sağlar.

Bunun anlamı, orada fazla bir şey kalmaması ve fazla bir şey olmaması. % Co_de% olamaz ( Sekme kullanılırken, dizinlerin ve dosyaların adları hala görüntülenir). Farklı dizinlerde ls ve ayrıca cd öğe de kullanabilirsiniz, ancak echo gibi komutlar artık mevcut değildir.

cat yok.

sudo ve shutdown -h now de kayboldu, bu nedenle tek seçeneğiniz makineyi manuel olarak kapatıyor. Oturum kapatma ( reboot ), güzel bir "çıkış" metni gösterse bile çalışmaz.

makineyi yeniden deneyin sonra

Eğer güzel bir grub hatası 15 ile sunulan ve daha sonra, hiçbir şey hangi Eğer exit sisteminize kötü bir şey yapmış olabileceğini düşünerek başlayabilir işaret olur.

Bunu da yapabilirsin

Hayır, bekle, makinende yapma!

Bunun yerine yapabileceğiniz bir sanal makine çalıştırmaktır. VM'lerin, deney yapmayı gerçekten kolay bir yararı vardır. Eğer Ubuntu kullanıyorsanız olduğundan, vmbuilder tarafından ilginizi çekebilir. Bu, sanal makineleri birkaç dakika içinde dağıtmanıza izin veren bir araçtır (resmi belgeler yaklaşık bir dakika içinde yapılabileceğini iddia eder), ancak hızlı donanımda bile gerçek zaman iki üç dakika kadardır. .

Dağıtım sona erdikten sonra, oynayabileceğiniz bir ortama sahip olursunuz. Onu yok edersen, farketmez: makineyi tekrar konuşlandırırsın ve iki dakika sonra devam edebilirsin.

Eğer VMWare gibi yazılımı kullanıyorsanız

Ayrıca ilginizi çekebilir anlık (serbest VMWare Player bu özelliği yoktur unutmayın, siz VMware Workstation satın gerekir). Hyper-V'nin ücretsiz olduğunu ve anlık görüntüleri desteklediğini (ancak Windows'u çalıştırmanız gerektiğini) unutmayın.

Anlık görüntülerin yararı, bir milisaniye cinsinden alabilmenizdir. Anlık görüntüye geri dönme daha uzun sürer, ancak genellikle birkaç saniyedir. Bu, denemeyi 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 başvuru aldınız mı? Bir VM'de test edin; eğer bir virüsse, zarar vermez. Çevreyi etkileyebileceğinden, bir veritabanında bir işlemi test etmek ister misiniz? Bunu bir VM'de test edin.

Ya bunu gerçek olmayan, test edilmemiş bir makinede yaptıysanız?

Kötü şeyler olur. % Co_de% 'un sizi kendinizden koruduğunu unutmayın: rm çalışmaz: rm değerini kullanmanız gerekir. Yine de, aslında, yanlışlıkla, her şeyi kaldırmayı başarırsanız?

rm -rf / sadece dosyaları kaldırır , ancak veriler hala sabit diskinizde var. Bu, daha sonra yeniden kurmanızı mümkün kılar (bu yüzden artık çalışmadığınız zaman, sabit disklerinizi hassas verilerle atmamalısınız).

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

200_success yorumunda yazdığı gibi, eğer akıllı davranırsanız Makineyi yedek bir bilgisayar olmadan da geri alabilirsiniz.Yalnızdaki verileri önemsiyorsanız, rahatsız olmazdım — yedek bir PC ile kurtarmak çok daha kolay.

    
verilen cevap Arseni Mourzenko 02.04.2015 20:06
25

Bunun nedeni, dosya adlandırma katmanı ( ls ile gördüğünüz) gerçekten sadece sizin rahatlığınız içindir. Dosya sistemi sürücüsü ve çekirdek yalnızca inode'un ne olduğunu gösterir. Bir dosya ad ile başvurulduğunda, izinler, diskteki veri blokları, sahip kimliği, grup kimliği ve bağlantı sayısı dahil olmak üzere meta verilerinin tümünü içeren derhal inode'a çevrilir.

Bağlantı sayısı burada gerçekten önemli olan şeydir. Bir UNIX sisteminde bir dosyayı sildiğinizde, gerçek sistem çağrısı unlink 'dir. 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ı) azaltılmasıdır. Dosya sistemi, bağlantı sayısı sıfıra ulaştığında bir dosyanın silineceğini bilir.

Bir dosya rm tarafından silindiğinde, dizin dosyasını da düzenler (evet, bu dosya adı ve bu kod için önemli olmayan diğer bitlere ek olarak inode içeren bir dosyadır). Bununla birlikte, aslında disk kaynaklarını serbest bırakan bağlantıyı kaldırır.

Bu, diğer bazı ilginç etkilere yol açar. İlk olarak, bağlantı sayısı sıfır olan bir dosyanın açık olması mümkündür. % Co_de% rm -rf / için girişi siler. Dosya açık (bunun için bir dosya tanıtıcısı var) ancak inode işaretli olarak işaretlendi (bağlantı sayısı = 0). Disk kaynakları dosya tanıtıcısı kapanana kadar serbest bırakılmayacak ve yeniden kullanılmayacaktır.

Başka bir ilginç etki, sıfırdan büyük bir bağlantı sayısı olan bir inode'unuz olduğunda, ancak dosya adlandırma katmanında kendisine işaret eden hiçbir şey olmadığında gerçekleşen şeydir. Bu, bir anlamda, çok iyi saklı bir dosyadır :). Ona erişim sağlamak için, adından ziyade inode numarasıyla başvurmak için bir alt düzey kullanmanız gerekir (çünkü bir tane yoktur) veya bir dizin düzenleyiciyi inode'da bir onaltılık editör kullanarak işaret edecek şekilde düzenleyin.

Bağlantı sayımını sıfıra indirir, ancak yine de inode'da dizin girişini işaretlerseniz, ilginç bir üçüncü etki olur. İstersen deneyimlemek için sana bırakırım. Açıkçası, bu son ikisi, her ikisi de, dosya sisteminin tutarsız bir durumda olmasına yol açıyor.

    
verilen cevap David Hoelzer 02.04.2015 15:08
18

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

rm sadece bir komut değil. % Co_de% dosyasında bulunan bir programdır.

Bu nedenle, çalıştırdığınızda ne olur?

  • diyorsunuz (root olarak) PATH
  • rm -rf / programının örneği, rm ve -rf argümanlarıyla belleğe yüklenir
  • bu argümanlar programına göre / işlemlerini başlatır (herşeyi takılı / bölümden geçirerek ve tekrar eden referansları kaldırarak [teknik özelliklerden dolayı];)])
  • bittiğinde, rm programının örneği kaldırılır
  • bu noktada, bellekte yer alan tek şey daha önce yüklenen programlardır (örneğin Ubuntu'da terminal açık, masaüstü ortamı, çekirdek, sürücüler vb. varsa).
  • eğer başka bir komutu çağırmaya çalışırsanız (Linux durumunda bunu bağımsız bir program yaparsa), PATH konumlarında böyle bir program bulunmadığından başarısız olur (ve PATH konumlarında artık yoktur). Ancak bir kez yüklenen her şey hala çalışır

Nasıl çalıştığını anlayabilmek için ubuntu (Virtualbox'ta), bazı betik ve PHP opcode önbelleği üzerinde LAMP yüklemeyi deneyin, sonra bu kötü komutu çağırın. Şaşırtıcı bir şekilde (eğer yeterince şanslıysanız ve opcode önbelleğiniz php dosyası silme işlemini görmezse) yine de apache web sunucusu aracılığıyla dışarıdan php betiklerine erişebilirsiniz!

PS: bu kötülük komutu, rm 'sini silmeden root olarak çalıştırılsa bile, everything ' dan bazı kernel ayrıcalıklı işlemleri silemez ve sisteminizde dosyalar olarak görünen /proc cihazlarından bazılarını silemez. Aslında, kök, düşündüğümüz kadar güçlü değildir, diğer yandan çekirdek.

PPS: Ayrıca, ikinci bir düşünce olarak, silme girişimi sırasında başka bir işlem tarafından /dev dosyalara sahip olacaksınız.

    
verilen cevap Alexey Kamenskiy 02.04.2015 13:45
1

Her şey harddrivesden silindiğinde, çekirdek hala çalışıyor, ancak hiçbir aygıt ve program, komut, vb. olmadığı için sıkışmış durumda.

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

Ve Oli'nın söylediği doğrudur, komut belleğe yüklenir / yüklenir ve bu işlemi (tabii eğer kill komutu hala mevcut ise) öldürmezseniz hiçbir şey durmaz.

    
verilen cevap s1mmel 02.04.2015 11:35
0

Lütfen, sistem selinux ve selinux zorlama modundaysa ve selinux'un politikalarının uygun şekilde ayarlandığını unutmayın; o zaman hiçbir şey olmayacak.

Selinux zorunlu erişim kontrolüdür, bu da birçok şey arasında, root kullanıcısının gerçekten sistemdeki diğer kullanıcılardan daha fazla sistemi yok etmek için daha fazla güce sahip olmadığı anlamına gelir.

Selinux, çekirdekte zorlanır; Çevresinden geçmek için çekirdeğinizden taviz vermelisiniz.

İyi Selinux politikalarına sahip iyi tasarlanmış bir sistemde, root sistemde fazla bir şey yapamazdı.

Android'in sonraki revizyonları, bu nedenle sadece bu nedenle geçerli olan Selinux'a sahip.

    
verilen cevap Mark Allyn 03.04.2015 04:38

Etiketlerdeki diğer soruları oku