GNU/Linux >> Belajar Linux >  >> Linux

Mengapa saya tidak dapat merusak sistem saya dengan fork bomb?

Anda mungkin memiliki distro Linux yang menggunakan systemd.

Systemd membuat grup untuk setiap pengguna, dan semua proses pengguna termasuk dalam grup yang sama.

Cgroups adalah mekanisme Linux untuk menetapkan batasan pada sumber daya sistem seperti jumlah maksimum proses, siklus CPU, penggunaan RAM, dll. Ini adalah lapisan pembatas sumber daya yang berbeda dan lebih modern daripada ulimit (yang menggunakan getrlimit() syscall).

Jika Anda menjalankan systemctl status user-<uid>.slice (yang mewakili cgroup pengguna), Anda dapat melihat jumlah tugas saat ini dan maksimum (proses dan utas) yang diizinkan di dalam cgroup tersebut.

$ systemctl status user-$UID.slice
● user-22001.slice - User Slice of UID 22001
   Loaded: loaded
  Drop-In: /usr/lib/systemd/system/user-.slice.d
           └─10-defaults.conf
   Active: active since Mon 2018-09-10 17:36:35 EEST; 1 weeks 3 days ago
    Tasks: 17 (limit: 10267)
   Memory: 616.7M

Secara default, jumlah maksimum tugas yang diizinkan oleh sistem untuk setiap pengguna adalah 33% dari "maksimum seluruh sistem" (sysctl kernel.threads-max ); ini biasanya berjumlah ~10.000 tugas. Jika Anda ingin mengubah batas ini:

  • Di systemd v239 dan yang lebih baru, default pengguna diatur melalui TasksMax= di:

    /usr/lib/systemd/system/user-.slice.d/10-defaults.conf
    

    Untuk menyesuaikan batas untuk pengguna tertentu (yang akan diterapkan segera serta disimpan di /etc/systemd/system.control), jalankan:

    systemctl [--runtime] set-property user-<uid>.slice TasksMax=<value>
    

    Mekanisme biasa mengesampingkan pengaturan unit (seperti systemctl edit ) dapat digunakan di sini juga, tetapi membutuhkan reboot. Misalnya, jika Anda ingin mengubah batas untuk setiap pengguna, Anda dapat membuat /etc/systemd/system/user-.slice.d/15-limits.conf .

  • Di systemd v238 dan sebelumnya, default pengguna diatur melalui UserTasksMax= di /etc/systemd/logind.conf . Mengubah nilai umumnya memerlukan reboot.

Info lebih lanjut tentang ini:

  • man 5 systemd.resource-control
  • man 5 systemd.slice
  • man 5 logind.conf
  • http://0pointer.de/blog/projects/systemd.html (cari cgroup di halaman ini)
  • man 7 cgroups dan https://www.kernel.org/doc/Documentation/cgroup-v1/pids.txt
  • https://en.wikipedia.org/wiki/Cgroups

Ini tidak akan membuat crash sistem Linux modern lagi.

Ini menciptakan banyak proses tetapi tidak benar-benar membakar banyak CPU saat proses menganggur. Anda kehabisan slot di tabel proses sebelum kehabisan RAM sekarang.

Jika Anda tidak membatasi cgroup seperti yang ditunjukkan Hkoof, perubahan berikut masih membuat sistem down:

:(){ : | :& : | :& }; :

Di tahun 90-an, saya tidak sengaja melepaskan salah satunya pada diri saya sendiri. Saya secara tidak sengaja mengatur bit eksekusi pada file sumber C yang memiliki perintah fork() di dalamnya. Ketika saya mengklik dua kali, csh mencoba menjalankannya daripada membukanya di editor seperti yang saya inginkan.

Meski begitu, itu tidak merusak sistem. Unix cukup kuat sehingga akun Anda dan/atau OS akan memiliki batas proses. Apa yang terjadi malah menjadi sangat lamban, dan apa pun yang perlu memulai proses kemungkinan besar akan gagal.

Apa yang terjadi di balik layar adalah tabel proses terisi dengan proses yang mencoba membuat proses baru. Jika salah satu dari mereka berhenti (baik karena mendapatkan kesalahan pada garpu karena tabel proses penuh, atau karena operator yang putus asa mencoba mengembalikan kewarasan ke sistem mereka), salah satu dari proses lain akan dengan senang hati memotong yang baru untuk diisi. kekosongan.

"Bom fork" pada dasarnya adalah sistem proses perbaikan sendiri yang tidak disengaja dalam misi untuk membuat tabel proses Anda tetap penuh. Satu-satunya cara untuk menghentikannya adalah dengan membunuh mereka sekaligus.


Linux
  1. Mengapa Saya Bisa Masuk Dengan Kata Sandi Sebagian??

  2. Mengapa Saya Dapat Melihat Output Dari Proses Latar Belakang?

  3. Mengapa fungsi kucing saya dengan panggilan sistem lebih lambat dibandingkan dengan kucing Linux?

  1. Mengapa kode ini mogok dengan pengacakan alamat aktif?

  2. Dimana fork() pada fork bomb :(){ :|:&};:?

  3. Mengapa nama pengguna Linux tidak boleh dimulai dengan angka?

  1. Mengelola sumber daya dengan cgroups di systemd

  2. ssh - mengapa saya bisa masuk dengan kata sandi parsial?

  3. Bagaimana saya bisa menggunakan rsync dengan sistem file FAT?