İçeriğe geç
academia.sh

Ders 18 / 22

Disk İmajı Alma

Yazma korumalı kopyalamanın doğrulanabilirlik cinsinden ölçülmesi: 4.096 dilimlik kurgu bir kaynakta seçmeli dizin kopyası 15 kanıt kaleminin 4'ünü, mantıksal kopya 8'ini, bölüm bloğu 13'ünü, tam blok kopyası 15'ini alıyor. Çevrimdışı kopyada kaynak karması yeniden hesaplanabildiği için 15 kalemin 15'i doğrulanıyor; çalışan sistemden alınan kopyada 4.096 dilimin 303'ü değişiyor, üç karma da farklı çıkıyor ve doğrulanan kalem 9'a iniyor.

İçindekiler

Bir önceki ders zinciri kalemin etrafında kurdu ve 28 kalemin altısının disk imajı olduğunu, her birinin modelde 5.400 saniyelik bir toplama süresi taşıdığını yazdı. Zincirin ilk halkası olan toplama adımı orada tek bir kutu olarak geçti. Bu ders o kutuyu açar ve tek bir soru sorar: kopyanın kaynakla aynı olduğunu ne kanıtlıyor.

Soru göründüğünden dar değildir. Karma iki değeri karşılaştırır; karşılaştırmanın anlamlı olması için ikinci değerin hesaplanabiliyor olması gerekir. Kaynak kopyalama boyunca değişmezse karması sonradan yeniden hesaplanır ve imajla karşılaştırılır. Kaynak değişiyorsa karşılaştırılacak sabit bir değer yoktur ve karma yalnız imajı kendisine bağlar. Bu ders üç sayıyı ayrı ayrı çıkarır: kaç kalem karma ile kaynağa bağlanıyor, kısmi kopya kaç kalemi kaçırıyor, kaç kalem kopyalama sırasında değişiyor.

  • AI7. Kaynak, 4.096 dilime bölünmüş 512 GiB’lik bir depolama birimi olarak modellenir. Dilim burada bir ölçüm taneciğidir, dosya sistemi bloğu değildir; gerçek bir depolama birimi okunmuyor.
  • AI8. Yazma korumalı kopyalama düzeneği kaynağa giden yazma isteklerini geçirmez. Kaynak, kopyalama boyunca ve sonrasında değişmez.
  • AI9. Adli imaj, kapsam içindeki bütün dilimlerin sırayla kopyasıdır. Kopyalama hızı 97 MiB/s’dir ve kurgudur.
  • AI10. Bir kopya doğrulanabilirdir ancak kaynağın karması kopyalamadan sonra yeniden hesaplanıp imajın karmasıyla karşılaştırılabiliyorsa.
  • AI11. Çalışan bir sistemde her bölge kendi hızıyla değişir; hız, 1.000 saniyede değişen dilim sayısıdır ve kurgudur.
  • AI12. Bir kanıt kalemi beş ardışık dilime yerleşir; kalem karması o beş dilimin özetlerinden hesaplanır.

Kaynak, Bölge ve Kapsam

// adli/disk.mjs — 512 GiB'lik bir kaynagin dilim modeli, bolgeler ve kanit kalemleri.
// MODELDIR: gercek bir disk okunmuyor, dilim icerigi uretecten geliyor.
import { createHash } from "node:crypto";

export const TOHUM = 20260803, DILIM = 4096, MIB = 128, HIZ = 97;   // dilim 128 MiB, 97 MiB/s
export const SURE = Math.round(DILIM * MIB / HIZ);                  // tam kopyalama suresi (sn)
const uretec = (t) => { let s = t >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; };

// bolge -> [dilim sayisi, 1000 saniyede degisen dilim (calisan sistemde)]
export const BOLGE = {
  "bolum-tablosu": [8, 0], "dosya-sistemi-meta": [240, 9], "etkin-dosya": [2400, 26],
  "dosya-sistemi-gunlugu": [128, 14], "takas-alani": [512, 11],
  "ayrilmamis-alan": [760, 2], "bolum-disi-alan": [48, 0],
};

