Ders 05 / 09
Konteyner Çalışma Zamanı
Yaygın altı düzenekli demet 12, sıkı sekiz düzenekli demet 10 olgu bırakıyor: iki düzenek eklemek yüzeyi yalnız 2 olgu daraltıyor ve açık eksen dördüncü düzenekten sonra 7'de duruyor.
İçindekiler
Dört ders dört düzenek ailesini tek tek ölçtü: ad alanı görünürlüğü, denetim grubu tüketimi, yetenek kırpma ayrıcalığı, zorunlu etiket erişimi daralttı. Her biri kendi ekseninde bir şey açık bıraktı ve her birinin yanına bir daraltma yolu yazıldı. Gerçek bir sistemde ise bu düzenekler tek tek açılmaz. Bir program bir tanım dosyası okur, dosyada yazan bütün düzenekleri doğru sırayla uygular ve süreci başlatır. O programın adı konteyner çalışma zamanıdır.
Bu ders çalışma zamanını bir düzenek demeti olarak ele alır ve tek soruyu sorar: düzenek eklemek yüzeyi ne kadar daraltıyor. Konteyner imajı, katman modeli, yerleşim, ölçekleme ve orkestrasyon DevOps müfredatının Konteynerler ve Konteyner Orkestrasyonu kurslarında ölçüldü; tekrarlanmaz. Buradaki konu yalnız çekirdeğin sunduğu parçalar ve bir çalışma zamanının onları nasıl bir araya getirdiğidir.
Çalışma Zamanı Ne Yapar
Çalışma zamanı bir dizin ile bir tanım dosyasından oluşan demeti girdi alır. Dizin sürecin kök dosya ağacıdır; tanım dosyası hangi düzeneklerin hangi ayarlarla açılacağını yazar. Çalışma zamanı bu dosyayı yorumlar, çekirdek çağrılarına çevirir ve süreci başlatır. Yaptığı iş bundan ibarettir: yeni bir izolasyon türü icat etmez, var olanları sırayla uygular.
# ornek calisma zamani tanimi (kisaltilmis , alan adlari ornektir)
# — calistirilmamistir
surec:
komut: /usr/local/bin/olcum-toplayici
kimlik: 10001
yetenek-tavani: [CAP_NET_BIND_SERVICE]
yeni-ayricalik-yok: evet
erisim-etiketi: sistem_u:sistem_r:olcum_t:s0
kok:
yol: kok-agaci
salt-okunur: evet
takmalar:
- hedef: /veri/olcum
secenekler: [rw, nosuid, nodev, noexec]
ad-alanlari: [surec, takma, ag, makine, kullanici, iletisim, denetim-grubu]
kimlik-eslemesi:
- icerideki: 0
disaridaki: 100000
boy: 65536
denetim-grubu:
yol: /olcum.slice/olcum-toplayici
islemci-kotasi: 20000/100000
bellek-tavani: 536870912
Tanımdaki her satır önceki dört dersten birine karşılık geliyor. Alan adları belirtime göre değişir ve döküm çalıştırılmamıştır; buradan hiçbir sayı iddiası çıkmaz.
Sıra bağlayıcıdır ve yanlış sıra sessiz bir açık bırakır. Kullanıcı ad alanı en başta açılır, çünkü yetkisiz bir kullanıcının öteki türleri açabilmesini sağlayan tek tür odur ve kimlik eşlemesi kapanmadan yazılmalıdır. Denetim grubu süreç başlatılmadan önce hazırlanır, yoksa ilk saniyeler sınırsız geçer. Kök ağacı, süreç kendi takma ad alanına geçtikten sonra değiştirilir; önce değiştirilirse makinenin takma listesi kirlenir. Yetenek kırpma ile yeni ayrıcalık yok bayrağı ise en sona, program değiştirmeden hemen öncesine bırakılır; erken yapılırsa hazırlık adımları başarısız olur, geç yapılırsa kırpma hiç uygulanmaz.
# ornek dokum — calistirilmamistir $ calisma-zamani create olcum-01 --bundle ./demet $ calisma-zamani start olcum-01 $ calisma-zamani state olcum-01 $ calisma-zamani kill olcum-01 TERM $ calisma-zamani delete olcum-01
Yaşam döngüsü beş adımdır ve oluşturma ile başlatma ayrıdır. Oluşturma bütün düzenekleri kurar ve süreci başlatmadan bekletir; başlatma yalnız beklemeyi sonlandırır. Ayrımın nedeni işletmedir: bütün izolasyon kurulduktan sonra, süreç henüz tek bir komut çalıştırmadan yapılandırmanın doğrulanmasına imkân verir.
Çalışma zamanının kendisi de bir süreçtir ve düzenekleri kurabilmek için yetkiye ihtiyaç duyar. İki işletim biçimi vardır. Yetkili biçimde çalışma zamanı ayrıcalıklı bir hizmet olarak koşar, bütün düzenekleri doğrudan açar ve kurduğu izolasyonun dışında kalır. Yetkisiz biçimde ise zincir kullanıcı ad alanıyla başlar: çalışma zamanı önce bir kullanıcı ad alanı açar, kimlik eşlemesini yazar ve öteki düzenekleri o ad alanının içinden kurar. İkinci biçim bu kursun ölçüsünde ek bir olgu kapatmaz, ama bir kusur durumunda etkinin kapsamını daraltır — çünkü çalışma zamanının kendi yetkileri de eşlemenin sınırındadır.
Demetin dışında kalan bir sınır da açıkça yazılmalıdır. Bütün bu düzenekler tek bir çekirdeği paylaşır; çalışma zamanı süreçleri birbirinden ayırır, çekirdeği çoğaltmaz. Ayrı bir çekirdek isteniyorsa gereken şey başka bir teknoloji sınıfıdır ve bu kursun konusu değildir. Ölçünün son bölümünde çekirdek ekseninin neden kapanmadığı da tam bu paylaşımdan gelir.
İki Demet
- IZ31 — Yaygın demet altı düzenektir: süreç, takma, ağ ve makine ad alanları, denetim grubu, yetenek kırpma. Kullanıcı ad alanı ve zorunlu etiket bu demette yoktur.
- IZ32 — Sıkı demet sekiz düzenektir: yaygın demete kullanıcı ad alanı ve zorunlu etiket eklenir.
- IZ33 — Demetler yalnız düzenek listesi bakımından farklıdır; olgu kümesi, eksenler ve açık kalan olgular ortak tanımdakiyle aynıdır.
- IZ34 — Model sekiz düzenek sayar. Gerçek bir çalışma zamanının uyguladığı sistem çağrısı süzgeci ve süreç dosya sisteminin bazı yollarını maskeleme adımı modelde düzenek olarak sayılmaz; ikisi de aşağıda daraltma yolu olarak yazılır.
"""Ortak tanim: izolasyon bir suzgectir. Bir konteyner calisma zamani duzeneklerin bir DEMETIDIR. Olculen sey ACIK KALAN YUZEY.""" OLGULAR = [ ("oteki-sureclerin-listesi", "surec"), ("kendi-surec-numarasi", "surec"), ("ata-surec-zinciri", "surec"), ("kok-dosya-agaci", "takma"), ("oteki-takmalar", "takma"), ("paylasilan-gecici-dizin", "takma"), ("makine-arayuzleri", "ag"), ("makine-yonlendirme-tablosu", "ag"), ("dinleyen-baglanti-noktalari", "ag"), ("kullanici-kimlik-esleme", "kullanici"), ("dosya-sahipligi", "kullanici"), ("makine-adi", "makine"), ("islemci-payi", "kaynak"), ("bellek-siniri", "kaynak"), ("kullanilan-bellek", "kaynak"), ("islemci-sayisi", "kaynak"), ("cekirdek-surumu", "cekirdek"), ("cekirdek-ayarlari", "cekirdek"), ("sistem-yuku", "cekirdek"), ("saat", "cekirdek"), ("yetenek-kumesi", "yetki"), ("dosya-yetkileri", "yetki"), ("erisim-etiketi", "etiket"), ("politika-kurallari", "etiket"), ] DUZENEK = { "surec-ad-alani": {"eksen": "surec", "acik_kalan": ["kendi-surec-numarasi"]}, "takma-ad-alani": {"eksen": "takma", "acik_kalan": ["kok-dosya-agaci"]}, "ag-ad-alani": {"eksen": "ag", "acik_kalan": []}, "kullanici-ad-alani": {"eksen": "kullanici", "acik_kalan": ["dosya-sahipligi"]}, "makine-ad-alani": {"eksen": "makine", "acik_kalan": []}, "denetim-grubu": {"eksen": "kaynak", "acik_kalan": ["islemci-sayisi"]}, "yetenek-kirpma": {"eksen": "yetki", "acik_kalan": ["dosya-yetkileri"]}, "zorunlu-etiket": {"eksen": "etiket", "acik_kalan": ["erisim-etiketi"]}, } YAYGIN = ["surec-ad-alani", "takma-ad-alani", "ag-ad-alani", "makine-ad-alani", "denetim-grubu", "yetenek-kirpma"] SIKI = YAYGIN + ["kullanici-ad-alani", "zorunlu-etiket"] def gorunen(duzenekler, olgular=None): olgular = OLGULAR if olgular is None else olgular kapali = set() for d in duzenekler: v = DUZENEK[d] kapali |= {o for o, e in olgular if e == v["eksen"]} kapali -= set(v["acik_kalan"]) return [o for o, _ in olgular if o not in kapali] def acik_eksen(duzenekler, olgular=None): olgular = OLGULAR if olgular is None else olgular g = set(gorunen(duzenekler, olgular)) return sorted({e for o, e in olgular if o in g}) print("KAHIN olgu:", len(OLGULAR), "| eksen:", len({e for _, e in OLGULAR})) print() print("demet duzenek kapatti gorunen acik eksen") for ad, d in (("yalin", []), ("yaygin", YAYGIN), ("siki", SIKI)): g = gorunen(d) print(f" {ad:8s} {len(d):7d} {len(OLGULAR) - len(g):7d}" f" {len(g):7d} {len(acik_eksen(d)):10d}") print() print("iki demetin farki:", [d for d in SIKI if d not in YAYGIN]) print("fark ettigi olgu :", sorted(set(gorunen(YAYGIN)) - set(gorunen(SIKI)))) print("iki duzenek yuzeyi", len(gorunen(YAYGIN)) - len(gorunen(SIKI)), "olgu daraltiyor")
KAHIN olgu: 24 | eksen: 9 demet duzenek kapatti gorunen acik eksen yalin 0 0 24 9 yaygin 6 12 12 7 siki 8 14 10 7 iki demetin farki: ['kullanici-ad-alani', 'zorunlu-etiket'] fark ettigi olgu : ['kullanici-kimlik-esleme', 'politika-kurallari'] iki duzenek yuzeyi 2 olgu daraltiyor
Üç sayı yan yana duruyor. Kâhin: 24 olgu, 9 eksen. İzolasyon: yaygın demet 12 olgu, sıkı demet 14 olgu kapatıyor. Açık kalan yüzey: yaygın demette 12 olgu, sıkı demette 10 olgu; ikisinde de 7 eksen.
Bu, kursun ikinci iddiasının en güçlü ödemesidir. Yaygın demetten sıkı demete geçmek düzenek
sayısını üçte bir büyütüyor, iki ayrı mekanizma ekliyor, yapılandırmayı ve işletim yükünü
belirgin biçimde artırıyor — ve yüzeyi yalnız 2 olgu daraltıyor. Daralan olgular
kullanici-kimlik-esleme ile politika-kurallaridır. Açık eksen ise hiç değişmiyor.
Sonuç, iki düzeneğin değersiz olduğu anlamına gelmez ve öyle okunmamalıdır. Kullanıcı ad alanı kimlik eşlemesini kapatarak yetkilerin kapsamını daraltır; zorunlu etiket, önceki derste sayıldığı gibi 36 erişim çiftinden 28’ini politikaya bağlar. Ölçü bunları saymıyor; ölçü yalnız görünürlüğü sayıyor. Söylediği şey dar ve nettir: görünürlük tarafında ikisinin kazancı iki olgudur.
Ölçünün pratikteki kullanımı da buradan çıkar. Bir demeti sıkılaştırmaya karar verirken sorulacak soru “kaç düzenek açtım” değil, “hangi olgu hâlâ görünüyor” olmalıdır. Birinci soru yapılandırmanın uzunluğunu ödüllendirir; ikincisi, kazancın nerede bittiğini gösterir. İki demetin arasındaki fark yazıya döküldüğünde yalnız iki satırdır ve bu iki satır, sıkılaştırmanın maliyetiyle birlikte tartılabilir hâle gelir.
Düzenek Eklendikçe
Demetleri uçtan uca karşılaştırmak, kazancın nerede biriktiğini göstermez. Aynı sıkı demet düzenek düzenek kurulduğunda eğri okunabilir hâle gelir.
- IZ35 — Ekleme sırası sıkı demetin listesindeki sıradır.
- IZ36 — Süpürmede eklenen olgu
cekirdek-derleme-secenekleri, çekirdek eksenine aittir; çıkarılansaatde aynı eksendedir.
# --- Onceki blogun uzerine kurulur: OLGULAR, DUZENEK, YAYGIN, SIKI, # gorunen ve acik_eksen oradan gelir. print("duzenek eklendikce (siki demet sirasiyla)") for i in range(len(SIKI) + 1): ekle = SIKI[i - 1] if i else "-" print(f" {i} duzenek ({ekle:18s}) gorunen {len(gorunen(SIKI[:i])):2d}" f" acik eksen {len(acik_eksen(SIKI[:i]))}") print() g = set(gorunen(SIKI)) print("siki demetten sonra acik kalan", len(g), "olgu (eksene gore)") for e in acik_eksen(SIKI): o = [x for x, ek in OLGULAR if ek == e and x in g] print(f" {e:10s} {len(o)} {', '.join(o)}") print() EK = OLGULAR + [("cekirdek-derleme-secenekleri", "cekirdek")] EKSIK = [(o, e) for o, e in OLGULAR if o != "saat"] print("olgu kumesi supurmesi (siki demet uygulanmis halde)") print("kume olgu eksen gorunen acik eksen") for ad, kume in (("temel", OLGULAR), ("+cekirdek-derleme-secenekleri", EK), ("-saat", EKSIK)): print(f" {ad:29s} {len(kume):4d} {len({x for _, x in kume}):5d}" f" {len(gorunen(SIKI, kume)):7d} {len(acik_eksen(SIKI, kume)):10d}")
duzenek eklendikce (siki demet sirasiyla) 0 duzenek (- ) gorunen 24 acik eksen 9 1 duzenek (surec-ad-alani ) gorunen 22 acik eksen 9 2 duzenek (takma-ad-alani ) gorunen 20 acik eksen 9 3 duzenek (ag-ad-alani ) gorunen 17 acik eksen 8 4 duzenek (makine-ad-alani ) gorunen 16 acik eksen 7 5 duzenek (denetim-grubu ) gorunen 13 acik eksen 7 6 duzenek (yetenek-kirpma ) gorunen 12 acik eksen 7 7 duzenek (kullanici-ad-alani) gorunen 11 acik eksen 7 8 duzenek (zorunlu-etiket ) gorunen 10 acik eksen 7 siki demetten sonra acik kalan 10 olgu (eksene gore) cekirdek 4 cekirdek-surumu, cekirdek-ayarlari, sistem-yuku, saat etiket 1 erisim-etiketi kaynak 1 islemci-sayisi kullanici 1 dosya-sahipligi surec 1 kendi-surec-numarasi takma 1 kok-dosya-agaci yetki 1 dosya-yetkileri olgu kumesi supurmesi (siki demet uygulanmis halde) kume olgu eksen gorunen acik eksen temel 24 9 10 7 +cekirdek-derleme-secenekleri 25 9 11 7 -saat 23 9 9 7
Eğrinin biçimi tek başına bir sonuçtur. İlk dört düzenek görünen olguyu 24’ten 16’ya indiriyor: sekiz olgu. Son dört düzenek 16’dan 10’a indiriyor: altı olgu. Açık eksen ise dördüncü düzenekten sonra bir daha hiç değişmiyor — beşinciden sekizinciye kadar dört düzenek eklendi ve eksen sayısı 7’de kaldı.
Nedeni son tabloda yazıyor. Sıkı demetten sonra açık kalan 10 olgunun yedisi, yedi ayrı eksende birer tanedir. Her düzenek kendi ekseninde bir olguyu açık bıraktığı için, o eksen listeden hiçbir zaman düşmez. Yedi eksende her zaman bir şey açık kalıyor ve bu, düzenek eklemekle kapanmıyor. Kursun ikinci iddiası tam olarak budur: düzenek eklemek olguyu azaltır ama ekseni azaltmaz.
Süpürme aynı yapıyı doğruluyor ve önceki derslerden farklı bir sonuç veriyor. Çekirdek eksenine yirmi beşinci olgu eklendiğinde yüzey 10’dan 11’e çıkıyor: ekleme birebir yüzeye yansıyor. Bir olgu çıkarıldığında yüzey 9’a iniyor, ama açık eksen 7’de kalıyor. Fark nereden geliyor — önceki derslerde eklenen olgu kapatılmış bir eksene düşüyordu ve düzenek onu da kapatıyordu; burada eksen kapatılmamıştır.
Kapanmayan Eksen: Çekirdek
Açık kalan 10 olgunun dördü tek bir eksende toplanıyor ve o eksenin adı çekirdektir: çekirdek sürümü, çekirdek ayarları, sistem yükü ve saat. Bunlar sıkı demetteki açık yüzeyin en büyük tek bloğudur ve nedeni modelin bir eksikliği değildir — çekirdek eksenini kapatan hiçbir düzenek yoktur. Ad alanı ikinci bir çekirdek üretmez; makinede tek bir çekirdek vardır ve her süreç onunla konuşur. Bu, izolasyonun en temel sınırıdır ve yapılandırmayla aşılmaz.
Buna karşılık eksen daraltılabilir ve üç yol vardır. Birincisi, çekirdek bilgisini yayınlayan yolların maskelenmesi ya da salt okunur yapılmasıdır: sürecin kök ağacında bu yollar ya hiç görünmez ya da yazılamaz. Bir çalışma zamanının öntanımlı olarak yaptığı iş budur ve modelde düzenek olarak sayılmayan adımlardan biridir. İkincisi, ad alanına göre ayrılabilen çekirdek ayarlarının ayrı ayrı verilmesidir; ayarların hepsi ayrılamaz, ama ayrılabilenler makinenin değerini göstermeyi bırakır. Üçüncüsü, sürecin çekirdeğe yapabileceği çağrı kümesini bir sistem çağrısı süzgeciyle daraltmaktır: süzgeç bir olguyu görünmez kılmaz, ama görünen olgunun karşılığı olan işlemleri azaltır. Üçü de yüzeyi sıfırlamaz; ölçünün dürüst okuması şudur: bu eksende bir şey her zaman görülecektir ve tasarım buna göre yapılır.
Kalan altı olgu için daraltma yolları önceki derslerde yazıldı: kök ağacını küçültmek ve salt
okunur takmak, kotayı okuyup havuz boyutlandırmasını ona bağlamak, sahiplik bayraklarını
temizlemek ve dosya sistemini nosuid ile takmak, sahipliği eşlenen aralığa normalleştirmek,
erişim etiketini gizli bilgi taşımayacak biçimde adlandırmak. Beşi de aynı kalıptadır: açık
kalan olgu süreçte değil, sürecin dünyasında daraltılır.
Özet
- Konteyner çalışma zamanı yeni bir izolasyon türü icat etmez; bir tanım dosyasındaki düzenekleri doğru sırayla uygulayan bir programdır. Sıra bağlayıcıdır ve yanlış sıra sessiz bir açık bırakır.
- Yaygın altı düzenekli demet 12 olgu, sıkı sekiz düzenekli demet 10 olgu açık bırakır:
iki düzenek eklemek yüzeyi yalnız 2 olgu daraltır ve daralan olgular
kullanici-kimlik-eslemeilepolitika-kurallaridır. - Açık eksen dördüncü düzenekten sonra 7’de durur ve dört düzenek daha eklendiğinde hiç değişmez; düzenek eklemek olguyu azaltır, ekseni azaltmaz.
- Sıkı demetten sonra açık kalan 10 olgunun yedisi yedi ayrı eksende birer tanedir; kalan dördü çekirdek eksenindedir ve bu ekseni kapatan hiçbir düzenek yoktur.
- Çekirdek ekseni kapatılamaz ama daraltılır: bilgi yayan yolların maskelenmesi, ad alanına ayrılabilen ayarların ayrı verilmesi ve sistem çağrısı süzgeci. Modeldeki bütün sayılar kurgu üzerinden tam sayımdır, ölçüm değildir.
Sonraki Adım
Bu konu izolasyonun kapatabildiğini ve kapatamadığını saydı; sıkı demet 24 olgunun 14’ünü kapattı, 10’unu açık bıraktı. Kapanan 14 olgunun gerçekten kapandığı ise henüz sınanmadı. Kursun ikinci konusu tam bu soruyu sorar ve yanıtı birinci konunun tersi yöndedir: bir sürecin çekirdekle konuşmasını okuyan, işlemci kullanımını örnekleyen, çekirdek içinde olay yakalayan ve çöken sürecin ardından dökümüne bakan araçlar, izolasyonun kapattığı olguların bir kısmını geri getirir. Sonraki ders bunların ilkini, sistem çağrısı izlemeyi ölçer: kaç olgunun geri geldiğini ve koşuma eklediği bedeli sayar. Kursun iki konusu birbirinin karşıtıdır ve bu açıkça yazılır — gözlem izolasyonu deler.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.