Quick start: your first template in five minutes
Updated 5 Novembre 2026
- Exemple 1. Modifier un paramètre sans toucher au fichier
- Exemple 2. Modification ciblée d'un fichier de configuration du paquet
- Exemple 3. Remplacement via .clt - sans répertoire de modèles
- Regroupement des modèles : un répertoire est aussi un modèle
- S'assurer que tout est correct
- Pour aller plus loin
Trois exemples, du simple à l'utile. Chacun est complet : créez, appliquez, vérifiez.
Exemple 1. Modifier un paramètre sans toucher au fichier
Supposons que vous deviez définir l'éditeur par défaut pour tous les utilisateurs. Le fichier /etc/profile.d/editor.sh existe déjà - le système le crée, et le modifier à la main est inutile : les modifications seront perdues lors de la réinstallation du paquet.
Créez un fichier de modèle dans le stockage local (les droits de superutilisateur sont nécessaires) :
/var/calculate/templates/editor.sh
# Calculate env=install ac_install_merge==on path=/etc/profile.d comment=# export EDITOR="nano"
Voici ce qui y est écrit :
- env=install ac_install_merge==on - appliquer le modèle pendant la configuration du paquet. La variable d'action appartient au module install, on l'écrit donc avec env=install : sans lui le moteur répond Variable ac_install_merge introuvable et le modèle n'est pas fusionné. Un fichier de premier niveau du stockage utilisateur doit porter une telle variable ; sans elle, le modèle est ignoré ;
- path=/etc/profile.d - où déposer le résultat ; le nom du fichier vient du nom du modèle (editor.sh) ;
- comment=# - comme aucun format n'est indiqué, le fichier est considéré comme "raw" et écrit entièrement ; le caractère de commentaire est nécessaire pour que les utilitaires ajoutent l'en-tête de service tout en haut sans casser la syntaxe bash.
Si le modèle lit des variables d'un module précis (#-os_install_*-#), on ajoute env=[HTML_REMOVED] à l'en-tête du modèle ; ici le corps ne lit aucune variable, donc env= est superflu. Voir Syntaxe du modèle pour son fonctionnement.
Appliquez maintenant les modèles de ce paquet :
cl-core-setup -n baselayout
Vérifiez le résultat - le fichier contient votre export et une mention indiquant de quel modèle il vient :
#------------------------------------------------------------------------------ # Modified Calculate Utilities 3.7.6.8 # Processed template files: # /var/db/repos/calculate/profiles/templates/2_ac_install_merge/sys-apps/baselayout/editor.sh # /var/calculate/templates/editor.sh # To modify this file, create a /etc/profile.d/editor.sh.clt template. #------------------------------------------------------------------------------ export EDITOR="nano"
L'en-tête de service n'est pas un ornement : c'est à lui que les utilitaires reconnaissent que le fichier est sous leur contrôle, et à la fusion suivante ils ne remplacent que leur propre partie, sans toucher au reste.
Exemple 2. Modification ciblée d'un fichier de configuration du paquet
Pour les fichiers de formats connus, vous n'avez pas à copier le contenu - indiquez le format, et le modèle ne décrira que les paramètres à modifier. Supposons que vous deviez activer la transmission de paquets. Dans Calculate, les paramètres du noyau se règlent par fichiers "drop-in" dans /etc/sysctl.d, et ils appartiennent au paquet sys-apps/openrc - les modèles de la distribution elle-même sont construits exactement de la même façon :
/var/calculate/templates/merge/.calculate_directory
# Calculate env=install ac_install_merge==on append=skip
/var/calculate/templates/merge/calculate_forward.conf
# Calculate format=procmail mergepkg(sys-apps/openrc)!= path=/etc/sysctl.d net.ipv4.ip_forward = 1
Il y a ici deux fichiers, et les deux sont nécessaires. Dans le stockage utilisateur, chaque élément de premier niveau est vérifié séparément des éléments imbriqués
Il y a ici deux fichiers, et les deux sont nécessaires. Dans le stockage utilisateur, chaque élément de premier niveau est vérifié séparément des éléments imbriqués : si un répertoire n'a pas de variable d'action qui lui est propre, il sera ignoré avec tout son contenu - dans la sortie détaillée, vous ne verrez que Répertoires omis :. L'en-tête du répertoire doit donc contenir env=install ac_install_merge==on ; cette variable s'applique aussi aux fichiers du répertoire, vous n'avez donc pas à la répéter dans le modèle lui-même. Et append=skip est nécessaire pour que le répertoire ne devienne pas lui-même un modèle : sans lui, un répertoire /[HTML_REMOVED] (ici (ici /merge) serait créé dans le système et resterait dans la racine comme un déchet.) serait créé dans le système et resterait dans la racine comme un déchet.
sans lui, un répertoire /[HTML_REMOVED] (ici (ici /merge) serait créé dans le système et resterait dans la racine comme un déchet.) serait créé dans le système et resterait dans la racine comme un déchet.mergepkg(sys-apps/openrc)!= associe le modèle à un paquet associe le modèle à un paquet : il s'appliquera lors de la configuration de
mergepkg(sys-apps/openrc)!= associe le modèle à un paquet associe le modèle à un paquet : il s'appliquera lors de la configuration de sys-apps/openrc et ne gênera pas quand autre chose est configuré. Les fichiers existants ne sont pas réécrits : l'utilitaire modifie uniquement l'enregistrement indiqué, et vos autres paramètres restent en place.
l'utilitaire modifie uniquement l'enregistrement indiqué, et vos autres paramètres restent en place.La vérification est la même - appliquez les modèles du paquet :
cl-core-setup -n openrc
Vérifiez ensuite le résultat :
grep ip_forward /etc/sysctl.d/calculate_forward.conf
Exemple 3. Remplacement via .clt - sans répertoire de modèles
Le moyen le plus court de modifier le paramètre d'un fichier précis est de placer le modèle à côté de lui, avec l'extension .clt. Il hérite du chemin et du nom depuis son emplacement : /etc/conf.d/consolefont.clt configure /etc/conf.d/consolefont.
/etc/conf.d/consolefont.clt
# Calculate format=openrc consolefont="ter-v12n"
path=, , name= et et env=install ne sont pas nécessaires ici - le chemin, le nom et le paquet sont déduits de l'emplacement du modèle lui-même et de la propriété du fichier cible. Non plus besoin de ne sont pas nécessaires ici - le chemin, le nom et le paquet sont déduits de l'emplacement du modèle lui-même et de la propriété du fichier cible. Non plus besoin de ac_install_merge==on : le
path=, , name= et et env=install ne sont pas nécessaires ici - le chemin, le nom et le paquet sont déduits de l'emplacement du modèle lui-même et de la propriété du fichier cible. Non plus besoin de ne sont pas nécessaires ici - le chemin, le nom et le paquet sont déduits de l'emplacement du modèle lui-même et de la propriété du fichier cible. Non plus besoin de ac_install_merge==on : le .clt s'applique lors de la mise à jour du paquet, même sans lui. Écrit explicitement, c'est une condition ordinaire - et si la variable est désactivée, le modèle sera ignoré. Une mise à jour ordinaire du paquet l'applique :
emerge -a1 openrc
consolefont="ter-v12n"
Le fait qu'un .clt modifie le fichier sur place dépend de l'état de la cible. Si le fichier de configuration diffère de ce qui est enregistré dans la liste des fichiers du paquet (il a été modifié à la main ou recréé), le moteur préserve votre version et place le résultat à côté - dans ._cfg0000_consolefont - tandis que la cible reste inchangée. Sur un fichier intact, le même modèle modifie la cible sur place. Les commandes equery b <file> et qcheck <package> vous aident à identifier le paquet auquel le fichier appartient et s'il existe des divergences.
Ne copiez pas le fichier entier dans un .clt : sans format=, ce sera un modèle "raw" qui réécrira entièrement la configuration et ne laissera aucun en-tête de service. Deux lignes avec le format suffisent.
Regroupement des modèles : un répertoire est aussi un modèle
Quand il y a plusieurs modèles, les conditions communes vont dans l'en-tête du répertoire. Il est conservé dans le fichier .calculate_directory et hérité par tout ce qu'il contient :
/var/calculate/templates/merge/.calculate_directory
# Calculate append=skip env=install ac_install_merge==on
- env=install ac_install_merge==on n'a plus besoin d'être répété dans chaque modèle à l'intérieur ;
- append=skip signifie que le répertoire lui-même n'est pas transféré dans le système (sinon les utilitaires créeraient /merge).
Les fichiers à l'intérieur deviennent plus courts :
/var/calculate/templates/merge/ncurses.sh
# Calculate mergepkg(sys-libs/ncurses)!= path=/etc/profile.d comment=# export LDFLAGS="${LDFLAGS} -ltinfo"
S'assurer que tout est correct
Les modèles sont liés au gestionnaire de paquets
/etc/profile.d /etc/profile.d/editor.sh
sys-apps/baselayout-2.18-r1 (/etc/profile.d/editor.sh)
Checking sys-apps/baselayout ... MTIME: /etc/mtab * 41 out of 42 files are good
La ligne MTIME: /etc/mtab n'est pas une erreur du modèlemergepkg()/pkg() n'est pas indiqué, et le fichier s'est retrouvé dans "configuration du système entier" et non parmi les fichiers du paquet. Voir La vie d'un fichier après le modèle.
Pour aller plus loin
- Comprendre que mettre dans l'en-tête.
- Choisir un format pour votre fichier.
- Si le modèle "ne fonctionne pas" - la liste de diagnostic.