Jak można zautomatyzować konfigurację raspbian raspi-config?

17

Zauważyłem, że wielokrotnie konfigurowałem wszystkie moje pi przy pomocy raspbian w prawie ten sam sposób, używając raspi-config.

Czy istnieje sposób na wyodrębnienie wszystkich ustawień, które wprowadziłem przy użyciu raspi-config, do skryptu wykonywalnego, który można pobrać za pomocą wget do każdego nowego skonfigurowanego pi?

Docenione zostanie również podobne rozwiązanie o tym samym działaniu. Wydaje mi się, że mógłbym wypróbować jedną z implementacji dokowania rpi, ale nie jestem tak chętny, aby dowiedzieć się, jak niesamowita jest ta sytuacja.

8DH
źródło
1
to zależy od konfiguracji, którą chcesz zrobić? raspi-config modyfikuj pliki konfiguracyjne, które możesz modyfikować w inny sposób (/boot/config.txt,/etc/module.conf ...)
mpromonet
1
Jest to dość prosty skrypt powłoki linii 1000 /usr/bin, jeśli to pomaga. Jeśli chcesz to wyłączyć, uruchamiając nowe obrazy, usuń /etc/init.d/apply_noobs_os_configi połącz /etc/rc2.d.
złotowłosa
Tak jak raspi-config koncentruje wszystkie podstawowe zadania instalacyjne w jednym miejscu, nie wymagając ode mnie wiedzy, jak wykonać każde zadanie, chciałbym mieć prosty DSL, który pozwala mi określić wszystkie ustawienia w jednym pliku. Coś jak doker.
8DH
Dlaczego nie skorzystać z dokera?
Tim Holt
Tak czemu nie? Jakie jest preferowane rozwiązanie dokera dla rpi?
8DH

Odpowiedzi:

20

Przynajmniej raspi-configwydaje się , że obsługuje tryb nieinteraktywny:

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

dzięki temu możesz pisać skrypty instalacyjne, które mogą zrobić wszystko, co możesz zrobić za pomocą interaktywnego polecenia, i zrobi dokładnie to samo. Będziesz jednak musiał znaleźć odpowiednie polecenia i ich użycie ze źródła skryptu.

Silly Freak
źródło
1
To jest cudowne!
8DH
Więc kiedy przygotowuję kartę SD, mógłbym tam umieścić obraz, dodać mój skrypt do folderu, a następnie uruchomić skrypt po uruchomieniu pi.
8DH
Czy brakuje mi innych usprawnień w tej procedurze?
8DH
1
To wszystko, czego jestem świadomy - jeśli jest ich więcej, nie jest to bardzo dobrze udokumentowane. Natknąłem się na to, patrząc na skrypt, i nie szukałem dalszych informacji po znalezieniu tej funkcji.
Silly Freak
1
@ 8DH Czy jest coś, z czym nie można sobie poradzić przy użyciu tej metody? (jeśli nadal dotyczy to Ciebie osobiście)
Silly Freak
17

Nadal nie jest to nigdzie udokumentowane, ale narzędzie rc_gui (zakładam, że byłby to graficzny interfejs użytkownika dla raspi-config, gdybym kiedykolwiek miał zainstalować pełny pulpit) używa opcji wiersza poleceń do skryptu bash raspi-config. Można zobaczyć pełną listę opcji w kodzie źródłowym C . AKTUALIZACJA: Oficjalne repozytorium zniknęło z jakiegoś powodu. To najbardziej aktywny widelec, jaki udało mi się znaleźć.

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

AKTUALIZACJA: Zauważam, że nie ma nic w ustawieniach regionalnych ani ustawieniach klawiatury. To sugeruje mi, że musimy zbadać źródło raspi-config. Na szczęście mamy wiele przykładów powyżej, aby dowiedzieć się, jak korzystać z tego skryptu w sposób noninterotyczny. Tak więc, aby rozwiązać ten problem bezgłowo , muszę :

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

