Bu makalede, Bazel'de korumalı alan, sandboxfs
'ü yükleme ve korumalı alan ortamınızda hata ayıklama ele alınmaktadır.
Korumalı alan, işlemleri birbirinden veya sistemdeki kaynaklardan ayıran bir izin kısıtlama stratejisidir. Bazel için bu, dosya sistemine erişimi kısıtlamak anlamına gelir.
Bazel'in dosya sistemi korumalı alanı, yalnızca bilinen girişleri içeren bir çalışma dizininde işlemleri yürütür. Böylece derleyiciler ve diğer araçlar, mutlak yollarını bilmedikleri sürece erişmeleri gerekmeyen kaynak dosyalarını görmez.
Korumalı alan, ana makine ortamını hiçbir şekilde gizlemez. İşlemler, dosya sistemindeki tüm dosyalara özgürce erişebilir. Ancak kullanıcı ad alanını destekleyen platformlarda işlemler, çalışma dizinlerinin dışındaki dosyaları değiştiremez. 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ı alan kullanmanın 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 durum, yanlış bir artımlı derlemeyle sonuçlanabilir.
Önbellek girişlerinin yanlış yeniden kullanılması, uzaktan önbelleğe alma sırasında sorunlara yol açar. Ortak bir önbelleğe eklenen bozuk bir önbelleğe girişi projedeki her geliştiriciyi etkiler ve uzak önbelleğin tamamını silmek uygun bir çözüm değildir.
Korumalı alan, uzaktan yürütme davranışını taklit eder. Bir derleme korumalı alanda iyi çalışıyorsa uzaktan yürütmeyle de büyük olasılıkla çalışır. Uzak yürütme işlemini gerekli tüm dosyaları (yerel araçlar dahil) yükleyecek şekilde ayarlayarak, yeni bir derleyiciyi denemek veya mevcut bir araçta değişiklik yapmak istediğinizde araçları kümedeki her makineye yüklemek zorunda kalmak yerine derleme kümelerinin bakım maliyetlerini önemli ölçüde azaltabilirsiniz.
Kullanılacak korumalı alan stratejisi
Strateji işaretlerini kullanarak, varsa hangi tür korumalı alan kullanılacağını seçebilirsiniz. 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.
--worker_sandboxing
işaretini gönderirseniz kalıcı çalışanlar genel bir korumalı alanda çalışır.
local
(diğer adıyla standalone
) stratejisi herhangi bir tür korumalı alan kullanmaz.
Bu işlev, çalışma dizini çalışma alanınızın execroot olarak ayarlandığı şekilde işlemin komut satırını yürütür.
processwrapper-sandbox
, herhangi bir "gelişmiş" özellik gerektirmeyen bir korumalı alan stratejisidir. Hazır olarak herhangi bir POSIX sisteminde çalışmalıdır. 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, işlemin yanlışlıkla tanımlanmamış giriş dosyalarını kullanmasını ve execroot'u bilinmeyen çıkış dosyalarıyla doldurmasını önler.
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. Dilerseniz işlemin ağa erişmesini de engelleyebilirsiniz. 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
, macOS için benzer bir uygulamadır. Linux korumalı alanıyla yaklaşık olarak aynı sonucu elde etmek için Apple'ın sandbox-exec
aracını kullanır.
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. Bu nedenle, Bazel bu durumlarda otomatik olarak processwrapper-sandbox
kullanmaya geri 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. Kapsam dışında kalmak için --experimental_local_lockfree_output
işaretini iletin. Dinamik yürütme, kalıcı çalışanları sessizce korumalı alana yerleştirir.
Korumalı alan kullanmanın dezavantajları
Korumalı alan, ek kurulum ve kaldırma maliyeti gerektirir. Bu maliyetin büyüklüğü, derlemenin şekli ve ana makine işletim sisteminin performansı gibi birçok faktöre bağlıdır. Linux için korumalı alan derlemeleri nadiren birkaç yüzdeden daha yavaştır.
--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. Bu sorunu, kalıcı çalışanlar kullanarak azaltabilirsiniz. Bununla birlikte, korumalı alan garantileri daha zayıf olur.
Çoklu çalışanlar, korumalı alana yerleştirilmek için açık çalışan desteği gerektirir. Çoklu korumalı alan desteği sunmayan çalışanlar, dinamik yürütme altında tek kanallı çalışanlar olarak çalışır. Bu durum ek bellek kullanımına neden olabilir.
sandboxfs
sandboxfs
, temel dosya sisteminin zaman cezası olmadan keyfi bir görünümünü sunan bir FUSE dosya sistemidir. Bazel, her işlem için execroot/
'ı anında oluşturmak amacıyla sandboxfs
'ten yararlanarak binlerce sistem çağrısı yapma maliyetini önler. execroot/
içindeki diğer G/Ç işlemlerinin, FUSE yükü nedeniyle daha yavaş olabileceğini unutmayın.
sandboxfs'yi yükleme
sandboxfs
'ü yüklemek ve bu sürümle Bazel derlemesi yapmak için aşağıdaki adımları uygulayın:
İndir
sandboxfs
ikili dosyası PATH
'ınıza eklensin diye sandboxfs
'yi indirip yükleyin.
Çalıştır sandboxfs
- (yalnızca macOS) OSXFUSE'i yükleyin.
(Yalnızca macOS) Şunu çalıştırın:
sudo sysctl -w vfs.generic.osxfuse.tunables.allow_other=1
Bunu kurulumdan sonra ve her yeniden başlatma sonrasında yapmanız gerekir; temel macOS sistem hizmetleri korumalı alanlarla çalışır.
--experimental_use_sandboxfs
ile Bazel derlemesi çalıştırın.bazel build target --experimental_use_sandboxfs
Sorun giderme
darwin-sandbox
yerine local
veya linux-sandbox
yerine
ek açıklamasına izin veriyorsa, bu, korumalı alana alma işleminin
devre dışı bırakıldı. Etkinleştirmek için --genrule_strategy=sandboxed --spawn_strategy=sandboxed
değerini iletin.
Hata ayıklama
Korumalı alanla ilgili sorunları gidermek için aşağıdaki stratejileri uygulayın.
Devre dışı bırakılan 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 içeriyorsa aşağıdaki komutu çalıştırarak kullanıcı ad alanı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 Bazel'in, derlemeniz başarısız olduğunda çalıştırılan tam komutu (korumalı alanı ayarlayan bölüm dahil) göstermesi için --verbose_failures
ve --sandbox_debug
simgesini kullanın.
Ö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.
Bazel, --sandbox_debug
kullanıldığında korumalı alan dizinini silmediğini unutmayın. Etkin bir şekilde hata ayıklamadığınız sürece --sandbox_debug
'ü devre dışı bırakmanız gerekir. Aksi takdirde, diskiniz zaman içinde dolar.