¿Cómo se puede automatizar la configuración raspbian raspi-config?

17

Me he encontrado varias veces configurando todos mis pi con raspbian de la misma manera usando raspi-config.

¿Hay alguna forma de extraer todas las configuraciones que hice usando raspi-config en un script ejecutable que podría descargar con wget en cada nueva pi que configuré?

También se agradecería una solución similar con el mismo efecto. Supongo que podría probar una de las implementaciones de rpi docker, pero no estoy tan ansioso por descubrir qué tan innovador es ese material.

8DH
fuente
1
depende de qué configuración le gustaría hacer? archivos de configuración de modificación de raspi-config que puede modificar de otra manera (/boot/config.txt,/etc/module.conf ...)
mpromonet
1
Es un script de shell de 1000 líneas bastante simple /usr/bin, si eso ayuda. Si desea deshabilitarlo comenzando con imágenes nuevas, elimine /etc/init.d/apply_noobs_os_configy el enlace en /etc/rc2.d.
Ricitos de oro
Al igual que raspi-config concentra todas las tareas de configuración básicas en un solo lugar sin requerir que sepa cómo hacer cada tarea, me gustaría un DSL simple que me permita especificar todas las configuraciones en un archivo. Algo así como estibador.
8DH
¿Por qué no solo usar docker?
Tim Holt
¿Si, Por qué no? ¿Cuál es la solución docker preferida para rpi?
8DH

Respuestas:

20

Al menos hoy en día, raspi-configparece admitir el modo no interactivo:

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 esto, puede escribir scripts de configuración que pueden hacer cualquier cosa que pueda hacer a través del comando interactivo, y hará exactamente lo mismo. Sin embargo, deberá encontrar los comandos relevantes y su uso desde la fuente del script.

Monstruo tonto
fuente
1
¡Eso es maravilloso!
8DH
Entonces, cuando preparo una tarjeta SD, puedo poner la imagen allí, agregar mi script a la carpeta y luego ejecutar el script cuando el pi se ha iniciado.
8DH
¿Hay alguna otra mejora en este procedimiento que me falta?
8DH
1
Eso es todo lo que sé: si hay más, no está muy visiblemente documentado. Me topé con esto mientras miraba el guión, y no busqué más información después de encontrar esta característica.
Silly Freak
1
@ 8DH ¿Hay algo que no pueda manejar con este método? (si aún es relevante para usted personalmente)
Silly Freak
16

Esto todavía no está documentado en ninguna parte, pero la herramienta rc_gui (supongo que sería una interfaz gráfica de usuario para la configuración de raspi si alguna vez instalo el escritorio completo) utiliza opciones de línea de comandos para el script baspi de configuración de raspi. Puede ver la lista completa de opciones en el código fuente C . ACTUALIZACIÓN: El repositorio oficial ha desaparecido por alguna razón. Esta es la bifurcación más activa que pude encontrar.

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

ACTUALIZACIÓN: Noto que no hay nada allí acerca de la configuración regional o del teclado. Entonces, eso me sugiere que debemos examinar la fuente de raspi-config. Afortunadamente, tenemos muchos ejemplos anteriores para tener una idea de cómo usar ese script de forma nonintactiva. Entonces, lo que necesito hacer para resolver este problema sin cabeza es:

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

Las variables son los valores que habría seleccionado de la interfaz de usuario de curses. Las opciones de configuración regional son el primer campo del archivo /usr/share/i18n/SUPPORTED. Las opciones de distribución del teclado son los nombres de directorio en /usr/share/X11/xkb/symbols/. Al estar en los Estados Unidos, uso en_US.UTF-8y us. YMMV

Bruno Bronosky
fuente
2
Si está interesado en automatizar la configuración de Raspberry Pis, debe consultar mi proyecto pi-init2 en github. Proporciona la característica largamente solicitada de "ejecutar un script en el arranque (sin cabeza)".
Bruno Bronosky
También hay sudo raspi-config nonint do_audio %dpara elegir la salida de audio (0 = auto, 1 = jack, 2 = HDMI)
golimar
@golimar, ¿de dónde sacaste eso? El proyecto original rc_gui ha desaparecido y la mejor bifurcación que pude encontrar (respuesta actualizada) no incluye do_audio. Pero esa es de hecho una función que se encuentra encurl -sL https://github.com/RPi-Distro/raspi-config/raw/master/raspi-config | grep -E '(do|get)_[a-zA-Z0-9_ ]+\(' | sort | uniq
Bruno Bronosky
Aquí: gist.github.com/damoclark/ab3d700aafa140efb97e510650d9b1be , pero tu comando es genial para encontrarlos a todos, gracias
golimar
3

Todo lo que raspi-confighace es editar algunos archivos de configuración, que también puede editar con un script. Consulte el sedmanual para ver cómo se pueden realizar de manera eficiente tales ediciones.

Si tiene que aplicar muchos cambios de esta manera, consideraría configurar una imagen RPi limpia de la manera que desee, diffsu sistema de archivos completo * contra una imagen vainilla, y luego aplicar los cambios patchcuando necesite configurar una nueva instalación.

Finalmente, eche un vistazo a herramientas tales como etckeeper: están diseñadas específicamente para manipular los cambios de configuración y son capaces de rastrear cambios sutiles que un simple diffpasaría por alto, como los permisos. Tenga en cuenta que, al contrario de su nombre, etckeeperno se limita a /etc, por ejemplo, la ejecución etckeeper -d /boot init; etckeeper -d /boot commithará una copia de seguridad de los archivos en /boot.

(*) Aparentemente no es obvio , así que para aclarar todos los malentendidos, quiero decir que debes ejecutar algo así diff -r /etc /mnt/vanilla_root/etc > etc.diffy diff -r /boot /mnt/vanilla_boot > boot.diffno diff my.img vanilla.img.

Dmitry Grigoryev
fuente
1

Use dd (o similar) para copiar la imagen de trabajo de Pi a su PC.

Use dd (o similar) para copiar la imagen copiada de su PC a su Pi.

hombre dd

joan
fuente
Sí, por supuesto, existe la forma de la imagen, pero luego necesitaría mantener la imagen con actualizaciones y otras cosas. (a menos que haya una solución elegante para eso también ...)
8DH
3
@ 8DH, su sugerencia de descargar la configuración y luego cargarla también significa que también debe mantener una "imagen" con las actualizaciones.
Tim Holt
0

Tengo 1 tarjeta SD 100% configurada según mis deseos que mantengo como base para todas las nuevas instalaciones.

Al configurar una nueva Pi, simplemente clono esa tarjeta SD en lugar de comenzar desde cero.

ON5MF Jurgen
fuente