Para aquellos que prefieren una solución que involucre solo scripts que se hayan caído en la partición de arranque FAT32 , aquí es cómo hacerlo. [ Editar: los archivos ahora están disponibles en un proyecto pi-boot-script .]
Como se menciona en otras respuestas, involucra los argumentos de la línea de comandos con los que se inicia el kernel de Linux. Esos argumentos están en /boot/cmdline.txt .
He probado esto en Raspbian Buster (v10.1) 2019-09-26. Funciona en una tarjeta SD recién flasheada o en la imagen de disco .img descargada , que luego puede flashear en cualquier cantidad de tarjetas SD.
1. Edite los argumentos del kernel
Abra el archivo de texto /boot/cmdline.txt , elimine cualquier init=
parte de él y agréguelo al final de la línea:
init=/bin/bash -c "mount -t proc proc /proc; mount -t sysfs sys /sys; mount /boot; source /boot/unattended"
La última palabra en esta línea es el nombre de un script que debe ejecutar el núcleo como primer proceso (PID = 1) en lugar de / sbin / init . La página de ayuda de argumentos del núcleo solo dice argumentos sin .
pasar al ejecutable init, por lo que no puede llamar al script desatendido.sh o cosas así.
2. Ponga el script en la partición de arranque
Guarde lo siguiente en la partición de arranque como / desatendido (el nombre que puso en la línea de comando):
# 1. MAKING THE SYSTEM WORK. DO NOT REMOVE
mount -t tmpfs tmp /run
mkdir -p /run/systemd
mount / -o remount,rw
sed -i 's| init=.*||' /boot/cmdline.txt
# 2. THE USEFUL PART OF THE SCRIPT
# Example:
[[ -d /boot/payload/home/pi ]] && sudo -u pi cp --preserve=timestamps -r\
/boot/payload/home/pi /home/ && rm -rf /boot/payload/home/pi # A
[[ -d /boot/payload ]] && cp --preserve=timestamps -r /boot/payload/* /\
&& rm -rf /boot/payload # B
ln -s /lib/systemd/system/one-time-script.service\
/etc/systemd/system/multi-user.target.wants/ # C
# 3. CLEANING UP AND REBOOTING
sync
umount /boot
mount / -o remount,ro
sync
echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger
sleep 5
Este script hace una preparación necesaria (capítulo 1), luego cualquier cosa que desee hacer (2) y luego limpie y reinicie (3). Reemplace las cosas debajo de 2 con los comandos que desea ejecutar.
Para algunas tareas de configuración, es probable que necesite un arranque normal para que aparezca la red y otros servicios, por lo que el ejemplo en esta versión (explicado a continuación) solo se prepara para ejecutar una secuencia de comandos adecuada cuando se reinicia el Pi.
3. Coloque cualquier otro archivo que su script necesite en la partición de arranque
...obviamente.
Ejemplo
Junto con mi script, pongo una carpeta de carga útil / en la partición de arranque, que contiene los archivos que quiero mover a la partición de Linux. En el script desatendido arriba,
- la línea A mueve los archivos al directorio del usuario pi. Por ejemplo, payload / home / pi / .bashrc se mueve al sistema de archivos raíz como /home/pi/.bashrc ;
- la línea B mueve los archivos propiedad de la raíz a la partición de Linux, incluyendo payload / usr / local / bin / one-time-script.sh que se convierte en /usr/local/bin/one-time-script.sh , y similar para payload / lib / systemd / system / one-time-script.service ;
- la línea C luego crea un enlace simbólico a ese último archivo, por lo que mi script de configuración one-time-script.sh se ejecuta en el próximo arranque.
Ese script hace varias personalizaciones que me gustan: crea y formatea otra partición FAT32 y la agrega a / etc / fstab para que el usuario pi pueda escribir en ella (para registros de aplicaciones, etc.); cambia el tamaño de la partición ext4 y el sistema de archivos al resto de la tarjeta SD; cambia la configuración regional, la zona horaria, el nombre de host (según el número de serie de la CPU), el país de WiFi; establece la red WiFi y la frase de contraseña; enciende SSH; corrige un problema de configuración de idioma para sesiones SSH; configura el arranque en una consola sin inicio de sesión automático; escribe algunos datos sobre el sistema en un archivo en la partición de arranque; y, por supuesto, elimina ese enlace simbólico para que no se vuelva a ejecutar en el arranque.
La mayoría de los usuarios encontrarán esto innecesario y preferirán usar PiBakery , pi-init2 o una imagen ext4 personalizada, que son excelentes soluciones. Prefiero esto porque puedo entenderlo completamente y no tengo que ejecutar otro software. Y también funciona: con el archivo .img en el que he puesto mis scripts, flashear una tarjeta SD + ponerla en un Pi + y dejar que se ejecute para configurarse solo lleva 6 minutos.
Fuente Encontré la idea de un script como init=
argumento del núcleo, y los mount
comandos necesarios para que funcione, en el script init_resize.sh que se ejecuta por defecto para cambiar el tamaño de la partición de Linux.