Wie kann man das Setup von raspbian raspi-config automatisieren?

17

Ich habe festgestellt, dass ich mit raspi-config immer wieder alle meine Pi's mit raspbian auf die gleiche Weise eingerichtet habe.

Gibt es eine Möglichkeit, alle Einstellungen, die ich mit raspi-config vorgenommen habe, in ein ausführbares Skript zu extrahieren, das ich mit wget auf jedes neu eingerichtete Pi herunterladen kann?

Eine ähnliche Lösung mit dem gleichen Effekt wäre auch wünschenswert. Ich denke, ich könnte eine der RPI-Docker-Implementierungen ausprobieren, aber ich bin nicht so gespannt darauf, herauszufinden, wie aktuell das Zeug ist.

8DH
quelle
1
Es hängt davon ab, welche Konfiguration Sie vornehmen möchten. raspi-config Konfigurationsdateien ändern, die Sie auf andere Weise ändern können (/boot/config.txt ,/etc/module.conf ...)
mpromonet
1
Es ist ein ziemlich einfaches 1000-Zeilen-Shell-Skript /usr/bin, wenn das hilft. Wenn Sie das Starten mit neuen Bildern deaktivieren möchten, löschen Sie /etc/init.d/apply_noobs_os_configund den Link in /etc/rc2.d.
Goldlöckchen
So wie raspi-config alle grundlegenden Setup-Aufgaben an einem Ort konzentriert, ohne dass ich wissen muss, wie jede Aufgabe zu erledigen ist, hätte ich gerne ein einfaches DSL, mit dem ich alle Einstellungen in einer Datei festlegen kann. Ein bisschen wie Hafenarbeiter.
8.
Warum nicht einfach Docker benutzen?
Tim Holt
Ja, warum nicht? Was ist die bevorzugte Docker-Lösung für RPI?
8.

Antworten:

20

Zumindest heutzutage raspi-configscheint der nicht interaktive Modus zu unterstützen:

cat /boot/cmdline.txt            # show original cmdline.txt
raspi-config nonint do_serial 1  # disable serial console
cat /boot/cmdline.txt            # confirm changes
raspi-config nonint do_serial 0  # enable serial console
cat /boot/cmdline.txt            # confirm changes

Mit diesem Befehl können Sie Setup-Skripte schreiben, die alles tun, was Sie über den interaktiven Befehl tun können, und genau das Gleiche tun. Sie müssen die relevanten Befehle und ihre Verwendung jedoch aus der Quelle des Skripts herausfinden.

Dumme Freak
quelle
1
Das ist wundervoll!
8.
Wenn ich also eine SD-Karte vorbereite, könnte ich das Image dort ablegen, mein Skript zum Ordner hinzufügen und das Skript dann ausführen, wenn der Pi gebootet wurde.
8.
Gibt es weitere Verbesserungen an diesem Verfahren, die ich vermisse?
8.
1
Das ist alles, was mir bewusst ist - wenn es mehr gibt, ist es nicht sehr gut sichtbar dokumentiert. Ich bin beim Lesen des Skripts darauf gestoßen und habe nach dem Auffinden dieser Funktion nicht mehr nach weiteren Informationen gesucht.
Dumme Freak
1
@ 8DH Gibt es etwas, mit dem Sie mit dieser Methode nicht umgehen können? (wenn es für Sie persönlich noch relevant ist)
Silly Freak
16

Dies ist noch nirgendwo dokumentiert, aber das rc_gui-Tool (ich nehme an, es wäre eine grafische Benutzeroberfläche für die raspi-config, wenn ich jemals den vollständigen Desktop installieren würde) verwendet Befehlszeilenoptionen für das raspi-config-Bash-Skript. Sie können die vollständige Liste der Optionen im C-Quellcode sehen . UPDATE: Das offizielle Repo ist aus irgendeinem Grund verschwunden. Dies ist die aktivste Gabel, die ich finden konnte.

