This shows you the differences between two versions of the page.
si:laboratoare:06 [2024/10/27 09:23] florin.stancu created |
si:laboratoare:06 [2024/11/11 12:43] (current) florin.stancu [Exerciții] |
||
---|---|---|---|
Line 74: | Line 74: | ||
* Inspectați căile ''/boot'' (rețineți / copiați într-un fișier text output-ul, e util de comparat mai încolo). | * Inspectați căile ''/boot'' (rețineți / copiați într-un fișier text output-ul, e util de comparat mai încolo). | ||
* Apoi, ne vom pregăti să pornim Raspberry PI 4! | * Apoi, ne vom pregăti să pornim Raspberry PI 4! | ||
- | * Asigurați-vă că firele ce conectează Raspberry PI-ul la adaptorul de serială nu sunt ieșite. Dacă da, [[https://pinout.xyz/|conectați-le corespunzător]] (UART RX/TX la TX/RS-ul adaptorului!) + chemați asistentul să verifice! | + | * Asigurați-vă că firele ce conectează Raspberry PI-ul la adaptorul de serială nu sunt ieșite. Dacă da, [[https://pinout.xyz/|conectați-le corespunzător]] (UART RX (alb) / TX (verde) la TX (pin 8)/RX (pin 10) al RPI-ului!) + chemați asistentul să verifice! |
+ | * TLDR: începeți cu negru (GND) la pin 6 (al treilea de pe margine), apoi imediat lângă (pe același rând), firele alb + verde (în această ordine); **firul roșu SĂ RĂMÂNĂ NECONECTAT**! | ||
<note warning> | <note warning> | ||
Line 80: | Line 81: | ||
</note> | </note> | ||
- | * În final, înainte de a-l alimenta, conectați-vă adaptorul serial la USB în laptop și porniți programul preferat de consolă serială (e.g., ''picocom''), folosind baud rate-ul ''115200''. | + | * În final, înainte de a-l alimenta, conectați-vă adaptorul serial la USB în laptop, faceți USB passthrough la mașina virtuală (dacă este cazul) și porniți programul preferat de consolă serială (e.g., ''picocom''), folosind baud rate-ul ''115200'': <code> |
+ | sudo dmesg | tail -20 && ls -l /dev/ttyUSB* | ||
+ | picocom -b 115200 /dev/ttyUSB0 # înlocuiți cu ce dispozitiv aveți | ||
+ | </code> | ||
+ | |||
+ | <note important> | ||
+ | Din păcate, în laborator avem ca adaptoare Serial to USB niște clone chinezești de Prolific PL2303, pe care driverele oficiale Microsoft [[http://wp.brodzinski.net/2014/10/01/fake-pl2303-how-to-install/|le dezactivează automat ca fiind "counterfeit" (găsiți o soluție aici)]]. De regulă, în mașina virtuală cu Linux nu ar trebui să conteze, doar că mecanismul driverelor de a dezactiva automat dispozitivele "copiate" poate interfera cu passthrough-ul USB care se face în mod normal. :(( problema apare frecvent pe VirtualBox (pe VMware nu au fost raportate probleme). | ||
+ | </note> | ||
**1.** Alimentați RPI-ul și urmăriți mesajele din consolă. Ar trebui să vă intre în U-Boot (preinstalat pe cardurile SD ca ''BL31''), apoi: | **1.** Alimentați RPI-ul și urmăriți mesajele din consolă. Ar trebui să vă intre în U-Boot (preinstalat pe cardurile SD ca ''BL31''), apoi: | ||
Line 87: | Line 95: | ||
* După ce vă apare prompt-ul ''U-Boot> '', rulați comanda ''mmc list''. O să vă apară o listă de dispozitive MMC (ar trebui să vedeți cardul SD ca fiind detectat); încercați-le pe fiecare cu ''mmc dev <N>'' și apoi ''mmc info'' până găsiți cardul SD; | * După ce vă apare prompt-ul ''U-Boot> '', rulați comanda ''mmc list''. O să vă apară o listă de dispozitive MMC (ar trebui să vedeți cardul SD ca fiind detectat); încercați-le pe fiecare cu ''mmc dev <N>'' și apoi ''mmc info'' până găsiți cardul SD; | ||
* Apoi rulați comanda ''ums mmc <N>'', unde ''<N>'' este numărul perifericului MMC. Acesta va lansa în execuție un program care emulează un Mass Storage Device pe interfața USB Type-C folosită la conectarea la laptop; | * Apoi rulați comanda ''ums mmc <N>'', unde ''<N>'' este numărul perifericului MMC. Acesta va lansa în execuție un program care emulează un Mass Storage Device pe interfața USB Type-C folosită la conectarea la laptop; | ||
- | * Inspectați noul dispozitiv montat (nu uitați să faceți pass-through la noul device USB în mașina virtuală, dacă este cazul!). Mai precis, montați prima partiție (posibil să fie și singura) pe mașina voastră virtuală cu Linux. Ce fișiere există? Comparați cu partiția ''/boot'' a rootfs-ului. | + | * Inspectați noul dispozitiv montat (nu uitați să faceți pass-through la noul device USB în mașina virtuală, dacă este cazul!). Mai precis, montați prima partiție (posibil să fie și singura) pe mașina voastră virtuală cu Linux, e.g., în /mnt. Ce fișiere există? Comparați cu partiția ''/boot'' a rootfs-ului. |
<note important> | <note important> | ||
Line 100: | Line 108: | ||
* Aveți nevoie de toolchain-ul pentru Aarch64 să fie în ''$PATH'' (lucru adevărat pe VM-ul de la laborator); | * Aveți nevoie de toolchain-ul pentru Aarch64 să fie în ''$PATH'' (lucru adevărat pe VM-ul de la laborator); | ||
* Urmați pașii: <code> | * Urmați pașii: <code> | ||
- | # pe Lab VM lipsește acest pachet, instalați-l: | + | # pe Lab VM 2023 lipsește acest pachet, instalați-l: |
sudo apt install libssl-dev | sudo apt install libssl-dev | ||
git clone --branch=v2023.07.02 https://github.com/u-boot/u-boot.git | git clone --branch=v2023.07.02 https://github.com/u-boot/u-boot.git | ||
Line 142: | Line 150: | ||
**3.** Ne dorim să instalăm sistemul de fișiere Linux referință pe cardul SD din Raspberry PI (folosind USB Mass Storage-ul prin USB Type-C). | **3.** Ne dorim să instalăm sistemul de fișiere Linux referință pe cardul SD din Raspberry PI (folosind USB Mass Storage-ul prin USB Type-C). | ||
- | * Primul lucru, va trebui să creați o partiție ''ext4'' pe cardul SD, **după cea de boot, FAT32 (NU O ȘTERGEȚI)!**. Putem folosi ''fdisk'' sau utilitarul mai modern, ''parted'' (tot în linia de comandă :D ); | ||
* Folosiți comanda ''lsblk'' pentru a descoperi cum se numesc device-urile (și, desigur, aveți grijă la capacitate: să nu ștergeți partiția rădăcină a OS-ului real din VM / fizic)! | * Folosiți comanda ''lsblk'' pentru a descoperi cum se numesc device-urile (și, desigur, aveți grijă la capacitate: să nu ștergeți partiția rădăcină a OS-ului real din VM / fizic)! | ||
+ | * Primul lucru, va trebui să creați o partiție ''ext4'' pe cardul SD, **după cea de boot, FAT32 (NU O ȘTERGEȚI)!**. Putem folosi ''fdisk'' sau utilitarul mai modern, ''parted'' (tot în linia de comandă :D ): | ||
+ | <code> | ||
+ | lsblk # NOTAȚI CU ATENȚIE CARE E CARDUL SD DE ~16GB !!!! | ||
+ | # probabil SDB/SDC..., poate să fie sda dacă aveți ssd pe NVME și rulați Linux nativ... | ||
+ | sudo parted /dev/sd<X> # înlocuiți <X>-ul | ||
+ | # în parted, dați comenzile 'print' pentru a vedea partițiile curente, 'help' pentru comenzi | ||
+ | # creați o partiție nouă (primary, ext2 sunt setări bune) pe restul de spațiu liber (puteți scrie ''100%''), apoi quit | ||
+ | # apoi, pentru a încărca tabela nouă de partiții, folosiți comanda: | ||
+ | sudo partprobe /dev/sd<X> | ||
+ | </code> | ||
<note warning> | <note warning> | ||
Line 150: | Line 167: | ||
Dacă folosiți mașina virtuală, este recomandat să faceți snapshot (riscați să ștergeți partițiile sistemului de operare real dacă nu aveți grijă!). | Dacă folosiți mașina virtuală, este recomandat să faceți snapshot (riscați să ștergeți partițiile sistemului de operare real dacă nu aveți grijă!). | ||
- | Dacă sunteți pe un Linux în mașină fizică (please don't), întrebați un asistent dacă dați comenzile bune **ÎNAINTE DE A LE DA**! | + | Dacă sunteți pe un Linux în mașină fizică și nu sunteți siguri de ce faceți, întrebați un asistent dacă dați comenzile bune **ÎNAINTE DE A LE DA**! |
</note> | </note> | ||
- | * Formatați noua partiție (cea de-a doua) folosind utilitarul ''mkfs.ext4''. Folosiți și argumentul ''-L RPI_ROOTFS'' pentru a-i da un label (nume). | + | * Formatați noua partiție (cea de-a doua, e.g. ''/dev/sdX2'') folosind utilitarul ''mkfs.ext4''. Folosiți și argumentul ''-L RPI_ROOTFS'' pentru a-i da un label (nume). |
- | * Copiați conținutul directoarelor rootfs-ului oficial în partiția ''ext4'' nou-creată (folosiți ''sudo cp -ar'' pentru a păstra meta-informațiile fișierelor -- utilizatorii și chmod-ul atribuit). | + | * Copiați conținutul arhivei ''rootfs.tar.xz'' (descărcată de pe GitHub la începutul laboratorului) pe partiția ''ext4'' nou-creată: |
+ | <code> | ||
+ | # montăm partiția în /media/rootfs (pe care trebuie să-l cream) | ||
+ | sudo mkdir /media/rootfs | ||
+ | sudo mount /dev/sdX2 /media/rootfs | ||
+ | # TODO: mount sdX1 undeva (veți avea nevoie mai jos), creați un dir nou sau folosiți /mnt | ||
+ | sudo tar xf rootfs.tar.xz -C /media/rootfs | ||
+ | sudo sync # sincronizează datele cacheuite în RAM către dispozitivele fizice | ||
+ | # dacă comanda sync durează mult, NU O ÎNTRERUPEȚI!!! citiți notița | ||
+ | # când a terminat, nu dați unmount, mai avem de copiat ceva de pe partiție!! | ||
+ | </code> | ||
<note> | <note> | ||
- | Este posibil ca operația de copiere să dureze neobișnuit de mult (cel mult 10 min), totul depinde de calitatea cardului SD folosit în RPI (cele mai ieftine :P ). | ||
- | </note> | ||
- | |||
- | * Acum mai avem nevoie de câteva fișiere pentru a boota linux-ul (pe care le găsiți pe rootfs în ''/boot''), anume: | ||
- | * ''vmlinuz--*''; | ||
- | * ''initrd.img-*''; | ||
- | * //device tree blob-ul ar trebui să fie bun cel de la BL2, încărcat automat și de către u-boot!//; | ||
- | |||
- | <note important> | ||
Cardurile SD sunt extrem de lente, iar Linux are un obicei prost de a cache-ui fișierele copate în RAM-ul local și a le scrie în background după ce returnează comenzile de dezarhivare / copiere! Rulați comanda ''sudo sync'', care este blocantă până toate operațiile de scriere pe disk se vor completa. | Cardurile SD sunt extrem de lente, iar Linux are un obicei prost de a cache-ui fișierele copate în RAM-ul local și a le scrie în background după ce returnează comenzile de dezarhivare / copiere! Rulați comanda ''sudo sync'', care este blocantă până toate operațiile de scriere pe disk se vor completa. | ||
Line 169: | Line 188: | ||
</note> | </note> | ||
- | * NU UITAȚI: după ce procesul de copiere s-a terminat, demontați toate device-urile implicate (i.e., cele 2 partiții ale cardului SD). | + | * Așa cum a fost menționat, avem nevoie de câteva fișiere din sistemul rădăcină pentru a boota linux-ul (pe care le găsiți în ''/media/rootfs/boot'' pe partiția a doua, sau în arhiva rootfs.tar.xz în directorul de boot), anume: |
+ | * ''vmlinuz--*''; | ||
+ | * ''initrd.img-*''; | ||
+ | * //device tree blob-ul ar trebui să fie bun cel de la BL2, încărcat automat și de către u-boot, nu-l preluați pe acesta!//; | ||
+ | |||
+ | * NU UITAȚI: după ce procesul de copiere s-a terminat (și ''sync'' nu mai blochează!), demontați toate device-urile implicate (i.e., cele 2 partiții ale cardului SD). | ||
* După copiere, puteți vizualiza fișierele de pe partiția FAT32 din U-Boot: ''fatls mmc 1'' ;) | * După copiere, puteți vizualiza fișierele de pe partiția FAT32 din U-Boot: ''fatls mmc 1'' ;) | ||
Line 178: | Line 202: | ||
<code> | <code> | ||
# inițial, fără initramfs: | # inițial, fără initramfs: | ||
- | fatload mmc <N>:1 ${kernel_addr_r} vmlinuz-6.1.0-13-arm64 | + | fatload mmc <N>:1 ${kernel_addr_r} vmlinuz-6.1.61-rpi+ |
- | #fatload mmc <N>:1 ${ramdisk_addr_r} initrd.img-6.1.0-13-arm64 | + | #fatload mmc <N>:1 ${ramdisk_addr_r} initrd.img-6.1.61-rpi+ # e degeaba, momentan :D |
- | # astea sunt setate deja în cmdline.txt (verificați), apoi sunt încărcate în DTB (FDT) mai departe de către BL2 | + | # astea sunt setate deja în cmdline.txt, apoi sunt încărcate în DTB (FDT) mai departe de către BL2 |
- | #setenv bootargs "earlycon=pl011,mmio32,0xfe201000 console=serial0,115200 root=/dev/mmcblk0p2 rw rootwait" | + | # putem explora device tree-ul din memorie în felul următor: |
+ | fdt addr ${fdt_addr} | ||
+ | fdt print /chosen | ||
+ | # verificați valoarea bootargs să conțină cel puțin: | ||
+ | # bootargs = "... earlycon=pl011,mmio32,0xfe201000 console=serial0,115200 root=/dev/mmcblk0p2 rw rootwait" | ||
+ | booti ${kernel_addr_r} - ${fdt_addr} | ||
+ | # se va plânge că nu aveți zonă de memorie de decompresie alocată! facem asta: | ||
+ | # set decompression zone in RAM at 400MB, 64MB in size | ||
+ | setenv kernel_comp_addr_r 0x19000000 | ||
+ | setenv kernel_comp_size 0x04000000 | ||
+ | # try again: | ||
booti ${kernel_addr_r} - ${fdt_addr} | booti ${kernel_addr_r} - ${fdt_addr} | ||
- | # sau cu initramfs: | + | # ramdisk-ul momentan nu merge folosit, dar e opțional la debian |
- | #booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr} | + | |
</code> | </code> | ||
Line 194: | Line 227: | ||
<note> | <note> | ||
- | Pentru a vedea parametrii de boot configurați în device tree de către BL2, rulați comenzile de u-boot: | + | Login-ul pentru rootfs este ''pi'' (fără parolă)! |
- | <code> | + | |
- | fdt addr ${fdt_addr} | + | |
- | fdt print /chosen | + | |
- | </code> | + | |
</note> | </note> | ||