如何使raspbian raspi-config设置自动化?


17

我发现自己使用raspi-config以几乎相同的方式反复用raspbian设置我的所有pi。

有没有一种方法可以将我使用raspi-config所做的所有设置提取到可执行脚本中,可以使用wget下载到我设置的每个新pi?

具有相同效果的类似解决方案也将被理解。我想我可以尝试一种rpi docker实现,但是我并不急于发现这些东西有多大的优势。


1
这取决于您要做什么配置?raspi-config修改可以使用其他方式(/boot/config.txt、/etc/module.conf ...)修改的配置文件
mpromonet

1
/usr/bin如果有帮助,这是一个非常简单的1000行shell脚本。如果要禁用它以全新图像启动,请删除/etc/init.d/apply_noobs_os_config,然后单击中的链接/etc/rc2.d
goldilocks

就像raspi-config将所有基本设置任务集中到一个地方,而无需我知道如何完成每个任务一样,我想要一个简单的DSL,让我在一个文件中指定所有设置。有点像码头工人。
8DH

为什么不只是使用docker?
蒂姆·霍尔特

是的,为什么不呢?rpi首选的docker解决方案是什么?
8DH

Answers:


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的图形用户界面)对raspi-config bash脚本使用命令行选项。您可以在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 UI中选择的值。区域设置选项是文件中的第一个字段/usr/share/i18n/SUPPORTED。键盘布局选项是中的目录名称/usr/share/X11/xkb/symbols/。在美国,我使用en_US.UTF-8us。青年汽车


2
如果您对自动化Raspberry Pi的安装感兴趣,则应在github上查看我的pi-init2项目。它提供了长期以来要求的“启动时(无头)运行脚本”的功能。
布鲁诺·布罗诺斯基

sudo raspi-config nonint do_audio %d可以选择音频输出(0 =自动,1 =插孔,2 = HDMI)
golimar

@golimar你从哪里得到的?原始的rc_gui项目已消失,并且我能找到的最好的fork(答案已更新)不包括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
Bruno Bronosky '19

此处: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.diffand和diff -r /boot /mnt/vanilla_boot > boot.diffnot diff my.img vanilla.img


1

使用dd(或类似名称)将有效的Pi映像复制到您的PC。

使用dd(或类似名称)将复制的图像从PC复制到Pi。

男人dd


是的,当然有映像的方式,但是接下来我需要使用更新和内容来维护映像。(除非也有一个优雅的解决方案...)
8DH

3
@ 8DH,您建议先下载设置然后再上传,这也意味着您还必须维护带有更新的“映像”。
蒂姆·霍尔特

0

我有1张SD卡,100%可以满足我所有新安装的需求。

设置新的Pi时,我只是克隆该SD卡,而不是从头开始。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.