Page 1 of 1

Eigenes Factory Reset Script, Daten vom USB Stick

Posted: 23 Sep 2020, 08:39
by mdirk
Hallo zusammen,

ich habe mir aus dem original RevPi-factory-reset Script ein eigenes reset-Script erstellt. Ziel ist es, über dieses Script die Netwerkeinstellungen (DHCP oder statische IP), das UserPW, den Hostnamen sowie einige Einstellungen für AnyDesk und VNC mitzugeben. Ich muss mehrere (vermutlich über 100) RevPi's für unsere Kunden einrichten, damit diese im Netzwerk laufen und wir uns per AnyDesk verbinden können. Dazu soll der Kunde max. einen USB Stick einstecken müssen und die Einrichtung automatisch mit den von uns zur Verfügung gestellten Einrichtungsdaten durchgeführt werden.

Dazu liesst das Script eine Config-Datei entweder aus dem Ordner /boot oder vom USB-Stick. Im /boot Ordner ist bei der Auslieferung von uns schon eine Basis-Config hinterlegt. Wird eine USB Stick mti config-Datei gefunden, hat diese jedoch die höhere Priorität.

Hier bin ich nun aber auf mehrere Probleme gestoßen. Hauptsächlich macht mir das erkennen des USB Sticks Probleme.

Wie das Script bisher aussieht:
Script-A) unter etc/profile.d liegt das "thorw-revpi-factory-reset.sh" Script. Dieses wird beim Login des Users ausgeführt.
  • Es prüft ob eine USB Stick vorhanden ist. Wenn ja wird die Config-Datei von diesem genommen, sonst aus dem /boot Verzeichnis.
  • Diese wird dann ausgelesen (ähnlich wie XML formatiert)
  • Eine LOG-Datei wird in /home/pi erstellt und falls möglich auch auf dem USB Stick kopiert
    (die LOG protokolliert die einzelnen Schritte des Scripts und soll uns in Servicefällen helfen)
  • Das "thorw-revpi-factory-reset" BASH-Script wird aufgerufen (falls /home/pi/.thorw-revpi-factory-reset und keine LOG-Datei auf USB Stick vorhanden) und die eingelesenen Werte werden als Args übergeben
Script-B) unter /usr/sbin liegt das "thorw-revpi-factory-reset" BASH-Script.
  • Es wird geprüft ob die Args das richtige Format haben. Falls nicht bricht das Script ab
  • overlay, machine id, mac adresse, hostname, userpw, network setting, AnyDesk und VNC Einstellungen werden gesetzt
  • "boot to GUI" wird aktiviert
  • Script führt zum Ende ein Reboot aus

Die Probleme:
  1. "find"-Befehl kann auch mit sudo in der CLI nicht den USB-Stick durchsuchen. Ein schreiben auf diesem ist auch nicht mögliche. Ist die GUI richtig gebootet, ist sowohl lesen als auch schreiben möglich. Sowohl in der GUI als auch CLI wird er automatisch unter z.B. /media/pi/KINGSTON gemountet.
    --> Lösung: Ich mounte mir den USB Stick manuell in den Ordner /media/pi/USB1 mit dem Befehl "sudo mount -o utf8,uid=pi,gid=pi,noatime /dev/sda1 /media/pi/USB1"
  2. der RevPi ist so eingestellt, dass er direkt in die GUI bootet. Jetzt scheint hier das Problem zu sein, dass es sich bei diesem vorgang zunächst in der CLI einloggt und nur wenige ms später in die GUI einloggt. Diese Logins führen dazu, dass das Script doppelt/parallel läuft. Hier macht dann wieder das manuelle mounten der USB Sticks Probleme. Was genau passiert kann ich nicht richtig nachvollziehen, jedoch scheint eins der Scripte den USB Stick nicht mehr richtig auslesen zu können. Es findet wohl die config-Datei, nicht aber die LOG. Da es die LOG nicht findet, wird ein Setup mit den USB-Stick config-Daten ausgeführt. Es ergibt sich somit eine Endlos-Schleife, solange der USB Stick eingesteckt ist.

Da ich hier nicht wirklich ne Idee habe, wie ich die Probleme sauber lösen kann und dass parallel starten eh blöd ist, habe ich mir was anderes überlegt.
Neue Idee ist, das Script nicht mehr bei jedem Start auszuführen, sondern immer dann, wenn ein USB Stick eingesteckt wird.

Gibt es noch andere Ideen? Ich kann auch gerne mal die beiden Script-Dateien hochladen.

Re: Eigenes Factory Reset Script, Daten vom USB Stick

Posted: 24 Sep 2020, 20:22
by sfm
Hallo,

