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 /bin
dihapus? Bagaimana cara rm
menjaga setumpuk run time? Bagaimana cara rm
berkomunikasi dengan sistem file dan penghapusan lengkap? Bagaimana cara berkomunikasi dengan perangkat keras?
kernel
filesystem
rm
Muye
sumber
sumber
rm -rf /
tidak menghapus apa pun tanpa--no-preserve-root
.Jawaban:
Tidak masalah yang
/bin/rm
dihapus. 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/rm
akan tetap ada sampairm
selesai (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
rm
data 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
rm
hanya dipanggil sekali. Berikut ini akan gagal setelah/bin/rm
mati karena memanggilnya sekali untuk setiap nama file:Yang mengatakan,
find / -exec rm -rf {} +
danfind / -print0 | xargs -0 rm -rf
juga akan gagal karena keduanya memiliki batas argumen, yang berarti mereka hanya akan menghapus sejumlah file sebelum dipanggil lagi. Di beberapa titik sepanjang perjalanan,/bin/rm
dapat kedaluwarsa ( dan akan dirilis) sebelum sisa file dihapus. Itu tidak dijamin. Jika/bin/
direktori terakhir dimasukkan, metode ini dapat bekerja.sumber
/bin/rm
tidak 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.Aku melakukannya.
rm -rf / --no-preserve-root
sedang berjalan di sesi root yang dibuka langsung di mesin, sementara saya juga terhubung melaluissh
dari komputer lain, menggunakan akun root juga.Apa yang terjadi adalah Anda mulai mendapatkan banyak pesan seperti:
atau:
Anehnya,
ssh
koneksi tetap dibuka hingga akhir operasi. Hanya ketika saya menutup koneksi dan mencoba membukanya kembali, muncul kesalahan: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 bisacd
di direktori yang berbeda, dan jugaecho
barang-barang, tetapi perintah seperticat
itu tidak tersedia lagi.Juga tidak ada
sudo
.shutdown -h now
danreboot
menghilang 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
rm
mungkin telah melakukan sesuatu yang buruk pada sistem Anda.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
rm
melindungi 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?rm
hanya 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.
sumber
rm
tidak 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 denganextundelete
). 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.rm
tetapishred
, cukup banyak permainan berakhir, meskipun Anda mungkin akan memiliki waktu untuk menyadari kesalahan dan membatalkan karena merobek-robek membutuhkan waktu lebih lama.ls
hilang,for i in /*; do echo $i; done
harusnya bekerja. Dan untuk mengganticat
Anda mungkin menggunakan perintah sepertiwhile read i; do echo $i; done < /proc/self/maps
.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
rm
olehnya 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.
sumber
Jawaban sebelumnya bagus, tetapi saya ingin menjelaskan satu detail:
rm
bukan hanya perintah. Ini adalah program yang ditemukan diPATH
.Karena itu apa yang terjadi ketika Anda mengeksekusi adalah sebagai berikut:
rm -rf /
rm
dimuat dalam memori dengan argumen-rf
dan/
rm
memulai operasinya (melalui semua yang ada di mount / partisi dan secara rekursif menghapus referensi [maaf untuk teknis;)]))rm
program diturunkanHanya 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/proc
dan tidak dapat menghapus beberapa hal dari/dev
perangkat 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
locked
oleh proses lain pada saat upaya penghapusan.sumber
/proc
karena ini adalah sistem file read-only. Demikian juga untuk/sys
. Saya yakin Anda juga tidak bisa menghapus poin mount.cd
, ini memanggil shell builtin dengan nama itu - perintah itu dibangun ke dalam shell, bukan kernel.) Apakah Anda berarti Alt + SysRq "perintah"?/dev/pts
karena ini adalah titik mount. (Dan sistem file read-only, juga.)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 ^^).
sumber
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.
sumber