এই নিবন্ধটি sandboxfs
এ স্যান্ডবক্সিং, স্যান্ডবক্সএফ ইনস্টল করা এবং আপনার স্যান্ডবক্সিং পরিবেশকে ডিবাগিং কভার করে।
স্যান্ডবক্সিং হল একটি অনুমতি সীমাবদ্ধ করার কৌশল যা একে অপরের থেকে বা একটি সিস্টেমের সংস্থান থেকে প্রক্রিয়াগুলিকে বিচ্ছিন্ন করে। Bazel এর জন্য, এর অর্থ ফাইল সিস্টেম অ্যাক্সেস সীমাবদ্ধ করা।
Bazel এর ফাইল সিস্টেম স্যান্ডবক্স একটি কার্যকরী ডিরেক্টরিতে প্রসেস চালায় যাতে শুধুমাত্র পরিচিত ইনপুট থাকে, যেমন কম্পাইলার এবং অন্যান্য সরঞ্জামগুলি সোর্স ফাইলগুলি দেখতে পায় না, যদি না তারা তাদের কাছে যাওয়ার সম্পূর্ণ পথ না জানে।
স্যান্ডবক্সিং কোনোভাবেই হোস্ট পরিবেশকে আড়াল করে না। প্রক্রিয়াগুলি ফাইল সিস্টেমের সমস্ত ফাইল অবাধে অ্যাক্সেস করতে পারে। যাইহোক, ব্যবহারকারীর নামস্থান সমর্থন করে এমন প্ল্যাটফর্মগুলিতে, প্রসেসগুলি তাদের কার্যকারী ডিরেক্টরির বাইরে কোনো ফাইল পরিবর্তন করতে পারে না। এটি নিশ্চিত করে যে বিল্ড গ্রাফটিতে লুকানো নির্ভরতা নেই যা বিল্ডের পুনরুত্পাদনযোগ্যতাকে প্রভাবিত করতে পারে।
আরও বিশেষভাবে, Bazel প্রতিটি কর্মের জন্য একটি execroot/
ডিরেক্টরি তৈরি করে, যা সম্পাদনের সময় কর্মের কাজের ডিরেক্টরি হিসাবে কাজ করে। execroot/
সমস্ত ইনপুট ফাইল ধারণ করে এবং যেকোন উৎপন্ন আউটপুটগুলির জন্য ধারক হিসাবে কাজ করে। ব্যাজেল তখন একটি অপারেটিং-সিস্টেম-প্রদত্ত কৌশল ব্যবহার করে, লিনাক্সে কন্টেনার এবং ম্যাকওএস-এ sandbox-exec
, execroot/
এর মধ্যে ক্রিয়াকে সীমাবদ্ধ করতে।
স্যান্ডবক্সিং জন্য কারণ
অ্যাকশন স্যান্ডবক্সিং ছাড়া, ব্যাজেল জানে না যে কোনও টুল অঘোষিত ইনপুট ফাইল ব্যবহার করে কিনা (ফাইলগুলি যেগুলি কোনও অ্যাকশনের নির্ভরতাগুলিতে স্পষ্টভাবে তালিকাভুক্ত নয়)। যখন একটি অঘোষিত ইনপুট ফাইল পরিবর্তিত হয়, তখনও Bazel বিশ্বাস করে যে বিল্ডটি আপ-টু-ডেট এবং ক্রিয়াটি পুনর্নির্মাণ করবে না। এর ফলে একটি ভুল ইনক্রিমেন্টাল বিল্ড হতে পারে।
ক্যাশে এন্ট্রিগুলির ভুল পুনঃব্যবহার দূরবর্তী ক্যাশিংয়ের সময় সমস্যা তৈরি করে। একটি ভাগ করা ক্যাশে একটি খারাপ ক্যাশে এন্ট্রি প্রকল্পের প্রতিটি বিকাশকারীকে প্রভাবিত করে এবং সম্পূর্ণ দূরবর্তী ক্যাশে মুছে ফেলা একটি সম্ভাব্য সমাধান নয়।
স্যান্ডবক্সিং রিমোট এক্সিকিউশনের আচরণকে অনুকরণ করে — যদি কোনও বিল্ড স্যান্ডবক্সিংয়ের সাথে ভাল কাজ করে, তবে এটি সম্ভবত দূরবর্তী সম্পাদনের সাথেও কাজ করবে। রিমোট এক্সিকিউশন করে সমস্ত প্রয়োজনীয় ফাইল (স্থানীয় সরঞ্জাম সহ) আপলোড করে, আপনি যখনই একটি নতুন কম্পাইলার চেষ্টা করতে চান বা পরিবর্তন করতে চান তখন ক্লাস্টারের প্রতিটি মেশিনে সরঞ্জামগুলি ইনস্টল করার তুলনায় কম্পাইল ক্লাস্টারগুলির জন্য রক্ষণাবেক্ষণ খরচ উল্লেখযোগ্যভাবে হ্রাস করতে পারেন। একটি বিদ্যমান টুলে।
কি স্যান্ডবক্স কৌশল ব্যবহার করতে হবে
আপনি কোন ধরনের স্যান্ডবক্সিং ব্যবহার করবেন তা বেছে নিতে পারেন, যদি থাকে, কৌশল পতাকা সহ। sandboxed
কৌশল ব্যবহার করে Bazel নীচে তালিকাভুক্ত স্যান্ডবক্স বাস্তবায়নের একটি বেছে নেয়, কম হারমেটিক জেনেরিকের থেকে একটি OS-নির্দিষ্ট স্যান্ডবক্স পছন্দ করে। যদি আপনি --worker_sandboxing
পতাকাটি পাস করেন তবে অবিরাম কর্মীরা একটি জেনেরিক স্যান্ডবক্সে দৌড়ায়।
local
(ওরফে standalone
) কৌশল কোনো ধরনের স্যান্ডবক্সিং করে না। এটি আপনার ওয়ার্কস্পেসের execroot এ সেট করা ওয়ার্কিং ডিরেক্টরির সাথে অ্যাকশনের কমান্ড লাইনটি সহজভাবে চালায়।
processwrapper-sandbox
হল একটি স্যান্ডবক্সিং কৌশল যার জন্য কোনো "উন্নত" বৈশিষ্ট্যের প্রয়োজন নেই - এটি বাক্সের বাইরে যেকোনো POSIX সিস্টেমে কাজ করা উচিত। এটি একটি স্যান্ডবক্স ডিরেক্টরি তৈরি করে যার মধ্যে সিমলিঙ্ক রয়েছে যা মূল উৎস ফাইলের দিকে নির্দেশ করে, এক্সিক্রুট-এর পরিবর্তে এই ডিরেক্টরিতে সেট করা ওয়ার্কিং ডিরেক্টরির সাথে অ্যাকশনের কমান্ড লাইনটি কার্যকর করে, তারপর পরিচিত আউটপুট আর্টিফ্যাক্টগুলিকে স্যান্ডবক্স থেকে এক্সিক্রোট-এ সরিয়ে দেয় এবং মুছে দেয়। স্যান্ডবক্স এটি দুর্ঘটনাক্রমে ঘোষিত নয় এমন কোনো ইনপুট ফাইল ব্যবহার করা থেকে এবং অজানা আউটপুট ফাইলগুলির সাথে execroot-এ লিটারিং থেকে অ্যাকশনটিকে বাধা দেয়।
linux-sandbox
এক ধাপ এগিয়ে যায় এবং processwrapper-sandbox
উপরে তৈরি করে। ডকার হুডের নিচে যা করে তার অনুরূপ, এটি হোস্ট থেকে অ্যাকশনকে আলাদা করতে লিনাক্স নেমস্পেস (ইউজার, মাউন্ট, পিআইডি, নেটওয়ার্ক এবং আইপিসি নেমস্পেস) ব্যবহার করে। অর্থাৎ, এটি স্যান্ডবক্স ডিরেক্টরি ব্যতীত সমগ্র ফাইল সিস্টেমকে শুধুমাত্র পঠনযোগ্য করে তোলে, তাই অ্যাকশনটি ভুলবশত হোস্ট ফাইল সিস্টেমে কিছু পরিবর্তন করতে পারে না। এটি দুর্ঘটনাক্রমে আপনার $HOME ডিরেক্টরিটি rm -rf'ing একটি বগি পরীক্ষার মতো পরিস্থিতি প্রতিরোধ করে। ঐচ্ছিকভাবে, আপনি নেটওয়ার্ক অ্যাক্সেস করা থেকে ক্রিয়াটি প্রতিরোধ করতে পারেন। linux-sandbox
PID নেমস্পেস ব্যবহার করে অ্যাকশনটিকে অন্য কোনো প্রসেস দেখা থেকে বিরত রাখতে এবং সব প্রসেসকে (এমনকি অ্যাকশনের দ্বারা সৃষ্ট ডেমনও) নির্ভরযোগ্যভাবে মেরে ফেলার জন্য।
darwin-sandbox
অনুরূপ, কিন্তু macOS এর জন্য। এটি লিনাক্স স্যান্ডবক্সের মতো মোটামুটি একই অর্জন করতে অ্যাপলের sandbox-exec
টুল ব্যবহার করে।
linux-sandbox
এবং darwin-sandbox
উভয়ই অপারেটিং সিস্টেমগুলির দ্বারা প্রদত্ত প্রক্রিয়াগুলির বিধিনিষেধের কারণে একটি "নেস্টেড" দৃশ্যে কাজ করে না। যেহেতু ডকার তার কন্টেইনার ম্যাজিকের জন্য লিনাক্স নামস্থানও ব্যবহার করে, আপনি ডকার কন্টেইনারের ভিতরে linux-sandbox
সহজে চালাতে পারবেন না, যদি না আপনি docker run --privileged
ব্যবহার করেন। macOS-এ, আপনি এমন একটি প্রক্রিয়ার মধ্যে sandbox-exec
চালাতে পারবেন না যা ইতিমধ্যে স্যান্ডবক্স করা হচ্ছে। এইভাবে, এই ক্ষেত্রে, Bazel স্বয়ংক্রিয়ভাবে processwrapper-sandbox
ব্যবহারে ফিরে আসে।
আপনি যদি একটি বিল্ড ত্রুটি পেতে চান — যেমন দুর্ঘটনাক্রমে কম কঠোর কার্যকরী কৌশল দিয়ে তৈরি না করা — স্পষ্টভাবে এক্সিকিউশন কৌশলগুলির তালিকা পরিবর্তন করুন যা Bazel ব্যবহার করার চেষ্টা করে (উদাহরণস্বরূপ, bazel build --spawn_strategy=worker,linux-sandbox
) .
ডায়নামিক এক্সিকিউশনের জন্য সাধারণত স্থানীয় এক্সিকিউশনের জন্য স্যান্ডবক্সিং প্রয়োজন হয়। অপ্ট আউট করতে, --experimental_local_lockfree_output
পতাকা পাস করুন। গতিশীল মৃত্যুদন্ড নিঃশব্দে স্যান্ডবক্সে অবিরাম কর্মীদের ।
স্যান্ডবক্সিং এর খারাপ দিক
স্যান্ডবক্সিং এর জন্য অতিরিক্ত সেটআপ এবং টিয়ারডাউন খরচ হয়। এই খরচ কত বড় তা বিল্ডের আকৃতি এবং হোস্ট ওএসের কার্যকারিতা সহ অনেকগুলি কারণের উপর নির্ভর করে। লিনাক্সের জন্য, স্যান্ডবক্সযুক্ত বিল্ডগুলি খুব কমই কয়েক শতাংশের বেশি ধীর হয়।
--reuse_sandbox_directories
সেটআপ সেটআপ এবং টিয়ারডাউন খরচ কমাতে পারে।স্যান্ডবক্সিং টুলটিতে থাকা যেকোনো ক্যাশে কার্যকরভাবে নিষ্ক্রিয় করে। আপনি দুর্বল স্যান্ডবক্স গ্যারান্টির খরচে অবিরাম কর্মীদের ব্যবহার করে এটি প্রশমিত করতে পারেন।
মাল্টিপ্লেক্স কর্মীদের স্যান্ডবক্স করার জন্য স্পষ্ট কর্মী সমর্থন প্রয়োজন। যে শ্রমিকরা মাল্টিপ্লেক্স স্যান্ডবক্সিং সমর্থন করে না তারা গতিশীল নির্বাহের অধীনে একক কর্মী হিসাবে কাজ করে, যার জন্য অতিরিক্ত মেমরি খরচ হতে পারে।
স্যান্ডবক্স
sandboxfs
হল একটি FUSE ফাইল সিস্টেম যা সময়ের জরিমানা ছাড়াই অন্তর্নিহিত ফাইল সিস্টেমের একটি নির্বিচারে দৃশ্য প্রকাশ করে। ব্যাজেল হাজার হাজার সিস্টেম কল ইস্যু করার খরচ এড়িয়ে প্রতিটি অ্যাকশনের জন্য তাত্ক্ষণিকভাবে sandboxfs
execroot/
তৈরি করতে স্যান্ডবক্সএফ ব্যবহার করে। মনে রাখবেন যে execroot/
মধ্যে আরও I/O FUSE ওভারহেডের কারণে ধীর হতে পারে।
স্যান্ডবক্সএফ ইনস্টল করুন
স্যান্ডবক্সএফ ইনস্টল করতে এবং এটির সাথে একটি sandboxfs
বিল্ড সম্পাদন করতে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন:
ডাউনলোড করুন
sandboxfs
ডাউনলোড এবং ইনস্টল করুন যাতে sandboxfs
বাইনারি আপনার PATH
এ শেষ হয়।
sandboxfs
চালান
- (শুধুমাত্র macOS) OSXFUSE ইনস্টল করুন ।
(শুধুমাত্র macOS) চালান:
sudo sysctl -w vfs.generic.osxfuse.tunables.allow_other=1
স্যান্ডবক্সফের মাধ্যমে মূল macOS সিস্টেম পরিষেবাগুলি কাজ করে তা নিশ্চিত করতে আপনাকে ইনস্টলেশনের পরে এবং প্রতিটি রিবুটের পরে এটি করতে হবে।
--experimental_use_sandboxfs
সাথে একটি Bazel বিল্ড চালান।bazel build target --experimental_use_sandboxfs
সমস্যা সমাধান
আপনি যদি darwin-sandbox
বা linux-sandbox
পরিবর্তে local
দেখেন যেগুলি সম্পাদিত ক্রিয়াগুলির জন্য একটি টীকা হিসাবে, এর অর্থ হতে পারে যে স্যান্ডবক্সিং অক্ষম করা হয়েছে৷ পাস --genrule_strategy=sandboxed --spawn_strategy=sandboxed
এটি সক্রিয় করতে।
ডিবাগিং
স্যান্ডবক্সিং সংক্রান্ত সমস্যাগুলি ডিবাগ করতে নীচের কৌশলগুলি অনুসরণ করুন৷
নিষ্ক্রিয় নামস্থান
কিছু প্ল্যাটফর্মে, যেমন গুগল কুবারনেটস ইঞ্জিন ক্লাস্টার নোড বা ডেবিয়ান, নিরাপত্তার কারণে ব্যবহারকারীর নামস্থান ডিফল্টরূপে নিষ্ক্রিয় করা হয়। যদি /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
for genrules, এবং --spawn_strategy=local
দিয়ে স্যান্ডবক্স নিষ্ক্রিয় করার চেষ্টা করুন। --spawn_strategy=local
।
বিল্ড ব্যর্থতার জন্য বিস্তারিত ডিবাগিং
আপনার বিল্ড ব্যর্থ হলে, স্যান্ডবক্স সেট আপ করে এমন অংশ সহ আপনার বিল্ড ব্যর্থ হলে এটি চালানোর সঠিক কমান্ডটি Bazel তৈরি করতে --verbose_failures
এবং --sandbox_debug
ব্যবহার করুন।
উদাহরণ ত্রুটি বার্তা:
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 তৈরি করেছে এবং এটি কীভাবে আচরণ করে তা দেখতে আবার কমান্ডটি চালান।
মনে রাখবেন যে আপনি যখন --sandbox_debug
ব্যবহার করেন তখন Bazel স্যান্ডবক্স ডিরেক্টরি মুছে দেয় না। আপনি সক্রিয়ভাবে ডিবাগিং না করলে, আপনার --sandbox_debug
নিষ্ক্রিয় করা উচিত কারণ এটি সময়ের সাথে সাথে আপনার ডিস্ক পূরণ করে।