Unofficial
På den här sidan
  1. 01Vad verkstaden gör
  2. 02Förbered arbetsytan
  3. 03Projektet
  4. 04Bygg drivrutinen
  5. 05Kontrollera mot den körande kärnan
  6. 06Läs in modulen och förstå följderna

Bygg en kärnmodul för din NAS: USB-seriedrivrutinen CH341

Många USB-serieadaptrar med ett CH340- eller CH341-chip behöver kärnans drivrutin ch341. Den NAS med QTS 6.1 som visas här saknar den. Kärnverkstaden i Bucket & Code Server IDE bygger en sådan modul för NAS:ens körande kärna, kontrollerar den mot kärnan och läser in den.

  1. Profilkärnans egenskaper
  2. Arbetsytaett träd med motsvarande konfiguration
  3. Byggdrivers/usb/serial
  4. Kontrolleravermagic, layout, symboler
  5. Läs insom administratör, på egen risk

Bilderna kommer från en NAS med QTS 6.1 och kärnan 6.6.129-qnap, med alla fält ifyllda enligt den här guiden.

01Vad verkstaden gör

QNAP:s offentliga GPL-arkiv innehåller kärnkällkod till och med QTS 5.2.3, men inte kärnan på denna NAS med QTS 6.1. Verkstaden läser därför uppgifterna som den körande kärnan visar om sig själv och konfigurerar ett kärnträd från kernel.org så att det stämmer. Sidan Kernels visar profilen: versionen, kompilatorn som QNAP använde, vermagic och layouten för struct module i QNAP:s egna moduler samt om moduler måste vara signerade.

Körande kärna: version 6.6.129-qnap, x86_64 TS-X74P, kompilator x86_64-QNAP_gcc13-linux-gnu-gcc 13.2.0, binutils 2.41, vermagic 6.6.129-qnap SMP preempt mod_unload, struct module på 1152 byte med init vid 312 och exit vid 1064; QNAP:s moduler saknar signatur; läst från QNAP:s egna moduler
  • Du behöver miljön Kernel builder från galleriet Examples (Apps → Examples): Ubuntu 24.04 med GCC 13 och verktygen för att bygga kärnan. Verkstaden kräver samma huvudversion av GCC som den körande kärnan byggdes med och kontrollerar den innan arbetsytan förbereds.
  • Förberedelse, bygge och inläsning kräver administratörsrollen; kontroll kräver utvecklarrollen. I redigerarens terminal, som körs som root, motsvaras stegen av kommandon med bvs kernel.

02Förbered arbetsytan

Arbetsytan är ett kärnträd för exakt den körande kärnan, i kernels/<release> i datamappen. Tryck på Prepare the workspace på sidan Kernels:

  1. Source: behåll den föreslagna källan. För 6.6.129 är det trädet från kernel.org, eftersom QNAP:s egna träd bara innehåller äldre kärnor. Kärnkällor: Linux 6.6.129 från kernel.org, föreslagen, innehåller denna kärna, 134 MB hämtat; QNAP:s GPL-källkod för QTS 5.2.3 med kärnorna 5.10.60, 4.14.24 och 4.2.8, annan version, 780 MB
  2. Environment: kernel-builder. Under Extra settings, en inställning per rad: USB_SERIAL=m och USB_SERIAL_CH341=m, USB-seriekärnan och CH341-drivrutinen. Låt Build the whole kernel vara avstängd och tryck på Prepare. Förbered arbetsytan för 6.6.129-qnap: Source föreslagen, Environment kernel-builder, Extra settings USB_SERIAL=m och USB_SERIAL_CH341=m, Build the whole kernel inte markerat och knappen Prepare
  3. Ett jobb packar upp källkoden, konfigurerar den utifrån profilen och dina inställningar, förbereder den för modulbyggen och kontrollerar att trädet bygger för exakt den körande versionen. Kortet Workspace visar ready. Om förberedelsen misslyckas behålls det tidigare trädet. Workspace, status ready: källan linux-6.6.129 från kernel.org, konfiguration defconfig+profile med USB_SERIAL=m och USB_SERIAL_CH341=m, miljön kernel-builder och knapparna Build modules och Delete

