Վերադառնալ
NetBSD-ում disklabel-ների ուսումնասիրությունը բայթ առ բայթ
SiTech AI Team3 წთ. საკითხავი

NetBSD-ում disklabel-ների ուսումնասիրությունը բայթ առ բայթ

NetBSD 11-ի վրա BSD disklabel-ի գործնական վերլուծություն. որտեղ է պիտակը պահվում սկավառակի վրա, ինչ է նշանակում վերնագրի ամեն դաշտը, ինչպես է հաշվվում XOR ստուգիչ գումարը և ինչպես կարելի է բաժին ստեղծել hex խմբագրիչում։

movq.de բլոգի գրառումը քննում է BSD disklabel-ը x86_64-ի վրա աշխատող NetBSD 11-ում։ Հեղինակը գրում է, որ եկել է DOS-ից և Linux-ից ու սեփական OpenBSD համակարգերում գրեթե ուշադրություն չի դարձրել disklabel-ներին։ Նպատակը եղել է պարզել, թե ինչ են նշանակում առանձին բայթերը և որքանը կարելի է ձեռքով խմբագրել։

Որտեղ է պահվում disklabel-ը

Փաստաթղթերի փնտրտուքը սկսվում է man disklabel-ից, որի SEE ALSO բաժինը մատնանշում է disklabel(5)-ը։ Գրառման մեծ մասում հեղինակը ուղղակիորեն կարդացել է /usr/include/sys/disklabel.h ֆայլը։ MBR համակարգերի հետ բախումից խուսափելու համար disklabel-ները պահվում են սովորական MBR տարածքից հեռու. libutil-ին կցված փոքրիկ C ծրագիրը getlabelsector()-ի համար վերադարձնում է 1, իսկ getlabeloffset()-ի համար՝ 0, այսինքն պիտակը երկրորդ սեկտորում է՝ 512 բայթ շեղման վրա։

Վերնագրի դաշտերը

Պիտակը սկսվում է սկավառակի մետատվյալներից և ավարտվում բաժինների զանգվածով։ little-endian բառերով կարդալիս երևում են երկու կախարդական թվեր (d_magic և d_magic2), սկավառակի տիպը՝ 0x0f, այսինքն logical disk, և վարորդի անունը՝ ld1, ապա գալիս է երկրաչափությունը՝ 512 բայթ սեկտորում, 63 սեկտոր ուղու վրա, 16 ուղի գլանում, 260 գլան և ընդհանուր 262144 սեկտոր, այսինքն՝ 128 MiB։ Հին սարքավորման պարամետրերը, օրինակ 3600 rpm-ը և որոնման ժամանակները, ժամանակակից x86_64-ի վրա հիմնականում զրո են, և MBR-ը՝ իր CHS մնացորդներով, ավելի լավը չէ. hex-դեմփից կարդացված արժեքները համընկնում են disklabel ld1-ի արտածմանը։

disklabel-ի վերնագրի hex դեմփը՝ դաշտերը նշված

Բաժինների աղյուսակը և ստուգիչ գումարը

Վերնագիրը հայտարարում է d_npartitions արժեքը, որից հետո գալիս են 16 բայթանոց գրառումները a-ից d բաժինների համար։ Իրականում կարևոր են երեք դաշտ՝ սկիզբը, չափը և ֆայլային համակարգի տիպը։ a բաժինը զբաղեցնում է 262144 սեկտոր՝ 0 շեղումից, և ունի 0x07 տիպ, այսինքն՝ 4.2BSD (FFS)։ d բաժինը x86_64-ի վրա միշտ կա և նկարագրում է ամբողջ սկավառակը, ինչպես բացատրել է NetBSD-ի մշակող Մարտին Հուզեմանը. c-ն չի երևում, քանի որ նրա չափը, շեղումը և տիպը զրո են։

Վերնագրում d_checksum-ը նկարագրված է որպես տվյալների xor՝ ներառյալ բաժինները։ Պիտակի բոլոր 16-բիթանոց հատվածների XOR-ը տալիս է զրո, ինչը հաստատում է պահված արժեքի համահունչությունը, քանի որ ստուգիչ գումարն ինքն այդ հատվածներից մեկն է։ Այն բացառելիս ստացվում է 1dc6, ինչը համընկնում է դեմփում երևացող c61d-ի հետ. համապատասխան կոդը, հավանաբար, sys/lib/libkern-ի dkcksum.c-ն է։

Բաժին, որը ստեղծվել է hex խմբագրիչում

Այնուհետև նա փորձեց հակառակը՝ ձեռքով սահմանել i բաժինը՝ 1234 սեկտոր երկարությամբ, սկսած 5678-րդ սեկտորից և ZFS տիպով։ Իններորդ գրառումը սկսվում է 788-րդ բայթից՝ 512 + 0x94 + (9-1) * 16 հաշվարկով։ Գրանցվեցին p_size-ը, p_offset-ը և p_fstype-ը՝ 0x21, d_npartitions-ը բարձրացվեց 9-ի, իսկ ստուգիչ գումարը վերահաշվարկվեց որպես 160f։

Բեռնումից հետո disklabel ld1-ը նոր բաժինը ցույց տվեց հենց այնպես, ինչպես մտածված էր, և զգուշացրեց, որ a և i բաժինները համընկնում են. դա սպասելի է, քանի որ a-ն ընդգրկում է ամբողջ սկավառակը։ Հեղինակը նշում է, որ MBR-ի և GPT-ի վրա ավելացրած շերտը հեշտ է աննկատ թողնել և որ ընտելանալը հաջողվել է միայն գործնական աշխատանքով։

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։