Korumalı alana alma

Sorun bildirin Kaynağı göster Gece · 7,4 , 7.3 · 7,2 · 7,1 · 7,0 · 6,5

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

  1. (yalnızca macOS) OSXFUSE'i yükleyin.
  2. (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.

  3. --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.