// Kopyalama kapsami -> hangi bolgeleri aliyor.
export const KAPSAM = {
  "secmeli dizin": ["etkin-dosya"],                        // yalniz secilen dizinler
  "mantiksal kopya": ["etkin-dosya", "dosya-sistemi-meta"],
  "bolum blogu": ["etkin-dosya", "dosya-sistemi-meta", "dosya-sistemi-gunlugu",
    "takas-alani", "ayrilmamis-alan"],
  "tam blok": Object.keys(BOLGE),
};

// kalem -> [bolge, secilen dizinin icinde mi]
export const KALEM = {
  "yapilandirma-dosyasi": ["etkin-dosya", true], "hizmet-tanimi": ["etkin-dosya", true],
  "uygulama-gunlugu": ["etkin-dosya", true], "zamanlanmis-gorev": ["etkin-dosya", true],
  "kullanici-belgesi": ["etkin-dosya", false], "onbellek-dosyasi": ["etkin-dosya", false],
  "silinmis-yukleyici-artigi": ["ayrilmamis-alan", false],
  "silinmis-gunluk-parcasi": ["ayrilmamis-alan", false],
  "gecici-dosya-kalintisi": ["ayrilmamis-alan", false],
  "silinmis-dosya-adi": ["dosya-sistemi-meta", false],
  "zaman-damgasi-kaydi": ["dosya-sistemi-meta", false],
  "gunluk-girdisi": ["dosya-sistemi-gunlugu", false],
  "takas-alanindaki-artik": ["takas-alani", false],
  "bolum-disi-yapilandirma": ["bolum-disi-alan", false],
  "bolum-tablosu-kaydi": ["bolum-tablosu", false],
};

// Dilimler bolge bolge dizilir; her kalem bes ardisik dilime yerlesir.
export function kaynak() {
  const r = uretec(TOHUM), d = [];
  for (const [b, [n]] of Object.entries(BOLGE))
    for (let i = 0; i < n; i += 1)
      d.push({ no: d.length, bolge: b, icerik: `${b}:${i}:${Math.floor(r() * 1e9)}` });
  const kalem = {};
  for (const [ad, [b, secili]] of Object.entries(KALEM)) {
    const bolgeDilim = d.filter((x) => x.bolge === b).map((x) => x.no);
    const bas = Math.floor(r() * (bolgeDilim.length - 5));
    kalem[ad] = { bolge: b, secili, dilim: bolgeDilim.slice(bas, bas + 5) };
  }
  return { dilim: d, kalem };
}

export const ozet = (s) => createHash("sha256").update(s).digest("hex").slice(0, 16);
export const butunKarma = (d) => ozet(d.map((x) => ozet(x.icerik)).join("|"));
export const kalemKarma = (d, k) => ozet(k.dilim.map((n) => ozet(d[n].icerik)).join("|"));
export const kapsanan = (kapsam, ad) => {
  const [b, secili] = KALEM[ad];
  return KAPSAM[kapsam].includes(b) && (kapsam !== "secmeli dizin" || secili);
};

Bölge listesi bu dersin asıl çatısıdır. Bir depolama birimi dosyalardan ibaret değildir: dosya sistemi meta verisi silinmiş dosyaların adını ve zaman damgalarını taşır, ayrılmamış alan silinmiş içeriğin üzerine yazılmamış kalıntısını taşır, takas alanı çalışan süreçlerin belleğinden düşmüş parçaları taşır, bölüm tablosunun dışında kalan alan ise dosya sistemi tarafından hiç görülmez. Kanıt kalemlerinin çoğu bu bölgelerdedir.

Kapsam Kaç Kalemi Kaçırıyor

// adli/kapsam.mjs — kopyalama kapsaminin aldigi dilim, sure ve kacirdigi kalem.
import { kaynak, BOLGE, KAPSAM, KALEM, DILIM, MIB, HIZ, SURE, kapsanan } from "./disk.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const { dilim } = kaynak();
const secmeliPay = 0.35;                            // secilen dizinler etkin dosyalarin %35'i

