Վերադառնալ
NixOS-ը Steam Link-ի վրա. ձեռքով կառուցված kexec մոդուլը շրջանցում է Valve-ի ստորագրած միջուկների սահմանափակումը
SiTech AI Team3 წთ. საკითხავი

NixOS-ը Steam Link-ի վրա. ձեռքով կառուցված kexec մոդուլը շրջանցում է Valve-ի ստորագրած միջուկների սահմանափակումը

George Huebner-ը 2018-ին զեղչով գնված Steam Link-ը դարձրել է մշտապես միացված ARM սերվեր։ Սարքը բեռնում է միայն Valve-ի ստորագրած միջուկները, ուստի նա հավաքել է նվազագույն մոդուլ, որն ավելացնում է բացակայող kexec կանչը, և բեռնումը փոխանցել փոքրացված NixOS պատկերին։

George Huebner-ը պահարանում գտել է 2018 թվականին զեղչով գնված Steam Link-ը, որը դեռ անթերի աշխատում էր, և որոշել է, որ Ethernet, Wi-Fi, Bluetooth և մի քանի USB պորտ ունեցող փոքր ARM սարքը կարող է դառնալ մշտապես միացված, ցածր էներգասպառմամբ սերվեր։ Սեպտեմբերի 26-ին հրապարակված գրառման մեջ նա պատմում է, թե ինչպես է աշխատեցրել NixOS-ը սարքի վրա և ինչ միջուկային մոդուլի հնարք դա հնարավոր դարձրել։

Դժվար մասն արդեն լուծել էր fijam կեղծանունով մասնագետը, ում նշումները հեղինակը հիշատակում է։ Հիմնական խոչընդոտը սա է՝ սարքի բեռնիչը ընդունում է միայն Valve-ի ստորագրած միջուկները, ուստի սեփական միջուկն ուղղակիորեն գործարկել հնարավոր չէ։ Լուծումն այսպիսին է՝ նախ բեռնվել Valve-ի հաստատած միջուկի մեջ, ապա kexec-ով անցնել նորին։

Համակարգային կանչ, որը վերածվեց միջուկային մոդուլի

Այստեղ հայտնվում է երկրորդ պատնեշը՝ Valve-ի մատակարարած միջուկը կառուցված չէ CONFIG_KEXEC-ով, այսինքն kexec համակարգային կանչն ընդհանրապես բացակայում է։ Հեղինակը kexec-ի համապատասխան ֆայլերը հավաքել է նվազագույն միջուկային մոդուլի մեջ՝ kexec_load.ko, որը աշխատող համակարգին ավելացնում է բացակայող կանչը։ Նույն հնարքն օգտագործել են նաև այլ տարածումների համար, սակայն շատերը ներբեռնում են fijam-ի պատրաստի մոդուլն ու kexec-ի երկուականը։ Huebner-ը չէր վստահում ինտերնետից միջուկային մոդուլ ներբեռնելուն և ինքն է կառուցել այն։

Խաչաձև կոմպիլյացիա 13 տարվա միջուկի համար

NixOS-ի օգտատիրոջ տարածությունը, միջուկն ու initrd-ն հավաքելը պարզ է՝ բավական է lib.nixosSystem-ին փոխանցել ճիշտ system և crossSystem։ Ճարտարապետության հարցը ավելի բարդ էր։ Valve-ի գործիքաշարը նախատեսված է armv7a-ի համար, սակայն համապատասխան crossSystem կարգավորումը՝ armv7a-unknown-linux-gnueabihf, լավ չի զուգակցվում Nix-ի Go-ի կառուցման ենթակառուցվածքի հետ, ուստի հեղինակն ընտրել է armv7l-ը և խաչաձև կոմպիլյացրել aarch64 մեքենայից։ Մոդուլն ինքը պետք է կառուցվի Valve-ի 3.8.13 տարբերակի, 13 տարվա վաղեմության միջուկի ճյուղի դեմ. ժամանակակից GCC-ով կառուցելու համար անհրաժեշտ եղան կարկատաններ և ոչ թե միայն make modules_prepare, այլ ամբողջական միջուկի կառուցում, որովհետև մոդուլների տարբերակումը պահանջում է Module.symvers, առանց որի insmod-ը մերժում է մոդուլը։

Կույր վրիպազերծում և պատկերի փոքրացում

Հանձնման ստուգումը դժվար էր. նոր միջուկով HDMI-ն չի աշխատում, իսկ հեղինակը UART-ի համար սարքը չի բացել, ուստի սկզբում փորձարկել է BusyBox-ի վրա հիմնված նվազագույն initramfs, որը նշիչ ֆայլ էր գրում և վերագործարկվում որպես հաջողության ազդանշան, ապա անցել NixOS-ի initrd-ին՝ Netcat-ով հակադարձ shell-ով։ Երկու մանրամասնություն էր կարևոր՝ initrd-ի մոդուլներին ավելացնել reset_berlin USB կրիչից ընթերցելու համար, և օգտագործել հին, ոչ systemd initrd-ը։ Երբ բեռնումը աշխատեց, պատկերը դեռ 2,3 ԳԲ էր, ուստի նա հանել է փաստաթղթերը, տառատեսակները, XDG ծառայությունները, Nix-ը և 1,8 ԳԲ-անոց linux-firmware փաթեթի բոլոր firmware բլոբները բացի մեկից, և կանգնել 1,2 ԳԲ-ի վրա՝ արդյունքը բավական լավ համարելով։ Գրառման վերջում նա նշում է, որ մեկ ուրիշը վերջերս vibe coding-ով հասել է բեռնվող NixOS կոնֆիգուրացիայի, սակայն այն սխալ է վարվում վերագործարկումների հետ։ flake-ի և մոդուլի կոդը հրապարակված է գրառման հետ։

SSiTech

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

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