Gå til innhold
  • Bli medlem
Støtt hjemmeautomasjon.no!

Rpi4 liten headless innstallasjon med redusert skriving til minnekort


Anbefalte innlegg

Dette er notater jeg har gjordt for å få en liten headless innstallasjon på Rpi4 med 4GB RAM.

Målet var å få noe som skriver minst mulig til minnekortet, mest mulig standard og godt håndterbar i drift.

 

Litt mere detaljert enn jeg bruker  notere, så jeg kan likegodt poste det hær.

Forhåpentligvis kommer noen tilbakemeldinger om forbedringer ?

 

Lastet ned Raspbian Buster Lite fra https://www.raspberrypi.org/downloads/raspbian/

For en Linux-PC så blir skriving til minnekort slik:

#finne device for minnekort:
lsblk -p
#skrive Raspian lite til minnekort:
sudo dd bs=4M if=2019-09-26-raspbian-buster-lite.img of=/dev/mmcblk0 conv=fsync

Det finnes mange eksempler på hvordan dette gjøres på feks. Windos på nettet.

Jeg vil ikke vurdere disse da jeg ikke bruker det tilhintede OS før jeg MÅ ?

 

Dokumentasjon for å sette opp headless:
https://www.raspberrypi.org/documentation/configuration/wireless/headless.md

 

Jeg prøvde den foreslåtte metoden med WiFi, den fungerer.

For trådet ethernett er det bare å plugge inn for å få IP via DHCP.

 

For å enable ssh, lag en fil i /boot som heter "ssh"

Fila kan være tom eller inneholde ett mellomrom.

Dette er vesentlig da ssh er disablet som default!

 

For Wifi så må også fila wpa_supplicant.conf lages i boot med lignende innhold:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=NO

network={
 ssid="AntiTerrorGRPLeder"
 psk="VeldigHemmelig"
 key_mgmt=WPA-PSK
}

Det er tabbekvote om en bommer med disse filene.

Det går an å legge de inn selv om rpien har bootet fra kortet.

 

Avmonter minnekortet fra PCen og set det i rpien og sett på strøm

 

Min DHCP-server tar hostname fra alle maskinene og putter de i DNS.

Jeg kan derfor ta en "ping raspberrypi" for å se om den er oppe.

Ikke alle DHCP/DNS -servere er like praktisk satt opp så det kan godt hende det må jaktes etter riktig IP-adresse.

Alternativt så støtter alle moderne systemer mDNS i dag, og siden avahi er aktiv som default på Raspian så kan rpien også finnes

på nettet ditt som "raspberrypi.local"

 

ssh til "raspberrypi" med brukernavn pi. Default passord er "raspberry"

oppdater til siste programmvare:

sudo apt-get update && sudo apt-get upgrade -y

Sjekk om noen pakker er holdt tilbake:

sudo apt-get upgrade

om den sier noe som:

The following packages have been kept back:
  raspi-config

sudo apt install raspi-config

Like greit å få alle oppdateringer aktive:

sudo reboot

Logg inn i rpien når den har bootet opp igjen: (fra en Linux-PC gjøres det slik)

ssh -l pi raspberrypi

Essesielle ting å sette opp:

sudo raspi-config

(brukt tab-knappen for å veksle mellom menyvalgene og knappetastene, bla med piltastene)


1 Change User Password
2 Network Options
    N1 Hostname
    N2 Wi-fi (sett alle undermenyene hær om du skal bruke WiFi)
    N3 Network interface names ( like greit å bli med i den moderne verden dvs. enable se doklink)
        https://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/
3 Boot Options (hopp over, ikke relevant for headless)
4 Localisation Options
    I1 Change Locale (legg til nb_NO.UTF-8 UTF-8 og sett denne som default, IKKE fjern de andre som er haket på).
    I2 Change Timezone (velg Europe og Oslo)
    I3 Change Keyboard Layout (sjekk at nb_NO.UTF-8 UTF-8 er haket på og godta)
    I4 Change Wi-fi Country (velg NO Norway)
 
 Ta en titt i de resterende menyene også.
 
 avslutt menyen med Finish
Det er lurt å ta en reboot nå

sudo reboot

