Linux

為什麼我不能用分叉炸彈使我的系統崩潰?

  • October 5, 2021

最近我一直在探勘有關 GNU/Linux 中程序的資訊,並且遇到了臭名昭著的 fork 炸彈:

:(){ : | :& }; :

理論上,它應該無限複製自己,直到系統耗盡資源……

但是,我已經嘗試在CLI DebianGUI Mint發行版上進行測試,它似乎對系統沒有太大影響。是的,有很多程序被創建,過了一會兒我讀到了控制台消息,比如:

bash:fork:資源暫時不可用

bash:fork:重試:沒有子程序

但一段時間後,所有程序都會被殺死,一切都恢復正常。我已經讀過ulimit為每個使用者設置了最大程序數,但我似乎無法將它提高到很遠。

針對叉形炸彈的系統保護措施是什麼?為什麼它不會自我複制,直到一切都凍結或至少滯後很多?有沒有辦法用叉子炸彈真正使系統崩潰?

您可能有一個使用 systemd 的 Linux 發行版。

Systemd 為每個使用者創建一個 cgroup,一個使用者的所有程序都屬於同一個 cgroup。

Cgroups 是一種 Linux 機制,用於設置系統資源的限制,例如最大程序數、CPU 週期、RAM 使用量等。這是一個不同的、更現代的資源限制層ulimit(它使用getrlimit()系統呼叫)。

如果您執行systemctl status user-<uid>.slice(代表使用者的 cgroup),您可以看到該 cgroup 中允許的目前和最大任務數(程序和執行緒)。

**$ systemctl status user-$UID.slice**
● user-22001.slice - UID 22001 的使用者切片
載入:載入
插入:/usr/lib/systemd/system/user-.slice.d
└─10-defaults.conf
活躍:自 2018 年 9 月 10 日星期一 17:36:35 EEST 起活躍;1 週 3 天前
   **任務:17(限制:10267)**
記憶體:616.7M

預設情況下,systemd 允許每個使用者的最大任務數是“系統範圍最大值”(sysctl kernel.threads-max)的 33%;這通常相當於約 10,000 個任務。如果要更改此限制:

  • 在 systemd v239 及更高版本中,使用者預設設置通過*TasksMax=*在:
/usr/lib/systemd/system/user-.slice.d/10-defaults.conf

要調整特定使用者的限制(將立即應用並儲存在 /etc/systemd/system.control 中),請執行:

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

覆蓋單元設置的常用機制(例如systemctl edit)也可以在此處使用,但它們需要重新啟動。例如,如果您想更改每個使用者的限制,您可以創建/etc/systemd/system/user-.slice.d/15-limits.conf.

  • 在 systemd v238 及更早版本中,使用者預設值是通過UserTasksMax= in設置的/etc/systemd/logind.conf。更改值通常需要重新啟動。

有關此的更多資訊:

引用自:https://unix.stackexchange.com/questions/469950