Bagaimana 'rm -rf /' dapat menghapus semua file di sistem?

81

Saya belum mencoba perintah ini di Ubuntu (untuk alasan yang jelas) jadi saya tidak yakin apakah Ubuntu akan mengizinkan pelaksanaannya. Tapi ini terkenal karena menghapus semuanya. Hanya ingin tahu, apa yang terjadi ketika kernel dan /bindihapus? Bagaimana cara rmmenjaga setumpuk run time? Bagaimana cara rmberkomunikasi dengan sistem file dan penghapusan lengkap? Bagaimana cara berkomunikasi dengan perangkat keras?

Muye
sumber
18
rm -rf /tidak menghapus apa pun tanpa --no-preserve-root.
muru
47
Pengalaman pertama saya dengan Linux adalah membuat Ubuntu vm sehingga saya bisa "rm -rf /". Saya sarankan Anda mencoba ini. Ini cukup cepat untuk diatur, itu membuat host Anda aman dan sangat menghibur untuk menonton bagian-bagian berbeda dari OS hancur di depan mata Anda. Sangat memuaskan.
DJMcMayhem
22
Mengingatkan saya pada laporan bug favorit saya: bugzilla.redhat.com/show_bug.cgi?id=1202858 "Hasil yang diharapkan: Squid dihidupkan ulang. Hasil aktual: Semua file dihapus pada mesin."
9
Anda harus membaca Unix Recovery Legend . Selama Anda masih login ke shell, sistem tidak sepenuhnya mati!
200_sukses
2
@gerit saya lakukan . :)
muru

Jawaban:

79

Tidak masalah yang /bin/rmdihapus. Itu hanya dijalankan sekali dan pada titik itu semua dimuat dalam memori, seperti segala sesuatu yang diperlukan untuk terus mengirim penghapusan ke sistem file dan disk.


Bilah Samping / Pembaruan: Per jawaban David Hoelzer (dan disebutkan dalam komentar), inode yang diacu oleh hardlink /bin/rmakan tetap ada sampai rmselesai (karena Linux bertahan dalam keadaan terbuka) tetapi fakta itu tidak relevan; keadaan disk tidak masalah sama sekali.

Biner dimuat ke dalam memori sebelum dijalankan. Bahkan jika Anda dapat secara manual menghancurkan rmdata disk, itu tidak akan mempengaruhi atau menghentikan penghapusan dari menyelesaikan (dengan asumsi Anda tidak membuat disk tidak tersedia).

Tidak tahu apa itu inode atau hardlink? Ini adalah jawaban tempat saya mengerjakannya.


Pokoknya, ini juga mengapa Anda dapat menghapus paket untuk kernel saat ini tanpa menggunakan komputer. Selama Anda menginstal versi yang berbeda, itu akan dapat boot.

Sekali lagi, ini berhasil karena rmhanya dipanggil sekali. Berikut ini akan gagal setelah /bin/rmmati karena memanggilnya sekali untuk setiap nama file:

find / -exec rm {} \;

Yang mengatakan, find / -exec rm -rf {} +dan find / -print0 | xargs -0 rm -rfjuga akan gagal karena keduanya memiliki batas argumen, yang berarti mereka hanya akan menghapus sejumlah file sebelum dipanggil lagi. Di beberapa titik sepanjang perjalanan, /bin/rmdapat kedaluwarsa ( dan akan dirilis) sebelum sisa file dihapus. Itu tidak dijamin. Jika /bin/direktori terakhir dimasukkan, metode ini dapat bekerja.