03Projektet

New project har två mallar under Kernel: en egen enkel Hello-modul och ch341-drivrutinen. Välj USB serial driver ch341.

Kernel-mallar i New project: Kernel module, en enkel Hello-kärnmodul med Kbuild och Makefile; USB serial driver ch341, kärnans egen ch341-drivrutin för CH340- och CH341-USB-serieadaptrar, vald

Projektet innehåller en Makefile vars mål kör verkstadens kommandon samt ett arbetsflöde för NAS:ens runner:

# projektets Makefile, kör som root i redigerarens terminal
make prepare   # bvs kernel prepare --option USB_SERIAL=m --option USB_SERIAL_CH341=m
make           # bvs kernel make --dir drivers/usb/serial
make check     # bvs kernel check ch341
make load      # bvs kernel load ch341
make unload    # bvs kernel unload ch341

Vid varje push bygger arbetsflödet drivrutinen med --build-only och kontrollerar den. Filen ch341.ko från bygget hamnar i körningens artefakt modules, aldrig i arbetsytans mapp modules/. Därför fortsätter make load att läsa in modulen som du själv byggde.

04Bygg drivrutinen

På sidan Kernels bygger Build modules en projektmapp eller en katalog i kärnträdet. Drivrutinen ch341 ingår i trädet: välj A directory of the kernel tree och skriv drivers/usb/serial. make i projektet gör samma sak.

Build modules i 6.6.129-qnap: What to build satt till A directory of the kernel tree; Directory drivers/usb/serial; Targets tomt; knappen Build

Bygget skapar ch341.ko och usbserial.ko. Arbetsytan behåller ch341.ko i modules/. Den behåller inte usbserial.ko, eftersom QNAP levererar den modulen och det är QNAP:s kopia som läses in.

Arbetsytans moduler: bvs_hello och ch341, ingen av dem inläst, med storlek, byggdatum och knapparna Check och Load

05Kontrollera mot den körande kärnan

Check jämför modulen med den körande kärnan: vermagic, storleken på struct module och positionerna för init och exit, signaturkrav, moduler den är beroende av och alla symboler den behöver. Varje fynd anger vad som inte stämmer och vad du ska göra.

Kontroll av ch341: kan läsas in; varning om att 2 symboler, jiffies och kmalloc_caches, inte kan slås upp eftersom kärnan inte listar datasymboler, och att kärnan avvisar modulen vid inläsning om någon av dem saknas

QNAP:s kärna listar inte sina datasymboler, så kontrollen visar symboler som jiffies som varningar. På kommandoraden avslutas bvs kernel check ch341 med slutstatus 3 när modulen inte får läsas in.

06Läs in modulen och förstå följderna

En modul körs inne i kärnan med alla kärnans rättigheter. En felaktig modul kan stoppa NAS:en. Läs bara in sådant som du byggt för ett bestämt syfte, och bara på en NAS som du kan starta om.

  • Load (administratör), eller make load, kör kontrollen igen och läser in modulen, först dess beroenden: här QNAP:s usbserial. En modul med ett fel i kontrollen läses aldrig in. Unload tar bort den; en modul som används förblir inläst. Varje inläsning och borttagning skrivs till log/kernel-modules.log.
  • En modul som lästs in för hand försvinner efter en omstart. För att läsa in den vid varje start anger du dess namn bland kärnmodulerna i en App Builder-app: när appen aktiveras läses den in, och varje start av paketet läser in den igen.
  • Om NAS:en stannade utan att paketet stoppades i ordnad form (en krasch, ett strömavbrott eller en hård återställning), under en uppstart där paketet hade läst in moduler, hoppar nästa start över dessa moduler. En av dem kan ha orsakat kraschen; ett meddelande anger deras namn. Om du läser in en modul för hand eller aktiverar dess app igen får starten läsa in den igen.
  • Efter en QTS-uppdatering till en annan kärna förbereder du den kärnans arbetsyta och bygger modulen igen. En säkerhetskopia innehåller inte kernels/.