# howto [unionfs]

## bouleetbil

Bonsoir,

Je viens de passer un peu de temps à faire des recherches sur unionfs en voici la synthèse :

Le système UNIONFS

1. Introduction :

Unionfs permet de réunir plusieurs systèmes de fichier sur un même point de montage.

unionfs se compile en tant que module pour le noyau. Il est disponible pour la branche 2.4 à partir de la version 2.4.20 et pour la branche 2.6 à partir de la version 2.6.9.

Ce type de système de fichier est de plus en plus utilisé dans les LiveCD. Cela permet d'ajouter des programmes qui ne sont pas sur le CD ou même de définir un nouveau repertoire /home qui pointe vers une partition d'un disque dur. Ce type de système de fichiers peut être utile même un système déjà installé. Par exemple, vous venez d'acheter un disque votre partition /home est pleine et ne peux pas être transféré vers le nouveau disque (pas assez de place), il suffit de fusionner les deux disques vers /home. Ou vous avez des documents que vous ne voulez pas que l'on puisse modifier sur une partition et d'autres sur une autre partition qui sont accéssible en lecture/écriture. Il suffit de monter la première partition en lecture seule puis la seconde en lecture/ecriture.

2. Installation :

```
# emerge unionfs

# modprobe unionfs
```

A partir de maintenenant unionfs est disponible sur votre système

3. Utilisation :

Exemple :

Deux lecteurs cdrom sont montés sur /mnt/cdrom et /mnt/cdrom2. Vous voulez qu'il soit accessibles tous les deux sur /mnt/union.

```
# mount -t unionfs -o dirs=/mnt/cdrom1=ro:/mnt/cdrom2=ro unionfs /mnt/union
```

Maintenant le contenu des deux lecteurs est accéssible sur /mnt/union.

Les différentes options :

=ro signifie que le système de fichiers n'est monté qu'en lecture seul

=rw signifie que le système de fichiers n'est monté qu'en lecture/écriture

4. Utilitaire unionctl :

unionctl est un outil qui est installé avec le paquet unionfs. Il permet de visualiser ou de modifier les branches du montage de type unionfs.

Pour visualiser la liste des unions de /mnt/union :

```
# unionctl /mnt/union --list
```

Cela affichera :

/mnt/cdrom1 (r-)

/mnt/cdrom2 (r-)

Pour ajouter une partition à /mnt/union en écriture :

```
# unionctl /mnt/union --add --after /mnt/cdrom2 --mode rw /mnt/hda7
```

Pour vérifier l'ajout de /mnt/hda7.

```
# unionctl /mnt/union --list
```

/mnt/cdrom1 (r-)

/mnt/cdrom2 (r-)

/mnt/hda7 (rw)

A partir de maintenant, si vous écrivez sur /mnt/union cela écrira sur /mnt/hda7

Pour supprimer une branche :

```
# unionctl /mnt/union --remove /mnt/hda7
```

La branche /mnt/hda7 n'est plus disponible.

5. Unionfs sur liveCD :

Je vais décomposer le lancement du liveCD SLAX pour donner une idée des possibilités de unionfs.

Le fichier /linuxrc trouvé dans le ramdisk est éxecuté en premier par le noyau, si init=/linuxrc est passé en paramètre. L'éxecution de ce fichier sur SLAX lance les opérations qui suivent :

. Monte le système de fichier /proc

. Monte le système de fichier /sys

. Chargement des modules contenu dans le ramdisk

. Active le DMA

. Charge les modules de prise en charge usb si demandé

. Création des répertoires pour l'union :

/union

/memory

. Monte le système de fichier tmpfs dans /memory

. Création des répertoires :

/memory/images

/memory/changes

. Monte /memory/changes en mode lecture/ecriture sur /union grâce à unionfs.

. Recherche du cdrom contenant le liveCD et renseigne $DATA

. Création /union/boot

. Monte le contenu du répertoire /boot du liveCD dans /union/boot

. Ajoute le contenu des modules de type squashfs contenu sur le livecd sur /memory/images puis une fois monté, ajoute pour chacun une branche à /union.

. Copie le contenu du repertoire /rootcopy du liveCD vers /union

. Mise à jour du fichier /etc/fstab de /union

. Création des répertoires système de /union :

/union/proc

/union/sys

/union/dev

/union/tmp

. Donne les droits en écriture à /union/tmp

. Création du repertoire /mnt/live

. Rentre dans le répertoire /union (Important pour faire le pivot_root)

. Démonte /sys

. Création du périphérique console dans /union/dev si besoin.

. Défini l'emplacement de l'éxecutable chroot

. Fait un pivot_root du répertoire en cours vers /mnt/live

Page Man de pivot_root : pivot_root remplace le répertoire racine et le répertoire courant de tous les processus en cours d'exécution (ayant anc_rac comme racine ou répertoire courant) par celui spécifié par le chemin nouv_rac. Ce répertoire sera utilisé comme origine des chemins commençant par /. Le répertoire racine est hérité par tous les enfants du processus ayant fait le changement. Seul le Super-User peut effectuer un changement de répertoire racine. Notez que cet appel-système modifie le répertoire de travail.