console.log(`model (tohum 20260803): ${DILIM} dilim x ${MIB} MiB = ` +
  `${DILIM * MIB / 1024} GiB, ${HIZ} MiB/s, tam kopya ${SURE} sn`);
console.log(`${Object.keys(BOLGE).length} bolge, ${Object.keys(KALEM).length} kanit kalemi`);

const A = [-17, 8, 10, 9, 9, 8];
console.log("");
y(A, "kapsam", "dilim", "GiB", "sure sn", "kalem", "kacan");
for (const ad of Object.keys(KAPSAM)) {
  let n = KAPSAM[ad].reduce((a, b) => a + BOLGE[b][0], 0);
  if (ad === "secmeli dizin") n = Math.round(n * secmeliPay);
  const alinan = Object.keys(KALEM).filter((k) => kapsanan(ad, k)).length;
  y(A, ad, n, (n * MIB / 1024).toFixed(1), Math.round(n * MIB / HIZ), alinan,
    Object.keys(KALEM).length - alinan);
}

const B = [-26, -22, 15, 17, 13, 10];
console.log("");
y(B, "kalem", "bolge", "secmeli dizin", "mantiksal kopya", "bolum blogu", "tam blok");
for (const ad of Object.keys(KALEM))
  y(B, ad, KALEM[ad][0], ...Object.keys(KAPSAM).map((k) => (kapsanan(k, ad) ? "var" : "-")));

const kacan = Object.keys(KALEM).filter((k) => !kapsanan("bolum blogu", k));
console.log(`\nbolum blogunun kacirdigi kalem: ${kacan.join(", ")}`);
console.log(`mantiksal kopyanin aldigi dilim ${Math.round((BOLGE["etkin-dosya"][0] +
  BOLGE["dosya-sistemi-meta"][0]) * 100 / dilim.length)}%, aldigi kalem ` +
  `${Object.keys(KALEM).filter((k) => kapsanan("mantiksal kopya", k)).length} / ` +
  `${Object.keys(KALEM).length}`);
model (tohum 20260803): 4096 dilim x 128 MiB = 512 GiB, 97 MiB/s, tam kopya 5405 sn
7 bolge, 15 kanit kalemi

kapsam              dilim       GiB  sure sn    kalem   kacan
secmeli dizin         840     105.0     1108        4      11
mantiksal kopya      2640     330.0     3484        8       7
bolum blogu          4040     505.0     5331       13       2
tam blok             4096     512.0     5405       15       0

kalem                     bolge                   secmeli dizin  mantiksal kopya  bolum blogu  tam blok
yapilandirma-dosyasi      etkin-dosya                       var              var          var       var
hizmet-tanimi             etkin-dosya                       var              var          var       var
uygulama-gunlugu          etkin-dosya                       var              var          var       var
zamanlanmis-gorev         etkin-dosya                       var              var          var       var
kullanici-belgesi         etkin-dosya                         -              var          var       var
onbellek-dosyasi          etkin-dosya                         -              var          var       var
silinmis-yukleyici-artigi ayrilmamis-alan                     -                -          var       var
silinmis-gunluk-parcasi   ayrilmamis-alan                     -                -          var       var
gecici-dosya-kalintisi    ayrilmamis-alan                     -                -          var       var
silinmis-dosya-adi        dosya-sistemi-meta                  -              var          var       var
zaman-damgasi-kaydi       dosya-sistemi-meta                  -              var          var       var
gunluk-girdisi            dosya-sistemi-gunlugu               -                -          var       var
takas-alanindaki-artik    takas-alani                         -                -          var       var
bolum-disi-yapilandirma   bolum-disi-alan                     -                -            -       var
bolum-tablosu-kaydi       bolum-tablosu                       -                -            -       var

bolum blogunun kacirdigi kalem: bolum-disi-yapilandirma, bolum-tablosu-kaydi
mantiksal kopyanin aldigi dilim 64%, aldigi kalem 8 / 15

