
NetBSD-də disklabel-lərin bayt-bayt araşdırılması
NetBSD 11 üzərində BSD disklabel-ının praktiki araşdırması: etiketin diskdə harada saxlandığı, başlıqdakı hər sahənin mənası, XOR yoxlama cəmi və hex redaktorda bölmə yaratmaq.
movq.de bloqundakı yazı x86_64 üzərində işləyən NetBSD 11-də BSD disklabel-ını araşdırır. Müəllif DOS və Linux təcrübəsindən gəldiyini və öz OpenBSD sistemlərində disklabel-lara demək olar ki, diqqət yetirmədiyini yazır. Məqsəd ayrı-ayrı baytların mənasını və nə qədərinin əl ilə redaktə edilə bildiyini öyrənmək idi.
disklabel harada saxlanılır
Sənədləşmə axtarışı man disklabel ilə başlayır; SEE ALSO bölməsi disklabel(5) səhifəsinə işarə edir. Müəllif yazının çoxunda birbaşa /usr/include/sys/disklabel.h faylını oxuyub. MBR sistemləri ilə toqquşmanın qarşısını almaq üçün disklabel-lar adi MBR sahəsindən kənarda saxlanılır: libutil ilə qoşulan kiçik C proqramı getlabelsector() üçün 1, getlabeloffset() üçün 0 qaytarır, yəni etiket ikinci sektorda, 512 bayt ofsetindədir.
Başlığın sahə-sahə oxunması
Etiket diskin metadatası ilə başlayır və bölmə massivi ilə bitir. little-endian oxunduqda əvvəlcə iki sehrli rəqəm (d_magic və d_magic2), disk tipi 0x0f, yəni logical disk, və sürücü adı ld1 görünür; sonra həndəsə gəlir: sektor başına 512 bayt, trek başına 63 sektor, silindr başına 16 trek, 260 silindr və cəmi 262144 sektor, yəni 128 MiB. 3600 rpm və axtarış vaxtları kimi köhnə aparat parametrləri müasir x86_64-də çoxunlukla sıfırdır və CHS qalıqları ilə MBR də daha yaxşı deyil; hex dump-dan oxunan dəyərlər disklabel ld1 çıxışı ilə üst-üstə düşür.
Bölmə cədvəli və yoxlama cəmi
Başlıq d_npartitions dəyərini bildirir, ardınca a-dan d-ə qədər bölmələr üçün 16 baytlıq qeydlər gəlir. Əslində üç sahə vacibdir: başlanğıc, ölçü və fayl sistemi tipi. a bölməsi 0 ofsetindən 262144 sektora və 0x07 tipinə, yəni 4.2BSD (FFS) malikdir. d bölməsi x86_64-də həmişə mövcuddur və bütün diski təsvir edir; bunu NetBSD tərtibatçısı Martin Husemann izah edib. c isə ölçüsü, ofseti və tipi sıfır olduğu üçün görünmür.
Başlıqda d_checksum bölmələr daxil olmaqla verilənlərin xor-u kimi təsvir olunur. Etiketin bütün 16-bitlik hissələrinin XOR-u sıfır verir; bu, saxlanılan dəyərin tutarlı olduğunu təsdiqləyir, çünki yoxlama cəminin özü həmin hissələrdən biridir. Onu çıxsaq, 1dc6 alınır və dump-dakı c61d ilə uyğun gəlir. NetBSD-dəki uyğun kod, ehtimal ki, sys/lib/libkern içindəki dkcksum.c-dir.
Hex redaktorda yaradılan bölmə
Sonra tərsini sınadı: 1234 sektor uzunluğunda, 5678-ci sektordan başlayan və ZFS tipində i bölməsini təyin etdi. Doqquzuncu qeyd 788-ci baytdan başlayır; hesablama 512 + 0x94 + (9-1) * 16 kimidir. p_size, p_offset və p_fstype 0x21 yazıldı, d_npartitions 9-a qaldırıldı və yoxlama cəmi 160f olaraq yenidən hesablandı.
Açılışdan sonra disklabel ld1 yeni bölməni tam nəzərdə tutulduğu kimi göstərdi və a ilə i bölmələrinin üst-üstə düşdüyü barədə xəbərdarlıq etdi; bu gözləniləndir, çünki a bütün diski əhatə edir. Müəllif qeyd edir ki, MBR və GPT üzərinə əlavə edilən bu qatı gözdən qaçırmaq asandır və öyrəşmək yalnız praktiki işlə mümkün olub.
SiTech — AI ilə gücləndirilmiş veb hazırlanması
Sürətli və müasir saytlar qurur, AI-ı real biznes proseslərinə gətiririk. Layihəniz və ya sualınız var? Kömək etməyə hazırıq.