इस लेख में Basel में सैंडबॉक्सिंग, sandboxfs
को इंस्टॉल करने, और डीबग करने के बारे में बताया गया है
आपके सैंडबॉक्सिंग एनवायरमेंट की ज़रूरत नहीं है.
सैंडबॉक्सिंग, अनुमतियों पर पाबंदी लगाने की ऐसी रणनीति है जो प्रोसेस को एक-दूसरे से या सिस्टम में मौजूद संसाधनों से. Basel के लिए, इसका मतलब फ़ाइल को प्रतिबंधित करना है सिस्टम ऐक्सेस.
बेज़ेल का फ़ाइल सिस्टम सैंडबॉक्स एक ऐसी चालू डायरेक्ट्री में प्रोसेस करता है जो सिर्फ़ इसमें ऐसे इनपुट शामिल होते हैं जिनके बारे में पहले से जानकारी मौजूद होती है. इससे कंपाइलर और अन्य टूल, सोर्स ऐसी फ़ाइलें जिन्हें वे ऐक्सेस नहीं कर सकते, जब तक कि उन्हें उनका ऐब्सलूट पाथ न पता हो.
सैंडबॉक्सिंग से, होस्ट एनवायरमेंट किसी भी तरह से छिपा नहीं होता. प्रोसेस, फ़ाइल सिस्टम में मौजूद सभी फ़ाइलों को आसानी से ऐक्सेस कर सकती हैं. हालांकि, ऐसे प्लैटफ़ॉर्म पर जो उपयोगकर्ता नेमस्पेस, प्रोसेस किसी फ़ाइल में बदलाव नहीं कर सकते. इससे यह पक्का होता है कि बिल्ड ग्राफ़ में ऐसी छिपी हुई डिपेंडेंसी न हों जिनसे बिल्ड को फिर से बनाने पर असर पड़ सकता है.
खास तौर पर, Basel हर कार्रवाई के लिए एक execroot/
डायरेक्ट्री बनाता है,
जो एक्ज़ीक्यूशन के समय, ऐक्शन की वर्क डायरेक्ट्री के तौर पर काम करती है. execroot/
इसमें कार्रवाई की सभी इनपुट फ़ाइलें होती हैं. साथ ही, जनरेट किए गए किसी भी आउटपुट के लिए कंटेनर के तौर पर काम करती है. इसके बाद, Basel ऑपरेटिंग सिस्टम से दी गई तकनीक का इस्तेमाल करके,
कंटेनर, Linux पर और macOS पर sandbox-exec
.
execroot/
.
सैंडबॉक्स करने की वजहें
ऐक्शन सैंडबॉक्सिंग के बिना, Basel को पता नहीं चलता कि कोई टूल ऐसे टूल का इस्तेमाल करता है जिसका एलान नहीं किया गया है इनपुट फ़ाइलें (ऐसी फ़ाइलें जो स्पष्ट रूप से किसी ऐक्शन). जब ऐसी किसी इनपुट फ़ाइल में बदलाव होता है जिसका एलान नहीं किया गया है, तो का मानना है कि बिल्ड अप-टू-डेट है और इससे कार्रवाई दोबारा नहीं बनेगी. इससे, इंक्रीमेंटल बिल्ड गलत हो सकता है.
कैश मेमोरी में सेव की गई एंट्री का गलत तरीके से फिर से इस्तेमाल करने पर, रिमोट कैश मेमोरी में समस्याएं पैदा होती हैं. शेयर किए गए कैश मेमोरी में कैश मेमोरी की गलत एंट्री होने पर, प्रोजेक्ट में शामिल हर डेवलपर पर असर पड़ता है. साथ ही, पूरे रिमोट कैश मेमोरी को मिटाना भी एक सही तरीका नहीं है.
सैंडबॉक्सिंग, रिमोट तरीके से ऐप्लिकेशन चलाने के तरीके की नकल करता है — अगर कोई बिल्ड सैंडबॉक्सिंग के साथ अच्छी तरह से काम करता है, तो हो सकता है कि वह रिमोट तरीके से ऐप्लिकेशन चलाने के साथ भी काम करे. रिमोट इक्विज़िक्यूशन की मदद से, सभी ज़रूरी फ़ाइलों (स्थानीय टूल के साथ-साथ) को अपलोड करने पर, कंपाइल क्लस्टर के रखरखाव की लागत को काफ़ी कम किया जा सकता है. ऐसा इसलिए, क्योंकि जब भी आपको कोई नया कंपाइलर आज़माना हो या किसी मौजूदा टूल में बदलाव करना हो, तब आपको क्लस्टर में मौजूद हर मशीन पर टूल इंस्टॉल करने पड़ते हैं.
सैंडबॉक्स की किस रणनीति का इस्तेमाल करना है
अगर किसी सैंडबॉक्स का इस्तेमाल किया जाए, तो
रणनीति के फ़्लैग. sandboxed
का इस्तेमाल करना
रणनीति के तहत, Basel को यहां दिए गए सैंडबॉक्स में से किसी एक इंप्लिमेंटेशन को चुनने में मदद मिलती है,
जो ओएस के हिसाब से बनाए गए सैंडबॉक्स के लिए, कम हर्मेटिक जेनेरिक सैंडबॉक्स को प्राथमिकता देता है.
--worker_sandboxing
फ़्लैग पास करने पर, पर्सिस्टेंट वर्कर्स सामान्य सैंडबॉक्स में चलते हैं.
local
(जिसे standalone
भी कहा जाता है) रणनीति, किसी भी तरह की सैंडबॉक्सिंग नहीं करती.
यह बस कार्रवाई की कमांड लाइन को उस काम करने वाली डायरेक्ट्री पर लागू करता है, जो
आपके फ़ाइल फ़ोल्डर का एक्सक्लूट.
processwrapper-sandbox
एक सैंडबॉक्सिंग रणनीति है, जिसके लिए किसी भी "ऐडवांस" सुविधा की ज़रूरत नहीं होती. यह किसी भी POSIX सिस्टम पर बिना किसी सेटअप के काम करनी चाहिए. यह
यह एक सैंडबॉक्स डायरेक्ट्री बनाता है, जिसमें ओरिजनल सिमलिंक शामिल होते हैं
सोर्स फ़ाइलें, काम करने वाली डायरेक्ट्री सेट के साथ कार्रवाई की कमांड लाइन चलाती हैं
लागू करने के बजाय इस डायरेक्ट्री में जोड़ें. इसके बाद, जाने-पहचाने आउटपुट आर्टफ़ैक्ट को ट्रांसफ़र करें
सैंडबॉक्स के बाहर एक्सक्रूट में जाते हैं और सैंडबॉक्स को मिटा देते हैं. इससे
अनजाने में किसी ऐसी इनपुट फ़ाइल का इस्तेमाल करने से कार्रवाई होनी चाहिए जिसका एलान नहीं किया गया है या
अज्ञात आउटपुट फ़ाइलों से एक्सक्लूट को हटाना.
linux-sandbox
एक कदम आगे बढ़ जाता है और
processwrapper-sandbox
. Docker जिस तरह से हुड के साथ काम करता है उसी तरह यह
Linux नेमस्पेस (उपयोगकर्ता, माउंट, पीआईडी, नेटवर्क, और आईपीसी नेमस्पेस)
कार्रवाई होती है. इसका मतलब है कि पूरे फ़ाइल सिस्टम को सिर्फ़ रीड-ओनली कर देता है
को अनुमति नहीं देते, तो कार्रवाई गलती से
होस्ट फ़ाइल सिस्टम. इससे, गड़बड़ी वाले टेस्ट की वजह से आपकी $HOME डायरेक्ट्री को rm
-rf की मदद से गलती से मिटाने जैसी स्थितियों से बचा जा सकता है. इसके अलावा, आपके पास ऐक्शन को नेटवर्क ऐक्सेस करने से रोकने का विकल्प भी है. linux-sandbox
, कार्रवाई को किसी भी दूसरी प्रोसेस को देखने से रोकने के लिए, पीआईडी नेमस्पेस का इस्तेमाल करता है. साथ ही, आखिर में सभी प्रोसेस (कार्रवाई से पैदा हुए डेमन भी) को भरोसेमंद तरीके से बंद करता है.
darwin-sandbox
समान है, लेकिन macOS के लिए. यह Apple के sandbox-exec
टूल का इस्तेमाल करता है
करीब-करीब Linux सैंडबॉक्स के समान पाने के लिए.
"नेस्ट किए गए" में linux-sandbox
और darwin-sandbox
, दोनों काम नहीं करते
संचालन की ओर से बताए गए तरीके में बताई गई पाबंदियों की वजह से
सिस्टम. क्योंकि Docker अपने कंटेनर मैजिक के लिए Linux नेमस्पेस का भी इस्तेमाल करता है, इसलिए आप
जब तक आप इस्तेमाल न करें, Docker कंटेनर के अंदर linux-sandbox
को आसानी से नहीं चला सकते
docker run --privileged
. macOS पर, sandbox-exec
को ऐसी प्रोसेस में नहीं चलाया जा सकता जिसे पहले से सैंडबॉक्स किया जा रहा है. इसलिए, इन मामलों में Bazel, processwrapper-sandbox
का इस्तेमाल करने के लिए अपने-आप स्विच हो जाता है.
अगर आपको बिल्ड करने में गड़बड़ी का मैसेज चाहिए, जैसे कि गलती से कम सख्त प्रोग्राम चलाने की रणनीति का इस्तेमाल न करना, तो प्रोग्राम चलाने की उन रणनीतियों की सूची में साफ़ तौर पर बदलाव करें जिनका इस्तेमाल Bazel करने की कोशिश करता है. उदाहरण के लिए, bazel build
--spawn_strategy=worker,linux-sandbox
.
डाइनैमिक एक्ज़ीक्यूशन के लिए आम तौर पर लोकल एक्ज़ीक्यूशन के लिए सैंडबॉक्सिंग की ज़रूरत होती है. ऑप्ट आउट करने के लिए,
--experimental_local_lockfree_output
फ़्लैग को पास करें. डाइनैमिक तरीके से लागू होने की सुविधा, पर्सिस्टेंट वर्कर्स को चुपचाप सैंडबॉक्स में डाल देती है.
सैंडबॉक्सिंग की समस्याएं
सैंडबॉक्सिंग के लिए अतिरिक्त सेटअप और टियरडाउन लागत आती है. यह लागत कितनी है यह कई बातों पर निर्भर करता है. जैसे, बिल्ड किस तरह का है और होस्ट OS की परफ़ॉर्मेंस. Linux के लिए, सैंडबॉक्स किए गए बिल्ड कुछ प्रतिशत धीमा हो जाता है.
--reuse_sandbox_directories
सेट करने से, सेटअप और टियरडाउन की लागत कम हो सकती है.सैंडबॉक्सिंग की सुविधा, टूल में मौजूद किसी भी कैश मेमोरी को असरदार तरीके से बंद कर देती है. पर्सिस्टेंट वर्कर्स का इस्तेमाल करके, इस समस्या को कम किया जा सकता है. हालांकि, ऐसा करने पर सैंडबॉक्स की सुरक्षा की गारंटी कम हो जाती है.
मल्टीप्लेक्स वर्कर को सैंडबॉक्स करने के लिए, वर्कर के लिए साफ़ तौर पर सहायता की ज़रूरत होती है. ऐसे वर्कर्स जो मल्टीप्लेक्स सैंडबॉक्सिंग के साथ काम नहीं करते, वे डाइनैमिक तरीके से लागू होने वाले फ़ंक्शन के तहत, सिंगलप्लेक्स वर्कर्स के तौर पर चलते हैं. इससे अतिरिक्त मेमोरी खर्च हो सकती है.
सैंडबॉक्सएफ़
sandboxfs
एक FUSE फ़ाइल सिस्टम है, जो
साथ ही, इसमें बदलाव करने का समय तय नहीं किया गया है. Baज़र, इन कामों के लिए sandboxfs
का इस्तेमाल करता है
हर कार्रवाई के लिए तुरंत execroot/
जनरेट करें. इसमें
हज़ारों सिस्टम कॉल जारी कर रहे हैं. ध्यान दें कि execroot/
में आगे I/O हो सकता है
FUSE ओवरहेड के कारण धीमी होगी.
सैंडबॉक्सएफ़ इंस्टॉल करना
sandboxfs
इंस्टॉल करने और इसके साथ Bazel बिल्ड करने के लिए, यह तरीका अपनाएं:
डाउनलोड करें
डाउनलोड और इंस्टॉल करना
sandboxfs
ताकि sandboxfs
बाइनरी आपके PATH
में खत्म हो जाए.
sandboxfs
चलाएं
- (सिर्फ़ macOS के लिए) OSXFUSE इंस्टॉल करें.
(सिर्फ़ macOS के लिए) यह तरीका अपनाएं:
sudo sysctl -w vfs.generic.osxfuse.tunables.allow_other=1
आपको इंस्टॉल करने के बाद और हर रीबूट के बाद ऐसा करना होगा, ताकि यह पक्का किया जा सके कि macOS की मुख्य सिस्टम सेवाएं, sandboxfs के ज़रिए काम करें.
--experimental_use_sandboxfs
की मदद से Bazel बिल्ड चलाएं.bazel build target --experimental_use_sandboxfs
समस्या हल करने से जुड़ी जानकारी
अगर आपको की गई कार्रवाइयों के लिए, एनोटेशन के तौर पर darwin-sandbox
या linux-sandbox
के बजाय local
दिखता है, तो इसका मतलब है कि सैंडबॉक्सिंग की सुविधा बंद है. इसे चालू करने के लिए, --genrule_strategy=sandboxed --spawn_strategy=sandboxed
पास करें.
डीबग करना
सैंडबॉक्सिंग से जुड़ी समस्याओं को डीबग करने के लिए, यहां दी गई रणनीतियों का पालन करें.
बंद किए गए नेमस्पेस
कुछ प्लैटफ़ॉर्म पर, उपयोगकर्ता नेमस्पेस डिफ़ॉल्ट रूप से बंद रहते हैं. जैसे, Google Kubernetes Engine क्लस्टर नोड या Debian. ऐसा सुरक्षा से जुड़ी समस्याओं की वजह से किया जाता है. अगर /proc/sys/kernel/unprivileged_userns_clone
फ़ाइल मौजूद है और उसमें 0 है, तो उपयोगकर्ता नेमस्पेस चालू करने के लिए, यह तरीका अपनाएं:
sudo sysctl kernel.unprivileged_userns_clone=1
नियम को लागू नहीं किया जा सका
सिस्टम सेटअप की वजह से, सैंडबॉक्स नियमों को लागू नहीं कर पाएगा. अगर आपको
namespace-sandbox.c:633: execvp(argv[0], argv): No such file or
directory
जैसे मैसेज भेजने के लिए, --strategy=Genrule=local
का इस्तेमाल करके सैंडबॉक्स को
सामान्य नियम और अन्य नियमों के लिए --spawn_strategy=local
.
बिल्ड विफलताओं के लिए विस्तृत डीबगिंग
अगर आपका बिल्ड फ़ेल हो गया है, तो --verbose_failures
और --sandbox_debug
का इस्तेमाल करके
Baज़ल, बिल्ड फ़ेल होने पर चलाया गया निर्देश दिखाता है. इसमें, बिल्ड का पार्ट भी शामिल है
जो सैंडबॉक्स सेट अप करता है.
गड़बड़ी के मैसेज का उदाहरण:
ERROR: path/to/your/project/BUILD:1:1: compilation of rule
'//path/to/your/project:all' failed:
Sandboxed execution failed, which may be legitimate (such as a compiler error),
or due to missing dependencies. To enter the sandbox environment for easier
debugging, run the following command in parentheses. On command failure, a bash
shell running inside the sandbox will then automatically be spawned
namespace-sandbox failed: error executing command
(cd /some/path && \
exec env - \
LANG=en_US \
PATH=/some/path/bin:/bin:/usr/bin \
PYTHONPATH=/usr/local/some/path \
/some/path/namespace-sandbox @/sandbox/root/path/this-sandbox-name.params --
/some/path/to/your/some-compiler --some-params some-target)
अब जनरेट की गई सैंडबॉक्स डायरेक्ट्री की जांच की जा सकती है और यह देखा जा सकता है कि Bazel ने कौनसी फ़ाइलें बनाई हैं. साथ ही, यह देखने के लिए कि यह कैसे काम करता है, कमांड को फिर से चलाया जा सकता है.
ध्यान दें कि जब आप उपयोग करते हैं, तो Baze सैंडबॉक्स डायरेक्ट्री को नहीं मिटाता
--sandbox_debug
. जब तक डीबगिंग की जा रही हो, तब तक आपको --sandbox_debug
को बंद रखना चाहिए. ऐसा इसलिए, क्योंकि यह समय के साथ आपकी डिस्क को भर देता है.