Bu makalede, Bazel'de korumalı alana alma ve korumalı alanlarınızda hata ayıklama konuları ele alınmaktadır. bahsedeceğim.
Korumalı alana alma, işlemleri izole eden bir izin kısıtlama stratejisidir birbirlerinden ya da sistemdeki kaynaklardan gelen kaynaklar olabilir. Bazel için bu, dosyanın sistem erişimi.
Bazel'in dosya sistemi korumalı alanı, işlemleri yalnızca derleyicilerin ve diğer araçların kaynağı görmediği bilinen girişler içerir mutlak yolları bilmedikleri sürece erişmemeleri gereken dosyalara erişebilirler.
Korumalı alan, ana makine ortamını hiçbir şekilde gizlemez. Süreçler özgürce dosya sistemindeki tüm dosyalara erişebilir. Ancak, kullanıcı arayüzünü destekleyen süreçlerin çalışma dizinlerinin dışındaki dosyalarda değişiklik yapamayacağını unutmayın. Böylece, derleme grafiğinde bu sorunları çözebilecek gizli bağımlılıklar derlemenin yeniden üretilebilirliğini etkiler.
Daha açık şekilde belirtmek gerekirse Bazel her işlem için bir execroot/
dizini oluşturur.
Bu dizin, yürütme zamanında işlemin çalışma dizini işlevi görür. execroot/
.
işleme yönelik tüm giriş dosyalarını içerir ve
üretildi. Bunun ardından Bazel, işletim sisteminin sağladığı bir teknik
ve macOS'te sandbox-exec
container'ları kullanarak bu işlemi
execroot/
.
Korumalı alana alma nedenleri
İşlem korumalı alan olmadan Bazel, bir aracın beyan edilmemiş özellikleri kullanıp kullanmadığını bilmez bağımlılıklarında açıkça listelenmeyen dosyalar işlemi). Beyan edilmemiş giriş dosyalarından biri değiştiğinde Bazel yine de , derlemenin güncel olduğunu ve aksiyonu yeniden oluşturmayacağını düşünüyor. Bu yanlış bir artımlı derlemeye neden olur.
Önbellek girişlerinin yanlış yeniden kullanılması, uzaktan önbelleğe alma sırasında sorunlara yol açar. CEVAP paylaşılan bir önbellekteki hatalı önbellek girişi, projedeki her geliştiriciyi etkiler. ve uzak önbelleğin tamamının silinmesi uygun bir çözüm değildir.
Korumalı alana alma, bir derleme iyi çalışıyorsa uzaktan yürütme davranışını taklit eder uzaktan yürütmeyle de çalışır. Yapmak istediğiniz tüm gerekli dosyaları (yerel araçlar dahil) yüklediğinizde, ile kıyaslandığında, derleme kümeleri için bakım maliyetlerini önemli ölçüde araçları kümedeki her makineye yüklemeniz gerekse yeni bir derleyici denemek veya mevcut araçta değişiklik yapmak istiyorsanız.
Hangi korumalı alan stratejisi kullanılmalıdır?
strateji işaretleri arasında yer alır. sandboxed
kullanılıyor
stratejisi, Bazel'in aşağıda listelenen korumalı alan uygulamalarından birini seçmesine neden oluyor:
daha az hermetik korumalı alana göre işletim sistemine özel bir korumalı alan tercih edilir.
Geçerseniz kalıcı çalışanlar genel bir korumalı alanda çalışır
--worker_sandboxing
işareti.
local
(diğer adıyla standalone
) stratejisi herhangi bir korumalı alan oluşturmaz.
İşlemin komut satırını, çalışma dizini şu değere ayarlanmış şekilde yürütür:
üst yönetici tarafından desteklenmektedir.
processwrapper-sandbox
, bir korumalı alan stratejisidir ve herhangi bir
"gelişmiş" kullanıma hazır olduğundan, kullanıma hazır tüm POSIX sistemlerinde çalışabilir. Google
orijinal dizine işaret eden sembolik bağlantılardan oluşan bir korumalı alan dizini oluşturur
kaynak dosyalarını kullanarak, işlemin komut satırını, çalışma dizini kümesiyle yürütür
execroot yerine bu dizine ekler ve ardından bilinen çıkış yapılarını taşır
buradan execroot'a geçer ve korumalı alanı siler. Bu,
bildirilmemiş giriş dosyalarının yanlışlıkla kullanılmasından kaynaklanan ve
execroot'u bilinmeyen çıkış dosyalarıyla doldurur.
linux-sandbox
bir adım daha ileri gider ve
processwrapper-sandbox
. Docker, arka planda yaptıklarına benzer şekilde
ana makinenin yaptığı işlem. Diğer bir deyişle, haricindeki dosyalar hariç tüm dosya sisteminin salt okunur
dizin içine alır; böylece işlem yanlışlıkla
ana makine dosya sisteminde görünür. Bu, yanlışlıkla yapılan bir hatalı test gibi durumları önler
$HOME dizininizi -rf'leme hakkında daha fazla bilgi edinin. İsteğe bağlı olarak,
ağa erişirsiniz. linux-sandbox
, işlemi önlemek için PID ad alanlarını kullanır
görmelerini engellemek ve tüm süreçleri (arka plan programlarını bile)
elde edilir).
darwin-sandbox
benzerdir ancak macOS'te kullanılabilir. Apple'ın sandbox-exec
aracını kullanır
aynısını elde etmek için kullanılabilir.
Hem linux-sandbox
hem de darwin-sandbox
, "iç içe yerleştirilmiş" bir öğede çalışmaz
tarafından sağlanan mekanizmalardaki kısıtlamalar nedeniyle
sistemlerdir. Docker, container büyüsü için Linux ad alanlarını da kullandığından
Docker container'ı içinde linux-sandbox
kolayca çalıştırılamaz
docker run --privileged
. sandbox-exec
uygulamasını macOS'te şunun içinde çalıştıramazsınız:
devam eden bir süreçtir. Dolayısıyla, bu durumlarda Bazel
otomatik olarak processwrapper-sandbox
kullanımına döner.
Bir yapı hatası almayı tercih ederseniz (örneğin, yanlışlıkla bir
daha az katı yürütme stratejisi — yürütme listesini açıkça değiştirme
stratejileri (örneğin, bazel build
--spawn_strategy=worker,linux-sandbox
) görebilirsiniz.
Dinamik yürütme genellikle yerel yürütme için korumalı alan gerektirir. Devre dışı bırakmak için:
--experimental_local_lockfree_output
işaretini geçin. Sessizce dinamik yürütme
kalıcı çalışanları korumalı alana alır.
Korumalı alan kullanmanın dezavantajları
Korumalı alan oluşturma, ek kurulum ve sökme maliyetine neden olur. Maliyetin büyüklüğü yapının şekli ve yapısı dahil olmak üzere işletim sistemi performansı kadar iyidir. Linux'ta, korumalı alan derlemeleri nadiren biraz daha yavaş.
--reuse_sandbox_directories
ayarlandığında ve ortadan kaldırma ile ilgili maliyetleri azaltacaktır.Korumalı alan, aracın sahip olabileceği tüm önbelleği etkili bir şekilde devre dışı bırakır. Şunları yapabilirsiniz: kalıcı çalışanları kullanarak daha zayıf korumalı alan garantilerinin maliyeti.
Multiplex çalışanları için açık çalışan desteği gerekir içine alınır. Multiplex korumalı alanını desteklemeyen çalışanlar şu şekilde çalışır: dinamik yürütme altındaki tek yönlü çalışanları zorlanması nedeniyle bu durum fazladan belleğe maliyete neden olabilir.
Hata ayıklama
Korumalı alan kullanımıyla ilgili sorunları ayıklamak için aşağıdaki stratejileri uygulayın.
Devre dışı ad alanları
Bazı platformlarda
Google Kubernetes Engine
kullanıcı ad alanları, aşağıdaki nedenlerden dolayı varsayılan olarak devre dışı bırakılır:
emin olun. /proc/sys/kernel/unprivileged_userns_clone
dosyası
varsa ve 0 değerini içeriyorsa aşağıdaki komutu çalıştırarak kullanıcı ad alanlarını etkinleştirebilirsiniz:
sudo sysctl kernel.unprivileged_userns_clone=1
Kural yürütme hataları
Korumalı alan, sistem kurulumu nedeniyle kuralları yürütemeyebilir. Bir
namespace-sandbox.c:633: execvp(argv[0], argv): No such file or
directory
gibi bir mesaj alırsanız, --strategy=Genrule=local
içeren korumalı alanı, şunun için devre dışı bırakmayı deneyin:
genrules ve diğer kurallar için --spawn_strategy=local
.
Derleme hataları için ayrıntılı hata ayıklama
Derlemeniz başarısız olduysa --verbose_failures
ve --sandbox_debug
kullanarak
Bazel, derlemeniz başarısız olduğunda çalıştırdığı komutu tamamen
bir şablondur.
Örnek hata mesajı:
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)
Artık oluşturulan korumalı alan dizinini inceleyebilir ve Bazel'in hangi dosyaları komutunu çalıştırın ve nasıl davrandığını görmek için komutu tekrar çalıştırın.
--sandbox_debug
Etkin bir şekilde hata ayıklama işlemi gerçekleştirmiyorsanız
--sandbox_debug
zaman içinde diskinizi doldurduğu için.