უკან დაბრუნება
NixOS Steam Link-ზე: ხელით აწყობილი მოდული Valve-ის ხელმოწერილ ბირთვებს გვერდს უვლის
SiTech AI Team2 წთ. საკითხავი

NixOS Steam Link-ზე: ხელით აწყობილი მოდული Valve-ის ხელმოწერილ ბირთვებს გვერდს უვლის

George Huebner-მა 2018 წელს ნაყიდი Steam Link მუდამ ჩართულ ARM სერვერად აქცია. მოწყობილობა მხოლოდ Valve-ის ხელმოწერილ ბირთვებს ტვირთავს, ამიტომ მან მინიმალური მოდული აწყო, რომელიც kexec-ის გამოძახებას უმატებს.

George Huebner-მა გარდერობში 2018 წელს ფასდაკლებით ნაყიდი Steam Link იპოვა, რომელიც ჯერ კიდევ მუშაობდა. Ethernet-ის, Wi-Fi-ის, Bluetooth-ისა და რამდენიმე USB პორტის მქონე პატარა ARM მოწყობილობა ყოველთვის ჩართულ სერვერად გამოდგებოდა, ამიტომ მასზე NixOS-ის გაშვება გადაწყვიტა. 26 სექტემბერს გამოქვეყნებულ ბლოგპოსტში ის აღწერს, რა ხრიკი დასჭირდა ამისთვის.

რთული ნაწილი უკვე გადაჭრილი ჰქონდა fijam-ის სახელით მწერ ენთუზიასტს, რომლის ჩანაწერებსაც Steam Link-ზე Linux-ის გაშვების შესახებ ავტორი ახსენებს. მთავარი დაბრკოლება ისაა, რომ მოწყობილობის bootloader მხოლოდ Valve-ის ხელმოწერილ ბირთვებს ტვირთავს, ამიტომ საკუთარი ბირთვის პირდაპირ გაშვება შეუძლებელია. გამოსავალი ასეთია: ჯერ Valve-ის დამტკიცებულ ბირთვში უნდა ჩაიტვირთოს სისტემა, შემდეგ კი kexec-ით ახალ ბირთვზე გადახტეს.

სისტემური გამოძახება, მოდულად გადაკეთებული

ამ გეგმას მეორე კედელი ხვდება: Valve-ის ბირთვი CONFIG_KEXEC-ის ჩართვის გარეშეა აწყობილი, ამიტომ kexec-ის სისტემური გამოძახება სისტემაში საერთოდ არ არსებობს. ავტორმა kexec-ის საწყისი ფაილები მინიმალურ მოდულად ააწყო და kexec_load.ko უწოდა. მოდული მომუშავე სისტემას დაკარგულ გამოძახებას უმატებს. სხვა დისტრიბუტივებზე იგივე ხერხი უკვე გამოუყენებიათ, თუმცა უმეტესობა fijam-ის მიერ აწყობილ მოდულსა და kexec-ის ბინარს იწერს. Huebner-ს ინტერნეტიდან ბირთვის მოდულის ჩამოტვირთვა არ სურდა, ამიტომ თავად ააწყო.

კროსკომპილაცია 13 წლის ბირთვისთვის

NixOS-ის userspace-ის, ბირთვისა და initrd-ის აწყობა მარტივია: lib.nixosSystem-ს სწორი system და crossSystem უნდა გადასცე. არქიტექტურა უფრო რთული აღმოჩნდა. Valve-ის toolchain armv7a-ზეა გათვლილი, მაგრამ შესაბამისი crossSystem პარამეტრი armv7a-unknown-linux-gnueabihf Nix-ის Go-ს აწყობის მექანიზმს არ უხდება, ამიტომ ავტორმა ეკვივალენტური armv7l აირჩია და aarch64 მანქანიდან დაკროსკომპილა. მოდული Valve-ის 13 წლის ბირთვის, 3.8.13-ის ვერსიაზე უნდა აშენდეს. თანამედროვე GCC-თვის პაჩები დასჭირდა, ისე კი სრული კომპილაცია საჭიროა და არა მხოლოდ make modules_prepare, რადგან მოდულების ვერსიონირებას Module.symvers სჭირდება და მის გარეშე insmod ახალ მოდულს არ იღებს.

ბრმად გამართვა და ზომის შემცირება

გადახტომის შემოწმება რთული იყო. ახალ ბირთვს HDMI არ მუშაობს, UART-ის პორტამდე მისასვლელად კი ავტორს მოწყობილობა არ გაუხსნია, ამიტომ ჯერ BusyBox-ზე დაფუძნებული მინიმალური initramfs სცადა: ის დისკზე ნიშნის ფაილს წერდა, მერე კი იტვირთებოდა, რაც წარმატებას ნიშნავდა. შემდეგ NixOS-ის initrd-ზე გადავიდა, ჩართული ქსელითა და Netcat-ის უკუღმა shell-ით. ორი დეტალი მნიშვნელოვანი აღმოჩნდა: initrd-ის ხელმისაწვდომ მოდულებში reset_berlin უნდა დამატებულიყო USB დისკიდან წაკითხვისთვის, საჭირო იყო ძველი, non-systemd initrd. ჩატვირთვის შემდეგ იმიჯი კვლავ 2,3 გბ იყო. ავტორმა ამოიღო დოკუმენტაცია, ფონტები, XDG სერვისები, თავად Nix და 1,8 გბ-იანი linux-firmware-იდან ყველა firmware-ბლობი, ერთის გარდა, და 1,2 გბ-ზე შეჩერდა, რასაც „საკმარისად კარგს“ უწოდებს. პოსტის ბოლოს ის აღნიშნავს, რომ სხვამაც მიაღწია ჩატვირთვად NixOS-ს „ვაიბ-კოდინგით“, თუმცა იმ კონფიგს გადატვირთვები არასწორად აქვს და ზედმეტ ბინარულ ბლობებს იყენებს. flake-ისა და მოდულის კოდი პოსტთან ერთად გამოქვეყნებულია.

SSiTech

SiTech — AI-გაძლიერებული ვებ დეველოპმენტი

ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.