/* Command strings */
#define GET_CAN_EXPAND  "sudo raspi-config nonint get_can_expand"
#define EXPAND_FS       "sudo raspi-config nonint do_expand_rootfs"
#define GET_HOSTNAME    "sudo raspi-config nonint get_hostname"
#define SET_HOSTNAME    "sudo raspi-config nonint do_hostname %s"
#define GET_BOOT_CLI    "sudo raspi-config nonint get_boot_cli"
#define GET_AUTOLOGIN   "sudo raspi-config nonint get_autologin"
#define SET_BOOT_CLI    "sudo raspi-config nonint do_boot_behaviour B1"
#define SET_BOOT_CLIA   "sudo raspi-config nonint do_boot_behaviour B2"
#define SET_BOOT_GUI    "sudo raspi-config nonint do_boot_behaviour B3"
#define SET_BOOT_GUIA   "sudo raspi-config nonint do_boot_behaviour B4"
#define GET_BOOT_WAIT   "sudo raspi-config nonint get_boot_wait"
#define SET_BOOT_WAIT   "sudo raspi-config nonint do_boot_wait %d"
#define GET_SPLASH      "sudo raspi-config nonint get_boot_splash"
#define SET_SPLASH      "sudo raspi-config nonint do_boot_splash %d"
#define GET_OVERSCAN    "sudo raspi-config nonint get_overscan"
#define SET_OVERSCAN    "sudo raspi-config nonint do_overscan %d"
#define GET_CAMERA      "sudo raspi-config nonint get_camera"
#define SET_CAMERA      "sudo raspi-config nonint do_camera %d"
#define GET_SSH         "sudo raspi-config nonint get_ssh"
#define SET_SSH         "sudo raspi-config nonint do_ssh %d"
#define GET_VNC         "sudo raspi-config nonint get_vnc"
#define SET_VNC         "sudo raspi-config nonint do_vnc %d"
#define GET_SPI         "sudo raspi-config nonint get_spi"
#define SET_SPI         "sudo raspi-config nonint do_spi %d"
#define GET_I2C         "sudo raspi-config nonint get_i2c"
#define SET_I2C         "sudo raspi-config nonint do_i2c %d"
#define GET_SERIAL      "sudo raspi-config nonint get_serial"
#define GET_SERIALHW    "sudo raspi-config nonint get_serial_hw"
#define SET_SERIAL      "sudo raspi-config nonint do_serial %d"
#define GET_1WIRE       "sudo raspi-config nonint get_onewire"
#define SET_1WIRE       "sudo raspi-config nonint do_onewire %d"
#define GET_RGPIO       "sudo raspi-config nonint get_rgpio"
#define SET_RGPIO       "sudo raspi-config nonint do_rgpio %d"
#define GET_PI_TYPE     "sudo raspi-config nonint get_pi_type"
#define GET_OVERCLOCK   "sudo raspi-config nonint get_config_var arm_freq /boot/config.txt"
#define SET_OVERCLOCK   "sudo raspi-config nonint do_overclock %s"
#define GET_GPU_MEM     "sudo raspi-config nonint get_config_var gpu_mem /boot/config.txt"
#define GET_GPU_MEM_256 "sudo raspi-config nonint get_config_var gpu_mem_256 /boot/config.txt"
#define GET_GPU_MEM_512 "sudo raspi-config nonint get_config_var gpu_mem_512 /boot/config.txt"
#define GET_GPU_MEM_1K  "sudo raspi-config nonint get_config_var gpu_mem_1024 /boot/config.txt"
#define SET_GPU_MEM     "sudo raspi-config nonint do_memory_split %d"
#define GET_HDMI_GROUP  "sudo raspi-config nonint get_config_var hdmi_group /boot/config.txt"
#define GET_HDMI_MODE   "sudo raspi-config nonint get_config_var hdmi_mode /boot/config.txt"
#define SET_HDMI_GP_MOD "sudo raspi-config nonint do_resolution %d %d"
#define GET_WIFI_CTRY   "sudo raspi-config nonint get_wifi_country"
#define SET_WIFI_CTRY   "sudo raspi-config nonint do_wifi_country %s"
#define CHANGE_PASSWD   "(echo \"%s\" ; echo \"%s\" ; echo \"%s\") | passwd"

UPDATE: Mir ist aufgefallen, dass sich dort nichts über das Gebietsschema oder die Tastatureinstellungen befindet. Das legt mir also nahe, dass wir die Quelle von untersuchen müssen raspi-config. Glücklicherweise haben wir oben viele Beispiele, um eine Vorstellung davon zu bekommen, wie man dieses Skript noninteraktiv einsetzt. Also, was ich tun muss, um dieses Problem kopflos zu lösen , ist:

