Comment automatiser la configuration de raspi-raspi-config?

17

Je me suis retrouvé à plusieurs reprises à configurer tous mes pi avec raspbian à peu près de la même manière en utilisant raspi-config.

Existe-t-il un moyen d'extraire tous les paramètres que j'ai définis à l'aide de raspi-config dans un script exécutable que je pourrais télécharger avec wget sur chaque nouveau pi que j'ai configuré?

Une solution similaire ayant le même effet serait également appréciée. Je suppose que je pourrais essayer l'une des implémentations de docker rpi, mais je ne suis pas si impatient de savoir à quel point ce truc est saignant.

8DH
la source
1
cela dépend de la configuration que vous souhaitez faire? raspi-config modifie les fichiers de configuration que vous pouvez modifier d'une autre manière (/boot/config.txt,/etc/module.conf ...)
mpromonet
1
C'est un script shell de 1000 lignes assez simple /usr/bin, si cela aide. Si vous souhaitez le désactiver en démarrant avec de nouvelles images, supprimez /etc/init.d/apply_noobs_os_configet le lien dedans /etc/rc2.d.
goldilocks
Tout comme raspi-config concentre toutes les tâches de configuration de base en un seul endroit sans me demander de savoir comment faire chaque tâche, je voudrais une simple DSL qui me permet de spécifier tous les paramètres dans un fichier. Un peu comme docker.
8DH
Pourquoi ne pas simplement utiliser Docker?
Tim Holt
Ouais pourquoi pas? Quelle est la solution docker préférée pour rpi?
8DH

Réponses:

20

Au moins de nos jours, raspi-configsemble prendre en charge le mode non interactif:

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

avec cela, vous pouvez écrire des scripts de configuration qui peuvent faire tout ce que vous pourriez faire via la commande interactive, et cela fera exactement les mêmes choses. Vous devrez cependant trouver les commandes pertinentes et leur utilisation à partir de la source du script.

Silly Freak
la source
1
C'est merveilleux!
8DH
Ainsi, lorsque je prépare une carte SD, je peux y mettre l'image, ajouter mon script au dossier, puis exécuter le script lorsque la pi a démarré.
8DH
Y a-t-il d'autres améliorations à cette procédure qui me manquent?
8DH
1
C'est tout ce que je sais - s'il y en a plus, ce n'est pas très visiblement documenté. Je suis tombé sur cela en regardant le script et je n'ai pas cherché plus d'informations après avoir trouvé cette fonctionnalité.
Silly Freak
1
@ 8DH Y a-t-il quelque chose que vous ne pouvez pas gérer avec cette méthode? (si cela vous concerne toujours personnellement)
Silly Freak
16

Ceci n'est toujours pas documenté nulle part, mais l'outil rc_gui (je suppose que ce serait une interface utilisateur graphique pour raspi-config si je devais installer le bureau complet) utilise des options de ligne de commande pour le script bash raspi-config. Vous pouvez voir la liste complète des options dans le code source C . MISE À JOUR: Le dépôt officiel a disparu pour une raison quelconque. C'est la fourche la plus active que j'ai pu trouver.

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

MISE À JOUR: Je remarque qu'il n'y a rien là-dedans concernant les paramètres régionaux ou du clavier. Donc, cela me suggère que nous devons examiner la source de raspi-config. Heureusement, nous avons de nombreux exemples ci-dessus pour avoir une idée de la façon d'utiliser ce script de manière nonintéractive. Donc, ce que je dois faire pour résoudre ce problème sans tête est:

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

Les variables sont les valeurs que j'aurais sélectionnées dans l'interface utilisateur curses. Les options de paramètres régionaux sont le premier champ du fichier /usr/share/i18n/SUPPORTED. Les options de disposition du clavier sont les noms de répertoire dans /usr/share/X11/xkb/symbols/. Aux États-Unis, j'utilise en_US.UTF-8et us. YMMV

Bruno Bronosky
la source
2
Si vous souhaitez automatiser la configuration de Raspberry Pis, vous devriez consulter mon projet pi-init2 sur github. Il fournit la fonctionnalité demandée depuis longtemps de «exécuter un script au démarrage (sans tête)».
Bruno Bronosky
Il y a aussi sudo raspi-config nonint do_audio %dpour choisir la sortie audio (0 = auto, 1 = jack, 2 = HDMI)
golimar
@golimar où avez-vous eu ça? Le projet rc_gui d'origine a disparu et la meilleure fourchette que j'ai pu trouver (réponse mise à jour) ne comprend pas do_audio. Mais c'est bien une fonction que l'on retrouve danscurl -sL https://github.com/RPi-Distro/raspi-config/raw/master/raspi-config | grep -E '(do|get)_[a-zA-Z0-9_ ]+\(' | sort | uniq
Bruno Bronosky
Ici: gist.github.com/damoclark/ab3d700aafa140efb97e510650d9b1be , mais votre commande est excellente pour les trouver tous, merci
golimar
3

Il raspi-configsuffit de modifier quelques fichiers de configuration, que vous pouvez également modifier avec un script. Consultez le sedmanuel pour voir comment ces modifications peuvent être effectuées efficacement.

Si vous avez beaucoup de changements à appliquer de cette manière, je considérerais de configurer une image RPi propre comme vous le souhaitez, diffson système de fichiers complet * par rapport à une image vanille, puis d'appliquer les modifications patchlorsque vous devez configurer une nouvelle installation.

Enfin, jetez un œil à des outils tels que etckeeper- ceux-ci sont spécifiquement conçus pour manipuler les changements de configuration et sont capables de suivre les changements subtils qu'un simple diffmanquerait, tels que les autorisations. Notez que contrairement à son nom, etckeepern'est pas limité à /etc, par exemple, l'exécution etckeeper -d /boot init; etckeeper -d /boot commitfera une sauvegarde des fichiers dans /boot.

(*) Apparemment, ce n'est pas évident , donc pour effacer tous les malentendus, je veux dire que vous devriez exécuter quelque chose comme diff -r /etc /mnt/vanilla_root/etc > etc.diffet diff -r /boot /mnt/vanilla_boot > boot.diffnon diff my.img vanilla.img.

Dmitry Grigoryev
la source
1

Utilisez dd (ou similaire) pour copier l'image Pi de travail sur votre PC.

Utilisez dd (ou similaire) pour copier l'image copiée de votre PC vers votre Pi.

homme dd

joan
la source
Ouais, il y a bien sûr la façon dont l'image mais ensuite je devrais maintenir l'image avec des mises à jour et d'autres choses. (sauf s'il existe une solution élégante pour cela aussi ...)
8DH
3
@ 8DH, votre suggestion de télécharger les paramètres puis de les télécharger signifie également que vous devez également conserver une "image" avec des mises à jour.
Tim Holt
0

J'ai 1 carte SD 100% configurée selon mes envies que je garde comme base pour toutes les nouvelles installations.

Lors de la configuration d'un nouveau Pi, je clone simplement cette carte SD au lieu de recommencer à zéro.

ON5MF Jurgen
la source