
NetBSD: disklabel'ı bayt bayt incelemek
NetBSD 11 üzerinde BSD disklabel'ının uygulamalı incelemesi: etiketin diskte nerede durduğu, başlıktaki her alanın anlamı, XOR sağlaması ve hex editörde bölüm oluşturma.
movq.de blogundaki yazı, x86_64 üzerinde çalışan NetBSD 11'de BSD disklabel'ını inceliyor. Yazar DOS ve Linux'tan geldiğini ve kendi OpenBSD sistemlerinde disklabel'lara neredeyse hiç bakmadığını söylüyor. Amacı baytların anlamını, biçimin nerede belgelendiğini ve ne kadarının elle düzenlenebildiğini görmekti.
Etiket diskte nerede duruyor
Belge arayışı man disklabel ile başlıyor; SEE ALSO bölümü disklabel(5) sayfasına işaret ediyor. Yazar yazının çoğunda doğrudan /usr/include/sys/disklabel.h dosyasını okumuş. MBR sistemleriyle çakışmayı önlemek için disklabel'lar alışılmış MBR alanının dışında tutuluyor: libutil'e bağlanan küçük bir C programı getlabelsector() için 1, getlabeloffset() için 0 döndürüyor, yani etiket ikinci sektörde, 512 bayt ofsetinde duruyor.
Başlığı alan alan okumak
Etiket disk üstverisiyle başlıyor, bölüm dizisiyle bitiyor. little-endian okunduğunda iki sihirli sayı (d_magic ve d_magic2), disk türü 0x0f yani logical disk ve sürücü adı ld1 görünüyor; ardından geometri geliyor: sektör başına 512 bayt, iz başına 63 sektör, silindir başına 16 iz, 260 silindir ve toplam 262144 sektör, yani 128 MiB. 3600 rpm ve arama süreleri gibi eski donanım parametreleri modern x86_64'te çoğunlukla sıfır ve CHS kalıntılarıyla MBR de daha iyi değil; hex dökümünden okunan değerler disklabel ld1 çıktısıyla örtüşüyor.
Bölüm tablosu ve sağlama toplamı
Başlık d_npartitions değerini bildiriyor, ardından a'dan d'ye bölümler için 16 baytlık kayıtlar geliyor. Gerçekten önemli üç alan var: başlangıç, boyut ve dosya sistemi türü. a bölümü 0 ofsetinde 262144 sektöre ve 0x07 türüne, yani 4.2BSD (FFS) sahip. d bölümü x86_64'te her zaman bulunur ve tüm diski tanımlar; bunu NetBSD geliştiricisi Martin Husemann açıklamış. c ise boyutu, ofseti ve türü sıfır olduğu için görünmüyor.
Başlıkta d_checksum, bölümler dahil verinin xor'u olarak tanımlanıyor. Etiketin tüm 16 bitlik parçalarının XOR'u sıfır veriyor; bu, saklanan değerin tutarlı olduğunu doğruluyor, çünkü sağlama toplamı bu parçalardan biri. Onu dışarıda bırakınca 1dc6 çıkıyor ve dökümdeki c61d ile eşleşiyor. NetBSD'deki karşılığı büyük olasılıkla sys/lib/libkern içindeki dkcksum.c.
Hex editörde oluşturulan bir bölüm
Sonra tersini denedi: 1234 sektör uzunluğunda, 5678. sektörden başlayan ve ZFS türünde bir i bölümü tanımladı. Dokuzuncu kayıt 788. baytta başlıyor; hesap 512 + 0x94 + (9-1) * 16. p_size, p_offset ve p_fstype 0x21 yazıldı, d_npartitions 9'a çıkarıldı ve sağlama toplamı 160f olarak yeniden hesaplandı.
Açılıştan sonra disklabel ld1 yeni bölümü tam istendiği gibi listeledi ve a ile i bölümlerinin çakıştığı uyarısını verdi; bu beklenen, çünkü a tüm diski kapsıyor. Yazar, MBR ve GPT üzerine eklenen bu katmanın gözden kaçmasının kolay olduğunu ve alışmayı ancak elle çalışmanın sağladığını belirtiyor.
SiTech — AI destekli web geliştirme
Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.