. Lance init system V par le biais d'un chroot

Voici une petit graphique de la mise en place du LiveCD SLAX :

```
/(initrd, 4MB)

     |

     |---- /memory(tmpfs, 80% of RAM)

     |        |-- images

     |        |     |-- base.mo   <--loop--+

     |        |     |      |-- bin         |

     |        |     |      |-- usr         |

     |        |     |      +-- var         |

     |        |     |                      |

     |        |     |-- xwindow.mo <-loop------+   

     |        |     |      |-- etc         |   |

     |        |     |      |-- usr         |   |

     |        |     |      +-- var         |   |

     |        |     |                      |   | 

     |        |     +-- kde.mo     <-loop----------+

     |        |            |-- opt         |   |   |

     |        |            |-- usr         |   |   |

     |        |            +-- var         |   |   |

     |        |                            |   |   |

     |        +-- changes                  |   |   |

     |                                     |   |   |

     +---- /union                          |   |   |

              |---- /mnt/cdrom             |   |   |

              |          |--- base.mo -----+   |   |

              |          |--- xwindow.mo ------+   |

              |          +--- kde.mo --------------+

              +---- /mnt/live
```

5. Prochainement :

Genkernel devrait intégrer prochainement le support de unionfs dans l'initrd. Pour le moment il faut soit se créer un ramdisk manuellement soit si vous n'avez pas l'utiliter de unionfs dans le ramdisk le charger à chaque démarrage.

Conclusion :

L'utilisation de unionfs en soit n'est pas compliqué et peut rendre quelques services, même sur un système déjà installé. (Cela rappelle LVM en version très simplifié)

Par contre j'ai rencontré des freeze avec les versions supérieur à la 1.0.14 de unionfs.

Bidouille :

Pour ceux et celles qui se fabriquent un liveCD from scratch (cf guide sympa => http://gentoo-wiki.com/Talk:HOWTO_build_a_LiveCD_from_scratch ) Voici une petite astuce pour intégrer unionfs au ramdisk en attandant une mise à jour qui l'intègre.

```
# emerge genkernel

# genkernel kernel --gensplash"Le gensplash utilisé" --install

# emerge unionfs 
```

A partir de la unionfs est disponible en tant que module.

Editer /usr/share/genkernel/generic/linuxrc

A la ligne 230 ajouter

```
good_msg  'Mise en place unionfs'

modprobe unionfs 
```

A la ligne 290 modifier la facon de monter le fichier squashfs

```
elif [ "${LOOPTYPE}" = 'squashfs' ]

   then

      good_msg 'Monte le systeme squashfs'

      mkdir -p ${NEW_ROOT}/mnt/squash

      mount -t squashfs -o loop,ro ${NEW_ROOT}/mnt/cdrom/${LOOPEXT}${LOOP} ${NEW_ROOT}/mnt/squash

      test_success 'Mount filesystem'

      FS_LOCATION='mnt/livecd'

      mkdir -p ${NEW_ROOT}/mnt/livecd

      mount -t unionfs -o dirs=${NEW_ROOT}/mnt/squash=ro unionfs ${NEW_ROOT}/mnt/livecd      
```

Editer /usr/share/genkernel/gen_initramfs.sh

A la ligne 43 ajouter

```
cp -av /usr/sbin/unionctl  ${TEMP}/initramfs-base-temp/sbin/

cp -av /usr/sbin/uniondbg ${TEMP}/initramfs-base-temp/sbin/

cp -av /usr/sbin/unionimap ${TEMP}/initramfs-base-temp/sbin/
```

A la ligne 356 ajouter

```
cp -axv --parents ./lib/modules/2.6.15-suspend2-r8/fs/unionfs.ko "${TEMP}/initramfs-modules-${KV}-temp"
```

ou 2.6.15-suspend2-r8 représente le noyau utilisé.

Maintenant la création du ramdisk :

```
# genkernel initrd --install
```

Et voila unionfs est disponible dans le ramdisk.   :Laughing: 

Donc maintenant, livecd.squashfs est monté sur /mnt/squash et /mnt/livecd est unioné si vous ajoutez une branche à /mnt/livecd celle ci apparaitra sur la partition /. car / pointe en parti sur /mnt/livecd. J'espere avoir été à peu pres clair.

----------

## Enlight

juste une remarque, pour pas s'embeter avec unionfs en module, on a la possibilité de faire un simple emerge -f unionfs, de l'unpacker où bon nous semble puis d'executer le script patch.sh (avec comme argument le répertoire des sources) là on retourne dans son menuconfig et pouf, on peut le metre en dur.

----------

## bouleetbil

Je ne connaissais pas cette possibilité.

Merci ,je vais essayer pour plus m'embeter avec le ramdisk

----------