ich hatte etwas ähnliches vor: meine Software schreibt ein log-File nach Desktop/pi/logs und sollte es alternativ auf einen USB-Stick schreiben, wenn einer eingesteckt ist. Das hätte den Vorteil, dass man auch per "Fernwartung" vom Benutzer zumindest die log-Datei bekommen könnte. Schlussendlich habe ich das verworfen, weil mir der Aufwand, einen USB-Stick zuverlässig zu (un)mounten, zu groß erscheint und das Risiko durch irgendwelche Fehlbedienungen, kaputte Sticks usw. größer ist als der mögliche Nutzen. Es ist auf jeden Fall so, dass der Stick erstmal nur gemounted wird, wenn die GUI aktiviert ist und man eingeloggt ist.

Man kann über das Tool usbmount automatisch mounten. Leider mounted die GUI automatisch in /media/pi/DEVICENAME und usbmount in /media/usb0 (und nummeriert dann durch), d.h. wenn man unterschiedliche Konfigurationen erwartet, muss man das abfangen.

Im Wesentlichen sind es folgende Schritte:
sudo apt-get install usbmount
sudo nano /etc/usbmount/usbmount.conf
dort eintragen
FS_MOUNTOPTIONS="-fstype=vfat,gid=users,dmask=0007,fmask=0117"

sudo nano /lib/systemd/system/systemd-udevd.service
dort
MountFlags=slave
ändern zu
MountFlags=shared

Hier sind einige Links, die das Problem weiter diskutieren und aus denen die Lösung stammt. ntfs-3g braucht man vermutlich nicht unbedingt.
https://www.elektronik-kompendium.de/si ... 911271.htm
https://www.elektronik-kompendium.de/si ... 012181.htm
https://pimylifeup.com/raspberry-pi-mount-usb-drive/
https://forum-raspberrypi.de/forum/thre ... ert-nicht/

Viel Erfolg
J.S.

Re: Eigenes Factory Reset Script, Daten vom USB Stick

Posted: 29 Sep 2020, 10:17
by mdirk
Ich habe es jetzt zum laufen bekommen. Habe meine Idee mit dem USB Stick weiter verfolgt. Ich führe mein Script jetzt nicht beim boot, sondern beim einstecken eines USB Device aus.

Und zwar boote ich eh in die GUI, da ich diese für AnyDesk benötige. Hier werden USB Devices ja automatisch erkannt und unter /media/pi/ gemountet. Damit ich auch auf NTFS schreiben kann, habe ich noch ntfs-3g installiert, mit folgendem Befehl:

Code: Select all

sudo apt-get -y install ntfs-3g hfsutils hfsprogs exfat-fuse

Über eine "udev" Regel starte ich dann einen Service, welcher wiederum ein Skript startet. Dieses Script kann dann all das machen, was man gerne machen möchte. In meinem Fall nach einem Config-File auf USB-Devices suchen und falls er eins findet, das Setup-Script starten. Weiter kopiert es mir die LOG vom RevPi auf das USB Device.
Ich starte zunächst einen Service, da "udev" ansich eine Script nach glaub ca. 5s killt. Sprich alles müsste in 5s passieren.
Mein Script hat am Anfang aber schon ein sleep von 5s, damit das System Zeit hat, das USB Device zu mounten. Dies kann nämlich schon einmal etwas länger dauern.

Meine UDEV-Regel (/etc/udev/rules.d/99-auto_USB_setup.rules):

Code: Select all

# Sobald USB Device durch Plug'n'Play erkannt, wird das Thorwesten-Setup Script ausgeführt

ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd?1", ENV{SYSTEMD_WANTS}+="usbscan.service"

ACTION=="remove", SUBSYSTEMS=="usb", KERNEL=="sd?1", RUN+="/bin/bash /usr/local/bin/whenUSBremoved.sh"
mit nachfolgenden Befehlen gebe ich der Regel die passenden Rechte und sogar dafür das sie aktiv sind:

Code: Select all

sudo chmod 644 /etc/udev/rules.d/99-auto_USB_setup.rules
sudo chown root:root /etc/udev/rules.d/99-auto_USB_setup.rules
/etc/init.d/udev restart
sudo udevadm control --reload-rules

Mein Service (/etc/systemd/system/usbscan.service):

Code: Select all

[Unit]
Description=USB Scanner

[Service]
ExecStart=/usr/local/bin/startasPI.sh

[Install]
WantedBy=system.device
Folgende Befehle sind für den Start des Service notwendig:

Code: Select all

sudo chmod 755 /etc/systemd/system/usbscan.service
sudo chown root:root /etc/systemd/system/usbscan.service
sudo systemctl daemon-reload