Kapsam tablosu bir eğri çiziyor ve eğri düz değildir. Seçmeli dizin kopyası kaynağın yüzde yirmisini alıyor ve 15 kalemin dördünü getiriyor. Mantıksal kopya alanı üçe katlıyor, kalem sayısı ikiye katlanıyor. Bölüm bloğu kopyası mantıksal kopyanın üstüne yüzde elli daha alan ekliyor ve kalem sayısını 8’den 13’e çıkarıyor. Son adım en ucuzudur: 56 dilim daha, 74 saniye daha, iki kalem daha.

Bu son adım tablodaki en öğretici satırdır. Bölüm bloğu kopyası kaynağın yüzde 98,6’sını almıştır ve “neredeyse tam” görünür; kaçırdığı iki kalem bölüm tablosu kaydı ile bölüm dışı alandaki yapılandırmadır. Kapsamı oranla ölçen bir karar, kalan yüzde 1,4’ü ihmal edilebilir sayar. Kapsamı kalemle ölçen bir karar, aynı yüzde 1,4’ün iki kalem taşıdığını görür. Kanıt oranla değil kalemle sayılır.

İkinci tablo aynı sonucu kalem kalem gösteriyor. Silinmiş dosya adı ve zaman damgası kaydı meta veridedir; bir dosya kopyalayıcı bunları görür ama silinmiş kaydı okumaz. Silinmiş yükleyici kalıntısı, silinmiş günlük parçası ve geçici dosya kalıntısı ayrılmamış alandadır; hiçbir dosya kopyası bunlara ulaşamaz, çünkü dosya sistemi bu dilimleri artık bir dosyaya bağlamıyor. Kalem sayısına bakıldığında bir dosya kopyası, kanıt kümesinin yarısından çoğunu kapsam dışında bırakıyor.

Çalışan Sistemden Kopya

// adli/canli.mjs — cevrimdisi ve calisan sistemden alinan kopyanin dogrulanabilirligi.
import { kaynak, BOLGE, KALEM, DILIM, SURE, butunKarma, kalemKarma } from "./disk.mjs";

const y = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd());
const { dilim, kalem } = kaynak();
const bas = dilim.map((d) => ({ ...d }));                 // kaynagin kopya baslangicindaki hali
const r = (() => { let s = 20260804 >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; })();

// Cevrimdisi kopya: yazma korumali duzenek kaynagi degistirmiyor.
const cevrimdisi = bas.map((d) => ({ ...d }));
console.log(`cevrimdisi kopya: kaynak karmasi ${butunKarma(bas)}, imaj karmasi ` +
  `${butunKarma(cevrimdisi)}, esit ${butunKarma(bas) === butunKarma(cevrimdisi) ? "evet" : "hayir"}`);

// Calisan sistem: her bolge kendi hiziyla degisiyor, kopyalama dilim dilim ilerliyor.
const son = bas.map((d) => ({ ...d }));
const imaj = bas.map((d) => ({ ...d }));
const kopyaAni = (no) => (no + 1) * SURE / DILIM;
const oncesi = new Set(), sonrasi = new Set();
for (const [b, [n, hiz]] of Object.entries(BOLGE)) {
  const havuz = bas.filter((d) => d.bolge === b).map((d) => d.no);
  for (let e = 0; e < Math.round(hiz * SURE / 1000); e += 1) {
    const no = havuz[Math.floor(r() * n)], t = r() * SURE;
    son[no].icerik += `|yazma${e}`;
    if (t < kopyaAni(no)) { imaj[no].icerik = son[no].icerik; oncesi.add(no); }
    else sonrasi.add(no);
  }
}
for (const no of oncesi) sonrasi.delete(no);

