Come si può automatizzare l'installazione di raspbian raspi-config?


17

Mi sono ritrovato a configurare ripetutamente tutti i miei pi con raspbian praticamente nello stesso modo usando raspi-config.

C'è un modo per estrarre tutte le impostazioni che ho fatto usando raspi-config in uno script eseguibile che potrei scaricare con wget su ogni nuovo pi che ho impostato?

Una soluzione simile con lo stesso effetto sarebbe anche apprezzata. Immagino di poter provare una delle implementazioni della finestra mobile rpi ma non sono così ansioso di scoprire quanto sia sanguinante quella roba.


1
dipende da quale configurazione vorresti fare? raspi-config modifica i file di configurazione che è possibile modificare in un altro modo (/boot/config.txt,/etc/module.conf ...)
mpromonet

1
È uno script di shell di 1000 righe piuttosto semplice /usr/bin, se questo aiuta. Se si desidera disabilitarlo avviandolo con una nuova immagine, eliminare /etc/init.d/apply_noobs_os_confige il collegamento /etc/rc2.d.
Riccioli d'oro

Proprio come raspi-config concentra tutte le attività di configurazione di base in un unico posto senza richiedermi di sapere come eseguire ogni attività, mi piacerebbe un semplice DSL che mi permetta di specificare tutte le impostazioni in un unico file. Un po 'come una finestra mobile.
8DH,

Perché non usare solo la finestra mobile?
Tim Holt,

Sì, perché no? Qual è la soluzione docker preferita per rpi?
8DH,

Risposte:


20

Almeno al giorno d'oggi, raspi-configsembra supportare la modalità non interattiva:

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

con questo, puoi scrivere script di installazione che possono fare qualsiasi cosa tu possa fare tramite il comando interattivo, e farà esattamente le stesse cose. Tuttavia, dovrai trovare i comandi pertinenti e il loro utilizzo dalla fonte dello script.


1
È meraviglioso!
8DH

Quindi, quando preparo una scheda SD, potrei inserire l'immagine lì, aggiungere il mio script alla cartella e quindi eseguire lo script quando il pi si è avviato.
8DH,

Ci sono altri miglioramenti a questa procedura che mi mancano?
8DH,

1
Questo è tutto ciò di cui sono a conoscenza - se c'è di più, non è documentato in modo molto visibile. Mi sono imbattuto in questo mentre guardavo la sceneggiatura e non ho cercato ulteriori informazioni dopo aver trovato questa funzione.
Silly Freak,

1
@ 8DH C'è qualcosa che non puoi gestire con questo metodo? (se è ancora rilevante per te personalmente)
Silly Freak

16

Questo non è ancora documentato da nessuna parte, ma lo strumento rc_gui (suppongo che sarebbe un'interfaccia utente grafica per raspi-config se dovessi mai installare il desktop completo) usa le opzioni della riga di comando per lo script bash raspi-config. Si può vedere l'elenco completo di opzioni nel codice sorgente C . AGGIORNAMENTO: il repository ufficiale è scomparso per qualche motivo. Questo è il fork più attivo che ho trovato.

/* 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"

AGGIORNAMENTO: noto che non c'è nulla nelle impostazioni locali o della tastiera. Quindi, questo mi suggerisce che dobbiamo esaminare la fonte di raspi-config. Fortunatamente abbiamo molti esempi sopra per avere un'idea di come usare quella sceneggiatura in modo noninterotico. Quindi, ciò che devo fare per risolvere questo problema senza testa è:

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

Le variabili sono i valori che avrei selezionato dall'interfaccia utente delle maledizioni. Le opzioni locali sono il primo campo nel file /usr/share/i18n/SUPPORTED. Le opzioni di layout della tastiera sono i nomi delle directory in /usr/share/X11/xkb/symbols/. Essendo negli Stati Uniti, io uso en_US.UTF-8e us. YMMV


2
Se sei interessato ad automatizzare l'installazione di Raspberry Pis, dovresti dare un'occhiata al mio progetto pi-init2 su github. Fornisce la funzionalità a lungo richiesta di "eseguire uno script all'avvio (senza testa)".
Bruno Bronosky,

C'è anche la sudo raspi-config nonint do_audio %dscelta dell'uscita audio (0 = auto, 1 = jack, 2 = HDMI)
golimar,

@golimar dove l'hai preso? Il progetto originale rc_gui è scomparso e il miglior fork che ho trovato (risposta aggiornata) non include do_audio. Ma questa è davvero una funzione trovata 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,

Qui: gist.github.com/damoclark/ab3d700aafa140efb97e510650d9b1be , ma il tuo comando è fantastico per trovarli tutti, grazie
golimar

3

Tutto ciò che raspi-configfa è modificare alcuni file di configurazione, che puoi anche modificare con uno script. Controlla il sedmanuale per vedere come tali modifiche possono essere eseguite in modo efficiente.

Se hai molte modifiche da applicare in questo modo, prenderei in considerazione la configurazione di un'immagine RPi pulita nel modo desiderato, il diffsuo file system completo * rispetto a un'immagine vaniglia, e quindi applicherei le modifiche con patchquando è necessario impostare una nuova installazione.

Infine, dai un'occhiata a strumenti come etckeeper: quelli sono specificamente progettati per manipolare le modifiche alla configurazione e sono in grado di tracciare le modifiche sottili che un semplice diffperderebbe, come le autorizzazioni. Si noti che contrariamente al suo nome, etckeepernon è limitato a /etc, ad esempio, l'esecuzione etckeeper -d /boot init; etckeeper -d /boot commiteseguirà un backup dei file in /boot.

(*) Apparentemente non è ovvio , quindi per eliminare tutti i malintesi, intendo che dovresti eseguire qualcosa di simile diff -r /etc /mnt/vanilla_root/etc > etc.diffe diff -r /boot /mnt/vanilla_boot > boot.diff, non diff my.img vanilla.img.


1

Usa dd (o simile) per copiare l'immagine Pi funzionante sul tuo PC.

Usa dd (o simile) per copiare l'immagine copiata dal tuo PC sul tuo Pi.

man dd


Sì, c'è ovviamente il modo in cui l'immagine, ma poi avrei bisogno di mantenere l'immagine con aggiornamenti e cose. (a meno che non ci sia una soluzione elegante anche per quello ...)
8DH

3
@ 8DH, il tuo suggerimento di scaricare le impostazioni e poi caricare significa anche che devi mantenere una "immagine" con gli aggiornamenti.
Tim Holt,

0

Ho 1 scheda SD configurata al 100% per i miei desideri che tengo come base per tutte le nuove installazioni.

Quando si configura un nuovo Pi, devo solo clonare quella scheda SD anziché iniziare da zero.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.