Zmienne są wartościami, które wybrałbym z interfejsu użytkownika curses. Opcje ustawień regionalnych są pierwszym polem w pliku /usr/share/i18n/SUPPORTED. Opcje układu klawiatury to nazwy katalogów /usr/share/X11/xkb/symbols/. Będąc w USA używam en_US.UTF-8i us. YMMV

Bruno Bronosky
źródło
2
Jeśli jesteś zainteresowany automatyzacją instalacji Raspberry Pis, powinieneś sprawdzić mój projekt pi-init2 na github. Zapewnia długo oczekiwaną funkcję „uruchamiania skryptu podczas rozruchu (bezgłowo)”.
Bruno Bronosky,
Jest też sudo raspi-config nonint do_audio %ddo wyboru wyjście audio (0 = Automatycznie, 1 = jack, 2 = HDMI)
golimar
@Golimar, skąd to masz? Oryginalny projekt rc_gui zniknął, a najlepszy widelec, jaki mogłem znaleźć (odpowiedź zaktualizowana) nie obejmuje do_audio. Ale to jest rzeczywiście funkcja znaleziona wcurl -sL https://github.com/RPi-Distro/raspi-config/raw/master/raspi-config | grep -E '(do|get)_[a-zA-Z0-9_ ]+\(' | sort | uniq
Bruno Bronosky
Tutaj: gist.github.com/damoclark/ab3d700aafa140efb97e510650d9b1be , ale twoje polecenie jest świetne, aby je wszystkie znaleźć, dzięki
golimar
3

Wszystko raspi-configpolega na edycji kilku plików konfiguracyjnych, które można również edytować za pomocą skryptu. Zapoznaj się z sedinstrukcją, aby zobaczyć, w jaki sposób można skutecznie wprowadzić takie zmiany.

Jeśli masz wiele zmian do zastosowania w ten sposób, rozważę skonfigurowanie czystego obrazu RPi tak, jak chcesz, diffjego kompletny system plików * względem obrazu waniliowego, a następnie zastosuj zmiany, patchgdy będziesz musiał skonfigurować nowy instalacja.

Na koniec spójrz na takie narzędzia, jak etckeeper- te są specjalnie zaprojektowane do manipulowania zmianami w konfiguracji i są w stanie śledzić subtelne zmiany, których zwykły brak diff, takie jak uprawnienia. Pamiętaj, że wbrew nazwie, etckeepernie jest ograniczony do /etc, np. Uruchomienie etckeeper -d /boot init; etckeeper -d /boot commitspowoduje utworzenie kopii zapasowej plików /boot.

(*) Najwyraźniej nie jest to oczywiste , więc aby usunąć wszystkie nieporozumienia, mam na myśli, że powinieneś coś takiego zrobić, diff -r /etc /mnt/vanilla_root/etc > etc.diffa diff -r /boot /mnt/vanilla_boot > boot.diffnie diff my.img vanilla.img.

Dmitrij Grigoriew
źródło
1

Użyj dd (lub podobnego), aby skopiować działający obraz Pi na komputer.

Użyj dd (lub podobnego), aby skopiować skopiowany obraz z komputera na komputer Pi.

człowiek dd

joan
źródło
Tak, jest oczywiście sposób na zdjęcie, ale wtedy musiałbym zachować obraz za pomocą aktualizacji i innych rzeczy. (chyba że istnieje również eleganckie rozwiązanie ...)
8DH
3
@ 8DH, twoja sugestia pobierania ustawień, a następnie przesyłania oznacza również, że musisz również zachować „obraz” z aktualizacjami.
Tim Holt
0

Mam 1 kartę SD w 100% skonfigurowaną według moich pragnień, którą przechowuję jako bazę dla wszystkich nowych instalacji.

Podczas konfigurowania nowego Pi po prostu klonuję tę kartę SD zamiast zaczynać od zera.

ON5MF Jurgen
źródło