const A = [-22, 9, 10, 16, 17];
console.log("");
y(A, "bolge", "dilim", "degisen", "kopyadan once", "kopyadan sonra");
for (const b of Object.keys(BOLGE)) {
  const h = bas.filter((d) => d.bolge === b).map((d) => d.no);
  y(A, b, h.length, h.filter((n) => son[n].icerik !== bas[n].icerik).length,
    h.filter((n) => oncesi.has(n)).length, h.filter((n) => sonrasi.has(n)).length);
}
const degisen = bas.filter((d, i) => son[i].icerik !== d.icerik).length;
y(A, "toplam", DILIM, degisen, oncesi.size, sonrasi.size);

console.log(`\ncalisan sistem: kopya basindaki kaynak ${butunKarma(bas)}, kopya sonundaki ` +
  `kaynak ${butunKarma(son)}, imaj ${butunKarma(imaj)}`);
console.log(`ucu de farkli; imajin esitlenebilecegi tek bir kaynak hali yok`);

const B = [-26, 16, 16, 12];
console.log("");
y(B, "kalem", "imaj=kopya basi", "imaj=kopya sonu", "dogrulanan");
let temiz = 0, hic = 0;
for (const [ad, k] of Object.entries(kalem)) {
  const a = kalemKarma(imaj, k) === kalemKarma(bas, k);
  const b = kalemKarma(imaj, k) === kalemKarma(son, k);
  if (a && b) temiz += 1;
  else y(B, ad, a ? "evet" : "hayir", b ? "evet" : "hayir", "hayir");
  if (!a && !b) hic += 1;
}
const N = Object.keys(KALEM).length;
console.log(`${N} kalemin ${temiz}'i iki kaynak haliyle de ayni; kopyalama sirasinda ` +
  `${N - temiz} kalem degisti ve bunlarin ${hic}'i hicbir kaynak haliyle esitlenemiyor`);
console.log(`cevrimdisi kopyada dogrulanan kalem ${N}/${N}, calisan sistemde ${temiz}/${N}`);
cevrimdisi kopya: kaynak karmasi 4123262663a3f0a2, imaj karmasi 4123262663a3f0a2, esit evet

bolge                     dilim   degisen   kopyadan once   kopyadan sonra
bolum-tablosu                 8         0               0                0
dosya-sistemi-meta          240        43               4               39
etkin-dosya                2400       139              43               96
dosya-sistemi-gunlugu       128        56              37               19
takas-alani                 512        54              43               11
ayrilmamis-alan             760        11               8                3
bolum-disi-alan              48         0               0                0
toplam                     4096       303             135              168

calisan sistem: kopya basindaki kaynak 4123262663a3f0a2, kopya sonundaki kaynak 76f5df072bc321a6, imaj 1db54a2503e2c78c
ucu de farkli; imajin esitlenebilecegi tek bir kaynak hali yok

kalem                      imaj=kopya basi imaj=kopya sonu  dogrulanan
zamanlanmis-gorev                     evet           hayir       hayir
onbellek-dosyasi                     hayir            evet       hayir
silinmis-dosya-adi                    evet           hayir       hayir
zaman-damgasi-kaydi                   evet           hayir       hayir
gunluk-girdisi                       hayir           hayir       hayir
takas-alanindaki-artik               hayir            evet       hayir
15 kalemin 9'i iki kaynak haliyle de ayni; kopyalama sirasinda 6 kalem degisti ve bunlarin 1'i hicbir kaynak haliyle esitlenemiyor
cevrimdisi kopyada dogrulanan kalem 15/15, calisan sistemde 9/15

İlk satır kopyalamanın kanıt tarafını tek başına taşıyor. Yazma korumalı düzeneğin arkasında kaynak değişmez; kopyalama bittikten sonra kaynağın karması yeniden hesaplanır ve imajınkiyle karşılaştırılır. İki değer eşittir. Kanıtlanan şey imajın kaynağın kopyası olduğudur ve bu, karmanın verebileceği en güçlü ifadedir.