ssh inn rpien når den har bootet.

 

Disable swap:
 ----------------------
 

sudo systemctl disable dphys-swapfile.service
 

Installer log2ram:
 ---------------------------
 
 Se https://github.com/azlux/log2ram

legg til pakkebrønn og innstaller log2ram:

echo "deb http://packages.azlux.fr/debian/ buster main" | sudo tee /etc/apt/sources.list.d/azlux.list
wget -qO - https://azlux.fr/repo.gpg.key | sudo apt-key add -
sudo apt update
sudo apt install log2ram

Det kan være lurt å ta en titt i konfigurasjonsfila for log2ram:

sudo nano /etc/log2ram.conf

Spesielt linja
MAIL=true
spekulerer jeg på om er så lur. Jeg satte den til MAIL=false.

Jeg har uansett ingen mail konfigurert på denne rpien.

Så en reboot igjen:

sudo reboot

ssh inn når rpien har bootet opp.

Sjekke status på swap:

pi@dangle:/var $ service dphys-swapfile status
● dphys-swapfile.service - dphys-swapfile - set up, mount/unmount, and delete a swap file
   Loaded: loaded (/lib/systemd/system/dphys-swapfile.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:dphys-swapfile(8)

Altså den er disablet og inactive ?

 

Sjekke status for log2ram:

pi@dangle:/var $ df -h|grep log2ram
log2ram              40M  2,5M    38M    7% /var/log

Den bruker altså 7% av ramdisken til logfiler

pi@dangle:/var $ mount|grep log2ram
log2ram on /var/log type tmpfs (rw,nosuid,nodev,noexec,relatime,size=40960k,mode=755)

Det ser ut som om den orginale /var/log er å finne under /var/hdd.log

 

Edit: etter nærmere sjekk av rpi så ligger /run allerede i tmpfs (altså i ram)

pi@dangle:/ $ df -h|grep run
tmpfs               2,0G   33M   1,9G    2% /run
tmpfs               5,0M  4,0K   5,0M    1% /run/lock
tmpfs               391M     0   391M    0% /run/user/1000

 

TODO:
---------

Rpien setter av en god del RAM til skjerm. Siden vi ikke skal ha noen skjerm tilkoplet så kan vi bruke minnet til noe nyttig.
Finner ingen god dokumentasjon for rpi4 på dette akkurat nå.

 

Det er sikkert mange deb-pakker som kan fjernes. Bør gå igjennom disse.

 

Se om /var/tmp lager mye skriving.
Denne kan potensielt også ligge i en ram-disk.

 

Vurder om man trenger alle loggene. Sjekk om man kan tune litt på rsyslog.

 

Altialt så begynner Raspberry Pi å ligne på noe brukbart.

Ver 4 har gigabit nettverksinterface som ikke deler båndbredde med buggy USB.

4GB RAM åpner for muligheter.

Lillingen virker snappy og kjapp. Dvs. helt til den må lese eller skrive til minnekortet.

Har anskaffet to stk. med PoE hatt så langt, og de skal få prøve seg.

Så får det vise seg hvor smådjevlene ligger henne ?

 

 

Endret av NilsOF
Pressisering av locales
  • Like 7
Lenke til kommentar
Del på andre sider

nettverk og persistent navning av interfacer

 

tl;dr: Bare aktuelt om man vil plugge inn flere nettverksinterfacer (ethernett og/eller wifi)

 

Mål: unngå interface-navn som enx283b82c7ae97
eller at navnet interface1 har plutselig blir bundet mot hardware interface2 og motsatt
Jeg vil ha navn på nettverksinterfacene som er likelydende på alle mine rpi-bokser.

 

Nettverk og interface-navning i Linux har vært i endring en god stund nå og vil ganske sikkert fortsette å endre seg før støvet omsider legger seg.
Raspberry Pi Foundation har også valgt å bruke eth0 og wlan0 som interface-navn i Raspian Buster.
Og dermed har vi endt opp med en slags kvasiløsning dær de Innebygde interfacene (for rpi) følger gammel standard for navning mens nettverksinterfacer som plugges inn på USB får navn med "ny" standard. feks.: enx283b82c7ae97
Dette er såkalt "Predictable interface names".
Det som kanskje er mest "Predictable" med ett slikt navn er at det går dårlig ihop med mennesklig hukommelse og assosiasjon.
Situasjonen er som den er og vi må gjøre det beste ut av det.
Det eneste som virker sikkert er at "Predictable interface names" har kommet for å bli.

 

På Rasbian er Debians dokumenterte renaming av interfacer i /etc/networking/interfaces
upålitelig så den muligheten utgår.
Med "Predictable interface names" er slått på blir min USB-ethernett -dongle altså til enx283b82c7ae97. Slått av blir den eth1.
Det går ikke an å gi enx283b82c7ae97 ett nytt navn med Debians "rename" (kanskje fordi den allerede er renamed), mens ethX altså IKKE er pålitelig da de nummereres fortløpende ettersom systemet finner de. Med andre ord: Man kan risikere at interfacer bytter navn.

 

En Debian-utvikler lagde dette dokumentet:
https://wiki.debian.org/NetworkInterfaceNames
Innholdet i dette dokumentet har endret seg mye de to siste ukene,
noe som jeg tolker som at Debian søker en løsning på problemet for neste versjon.
Og ikke minst at det jobbes med saken.

 

I alt dette rotet har jeg kommet til følgende løsning med Raspian Buster:
1: La Rasbian selv ta håndtering av innebygde interfacer på rpien.
2: Ekstra nettverksinterfacer låses til egendefinert navn etter mac-adresse.
3: Navn som ethX og wlanX unngåes i vår navngivning. lanX og wifiX er ledige for bruk.

Det første man må gjøre er å slå av systemd's "Predictable interface names" mekanisme med

ln -nfs /dev/null /etc/systemd/network/99-default.link

USB- interfacer vil da som default få navn som eth1, eth2 eller wlan1, wlan2 fortløpende etter som de blir oppdaget av systemet.
Men vi overstyrer navngivingen etter mac-adressa på interfacet.

Det må være en fil for hvert interface som skal ha nytt navn.
 feks:

 /etc/systemd/network/10-persistent-net-lan1.link
 /etc/systemd/network/10-persistent-net-lan2.link
 /etc/systemd/network/10-persistent-net-wifi1.link
 /etc/systemd/network/10-persistent-net-wifi2.link

Disse filene lastes i ASCIIbetisk rekkefølge av systemet
 
Innholdet i diise filene blir som følgende:

#Sette interface navn etter mac-addr
#/etc/systemd/network/10-persistent-net-?.link
 [Match]
 MACAddress=01:23:45:67:89:ab

 [Link]
 Name=lan1

 sjekk filene med "udevadm test /sys/class/net/"
 Les utlistingen nøye!
 
 Fremgangsmåte:
 1: plugg i interface og lopp ut MAC-adressa med "ip link"
 2: lag/editer /etc/systemd/network/10-persistent-net-?.link fila
 3: plugg ut og inn igjen interfacet
 4: sjekk at navnet er endret med "ip link"
 5: dersom navnet ikke er endret, studer utlisting av "udevadm test /sys/class/net/"
 

Endret av NilsOF
  • Like 1
Lenke til kommentar
Del på andre sider

root og sudo:
----------------------
I eksemplene nedenfor har jeg ikke giddet å putte sudo foran alle komandoene.
Når man skal jobbe som root bør man være root ? Når man ikke jobber som root skal man heller ikke være det!

#bli root og ta med envioment fra gjeldende bruker:
sudo su -

Merk bindestreken etter su


wpa_supplicant:
----------------------------
For at WiFi skal kunne fungere trenger man en /etc/wpa_supplicant/wpa_supplicant.conf som ser ut noe slik:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=NO

network={
 ssid="PST-OSL-Utepatrulje"
 psk="VeldigHemmelig"
 key_mgmt=WPA-PSK
}
network={
 ssid="PST-Hovedkvarter"
 psk="ExxxtraHemmmeliigOgVaaanskelig"
 key_mgmt=WPA-PSK
}
#Etter edit av fil for å aktivere nytt oppsett:
wpa_cli -i wlan0 reconfigure
#For å aktivere feks. dhcpcd for statisk eller dynamisk IP:
service dhcpcd restart
#Sjekk resultat:
ip address list

Jobbe over ssh med nettverksinnstillinger på headless system.
 ------------------------------------------------------------------------------------------------
 
 Når man jobber med ett headless system er det viktig at man ikke sager over greina man sitter på.
Altså: IKKE rekonfigurer interfacet man er logget inn over.
I praksis så kan man gjøre dette med å sette op både ethernett og wifi interfacet slik at de nåes
på samme subnett. De vil da ha hver sin IP-adresse.
dhcp er ett ok utgangspunkt for begge interfacene.

#Finn den rette adressa å logge inn på:
ip route show

Logg ut og inn igjen på IP-adressa som tilhører interfacet man IKKE skal jobbe med.
 
 
 dhcpcd
 ------------
 
 Kan ikke akkurat si at jeg tok bølgen da jeg oppdaget at default maskineri for
 adresse-styring i Rasbian er dhcpcd..
 Den tar som default ALLE nettverksinterfacer som kommer opp og vil forsøke å hente IPer fra dhcp-server og binde IPer til interface.
 Der jeg kommer fra er slikt direkte farlig.
 Menmen, for de fleste bruksomeråder oppleves det sikkert som helt greit.
 
Statiske IP-adresser på Rasbian kan gjøres veldig enkelt:

Sette statiske IP-adresser ved å editere eksempelene i /etc/dhcpcd.conf:

nano /etc/dhcpcd.conf
#Se hva man har før aktivering av endringer:
ip address list
#Restart så dhcpcd for aktivere endringene:
service dhcpcd restart
#Sjekk hva som skjedde:
ip address list

Observer at interfacet nå har både statisk IP og adresse fra dhcp.
(helt til reboot eller dhcp-IPn fjernes manuelt fra interfacet.
Hva som skjer når dhcp-leasen går ut ventet jeg ikke på for å finne ut.. ?

Alle adresser blir publisert av avahi over mDNS som <hostname>.local


Ta ett interface ut av dhcpcd sin kontroll
-------------------------------------------------------------

Siden dhcpcd allerede har konfigurert interfacene må noen tilltak taes (bruker wlan0 som eksempel):

editer /etc/dhcpcd.conf: Legg inn "denyinterfaces wlan0" i toppen av fila

#restart dhcpcd for aktivere nye innstillinger:
service dhcpcd restart
#ta ned Interfacet:
ip link set wlan0 down
#fjern alle IP-adresser på interfacet:
ip addr flush dev wlan0
#opsjonelt: prøv å ta interfacet opp igjen:
ip link set wlan0 up
#opsjonelt: sjekk om noen adresser er tildelt (skal ikke noen, samt ha "state DOWN"):
ip address list

Merknad1: dhcpcd liker tydeligvis ikke at man tukler med interfacene og adressene den mener den har ansvar for.
Den MÅ først fortelles hva den IKKE har ansvar for! (med "denyinterfaces <ifacenavn>" og påfølgende restart av service)
Ellers opplevde jeg at dhcpcd gikk fullstendig i frø og tok alle nettverk med seg i fallet. Spesielt ved jobbing på eth0.

 

Merknad2: Dersom man tar ett interface ut med "denyinterfaces <ifacenavn>"  samt konfigurer interfacet med /etc/network/interfaces for så å reboote så vil dhcpd nekte å starte.
Den sier "Failed to start dhcpcd on all interfaces"
Løsningen er å gjøre seg ferdig med /etc/network/interfaces før man rebooter.
Det er lurt å flytte ett interface om gangen. Inkludert testing.
I tilfelle rottefelle så bør man uansett deklarere alle utflyttede interfacer ettervert som de flyttes: "denyinterfaces <ifacenavn1> <ifacenavn2>" skilt med mellomrom. Det kan jo hende at dette er en bug som plutselig blir fikset..

 

Bruke Debians /etc/network/interfaces
---------------------------------------------------------

Dette er aktuelt om man vil bruke VLAN på nettverksinterfacene,
eller bruke Bridging, eller kanskje Bonding (sette samen flere fysiske interfacer)
For min egen del er det vanen, jeg vil bruke /etc/networking/interfaces som på en ordentlig Debian installasjon.
Jeg har også funnet dette som en utmerket måte å gjøre nettverksendringer på maskiner i drift uten at det merkes på de andre interfacene.
Jeg liker også at alle interfacene er ganske oversiktelig og komprimert listet i en fil.

(noe rotete) dokumentert: https://wiki.debian.org/NetworkConfiguration
Ellers er "man" et fint verktøy: "man interfaces", "man ifup" feks.

 

Kort intro:
--------------
"ifup <ifacenavn>" og "ifdown <ifacenavn>" er kommandoene man bruker for å ta opp og ned interfacene.
Om man vil legge til ett interface:
1: legg inn interfacet med innstillinger i /etc/networking/interfaces
2: ifup <ifacenavn>

 

Om man vil endre ett interface:
1: ifdown <ifacenavn>
2: editer interfacets innstillinger i /etc/networking/interfaces
3: ifup <ifacenavn>

 

For all del: Migrer kun over ett interface ut fra /etc/dhcpd.conf i gangen og test det før man tar neste
(eller rebooter, se merknader under avsnittet "Ta ett interface ut av dhcpcd sin kontroll").

Eksempel på /etc/networking/interfaces man kan bruke som utgangspunkt:

# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d

##eksempel: eth0 med dhcp
#auto eth0
#allow-hotplug eth0
#       iface eth0 inet dhcp

##eksempel: eth0 med statisk IP og opsjonell DNS-server for ifacet
#auto eth0
#allow-hotplug eth0
#       iface eth0 inet static
#        address 192.168.1.22/24
#        gateway 192.168.1.7
#        dns-nameservers 192.168.1.7

##eksempel: wlan0 med dhcp og link til wpa_supplicant.conf
#auto wlan0
#allow-hotplug wlan0
#iface wlan0 inet dhcp
#           wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

##eksempel: trådløs med statisk IP
#auto wlan0
#allow-hotplug wlan0
#iface wlan0 inet static
#       address 192.168.1.23/24
#       gateway 192.168.1.7
#       dns-nameservers 192.168.1.7
#       wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Når alt er plass bør man disable dhcpd:

systemctl disable dhcpcd.service

Alternativer til dhcpcd og /etc/network/interfaces for konfig av IP og interfacer
---------------------------------------------------------------------------------------------------------------
Jadda, de er der!

Alt1:

ip link add name br0 type bridge
ip link add name veth0 type veth peer name veth1
ip link set veth0 master br0
...
ip link set br0 up

 

Da har man fullstendig kontroll på detaljene.
Det blir ganske fort uoversiktelig, men er absolutt gjenomførbart.
Helt nødvendig for lavnivå kontroll, oppretting,prototyping eller endring av interfacer, IPadresser og routing.

 

Al2:
Bruke systemd.


Dokumentert https://www.freedesktop.org/software/systemd/man/systemd.network.html og https://www.freedesktop.org/software/systemd/man/systemd.netdev.html
Servicen  systemd-networkd er innstallert som default på Rasbian, men ikke aktivert.
En kjapp titt sier meg at det er gjennomførbart.
Om noen vil prøve seg, så vil jeg gjerne lese om det. ?

 

Endret av NilsOF
Lenke til kommentar
Del på andre sider

Bli med i samtalen

Du kan publisere innhold nå og registrere deg senere. Hvis du har en konto, logg inn nå for å poste med kontoen din.

Gjest
Skriv svar til emnet...

×   Du har limt inn tekst med formatering.   Lim inn uten formatering i stedet

  Du kan kun bruke opp til 75 smilefjes.

×   Lenken din har blitt bygget inn på siden automatisk.   Vis som en ordinær lenke i stedet

×   Tidligere tekst har blitt gjenopprettet.   Tøm tekstverktøy

×   Du kan ikke lime inn bilder direkte. Last opp eller legg inn bilder fra URL.

×
×
  • Opprett ny...

Viktig informasjon

Vi har plassert informasjonskapsler/cookies på din enhet for å gjøre denne siden bedre. Du kan justere dine innstillinger for informasjonskapsler, ellers vil vi anta at dette er ok for deg.