Як можна автоматизувати налаштування raspi-config для Rasbian?


17

Я неодноразово виявляв, що налаштовував усі мої пі-файли з raspbian в майже однаковому вигляді, використовуючи raspi-config.

Чи є спосіб витягнути всі налаштування, зроблені за допомогою raspi-config, у виконуваний сценарій, який я можу завантажувати за допомогою wget до кожного нового пі, який я створив?

Подібне рішення з тим же ефектом також буде вдячне. Я здогадуюсь, я міг би спробувати одну з реалізацій докера rpi, але я не так бажаю дізнатися, наскільки цей кров крою.


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,

Чому б просто не використовувати Docker?
Тім Холт

Так, чому ні? Яке переважне докерне рішення для 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-карту, я можу помістити зображення туди, додати свій скрипт до папки, а потім запустити сценарій, коли пі завантажився.
8DH

Чи є якісь інші вдосконалення цієї процедури, які я пропускаю?
8DH

1
Це все, що я усвідомлюю - якщо їх більше, це не дуже помітно документовано. Я натрапив на це, переглядаючи сценарій, і не шукав додаткової інформації після того, як знайшов цю функцію.
Дурний фрік

1
@ 8DH Чи є щось, що ви не можете впоратися з цим методом? (якщо це все ще стосується вас особисто)
Дурний фрік

17

Це ще ніде не задокументовано, але інструмент 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

Змінні - це значення, які я вибрав би з інтерфейсу прокльонів. Параметри місцеположення - це перше поле у ​​файлі /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

У мене є одна SD-карта на 100%, налаштована на мої бажання, яку я зберігаю як базу для всіх нових установок.

Під час налаштування нового Pi я просто клоную цю SD-карту, а не починаю з нуля.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.