Oli
sumber
7
Seperti yang dijelaskan oleh @DavidHoelzer, file yang tidak ditautkan tidak perlu berada dalam memori untuk tetap berfungsi. Kernel tahu ada pegangan file yang terbuka, jadi itu menyimpan data file sekitar untuk memenuhi permintaan apa pun (termasuk halaman-in) sampai pegangan terakhir ditutup.
Andrew Medico
4
@ Sayang, tidak, itu tidak akan berhasil, asalkan /bin/rmtidak cukup dekat untuk menjadi yang terakhir di batch terakhir; -exec ... {} +(melarikan diri backslash tidak perlu) masih menghasilkan beberapa eksekusi; bukan satu per file, tetapi satu per batch berdasarkan jumlah argumen yang dapat masuk ke ARG_MAX.
Charles Duffy
6
@ Oli, ini bukan tentang paging; penghitung referensi ditautkan ke inode, bukan entri direktori, dan file yang terbuka menangani dianggap sebagai referensi (sama seperti hard link), mencegah inode dari yang tidak dialokasikan. Ukuran file bukanlah faktor sama sekali, dan ini terjadi bahkan jika tidak ada ruang swap (dengan demikian, tidak ada paging) sama sekali.
Charles Duffy
2
@CharlesDuffy Terlepas dari apakah Anda memiliki ruang swap atau tidak, paging akan digunakan untuk semua file yang dipetakan memori. Itu termasuk semua executable dan library. Sebenarnya kurangnya ruang swap sebenarnya bisa berarti lebih banyak paging terjadi untuk file yang dipetakan memori.
kasperd
2
@CharlesDuffy Ya, ukurannya memang tidak relevan. Memori memetakan file tidak menyebabkan konten file dimuat hingga diakses. Dan memori yang digunakan untuk memuat bagian yang diakses dari file dapat dibebaskan lagi jika diperlukan, setelah itu akan dimuat dari file jika diakses lagi. Jadi file tersebut memang harus tetap berada di sistem file selama dipetakan, dan ini berlaku sama untuk file satu halaman seperti halnya file yang cukup besar untuk menjangkau seluruh ruang alamat. (
Detailnya
57

Saya belum mencoba perintah ini di Ubuntu (untuk alasan yang jelas) jadi saya tidak yakin apakah Ubuntu akan mengizinkan pelaksanaannya.

Aku melakukannya. rm -rf / --no-preserve-rootsedang berjalan di sesi root yang dibuka langsung di mesin, sementara saya juga terhubung melalui sshdari komputer lain, menggunakan akun root juga.

Apa yang terjadi adalah Anda mulai mendapatkan banyak pesan seperti:

rm: tidak dapat menghapus '/ ...': Operasi tidak diizinkan

atau:

rm: tidak dapat menghapus '/ ...': Perangkat atau sumber daya sibuk

masukkan deskripsi gambar di sini

Anehnya, sshkoneksi tetap dibuka hingga akhir operasi. Hanya ketika saya menutup koneksi dan mencoba membukanya kembali, muncul kesalahan:

Baca dari soket gagal: Koneksi diatur ulang oleh rekan

Di mesin, empat direktori tetap:

  • /dev. Di sinilah file perangkat disimpan.
  • /proc—Dalam sistem file memori yang dibuat oleh kernel.
  • /run, lokasi sistem file standar untuk daemon.
  • /sys. Ini memungkinkan Anda untuk mendapatkan informasi tentang sistem dan komponen-komponennya.

Ini berarti tidak banyak yang tersisa, dan tidak banyak yang harus dilakukan di sana. Anda tidak bisa ls(walaupun saat menggunakan Tab, nama direktori dan file masih ditampilkan). Anda bisa cddi direktori yang berbeda, dan juga echobarang-barang, tetapi perintah seperti catitu tidak tersedia lagi.

Juga tidak ada sudo.

shutdown -h nowdan rebootmenghilang juga, jadi satu-satunya pilihan Anda tampaknya mematikan mesin secara manual. Logout ( exit) tidak berfungsi, bahkan jika itu menunjukkan teks "logout" yang bagus.

Setelah Anda mencoba untuk me-reboot mesin, Anda disajikan dengan kesalahan GRUB yang bagus 15, dan kemudian, tidak ada yang terjadi, pada titik mana Anda mungkin mulai berpikir bahwa Anda rmmungkin telah melakukan sesuatu yang buruk pada sistem Anda.

masukkan deskripsi gambar di sini

Anda bisa melakukannya juga

Tidak, tunggu, jangan lakukan itu di mesin Anda!

Yang bisa Anda lakukan adalah menjalankan mesin virtual . VM memiliki manfaat membuat eksperimen sangat mudah. Karena Anda menggunakan Ubuntu, Anda mungkin tertarik dengan vmbuilder . Ini adalah alat yang memungkinkan Anda untuk menggunakan mesin virtual dalam hitungan menit (dokumentasi resmi mengklaim bahwa itu dapat dilakukan "dalam waktu sekitar satu menit", tetapi waktu aktual, bahkan pada perangkat keras yang cepat, adalah sekitar dua-tiga menit. .

Setelah penyebaran berakhir, Anda memiliki lingkungan yang dapat Anda mainkan. Jika Anda akhirnya menghancurkannya, itu tidak masalah: Anda menggunakan mesin lagi, dan dua menit kemudian Anda dapat melanjutkan.

Jika Anda menggunakan perangkat lunak seperti VMWare, Anda mungkin juga tertarik pada snapshots (perhatikan bahwa VMWare Player gratis tidak memiliki fitur ini; Anda harus membeli VMware Workstation). Perhatikan bahwa Hyper-V gratis dan mendukung snapshot (tetapi Anda harus menjalankan Windows).

Manfaat dari snapshot adalah Anda dapat mengambilnya dalam hitungan milidetik. Menggulung kembali ke snapshot membutuhkan waktu lebih lama, tetapi seringkali hanya hitungan detik. Ini membuat eksperimen menjadi lebih mudah dan lebih cepat.

Eksperimen ini tidak terbatas pada sistem operasi itu sendiri. Anda dapat melakukan semua hal yang melibatkan perangkat lunak. Punya aplikasi yang mencurigakan? Uji dalam VM — jika itu virus, tidak akan ada salahnya. Ingin menguji operasi pada basis data, mengingat hal itu dapat memengaruhi lingkungan? Uji dalam VM.

Bagaimana jika Anda melakukannya pada mesin non-tes nyata?

Hal-hal buruk terjadi. Catatan yang rmmelindungi Anda dari diri sendiri: rm -rf /tidak akan berfungsi: Anda harus menggunakan --no-preserve-root. Namun, bagaimana jika Anda benar-benar mencapai, secara tidak sengaja, untuk menghapus semuanya?

rmhanya memutus tautan file , tetapi datanya masih ada, di hard disk Anda. Ini memungkinkan untuk memulihkannya nanti (itulah sebabnya Anda tidak boleh hanya membuang hard disk Anda dengan data sensitif ketika mereka tidak berfungsi lagi).

Ini berarti Anda hanya perlu memiliki PC cadangan dengan penutup hard drive untuk benar-benar memulihkan hampir semua file. Yang penting adalah menghindari menulis apa pun ke hard disk untuk dipulihkan: data yang Anda tulis akan menimpa file yang tidak ditautkan.

Seperti dicatat oleh artikel di komentar 200_success , jika Anda bertindak cerdas, Anda bisa mendapatkan mesin kembali bahkan tanpa PC cadangan. Jika Anda hanya peduli pada data, saya tidak akan repot-repot — memulihkannya dengan PC cadangan jauh lebih mudah.

Arseni Mourzenko
sumber
VirtualBox mendukung snapshot disk.
Nathan Osman
1
Perhatikan bahwa virus sering dirancang untuk mendeteksi VM, jadi saya tidak akan menyarankan proses deteksi virus ini. Sebuah pertanyaan kecil: empat direktori yang tersisa bukan direktori "nyata", kan? Mereka tidak benar-benar di hard drive? Apa yang tertinggal di hard drive setelah menjalankan perintah ini?
raptortech97
2
@ raptortech97 rmtidak benar-benar menghapus hal-hal dari hard drive, itu hanya "membatalkan tautan" (memisahkan) data aktual pada disk dari pohon sistem file, menandainya gratis (sehingga akhirnya akan ditimpa melalui penggunaan komputer normal). Jadi jika Anda, katakanlah, rm -rf ~tidak semua hilang, selama Anda bertindak cepat (misalnya dengan extundelete). Anda dapat menganggapnya sebagai versi yang lebih tidak dapat diandalkan dari folder "dihapus" di kotak surat Anda, Anda bisa mendapatkan barang kembali jika Anda tidak menunggu terlalu lama, tetapi pada akhirnya akan dihapus.
Thomas
@ raptortech97 Di sisi lain, jika karena alasan tertentu Anda tidak menggunakan rmtetapi shred, cukup banyak permainan berakhir, meskipun Anda mungkin akan memiliki waktu untuk menyadari kesalahan dan membatalkan karena merobek-robek membutuhkan waktu lebih lama.
Thomas
5
Direktori yang disimpan kemungkinan besar adalah poin mount dari beberapa bentuk atau lainnya. Dan perintah yang terus bekerja adalah perintah bash builtin, bukan binari yang terpisah. Jadi saat lshilang, for i in /*; do echo $i; doneharusnya bekerja. Dan untuk mengganti catAnda mungkin menggunakan perintah seperti while read i; do echo $i; done < /proc/self/maps.
MvG
25

Alasannya adalah bahwa lapisan penamaan file (apa yang Anda lihat ls) benar-benar hanya untuk kenyamanan Anda. Driver sistem file dan kernel hanya peduli apa inode itu. Ketika file direferensikan oleh nama, itu segera diterjemahkan ke dalam inode yang berisi semua metadata termasuk izin, blok data pada disk, ID pemilik, ID grup dan jumlah tautan.

Hitungan tautan adalah yang paling penting di sini. Ketika Anda menghapus file pada sistem UNIX, panggilan sistem yang sebenarnya adalah unlink. Apa yang terjadi di bawah tenda adalah bahwa jumlah tautan (jumlah nama file dalam lapisan penamaan file) yang menunjuk pada inode itu dikurangi. Sistem file tahu bahwa file dihapus ketika jumlah tautan mencapai nol.

Ketika sebuah file dihapus rmolehnya juga akan mengedit file direktori (ya, itu hanya file yang berisi nama file dan inode di samping beberapa bit lain yang tidak penting untuk jawaban ini). Namun, penghentian tautan itulah yang sebenarnya membebaskan sumber daya disk.

Ini mengarah ke beberapa efek menarik lainnya. Pertama, dimungkinkan untuk membuka file yang jumlah tautannya nol. Ini terjadi ketika rm -rf /menghapus entri untuk /bin/rm. File terbuka (ada pegangan file untuk itu) tetapi inode ditandai dihapus (jumlah tautan = 0). Sumber daya disk tidak akan dirilis dan digunakan kembali sampai file menangani ditutup.

Efek menarik lainnya adalah apa yang terjadi ketika Anda memiliki inode dengan jumlah tautan lebih besar dari nol tetapi tidak ada dalam lapisan penamaan file yang menunjuk ke sana. Ini, dalam arti tertentu, adalah file yang sangat tersembunyi :). Untuk mendapatkan akses ke sana Anda harus menggunakan sesuatu tingkat rendah untuk referensi dengan nomor inode daripada dengan nama (karena tidak ada satu) atau mengedit entri direktori untuk menunjuk pada inode menggunakan hex editor.

Efek menarik ketiga adalah apa yang terjadi jika Anda mengurangi jumlah tautan menjadi nol tetapi tetap mengarahkan entri direktori pada inode. Saya akan menyerahkan kepada Anda untuk bereksperimen jika Anda mau. Namun, yang jelas, kedua terakhir ini menyebabkan sistem file berada dalam kondisi tidak konsisten.

David Hoelzer
sumber
Mencari cara lain, jumlah tautan bukan nol, karena membuka file menambah tautan di dalam / proc.
OrangeDog
@OrangeDog, perilaku ini masih ada bahkan jika procount dilepas.
Charles Duffy
1
@OrangeDog Charles Duffy benar. File menangani di / proc tidak memodifikasi inode, menyesuaikan jumlah tautan.
David Hoelzer
/ proc dan / sys adalah cerminan dari status sistem (kernel) saat ini. Hanya memilih tindakan ke file dan direktori di sana yang benar-benar mengubah status sistem.
CVn
18

Jawaban sebelumnya bagus, tetapi saya ingin menjelaskan satu detail:

rmbukan hanya perintah. Ini adalah program yang ditemukan di PATH.

Karena itu apa yang terjadi ketika Anda mengeksekusi adalah sebagai berikut:

  • Anda memanggil (sebagai root) rm -rf /
  • contoh program rmdimuat dalam memori dengan argumen -rfdan/
  • berdasarkan pada argumen ini program rmmemulai operasinya (melalui semua yang ada di mount / partisi dan secara rekursif menghapus referensi [maaf untuk teknis;)]))
  • setelah selesai, turunan rmprogram diturunkan
  • pada titik ini satu-satunya hal dalam memori adalah program yang dimuat di sana sebelumnya (misalnya bash jika Anda memiliki terminal terbuka di Ubuntu, lingkungan Desktop, kernel, driver dll)
  • jika Anda mencoba memanggil perintah lain (yang dalam kasus Linux menjadikannya program mandiri), itu akan gagal karena tidak ada program seperti itu ditemukan di lokasi PATH (dan lokasi PATH tidak ada lagi). Namun semuanya setelah dimuat akan tetap berjalan

Hanya demi memahami cara kerjanya coba instal LAMP di ubuntu (di Virtualbox), beberapa skrip dan cache opcode PHP, lalu panggil perintah jahat ini. Anehnya (jika Anda cukup beruntung dan cache opcode Anda tidak akan melihat penghapusan file php) Anda masih dapat mengakses skrip php dari luar melalui webserver apache!

PS: perintah jahat ini bahkan dijalankan sebagai root tidak akan menghapus everything, itu tidak dapat menghapus beberapa proses istimewa kernel dari /procdan tidak dapat menghapus beberapa hal dari /devperangkat yang muncul di sistem Anda sebagai file. Sebenarnya, root tidak sekuat yang kita kira, kernel di sisi lain.

PPS: Juga sebagai pemikiran kedua Anda juga akan masih memiliki file yang lockedoleh proses lain pada saat upaya penghapusan.

Alexey Kamenskiy
sumber
Di Linux, Anda tentu dapat menghapus simpul perangkat saat dijalankan sebagai root. Tapi ya, Anda tidak dapat menghapus apa pun /prockarena ini adalah sistem file read-only. Demikian juga untuk /sys. Saya yakin Anda juga tidak bisa menghapus poin mount.
Brian
@AlexKey Saya sarankan mengedit untuk memperjelas apa yang Anda maksud dengan "perintah tertanam non-kernel" (atau untuk menghindari frasa itu sama sekali). Kedengarannya seperti Anda mengatakan ada perintah yang dapat Anda jalankan melalui shell yang diimplementasikan langsung di kernel sehingga mereka selalu berfungsi apa pun yang terjadi. (Yaitu, seperti yang mungkin Anda ketahui tetapi banyak pembaca mungkin tidak, tidak demikian: ketika Anda menjalankan perintah seperti cd, ini memanggil shell builtin dengan nama itu - perintah itu dibangun ke dalam shell, bukan kernel.) Apakah Anda berarti Alt + SysRq "perintah"?
Eliah Kagan
@Brian apakah itu tergantung pada distro? Saya bekerja di berbagai distro dan lucu itu terdengar membuat kesalahan ini beberapa kali. Seingat saya setelah memeriksa sisa-sisa dari / masih ada sesuatu di / dev, tapi bisa jadi hal-hal seperti cdrom atau floppy ...
Alexey Kamenskiy
@EliahKagan Ketika saya mencoba untuk tetap distro mandiri, jadi saya menggunakan istilah ini. Ini berarti bahwa tidak pada semua sistem, perintah cli berarti program eksternal. Tapi terima kasih, untuk menunjukkan hal itu, saya akan menjelaskan maksudnya.
Alexey Kamenskiy
@AlexKey Saya yakin Anda tidak akan bisa menghapus /dev/ptskarena ini adalah titik mount. (Dan sistem file read-only, juga.)
Brian
1

Setelah semuanya terhapus dari harddisk, kernel masih berfungsi tetapi agak macet karena tidak ada perangkat dan program, perintah, dll. Yang tersisa.

OS tidak akan berfungsi lagi.

Dan memang benar apa yang dikatakan Oli, perintah akan dimuat / dieksekusi ke dalam memori dan tidak ada yang akan menghentikannya kecuali Anda mematikan proses ini (tentu saja, jika perintah kill masih ada ^^).

s1mmel
sumber
4
Mengapa kernel macet? Jawaban oleh MainMa menyarankan sebaliknya, dan mendukung apa yang saya harapkan.
MvG
4
Program dijalankan dari memori, bukan hard drive. Kernel tidak akan tahu ada yang salah sampai reboot.
phyrfox
Yah mungkin saya perlu mengubah kata-kata yang saya gunakan, kernel lebih atau kurang "macet" tanpa perangkat, program, dll. Dan jika Anda tidak di depan konsol root Anda tidak dapat melakukan hal-hal buruk, heck bahkan pada itu konsol Anda tidak dapat melakukan hal-hal buruk. Tapi saya akan mengubah kata-kata saya dalam jawaban saya karena itu menyesatkan, saya setuju.
s1mmel
0

Perlu diketahui bahwa jika sistem memiliki selinux dan selinux berada dalam mode menegakkan, dan kebijakan selinux diatur dengan benar; maka tidak banyak yang akan terjadi.

Selinux adalah kontrol akses wajib, yang berarti, di antara banyak hal, bahwa pengguna root benar-benar tidak memiliki lebih banyak kekuatan untuk menghancurkan sistem daripada pengguna lain pada sistem.

Selinux diberlakukan di kernel; Anda harus mengkompromikan kernel untuk mengatasinya.

Pada sistem yang dirancang dengan baik dengan kebijakan Selinux yang baik, root tidak akan bisa berbuat banyak pada sistem.

Revisi Android selanjutnya memiliki Selinux menegakkan hanya karena alasan ini.

Mark Allyn
sumber