Как можно автоматизировать настройку raspbian raspi-config?

17

Я обнаружил, что неоднократно настраивал все свои пи с помощью raspbian почти одинаково, используя raspi-config.

Есть ли способ извлечь все настройки, которые я сделал с помощью raspi-config, в исполняемый скрипт, который я могу загрузить с помощью wget для каждого нового пи, который я настроил?

Аналогичное решение с тем же эффектом также будет оценено. Думаю, я мог бы попробовать одну из реализаций док-станции rpi, но я не очень хотел бы выяснить, насколько остро стоит этот вопрос.

8DH
источник
1
это зависит от того, какую конфигурацию вы хотели бы сделать? raspi-config изменяет файлы конфигурации, которые вы можете изменить другим способом (/boot/config.txt,/etc/module.conf ...)
mpromonet,
1
Это довольно простой сценарий из 1000 строк /usr/bin, если это поможет. Если вы хотите отключить его, начиная с свежих изображений, удалите /etc/init.d/apply_noobs_os_configи ссылку в /etc/rc2.d.
Златовласка
Так же, как raspi-config концентрирует все основные задачи установки в одном месте, не требуя от меня знания, как выполнять каждую задачу, мне нужен простой DSL, который позволяет мне указывать все настройки в одном файле. Вроде как докер.
8DH
Почему бы просто не использовать докер?
Тим Холт
Да почему бы и нет? Какое предпочтительное решение для докера для rpi?
8DH

Ответы:

20

По крайней мере, в наши дни, raspi-configпохоже, поддерживается неинтерактивный режим:

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

при этом вы можете написать сценарии установки, которые могут делать все, что вы могли бы делать с помощью интерактивной команды, и она будет делать точно такие же вещи. Вам нужно будет найти соответствующие команды и их использование из исходного кода скрипта.

Глупый урод
источник
1
Это чудесно!
8DH
Поэтому, когда я готовлю SD-карту, я могу поместить туда изображение, добавить свой сценарий в папку, а затем запустить сценарий после загрузки pi.
8DH
Есть ли какие-либо другие улучшения в этой процедуре, которые я пропускаю?
8DH
1
Это все, что я знаю - если есть еще, это не очень заметно задокументировано. Я наткнулся на это, изучая сценарий, и не стал искать дополнительную информацию после того, как обнаружил эту функцию.
Глупый урод
1
@ 8DH Есть ли что-то, с чем вы не можете справиться этим методом? (если это все еще актуально для вас лично)
Глупый урод
16

Это все еще нигде не задокументировано, но инструмент rc_gui (я предполагаю, что это был бы графический интерфейс пользователя для raspi-config, если бы я когда-либо устанавливал полный рабочий стол) использует параметры командной строки для сценария bash raspi-config. Вы можете увидеть полный список опций в исходном коде C . ОБНОВЛЕНИЕ: официальный репо по какой-то причине исчез. Это самая активная вилка, которую я мог найти.

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

ОБНОВЛЕНИЕ: я замечаю, что там нет ничего о настройке локали или клавиатуры. Итак, это говорит мне о том, что мы должны изучить источник raspi-config. К счастью, у нас есть много примеров выше, чтобы понять, как эффективно использовать этот скрипт nonint. Итак, что мне нужно сделать, чтобы решить эту проблему без головы:

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

Переменные - это значения, которые я бы выбрал в интерфейсе curses. Параметры локали - это первое поле в файле /usr/share/i18n/SUPPORTED. Параметры раскладки клавиатуры - это имена каталогов в /usr/share/X11/xkb/symbols/. Находясь в США, я использую en_US.UTF-8и us. YMMV

Бруно Броноски
источник
2
Если вы заинтересованы в автоматизации установки Raspberry Pis, вы должны проверить мой проект pi-init2 на github. Он предоставляет давно запрошенную функцию «запускать скрипт при загрузке (без заголовка)».
Бруно Броноски
Существует также sudo raspi-config nonint do_audio %dдля выбора аудио выхода (0 = авто, 1 = разъем, 2 = HDMI)
golimar
@golimar где ты это взял? Первоначальный проект rc_gui исчез, и лучший ответ, который я смог найти (ответ обновлен), не включает do_audio. Но это действительно функция, найденная вcurl -sL https://github.com/RPi-Distro/raspi-config/raw/master/raspi-config | grep -E '(do|get)_[a-zA-Z0-9_ ]+\(' | sort | uniq
Бруно Броноски
Здесь: gist.github.com/damoclark/ab3d700aafa140efb97e510650d9b1be , но ваша команда великолепна, чтобы найти их всех, спасибо
golimar
3

Все, что raspi-configнужно сделать - это отредактировать несколько файлов конфигурации, которые вы также можете редактировать с помощью скрипта. Проверьте sedруководство, чтобы увидеть, как такие изменения могут быть эффективно сделаны.

Если у вас есть много изменений, которые можно применить таким образом, я бы рассмотрел настройку чистого образа RPi так, как вы хотите, diffего полную файловую систему * по сравнению с ванильным образом, а затем применил изменения, patchкогда вам нужно установить новый установка.

Наконец, взгляните на такие инструменты, как etckeeper- те, которые специально предназначены для манипулирования изменениями конфигурации и могут отслеживать тонкие изменения, которые diffмогут пропустить простые , такие как разрешения. Обратите внимание, что, в отличие от его имени, etckeeperне ограничивается /etc, например, при запуске etckeeper -d /boot init; etckeeper -d /boot commitбудет создана резервная копия файлов в /boot.

(*) По-видимому, это не очевидно , поэтому, чтобы устранить все недоразумения, я имею в виду, что вы должны запустить что-то вроде, diff -r /etc /mnt/vanilla_root/etc > etc.diffа diff -r /boot /mnt/vanilla_boot > boot.diffне diff my.img vanilla.img.

Дмитрий Григорьев
источник
1

Используйте dd (или аналогичный) для копирования рабочего изображения Pi на ваш компьютер.

Используйте dd (или аналогичный), чтобы скопировать скопированное изображение с вашего компьютера на Pi.

человек дд

Джоан
источник
Да, конечно, есть способ изображения, но тогда мне нужно будет поддерживать изображение с обновлениями и прочим. (если только не существует элегантного решения для этого ...)
8DH
3
@ 8DH, ваше предложение о загрузке настроек, а затем о загрузке также означает, что вам также необходимо поддерживать «образ» с обновлениями.
Тим Холт
0

У меня есть 1 SD-карта, на 100% настроенная на мои желания, которую я использую в качестве основы для всех новых установок.

При настройке нового Pi я просто клонирую эту SD-карту вместо того, чтобы начинать с нуля.

ON5MF Юрген
источник