Korumalı alana alma

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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.