Bonjour,

chouette probleme que celui-ci. Definitivement mieux que les mots croises du dimanche :-D

Le 21-févr.-11 à 11:03, nicolas.flin...@gmail.com a écrit :

Merci pour votre intérêt a la question a vous deux :o)

Alors pour avancer un peu plus, je vais un peu dévoiler la mienne...

Le 20 février 2011 10:12, Jean-Charles de Longueville
<jean-char...@de-longueville.eu> a écrit :
Difficile d'avoir structurellement une partie de repertoire sur une
partition et une autre sur une seconde.

Et bien non, c'est facilement faisable.

facilement de maniere structurelle?
ton explication c'est ni simple ni structurelle ;-)
mais elle est pleine de bonne idees ;-)
creusons!

Peu d'utilisateurs GNU le
savent visiblement quand je leur en ai parlé, d'où l'idée de ce sujet
ici pour le partager avec d'éventuelles personnes ne le sachant pas...

L'idée est de se débarrasser des liens symboliques qui sont la
solution du pauvre...  il faut faire gaffe lorsqu'on a fait des
scripts, d'utiliser les bonnes options sur les bonnes commandes pour
résoudre (ou pas) les liens symboliques, etc...

D'accord. voyons comment faire sans utiliser de liens symboliques mais uniquement avec mount.

Donc comme on le disait, il faut que le /home/user soit monté sur le
SSD pour que les nouveaux fichiers de config des nouveaux outils
soient sur le SSD de façon simple....  sinon il faudrait
éventuellement les déplacer, etc... chose dont je ne veux pas, vu que
je veux garder mon boot inférieur a 12 secondes pour continuer de
profiter pleinement de mon SSD.

Alors comment faire ? L'idée est d'utiliser une capacité de notre ami
mount qui est géniale dans notre cas mais pas super connue...


======= man 8 mount =======
[....]
Depuis Linux 2.4.0 il est possible de remonter une partie de la
hiérarchie des fichiers ailleurs. L'appel est :
mount --bind olddir newdir Ensuite, le même contenu est accessible en
deux endroits.

Cet appel attache seulement (une partie de) un unique système de
fichiers, et pas les éventuels sous-montages. La hiérarchie complète,
y compris les sous-montages est attachée une seconde fois avec :
mount --rbind olddir newdir

Depuis Linux 2.5.1 il est possible de déplacer atomiquement une
sous-arborescence à un autre endroit. L'appel est :
mount --move olddir newdir
[....]
==============

Je vous laisse lire le mount en entier, car il y a des infos
concernant la securite, notamment les options:

mount --make-shared mountpoint
mount --make-slave mountpoint
mount --make-private mountpoint
mount --make-unbindable mountpoint


L'idée est d'avoir des répertoires /quelquechose/user1/Documents
/quelquechose/user1/Images  etc... sur le HDD, de monter la partition
du HDD dans un répertoire, disons /mnt/home_ext, et ensuite de binder
(mount --bind) ces répertoires (ex:
/mnt/home_ext/quelquechose/user1/Documents) aux répertoires du $HOME
sur le SSD (ex: /home/user1/Documents)

Ainsi, ~ se trouve sur le SSD, et tous les répertoires Documents,
Images etc... se trouvent sur le HDD, avec un montage propre, et sans
problématique de back-up ou que sais-je.

Pour le moment, j'ai hard-codé pour mon user principal les montages
dans le fichier /etc/fstab, mais je vais faire un petit script exécuté
au démarrage de la machine qui montera ma partoche du HDD dans
/mnt/home_ext, puis qui boucle sur les répertoires /home/userN,
vérifiera si il existe un répertoire /mnt/home_ext/quelquechose/userN,
et montera alors les répertoires présents dans les répertoires du
/home/userN.

Pour être complet, il faudra faire un alias de la commande mkdir si
l'on veut que les users créent leur nouveaux répertoires sur le HDD,
et le tour est joué...

Du coup, a l'utilisation, c'est très flexible: si je veux profiter de
la rapidité du SSD, en manipulant un fichier photo temporairement, par
exemple, je le sauve directement dans mon ~, et en revanche, des que
je veux le classer proprement dans mes/images/albums-titi/etc.. il est
automatiquement sur le RAID1.

Remarques ? Conseils ? Idées ?

C'est bienvenu, car a mon avis cela mérite de faire un petit topo sur
le site, avec éventuellement le petit script du démarrage, les
quelques lignes a rajouter a certains endroits, et on pourrait
proposer une solution toute faite pour l'utilisateur lambda. Je pense
que c vaut le coup pour les config' SSD + HDD de données, qui devrait
se répandre de plus en plus.... ou même HDD interne systeme + HDD
externe de données etc...

Qu'en pensez-vous ?

en reponse, voici ce que j'en pense ;-)

Recapitulons. Nous avons:

/hdd/home/user/repertoire
/sdd/home/user/.fichier
/sdd/home/user/.repertoire
/sdd/home/user/fichier

