De nombreuses questions ont été posées sur la façon de trouver mon Pi sur mon réseau . D'autres - y compris moi-même - ont des problèmes qui prennent du temps tout en essayant de déployer un lot de nouveaux Pi.
Bien que la création d'images personnalisées puisse être une solution à ces problèmes, je me demande s'il existe d'autres solutions.
Avec (uniquement) le /boot
répertoire ouvert pour l'accès sur les machines normales (Win / OSX), serait-il possible d'utiliser /boot/cmdline.txt
pour diriger du texte vers un script bash, l'exécuter et le supprimer ensuite?
Réponses:
J'ai créé une version légèrement modifiée de Raspberian-light qui répond à ce besoin - il exécute votre script /boot/firstboot.sh personnalisé au premier démarrage:
https://github.com/nmcclain/raspberian-firstboot
la source
Pour ceux qui préfèrent une solution impliquant uniquement des scripts déposés dans la partition de démarrage FAT32 , voici comment procéder. [ Modifier: Les fichiers sont maintenant disponibles dans un projet pi-boot-script .]
Comme mentionné dans d'autres réponses, il implique les arguments de ligne de commande avec lesquels le noyau Linux est démarré. Ces arguments se trouvent dans /boot/cmdline.txt .
J'ai testé cela sur Raspbian Buster (v10.1) 2019-09-26. Il fonctionne sur une carte SD nouvellement flashée ou sur l' image disque .img téléchargée , que vous pouvez ensuite flasher sur n'importe quel nombre de cartes SD.
1. Modifiez les arguments du noyau
Ouvrez le fichier texte /boot/cmdline.txt , supprimez-en une
init=
partie et ajoutez-le à la fin de la ligne:Le dernier mot de cette ligne est le nom d'un script à exécuter par le noyau comme premier processus (PID = 1) au lieu de / sbin / init . La page d'aide kernel-arguments indique uniquement les arguments sans
.
être passés à l'exécutable init, vous ne pouvez donc pas appeler le script unattended.sh ou des choses de ce genre.2. Mettez le script sur la partition de démarrage
Enregistrez les éléments suivants dans la partition de démarrage sous / sans assistance (le nom que vous avez mis dans la ligne de commande):
Ce script fait une préparation nécessaire (chapitre 1), puis tout ce que vous voulez faire (2) et ensuite nettoyer et redémarrer (3). Remplacez le truc sous 2 par les commandes que vous souhaitez exécuter.
Pour certaines tâches de configuration, vous avez probablement besoin d'un démarrage normal pour faire apparaître la mise en réseau et d'autres services, de sorte que l'exemple de cette version (expliqué ci-dessous) ne prépare qu'un bon script à exécuter lorsque le Pi redémarre.
3. Mettez tous les autres fichiers dont votre script a besoin sur la partition de démarrage
...évidemment.
Exemple
Avec mon script, j'ai mis un dossier payload / sur la partition de démarrage, qui contient les fichiers que je veux déplacer vers la partition Linux. Dans le script sans surveillance ci-dessus,
Ce script fait diverses personnalisations que j'aime: il crée et formate une autre partition FAT32 et l'ajoute à / etc / fstab pour que l'utilisateur pi puisse y écrire (pour les journaux d'application, etc.); redimensionne la partition ext4 et le système de fichiers pour le reste de la carte SD; modifie les paramètres régionaux, le fuseau horaire, le nom d'hôte (basé sur le numéro de série du processeur), le pays WiFi; définit le réseau WiFi et la phrase secrète; active SSH; résout un problème de paramètres de langue pour les sessions SSH; configure le démarrage dans une console sans connexion automatique; écrit certaines données sur le système dans un fichier sur la partition de démarrage; et bien sûr, il supprime ce lien symbolique pour qu'il ne s'exécute plus au démarrage.
La plupart des utilisateurs trouveront cela inutile et préfèrent utiliser PiBakery , pi-init2 ou une image ext4 personnalisée, qui sont d'excellentes solutions. Je préfère cela car je peux le comprendre et je n'ai pas besoin d'exécuter d'autres logiciels. Et cela fonctionne aussi: avec le fichier .img dans lequel j'ai mis mes scripts, flasher une carte SD + la mettre dans un Pi + la laisser s'exécuter pour se configurer prend 6 minutes.
Source J'ai trouvé l'idée d'un script comme
init=
argument du noyau, et lesmount
commandes nécessaires pour le faire fonctionner, dans le script init_resize.sh qui s'exécute par défaut pour redimensionner la partition Linux.la source
Vous POUVEZ faire exécuter du code en jouant avec la ligne de commande du noyau. La méthode la plus évidente consiste à remplacer init par autre chose. L'application la plus courante consiste à lancer un shell très tôt dans le processus de démarrage, généralement parce que vous devez réparer quelque chose ou parce que tout le reste est très mal cassé, par exemple:
Gardez à l'esprit qu'à ce stade du processus de démarrage, les systèmes de fichiers sont toujours montés en lecture seule. De plus, il y a tout un tas de choses qui ne fonctionnent pas correctement. Parce que vous n'avez pas de véritable init en cours d'exécution, l'arrêt et le redémarrage ne fonctionneront pas. Vous devez remonter manuellement le système de fichiers racine en lecture seule et appeler
reboot -f
pour redémarrer, par exemple.Je n'ai aucune idée si vous pouvez passer des arguments à bash de cette manière. Je n'ai jamais essayé. En théorie, si vous pouvez passer
-c
à bash, vous pouvez dire à ce processus bash de faire quoi que ce soit. Mais cela pourrait se transformer en un argument assez long, et je ne sais pas si le noyau permettrait de telles choses.Deuxième chose que vous pouvez faire. Vous pouvez copier un ramfs initial (initramfs) dans le système de fichiers et configurer le chargeur de démarrage pour l'utiliser dans
config.txt
. Il y a plusieurs façons d'obtenir des scripts dans un initramfs pour faire des choses spéciales. Vous devrez cependant préparer un initramfs spécial à cet effet (voir initramfs-tools (8)), donc je ne suis pas sûr que ce soit une meilleure solution qu'une image personnalisée.Vous pouvez inclure le script dans / boot (j'ai ri de votre suggestion à propos des machines "normales", mais ce serait le bit auquel vous pouvez accéder à partir de ces machines) et essayez de le lancer en utilisant la ligne d'initialisation du noyau, mais les fichiers sur les systèmes de fichiers dos ne sont pas n'est pas exécutable, sauf si vous le faites pour l'ensemble du système de fichiers.
Si c'était moi, je ferais une image personnalisée qui utilise DHCP pour configurer le réseau et qui contient un script personnalisé qui s'exécute au démarrage. Ce script recherche un fichier spécifique qui agit comme indicateur. Si le fichier existe, ne faites rien. Sinon, configurez les choses, puis créez le fichier indicateur.
Votre script de configuration pourrait même tirer la vraie chose d'un serveur http. Cela signifie que vous n'avez pas à créer une nouvelle image si vous devez modifier quelque chose.
Cela devrait être la solution la moins stressante.
Une dernière possibilité, mais vous devrez le faire sur une machine "non régulière" :-) Vous pouvez monter le système de fichiers ext4 sur un périphérique en boucle et y copier des fichiers sans l'écrire d'abord sur sdcard. Pour une image Raspbian Jessie standard, ce serait quelque chose comme ceci:
J'aime faire un fsck forcé sur mes systèmes de fichiers avant de faire des images. Définit le nombre de montages à zéro au premier démarrage :-)
EDIT : Après plusieurs mois et plus d'expérience. Vous voulez regarder u-boot. Remplacez le chargeur de démarrage par u-boot. Cela peut être fait à partir d'une "machine ordinaire". Une fois que vous avez u-boot en place, vous pouvez soit démarrer en réseau une distribution à partir de laquelle vous pouvez facilement flasher la carte sd, soit théoriquement flasher la carte directement, bien que je ne sache pas à quel point ce serait difficile.
Essentiellement, u-boot apporte un démarrage réseau au Raspberry Pi, quelque chose qu'il ne prend pas en charge seul.
la source
init=script & init
? Le script s'exécuterait en arrière-plan pendant que init démarre normalement. Le script aurait besoin d'une vérification de condition au début et par exemple continuer lorsque init a terminé son travail.Je ne recommanderais pas de toucher quoi que ce soit dans la zone de démarrage (autre que
config.txt
), sauf si vous avez une compréhension détaillée de ce que font ces choses.cmdline.txt
n'est pas conçu pour exécuter les choses lorsque le RPi démarre. Il est utilisé pour passer des paramètres au noyau Linux au démarrage.Je suggère de le faire tout au long de SSH. Un script sur votre bureau pourrait pousser un programme bash / python / java / c / quel que soit vers le RPi, l'exécuter, puis le supprimer une fois terminé. Ajoutez du filetage au script sur votre bureau et vous pouvez l'envoyer à autant d'appareils que vous le souhaitez en même temps.
la source
Sans doute, si vous êtes d'accord avec la modification de l'image pour exécuter automatiquement un script au premier démarrage, vous pouvez simplement modifier l'image comme le ferait votre script, puis enregistrer cette carte SD dans un fichier image et l'utiliser pour flasher Cartes SD que vous allez utiliser avec de nouveaux RPis. Par exemple, si vous voulez que tous vos RPis aient une certaine entrée
/etc/fstab
, vous pouvez simplement vous modifier/etc/fstab
au lieu d'écrire un script qui effectue la modification.Si vous avez absolument besoin d'actions scriptées (par exemple, si chaque image doit être modifiée d'une manière différente), vous pouvez déplacer votre
/etc/rc.local
vers/etc/rc.bak
et mettre un script dans/etc/rc.local
lequel se remplace/etc/rc.bak
dans la dernière commande. Ce script peut effectuer lui-même les premières actions de démarrage, ou il peut appeler un script particulier à partir de la/boot
partition si vous préférez.Il est possible d'effectuer une exécution automatique en touchant uniquement la
/boot
partition, en fournissant une image ramdisk de démarrage spéciale au noyau comme décrit ici . Cette image contiendrait les scripts pour modifier la partition racine, puis s'auto-supprimerconfig.txt
. Je ne sais pas si cela en vaut la peine.la source
Vous voudrez peut-être regarder mon projet Nard qui a une solution à votre problème:
1) Chaque carte SD peut se voir attribuer un ID unique avec un PC Windows ordinaire comme décrit ici:
http://www.arbetsmyra.dyndns.org/nard/#devsettingsid
2) Allumez tous vos Pis
3) Si possible, désactivez le pare-feu du PC
4) Ouvrez une fenêtre d'invite DOS et envoyez une requête ping à l'adresse de diffusion du sous-réseau
5) Répertoriez la table ARP avec la commande Windows "arp -a". Dans la liste, vous trouverez les adresses MAC et IP de tous les Raspberry Pi à proximité.
6) Connectez-vous à chaque appareil avec telnet (généralement également disponible sous Windows). La phrase de bienvenue affichera l'ID attribué à l'étape 1.
la source