mageia4arm
==========

Short :
-------
* [Français](#francais)
* [English](#english)


<a id="francais"/>
Français
--------

* [Description](#fr_desc)
* [Rapidement](#fr_quick)
* [Créer une image](#fr_creatimg)
* [Aide](#fr_help)
* [Premier démarrage](#fr_1stStart)
* [Nouvelle plateforme](#fr_newPlat)
    * [Fichier de configuration](#fr_file-conf)
    * [Fichier chroot](#fr_file-second)
    * [Fichier de fonctions personnalisées](#fr_file-spe)
    * [Fichier extlinux](#fr_file-extlinux)
    * [Autres fichiers](#fr_file_others)
* [Extras](#fr_extras)
    * [Graver l'image](#fr_burn)
    * [Compresser l'image](#fr_compress)
    * [Générer une checksum](#fr_gen_chksum)
    * [Signer la checksum](#fr_sign)
    * [Vérifier une signature](#fr_verify)
    * [Étendre la partition](#fr_extend)


<a id="fr_desc"></a>
### Description :
Outils servant à  générer une image Mageia pour systèmes à base de processeurs arm

<a id="fr_quick"/>
### Démarrage rapide :

Avoir une copie de ce dépot :
```
git clone https://git.labolyon.fr/DTux/mageia4arm
```
Choisissez le dossier de configuration adapté à votre besoin (rpi ou xu4), sinon créez un nouveau dossier de configuration, copiez le fichier "mageia4arm.cfg.template" à l'interieur et modifiez le selon vos besoins.  
Par défaut l'utilisateur est "pi" avec le mot de passe "raspberry", et l'administrateur "root" avec le mot de passe "piroot".  

<a id="fr_creatimg"/>
### Créer l'image :
create_arm_image.sh --all --config \<dossier de configuration\>  
Par exemple :  
```
su -  
<mot de passe root>  
cd /home/user/workspace/mageia4arm/  
./create_arm_image.sh --all --target bananaPro --size 4 --tainted --nonfree --build-path ./build --config bananaPro 2>&1 | tee -a ./build.log
```
Avec cette commande, toutes les étapes (--all) du processus de création pour (--target) la bananaPro sont exécuter. L'image final tiendra sur une carte de (--size) 4Go. Les dépots tainted et nonfree seront activé. Le chemin de construction (--build-path) sera ./build. Finalement, la configuration (--config) sera bananaPro. La suite de la commande, 2>&1 redirige la sortie d'erreur dans la sortie standart et le tout est dupliqué (| tee -a) dans le fichier build.log pour le déboguage.

<a id="fr_help"/>
### Aide :
create_arm_image.sh -h|--help  

Vous pouvez adapter le script "second_stage_install.sh" afin de compléter l'installation.  
Des scripts sont disponibles dans le dossier "tools", ils sont copié dans /usr/local/bin/ dans l'image.  

<a id="fr_1stStart"/>
### Premier lancement de l'image sur le raspberry pi :
- lancer drakkeyboard afin de configurer le clavier  
- si vous avez besoin d'un gestionnaire graphique, lancer le script :<br/>install_graphical.sh \<gestionnaire-graphique\>( xfce, lxqt, plasma, ...) voir les métapaquetages disponibles dans "Environnement graphique" dans le gestionnaire de logiciels.


<a id="fr_newPlat"/>
### Ajouter une nouvelle plateforme :
Pour ajouter une nouvelle plateforme, il faut le dossier au nom du matériel dans le dossier platforms contenant le fichier mageia4arm.cfg comprennant les informations relatif à la distribution Mageia, le fichier second_stage_install.sh qui vient installer le système, le fichier specialFunctions.sh qui implémentes les fonctions pour affiner l'installation à la plateforme et extlinux.conf.

<a id="fr_file-conf"/>
#### mageia4arm.cfg
Un modèle est présent à la source de ce projet. Il contient les variables nécessaire à l'installation de Mageia, comme la version, l'architecture, le mirroir, les mots de passes etc.

<a id="fr_file-second"/>
#### second_stage_install.sh
Ce script est lancé avec chroot, ainsi nous pouvons exécuter des opérations personnalisées comme l'installation de paquets non présents des dépots de Mageia. Ce script vient aussi définir les groupes de fichiers.

<a id="fr_file-spe"/>
#### specialFunctions.sh
Ce script complémente le processus d'installation pour des éléments spécifiques à la plateformes, comme le partitionnement, la manière de mettre en place le chargeur de démarrage, le téléchargements de fichiers externe, etc.  
Le script doit implémenter ces quatres fonctions :  
```
function preImgCreation() { 
    #Possibilité de télécharger des éléments supplémentaires ici.  
    return 0  
}  
function postPrepareChroot() {  
    #Possibilité de copier des fichiers spécifique à la plateforme avant de lancer le script second_stage_install.sh.  
    return 0  
}  
function burningBootloader() {  
    #Plusieurs méthodes sont possibles pour flasher le chargeur de démarrage, et dépendent de la plateforme.  
    return 0  
}  
function copyingCustomSystem() {  
    #Possibilité de copier des fichiers dans le système monté.  
    return 0  
}  
```
Si l'une de ces fonctions ne retourne pas 0, la création de l'image échoue.

<a id="fr_file-extlinux"/>
#### extlinux.conf
Extlinux.conf est un script utilisé par le chargeur de démarrage (s'il est capable de le gérer, uboot le peut), pour spécifier la version du noyau à démarrer. Le script est normalement généré automatiquement par les outils de Mageia à chaque installation/mise à jour d'un noyau. Malheureusement, lors de la création d'une image de Mageia en chroot, l'outil refuse de générer ce fichier, de plus si le fichier est manquant, lors de la mise à jour du noyau, l'outil de Mageia génère un fichier erroné avec des entrées vides que u-boot refuse.  
Il vaut mieux créer ce fichier, même s'il n'est pas primordiale. D'autant plus que lors de la mise à jour d'un noyau, l'outil de Mageia reprends les arguments de la commande de démarrage pour les nouvelles versions.

La structure basique du fichier est :
```
default linux
timeout 20
menu title Welcome to Mageia-Minimal.

label linux
  kernel /boot/vmlinuz
  fdtdir /usr/lib/<FDTDIR>
  append root=UUID=<UUID> <BOOT_ARGS>
```
Les balises :
- \<FDTDIR\> est automatiquement généré par le script ./mageia4arm/create_arm_image.sh
- \<UUID\> est récupéré par le script ./mageia4arm/create_arm_image.sh , il peut être nécessaire d'ajouter une initrd pour utiliser l'UUID, autrement il faut spécifier /dev/mmcblkXpY .
- \<BOOT_ARGS\> est défini dans le fichier ./mageia4arm/platforms/\<LaPlateforme\>/mageia4arm.cfg .


Il est possible d'ajouter la ligne `initrd /boot/initrd.img` si un fichier initrd a été généré par dracut.


<a id="fr_file-others"/>
#### Autres
Bien sûr, d'autres fichiers sont nécessaires. Il faut avoir l'arborescence du matériel (soit DTB/DTS, soit script.bin), le chargeur de démarrage spécifique à la plateforme ainsi qu'un noyau compatible avec l'architecture de la plateforme.

<a id="fr_extras"/>
### Extras :
Diverses informations complémentaires.

<a id="fr_burn"/>
#### Graver une image
Il est possible de graver l'image avec dd, souvent les cartes SD sont disponibles sous le nom mmcblkX avec X leurs numéros.  
```
dd if=./build/Mageia-7-bananaPro1.img of=/dev/mmcblkX
```
On peut ajouter une barre de progression :  
```
pv ./build/Mageia-7-bananaPro1.img | dd of=/dev/mmcblkX
```

<a id="fr_compress"/>
#### Compresser une image
Pour compresser l'image, de plusieurs Go en quelques centaines de Mo pour la mettre en ligne par exemple, il est possible d'exécuter la commande suivante :  
```
dd if=./build/Mageia-7-bananaPro1.img | gzip -9 | dd of=./build/Mageia-7-bananaPro1.img.gz
```  
Avec une barre d'avancement :  
```
pv ./build/Mageia-7-bananaPro1.img | gzip -9 | dd of=./build/Mageia-7-bananaPro1.img.gz
```  
Il est possible d'utiliser d'autre logiciel de compression comme xz par exemple.  

<a id="fr_gen_chksum"/>
#### Calculer les sommes de contrôles
Pour s'assurer qu'un fichier a été bien téléchargé, pour vérifier son intégrité, il est d'usage de comparer la somme de contrôle. On peut la calculer avec l'algorithme MD5, SHA1, SHA256, SHA512. Par exemple :  
```
cd /home/user/workspace/mageia4arm/build
md5sum Mageia-7-bananaPro1.img > Mageia-7-bananaPro1.img.md5
```
Il est possible de remplacer la commande md5sum par sha1sum ou sha256sum ou encore sha512sum.

<a id="fr_sign"/>
#### Signer les sommes de contrôles
Pour assurer les utilisateurs que le fichier téléchargé vient bien de vous et non d'un tiers malveillant, il est possible de signer la somme de contrôle avec votre clef.
```
cd /home/user/workspace/mageia4arm/build
gpg --sign Mageia-7-bananaPro1.img.md5
```
La commande génère automatiquement le fichier de signature reprenant le nom du fichier à l'identique et ajoutant l'extension .gpg.

<a id="fr_verify"/>
#### Vérifier les sommes de contrôles
Pour vérifier une somme de contrôle, il faut joindre le créateur de l'image, lui faire confiance, ajouter sa clef à son trousseau de clef. Ensuite, il est possible d'exécuter la commande suivante :
```
cd /home/user/Téléchargements/
gpg --verify Mageia-7-bananaPro1.img.md5
```

<a id="fr_extend"/>
#### Étendre la partition
L'image créé peut contenir une partition root très réduite. Ceci permet d'économiser de la place pour la construction, le stockage de l'image et sûrtout un temps réduit pour graver l'image sur une carte sd.
Il est possible d'étendre cette partition pour profiter pleinement de l'entièreté de la carte SD. Le plus simple est avec l'utilitaire growpart dans le paquet cloud-utils-growpart.
Les valeurs X et Y sont à remplacer par le périphérique et la dernière partition du périphérique à étendre.
```
#Vérifier la partition, il peut être demandé pour l'étape suivante.
e2fsck -f /dev/mmcblkXpY

#Défini la nouvelle taille. (Change de langue avec LC_ALL car growpart ne supporte pas 'octet'.
LC_ALL=C growpart /dev/mmcblkX partitionNumber

#Change la taille
resize2fs /dev/mmcblkXpY

#Synchronise, vide le cache USB et assure que les données sont sur la clef.
sync
```


<a id="english"/>
English
-------

* [Description](#en_desc)
* [Quickly](#en_quick)
* [Create an image](#en_creatimg)
* [Help](#en_help)
* [First boot](#en_1stStart)
* [New Platform](#en_newPlat)
    * [Configuration File](#en_file-conf)
    * [chroot Filechroot](#en_file-second)
    * [Custom function File](#en_file-spe)
    * [extlinux File](#en_file-extlinux)
    * [Other Files](#en_file-others)
* [Extras](#en_extras)
    * [Burn the image](#en_burn)
    * [Compress the Image](#en_compress)
    * [Generate the Checksum](#en_gen_chksum)
    * [Sign the Checksum](#en_sign)
    * [Verify the Signature](#en_verify)
    * [extending the partition](#en_extend)

<a id="en_desc"/>
### Description:
This repository contains script to make image for arm based systems from Mageia repositories.  

<a id="en_quick"/>
<a id="en_creatimg"/>
### Quick start:

Choose the config dir you need (rpi or xu4), else create a new config directory with "mageia4arm.cfg.template" in and modify it as you need.  
By default username is "pi" with password "raspberry" and root password is "piroot".  

create_arm_image.sh --all --config <your config dir\>  
Example given :
```
su -
<root password>
cd /home/user/workspace/mageia4arm/
./create_arm_image.sh --all --target bananaPro --size 4 --tainted --nonfree --build-path ./build --config bananaPro 2>&1 | tee -a ./build.log
```
With such command, all steps of the build process for the bananaPro will be executed. The final image will fit into a 4 GB SD card. The nonfree and tainted repositories will be activated. The build path will be the directory ./build. Finaly, the configuration is for bananaPro. The rest of the command, 2>&1 redirect the stderr stream into the stdout and it will be duplicated inside the build.log file for debug purpose.

<a id="en_help"/>
### Help:
create_arm_image.sh -h|--help  

you can adapt the script "second_stage_install.sh" to complete the installation.  
Some scripts are available in directory "tools". they are copied in /usr/local/bin/ in the image.  

<a id="en_1stStart"/>
### First launch of the image on raspberry pi:
- launch drakkeyboard to configure keyboard layout.  
- if you need a graphical environment, launch the script :<br/>install_graphical.sh \<graphical environment\> ( xfce, lxqt, plasma, ...), see "Graphical environment" in the Mageia application manager meta packages.


<a id="en_newPlat"/>
### Adding a new platform:
To add a new platform, a new folder needs to be created in the platforms directory with the name of the platform containing the mageia4arm.cfg configuration file about the Mageia distribution itself, the second_stage_install.sh script which install the system, the specialFunctions.sh script which implements functions in order to fit the platform and the extlinux.conf file.

<a id="en_file-conf"/>
#### mageia4arm.cfg
A template file is located in the root of the project. It contains all necessary variables for the installation of Mageia, as the version, architecture, mirroir, password etc.

<a id="en_file-second"/>
#### second_stage_install.sh
This script is launched with chroot, then we can execute custom operation as installing packages that are not from Mageia.org. This script also defines some files groups.

<a id="en_file-spe"/>
#### specialFunctions.sh
This script add into the installation process some elements specific to the platform, as the partitionning, the fashon to set the bootloader, downloading external files, etc.  
It must implement the four next functons :  
```
function preImgCreation() {
    #Here it is possible to download external file.
    return 0
}
function postPrepareChroot() {
    #Possibility to copy/paste platform related files before to launch the second_stage_install.sh script.
    return 0
}
function burningBootloader() {
    #There are several methods to flash the bootloader and depend on the platform.
    return 0
}
function copyingCustomSystem() {
    #It is possible to copy files into the mounted system.=
    return 0
}
```
If one of this functions does not return 0, the process is stoped.

<a id="en_file-extlinux"/>
#### extlinux.conf
extlinux.conf is a script used by the bootloader (if it is able to manage it, uboot does) in order to select specific kernel version to start with boot arguments. This script is normaly automatically generated by Mageia's tools at each kernel installation/update. Unfortunately, when creating the image of Mageia in chroot, the tool refuses to generate the file, moreover, if the file is missing, at the first kernel update, the tool will create it with empty entries which makes uboot failing to parse it.  
It is better to generate this file, even if it isn't mandatory. It is even better as the tool take into account the boot arguments of previous kernel and add it for the new one and regenerate automatically the file.

The basic file is:
```
default linux
timeout 20
menu title Welcome to Mageia-Minimal.

label linux
  kernel /boot/vmlinuz
  fdtdir /usr/lib/<FDTDIR>
  append root=UUID=<UUID> <BOOT_ARGS>
```
The tags :
- \<FDTDIR\> is automatically generated by the script ./mageia4arm/create_arm_image.sh
- \<UUID\> is automatically reused bu the script ./mageia4arm/create_arm_image.sh , it might be necessary to add an initrd in order to user the UUID, otherwise it should be specify /dev/mmcblkXpY .
- \<BOOT_ARGS\> is defined in the configuration file ./mageia4arm/platforms/\<ThePlatform\>/mageia4arm.cfg


It is also possible to add the line `initrd /boot/initrd.img` if a initrd file has been generated by dracut.

<a id="en_file-others"/>
#### others
Of course, other files are necessary. The device tree (DTB/DTS or script.bin) is necessary, a specific bootloader for the platform and a compatible kernel with that architecture.


<a id="en_extras"/>
<a id="en_burn"/>
<a id="en_compress"/>
<a id="en_gen_chksum"/>
<a id="en_sign"/>
<a id="en_verify"/>
<a id="en_extend"/>
### extras:
Not translated.