Il faut que le /home soit /sdd/home
il faut que les repertoires de donnees soient sur /hdd/home/user
il faut que les fichiers de donnees qui ne soient pas dans un sous repertoire soient sur /sdd/home/user il faut que l'utilisation soit transparente pour l'utilisateur (solution accessible a l'utilisateur lambda) Il faut que cela fonctionne pour tous les utilisateurs (solution structurelle)

Le script suivant monte les repertoires des utilisateurs depuis hdd vers sdd

#!/bin/bash
# depuis /etc/fstab nous avons
## mount /dev/sdd/home /home
## mount /dev/hdd/home /hdd/home
cd /home
for u in *
# on boucle sur les users repris dans /home
do
cd /hdd/home/$u
for r in *
# on boucle sur les contenus (repertoires) des users dans hdd
do
# on verifie que r soit bien un repertoire
if [[-d $r]]
then
# on verifie que le point de montage existe
if [[-d /home/$u/$r]]
then
# on le monte
mount --bind /hdd/home/$u/$r /home/$u/$r
elif [[-e /home/$u/$r]]
then
# comme ce n'est pas un repertoire mais qu'il existe,
# c'est un fichier, il ne devrait pas etre la
echo "error: $r est un fichier et pas un repertoire, on ne peut monter un repertoire par dessus"
# on pourrait le deplacer dans /home
# mv /hdd/home/$u/$r /home/$u/$r
else
# on cree le repertoire manquant ("point de montage")
mkdir /home/$u/$r
# et on y monte le repertoire de donnees
mount --bind /hdd/home/$u/$r /home/$u/$r
fi
fi
done
done

Premier souci: quid des repertoires crees en cours de session dans / home/user ? que ce soit par l'utilisateur ou par root (ou un daemon)? Je ne suis pas sur qu'un alias pour mkdir couvre tous les cas de figure! Une solution serait de laisser faire et de deplacer ces repertoires de sdd vers hdd avant le montage decrit ci-dessus... Dans ce cas il faut ajouter en debut du script

#!/bin/bash
cd /home
for u in *
cd $u
for r in *
if [[-d $r]]
then
mv /home/$u/$r /hdd/home/$u/$r
fi
done
done
# et on reprend le script d'avant ici

Mais si c'est un script de demarrage et que la machine est multiutilisateur et peut-etre jamais rebootee (c'est le cas de mon desktop partage avec ma femme et les enfants qui n'est reboote que pour en changer le kernel) alors le script n'est en fait jamais joue a chaud... et le SDD va vite exploser!

Dons cherchons plutot une solution executee en debut de session. Premier souci, le script devra etre joue par tous les gestionnaires de sessions actifs. Pour la console, l'appel d'un tel script peut etre inclus dans ~/.bashrc (via /etc/skel/.bashrc pour que les nouveaux utilisateurs en profitent de maniere transparente). Autre souci evident, il faudra verifier si un repertoire de hdd est deja lie a un autre de sdd pour eviter d'empiler les montages identiques les uns sur les autres. Et il faudra veiller a ajouter un script de demontage propre dans la procedure de shutdown. Linux permettant plusieurs sessions simultanees tant en console que sous X il faudra en outre veiller a ni monter plusieurs fois le meme repertoire ni le demonter tant qu'il existe une session active.

Toujours convaincu que c'est simple? moi vraiment pas :-p

Essayons neanmois. Nous verrons ensuite comment declencher ce script ci.

Premier essai

#!/bin/bash
cd ~
$HOME=$(pwd)
# l'utilisateur est-il deja en session
moi=$(whoami)
cb=$(who|grep $moi|wc -l)
if (( $cb = 1 ))
# si non alors deplacons les repertoires de donnees crees depuis la derniere session de sdd vers hdd
then
for r in *
do
if [[ -d $r]]
then
if [[ ! -d /hdd/$HOME/$r ]]
then
mv $HOME/$r /hdd/$HOME/$r
fi
fi
done
fi
# ensuite montons les repetoires de hdd qui ne sont pas encore montes sur sdd
for r in *
mount | grep -v "/hdd/$HOME/$r" && mount --bind /hdd/$HOME/$r $HOME/$r
done

ca le fait?

Et comment declencher ce script?
dans ~/.bashrc
dans ~/.xsession

AFAIK il n'y a pas de moyen unique tous window manager confondus :- ( sauf si le mechanisme xdm qui lance le script ~/.xsession est repris par les gestionnaire de sessions plus recents (gdm, kdm, etc)

Pour le shutdown, c'est relativement facile. IMHA il suffit d'ajouter dans le script /etc/init.d/umount les lignes

for l in `mount | gawk '/hdd/' {print $1}`
do
umount $l
done

et vos avis?

librement votre,
--
R : Tu vois !            || Jean-Charles de Longueville
Q : Tu crois ?
R : Ça casse l'ordre chronologique de l'échange.
Q : En quoi répondre au dessus est-il gênant ?


Diffusez cette liste aupres de vos relations :-)
   Linux Azur : http://www.linux-azur.org
   Vous etes responsable de vos propos.
*** Merci de rediger sans SMS, ni HTML ni PJ ***



Répondre à