CGroups
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Linux Control Groups, या cgroups, लिनक्स कर्नेल की एक विशेषता है जो प्रक्रिया समूहों के बीच CPU, मेमोरी, और डिस्क I/O जैसे सिस्टम संसाधनों का आवंटन, सीमा, और प्राथमिकता निर्धारित करने की अनुमति देती है। ये प्रक्रिया संग्रह के संसाधन उपयोग को प्रबंधित और अलग करने के लिए एक तंत्र प्रदान करते हैं, जो संसाधन सीमा, कार्यभार अलगाव, और विभिन्न प्रक्रिया समूहों के बीच संसाधन प्राथमिकता जैसे उद्देश्यों के लिए लाभकारी है।
cgroups के दो संस्करण हैं: संस्करण 1 और संस्करण 2। दोनों को एक सिस्टम पर एक साथ उपयोग किया जा सकता है। मुख्य अंतर यह है कि cgroups संस्करण 2 एक हाइरार्किकल, पेड़ जैसी संरचना पेश करता है, जो प्रक्रिया समूहों के बीच संसाधन वितरण को अधिक सूक्ष्म और विस्तृत बनाता है। इसके अतिरिक्त, संस्करण 2 में विभिन्न सुधार भी शामिल हैं, जैसे:
नई हाइरार्किकल संगठन के अलावा, cgroups संस्करण 2 ने कई अन्य परिवर्तन और सुधार भी पेश किए, जैसे नए संसाधन नियंत्रकों के लिए समर्थन, विरासती अनुप्रयोगों के लिए बेहतर समर्थन, और प्रदर्शन में सुधार।
कुल मिलाकर, cgroups संस्करण 2 में संस्करण 1 की तुलना में अधिक सुविधाएँ और बेहतर प्रदर्शन है, लेकिन बाद वाला अभी भी कुछ परिदृश्यों में उपयोग किया जा सकता है जहाँ पुराने सिस्टम के साथ संगतता एक चिंता है।
आप किसी भी प्रक्रिया के लिए v1 और v2 cgroups को /proc/<pid> में इसके cgroup फ़ाइल को देखकर सूचीबद्ध कर सकते हैं। आप इस कमांड के साथ अपने शेल के cgroups को देखने से शुरू कर सकते हैं:
The output structure is as follows:
Numbers 2–12: cgroups v1, प्रत्येक पंक्ति एक अलग cgroup का प्रतिनिधित्व करती है। इनके लिए नियंत्रक संख्या के बगल में निर्दिष्ट होते हैं।
Number 1: भी cgroups v1 है, लेकिन केवल प्रबंधन उद्देश्यों के लिए (जैसे, systemd द्वारा सेट किया गया), और इसमें कोई नियंत्रक नहीं है।
Number 0: cgroups v2 का प्रतिनिधित्व करता है। कोई नियंत्रक सूचीबद्ध नहीं हैं, और यह पंक्ति केवल उन सिस्टम पर विशेष है जो केवल cgroups v2 चला रहे हैं।
नाम पदानुक्रमात्मक हैं, जो फ़ाइल पथों के समान हैं, विभिन्न cgroups के बीच संरचना और संबंध को इंगित करते हैं।
जैसे नाम /user.slice या /system.slice cgroups की श्रेणीकरण को निर्दिष्ट करते हैं, जिसमें user.slice आमतौर पर systemd द्वारा प्रबंधित लॉगिन सत्रों के लिए और system.slice सिस्टम सेवाओं के लिए होता है।
Filesystem आमतौर पर cgroups तक पहुँचने के लिए उपयोग किया जाता है, जो पारंपरिक रूप से कर्नेल इंटरैक्शन के लिए उपयोग किए जाने वाले Unix सिस्टम कॉल इंटरफेस से भिन्न है। एक शेल के cgroup कॉन्फ़िगरेशन की जांच करने के लिए, किसी को /proc/self/cgroup फ़ाइल की जांच करनी चाहिए, जो शेल के cgroup को प्रकट करती है। फिर, /sys/fs/cgroup (या /sys/fs/cgroup/unified
) निर्देशिका में जाकर और उस निर्देशिका को खोजकर जो cgroup के नाम को साझा करती है, कोई विभिन्न सेटिंग्स और cgroup से संबंधित संसाधन उपयोग जानकारी देख सकता है।
Cgroups के लिए प्रमुख इंटरफ़ेस फ़ाइलें cgroup से पूर्ववर्ती होती हैं। cgroup.procs फ़ाइल, जिसे मानक कमांड जैसे cat के साथ देखा जा सकता है, cgroup के भीतर प्रक्रियाओं की सूची देती है। एक और फ़ाइल, cgroup.threads, थ्रेड जानकारी शामिल करती है।
शेल को प्रबंधित करने वाले cgroups आमतौर पर दो नियंत्रकों को शामिल करते हैं जो मेमोरी उपयोग और प्रक्रिया की संख्या को नियंत्रित करते हैं। एक नियंत्रक के साथ बातचीत करने के लिए, नियंत्रक के पूर्ववर्ती वाली फ़ाइलों को देखा जाना चाहिए। उदाहरण के लिए, pids.current का संदर्भ लिया जाएगा ताकि cgroup में थ्रेड की संख्या का पता लगाया जा सके।
एक मान में max का संकेत cgroup के लिए किसी विशिष्ट सीमा की अनुपस्थिति का सुझाव देता है। हालाँकि, cgroups की पदानुक्रमात्मक प्रकृति के कारण, सीमाएँ निर्देशिका पदानुक्रम में एक निम्न स्तर के cgroup द्वारा लागू की जा सकती हैं।
प्रक्रियाओं को cgroups में उनकी प्रक्रिया आईडी (PID) को cgroup.procs
फ़ाइल में लिखकर सौंपा जाता है। इसके लिए रूट विशेषाधिकार की आवश्यकता होती है। उदाहरण के लिए, एक प्रक्रिया जोड़ने के लिए:
इसी तरह, cgroup विशेषताओं को संशोधित करना, जैसे PID सीमा सेट करना, संबंधित फ़ाइल में इच्छित मान लिखकर किया जाता है। एक cgroup के लिए अधिकतम 3,000 PIDs सेट करने के लिए:
नए cgroups बनाना cgroup पदानुक्रम के भीतर एक नया उपनिर्देशिका बनाने में शामिल है, जो कर्नेल को आवश्यक इंटरफेस फ़ाइलें स्वचालित रूप से उत्पन्न करने के लिए प्रेरित करता है। हालांकि सक्रिय प्रक्रियाओं के बिना cgroups को rmdir
के साथ हटाया जा सकता है, कुछ सीमाओं के प्रति जागरूक रहें:
प्रक्रियाएँ केवल पत्ते cgroups में रखी जा सकती हैं (यानी, पदानुक्रम में सबसे अधिक नेस्टेड वाले)।
एक cgroup में अपने माता-पिता में अनुपस्थित नियंत्रक नहीं हो सकता।
बच्चे cgroups के लिए नियंत्रकों को स्पष्ट रूप से घोषित किया जाना चाहिए cgroup.subtree_control
फ़ाइल में। उदाहरण के लिए, एक बच्चे cgroup में CPU और PID नियंत्रकों को सक्षम करने के लिए:
The root cgroup इन नियमों का एक अपवाद है, जो सीधे प्रक्रिया स्थानांतरण की अनुमति देता है। इसका उपयोग systemd प्रबंधन से प्रक्रियाओं को हटाने के लिए किया जा सकता है।
cgroup के भीतर CPU उपयोग की निगरानी cpu.stat
फ़ाइल के माध्यम से संभव है, जो कुल CPU समय को प्रदर्शित करता है, जो सेवा के उप-प्रक्रियाओं के बीच उपयोग को ट्रैक करने में सहायक है:
Book: How Linux Works, 3rd Edition: What Every Superuser Should Know By Brian Ward
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)