locale=en_US.UTF-8
layout=us
sudo raspi-config nonint do_change_locale $locale
sudo raspi-config nonint do_configure_keyboard $layout

Die Variablen sind die Werte, die ich auf der Curses-Benutzeroberfläche ausgewählt hätte. Gebietsschemaoptionen sind das erste Feld in der Datei /usr/share/i18n/SUPPORTED. Tastaturlayoutoptionen sind die Verzeichnisnamen in /usr/share/X11/xkb/symbols/. In den USA benutze ich en_US.UTF-8und us. YMMV

Bruno Bronosky
quelle
2
Wenn Sie daran interessiert sind, das Setup von Raspberry Pis zu automatisieren, sollten Sie sich mein pi-init2- Projekt auf github ansehen. Es bietet die seit langem gewünschte Funktion "Ein Skript beim Booten ausführen (ohne Kopf)".
Bruno Bronosky
Es gibt auch sudo raspi-config nonint do_audio %dfür die Auswahl der Audio-Ausgabe (0 = Auto, 1 = Buchse, 2 = HDMI)
Golimar
@golimar woher hast du das? Das ursprüngliche rc_gui-Projekt ist verschwunden und die beste Gabel, die ich finden konnte (Antwort aktualisiert), enthält sie nicht do_audio. Aber das ist in der Tat eine Funktion incurl -sL https://github.com/RPi-Distro/raspi-config/raw/master/raspi-config | grep -E '(do|get)_[a-zA-Z0-9_ ]+\(' | sort | uniq
Bruno Bronosky
Hier: gist.github.com/damoclark/ab3d700aafa140efb97e510650d9b1be , aber Ihr Befehl ist großartig, alle zu finden, danke
golimar
3

Es raspi-configmüssen nur einige Konfigurationsdateien bearbeitet werden, die Sie auch mit einem Skript bearbeiten können. sedSehen Sie im Handbuch nach, wie solche Bearbeitungen effizient durchgeführt werden können.

Wenn Sie eine Menge Änderungen auf diese Weise anwenden müssen, würde ich in Betracht ziehen, ein sauberes RPi-Image so einzurichten, wie Sie es möchten, diffsein vollständiges Dateisystem * gegen ein Vanille-Image und die Änderungen dann mit anzuwenden, patchwenn Sie ein neues einrichten müssen Installation.

Schauen Sie sich abschließend Tools an, etckeeperdie speziell für das Manipulieren von Konfigurationsänderungen entwickelt wurden und in der Lage sind, geringfügige Änderungen, die ein einfacher diffBenutzer übersehen hätte, wie z. B. Berechtigungen, nachzuverfolgen. Beachten Sie, dass im Gegensatz zu seinem Namen etckeeperkeine Einschränkung besteht /etc, z. B. wird beim Ausführen etckeeper -d /boot init; etckeeper -d /boot commiteine Sicherungskopie der Dateien in erstellt /boot.

(*) Anscheinend ist es nicht offensichtlich . Um alle Missverständnisse auszuräumen, solltest du so etwas wie diff -r /etc /mnt/vanilla_root/etc > etc.diffund diff -r /boot /mnt/vanilla_boot > boot.diffnicht machen diff my.img vanilla.img.

Dmitry Grigoryev
quelle
1

Verwenden Sie dd (oder ähnliches), um das funktionierende Pi-Image auf Ihren PC zu kopieren.

Verwenden Sie dd (oder ähnliches), um das kopierte Bild von Ihrem PC auf Ihren Pi zu kopieren.

Mann dd

joan
quelle
Ja, da gibt es natürlich den Image-Weg, aber dann müsste ich das Image mit Updates und so weiter pflegen. (es sei denn, es gibt auch dafür eine elegante Lösung ...)
8.
3
@ 8DH, Ihr Vorschlag, Einstellungen herunterzuladen und dann hochzuladen, bedeutet auch, dass Sie auch ein "Image" mit Aktualisierungen pflegen müssen.
Tim Holt
0

Ich habe 1 SD-Karte 100% nach meinen Wünschen eingerichtet, die ich als Basis für alle Neuinstallationen behalte.

Beim Einrichten eines neuen Pi klone ich einfach diese SD-Karte, anstatt von vorne zu beginnen.

ON5MF Jürgen
quelle