Çalışan sistemde aynı hesap yapılamaz. Kopyalama 5.405 saniye sürüyor ve bu sürede 4.096 dilimin 303’ü değişiyor. Değişimin nerede yoğunlaştığı bölge hızlarını doğrudan yansıtıyor: dosya sistemi günlüğünün 128 diliminin 56’sı, takas alanının 512 diliminin 54’ü, ayrılmamış alanın 760 diliminin yalnız 11’i. Kanıt açısından en değerli bölge olan ayrılmamış alan aynı zamanda en durağan olanıdır; en hareketli bölgeler ise sistemin kendi çalışmasıyla dönen bölgelerdir.

Üç karma da farklı çıkıyor ve bu sonucun tek bir okuması vardır: imajın eşitlenebileceği bir kaynak hali yoktur. İmaj, kopya başındaki kaynak da değildir, kopya sonundaki kaynak da; 135 dilimde yeni içeriği, 168 dilimde eski içeriği taşır. Ortaya çıkan şey hiçbir anda var olmamış bir karışımdır.

Kalem tablosu bunun bedelini sayıyor: 15 kalemin altısı kopyalama sırasında değişiyor, doğrulanan kalem 15’ten 9’a iniyor. Burada bir uyarı gerekir. Modelin “imaj=kopya başı” sütunu gerçek bir incelemede görülemez, çünkü kaynağın kopya başındaki hali artık yoktur. Elde yalnız imajın kendi karması kalır ve o karma imajın sonradan değişmediğini gösterir — kaynakla aynı olduğunu değil. Canlı kopyada doğrulanan kalem sayısı, ölçülemediği için sıfır sayılır.

Bu, canlı kopyayı yanlış bir adım yapmaz. Kapatılamayan bir sistemde tek seçenek odur ve bu ders kapsamın kaç kalem getirdiğini zaten saydı. Yapılması gereken, imajın hangi koşulda alındığının gözetim zinciri kaydına yazılmasıdır: kaynak çalışıyordu, kopyalama şu kadar sürdü, doğrulama imajın kendisiyle sınırlıdır. Yazılmayan koşul, sonradan hiç fark edilmemiş bir eksiklik gibi görünür.

Özet

  • Bir kopyanın doğrulanabilirliği kaynağın karmasının yeniden hesaplanabilmesine bağlıdır; yazma korumalı düzeneğin arkasında iki karma eşit çıkar ve 15 kalemin 15’i doğrulanır.
  • Kapsam eğrisi düz değildir: seçmeli dizin 4 kalem, mantıksal kopya 8, bölüm bloğu 13, tam blok kopyası 15 kalem getirir; son adım 56 dilim ve 74 saniyeye iki kalem eklemiştir.
  • Kaynağın yüzde 98,6’sını alan bölüm bloğu kopyası iki kalem kaçırır; kapsam oranla değil kalemle ölçülür.
  • Kanıt kalemlerinin çoğu dosya olmayan bölgelerdedir: ayrılmamış alanda 3, meta veride 2, dosya sistemi günlüğünde 1, takas alanında 1 kalem.
  • Çalışan sistemden alınan kopyada 4.096 dilimin 303’ü değişir, üç karma da farklı çıkar ve imajın eşitlenebileceği bir kaynak hali kalmaz; doğrulanan kalem 15’ten 9’a iner.

Sonraki Adım

Bu derste bir kalem hiç görünmedi. Modelin bölge listesinde bellek yoktur ve olmaması doğrudur: bellek diskte değildir, hiçbir kopyalama kapsamı onu almaz. Takas alanındaki artık bellekten düşmüş parçaları taşır ama bu, belleğin kendisi değil, kalıntısıdır — ve o kalıntı kopyalama sırasında değişen bölgeler arasındadır.

Sonraki ders bu konunun en önemli sayısını çıkarır. Kanıt kalemleri ömürlerine göre bir uçuculuk sırasına dizilir ve toplama sırası bu sıraya uymadığında kaç kalemin kaybolduğu hesaplanır. Aynı 28 kalem, aynı süreler, üç farklı sıra: uçuculuğa göre, konak konak ve en büyük kalem önce. Aradaki fark bir tercih meselesi değil, doğrudan kaybedilen kanıt sayısıdır.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat