Journal Changement dynamique de rootdevice (attention, c'est long !)

Posté par  .
Étiquettes :
0
30
juil.
2004
D'abord, situons le contexte (les plus pressés d'entre vous peuvent sauter directement au point II):


I) LE CONTEXTE


Je dispose d'un portable dont le disque-dur est l'unique source de bruit (mis à part le ventilateur du cpu qui ne se met en route qu'en cas de forte charge).

Pour atteindre le silence *absolu*, il me faut donc m'attaquer au disque-dur.

La commande hdparm -Y /dev/hdx (put IDE drive to sleep) est toute indiquée à cette fin.

Pour l'utiliser, il faut toutefois que mon système ne dépende en rien du disque-dur.

La solution consiste à mettre à profit les autres sources de données disponibles: lecteur cdrom, carte réseau, adaptateur pcmcia/compact-flash, port usb...

Dans cette perspective, j'ai entrepris ces jours derniers la construction d'un système basé sur la branche current de la slackware, et dont les composants correspondent à mes besoins les plus simples :
lecture de vidéos (mplayer), écoute de musique (mpd/ncmpc), réception et rédaction de courriels (fetchmail/procmail/elmo/vim), surf (firefox/windowmaker), etc.

Au final, j'obtiens 483M de fichiers, dans une arborescence unix normale, et que je grave tels quels sur un cd-rw, sans compression.

Au boot, un ramdisk initial crée la structure du système:
- montage d'un système de fichiers de type ramfs dans /mnt (ce sera notre futur /, et basé en mémoire, il sera writeable)
- montage du cdrw dans le dossier /mnt/cdrom (dont le contenu sera donc read-only)
- les futurs /dev, /etc, /root, /var, et /tmp sont crées et remplis dans /mnt (ils seront writeable puisque également basés en mémoire, découlant de /mnt)
- on crée les liens symboliques vers les dossiers dont un accès en lecture suffit:

for DIR in bin boot lib root sbin usr
do
ln -s /mnt/cdrom/"$DIR" /mnt/"$DIR"
done

- enfin, la commande pivot_root nous permet de définir effectivement /mnt comme le nouveau /

La suite, via /sbin/init, va consister notamment en:
- montage du /home, stocké sur une carte compact-flash
- montage du partage samba pour accéder à mes fichiers multimédia (stockés sur le serveur, très bruyant, mais je m'en fous, il est dans une pièce très éloignée).

Et bien sûr, le tout s'est fait disque-dur en veille (objectif de départ).

Jusque là, tout fonctionne comme prévu. Le lecteur cdrom est même très peu sollicité une fois le système "rodé" (caches et buffers mémoire bien remplis).

Mais, puisque rien n'est parfait, cette configuration implique un inconvénient tout de même de taille : le temps de chargement total, me permettant une opérationnalité complète dans mon activité moulesque excède les 3 minutes.

Cela m'amène (ouf !) au problème.


II) LE PROBLÈME


J'ai pensé alors que le système pourrait être lancé via le disque-dur, puis que l'on switcherait sur le cd-rw le moment voulu. Facile, me dis-je, il s'agit juste de changer les liens symboliques des dossiers dont un accès en lecture suffit, puisque le reste est en mémoire.

Malheureusement, un sudo ls -l /proc/1/exe renvoie ceci:

lrwxrwxrwx 1 root root 0 2004-07-30 05:57 /proc/1/exe -> /disque/sbin/init

Init, et les autres processus, ont été lancés avec en référence la destination du lien symbolique (/disque/sbin/init) et non le lien symbolique lui-même (/sbin/init), ce qui m'interdit tout changement de support. Un lsof | grep /disque est tout aussi éloquent.

Le disque reste donc busy, soit inendormable, tout comme moi.

J'en appelle donc à la solidarité linuxfrienne : si vous avez le moindre début de commencement d'idée potentielle, je suis intéressé !

À noter, que le noyau utilisé est un 2.6.7, donc pas de overlayfs (http://ovlfs.sf.net(...) ) ni de unionfs (http://www.fsl.cs.sunysb.edu/project-unionfs.html(...) ) possible.

Je vous suis déja reconnaissant de m'avoir lu jusqu'ici :)

_niouls_
  • # Y'en a qui sont balaizes

    Posté par  . Évalué à 1.

    Pfiou !!!
    Passionnant mais compliqué !
    En gros tu veux booter sur le disque dur et après l'endormir ??
    j'ai bien compris ?
    • [^] # Re: Y'en a qui sont balaizes

      Posté par  . Évalué à 2.

      Tu peux aussi utiliser de la mémoire flash qui ne coute plus très chère et qui peux se mettre sur un port ide (à vérifier surtout pour sur portable). Une petite synchro de temps en temps sur le disque dur et voilà.

      En allant voir un tour sur site de vente, je trouve 1Go à partir de 115euros et la 2Go à 154euros. Bon c'est de la noname.

      Tout celà est bien sur à vérifier et est juste donné comme idée.
  • # initrd ?

    Posté par  . Évalué à 1.

    Tu es sur de vouloir booter sur ton disque dur ? Parce que tu as la solution de booter directement sur le CDROM avec une image initrd qui fera toutes les initialisations demandées. Comme ça aucun lien avec le disque dur !
    • [^] # Re: initrd ?

      Posté par  . Évalué à 2.

      en fait, il cherche un truc rapide... le livecd pur est un peu à oublier.

      la vrai question, dans tout ca, en fait, et à laquelle on n'a pas de réponse est :

      Qu'est ce que est lent (quelle phase de l'initialisation), exactement? Qu'est ce qu'il essaie de rendre plus rapide?
  • # pivot_root ?

    Posté par  . Évalué à 2.

    Salut,

    j'ai du réaliser un live cd pendant un stage, et j'ai eu droit à la même problématique : changer le root device de l'initrd vers le cd.
    Bon, le tout était avec un noyau 2.4, et je ne sais pas si ce que je vais te dire s'applique encore a un 2.6 (c'est toujours mieux que rien).

    En fait tout se joue dans l'initrd, vers la fin de celui-ci tu dois utiliser la commande pivot_root avec les arguments qui vont bien pour faire basculer ta racine. Je te recommande de lire la page man de pivot_root et de chercher sur le net.

    Je pense qu'il est plus simple que tu déportes ton système de fichiers racine dès le démarrage, et je ne crois pas que ce soit faisable trivialement une fois init démarré.

    Je viens de regarder, les deux liens qui m'avaient donné un max d'info sur le sujet ne sont malheureusement plus en ligne.

    En bonus, les quelques dernières lignes appelées dans mon linuxrc :


    # A faire uniquement si /proc était monté
    umount -n /proc >/dev/null 2>&1
    mount -n -o ro -t iso9660 $CDROM $TMPMNT
    cd $TMPMNT
    pivot_root . mnt/initrd
    exec chroot . sh -c 'mount -n -t devfs none /dev >/dev/null 2>&1;\
      exec -a init.new /sbin/init 3'\
      <dev/console >dev/console 2>&1
    • [^] # Re: pivot_root ?

      Posté par  . Évalué à 1.

      oops, je n'aurais pas du t'écouter et lire plus attentivement le contexte /o\

      Heu, question subsidiaire : à quoi ça t'avance de booter sur le disque dur si tu passes sur le cd ensuite ? Je suppose que tu as une bonne raison de vouloir faire cela, mais je ne la vois pas.
      • [^] # Re: pivot_root ?

        Posté par  . Évalué à 1.

        Heu, pouvoir endormir son HD parce qu'il fait du bruit et continuer à avoir ses softs avec le CD une fois que le plus gros du boulot (le démarrage) aura été fait grâce au HD (qui est plus rapide sur le CD) ?
        • [^] # Re: pivot_root ?

          Posté par  . Évalué à 2.

          en même temps, t'as pas 36000 services à démarrer, pour l'utilisation que t'as de cette machine, non?
    • [^] # Re: pivot_root ?

      Posté par  . Évalué à 3.

      exec chroot . sh -c 'mount -n -t devfs none /dev >/dev/null 2>&1;\
      exec -a init.new /sbin/init 3'


      Euh, t'es sur de ton coup, là?

      c'est pas plutôt au kernel de spawner init tout seul, et de laisser init lire le runlevel dans /etc/inittab?

      parce que là, en théorie, quand ton machin boot, exec remplace linuxrc par init, et en toute logique, si tu killes cet init, le noyau va voir que linuxrc est mort aussi et lancer son propre init par derrière, non?

      enfin, ca m'intrigue, parce que les linuxrc que j'ai vu jusqu'à présent, ils s'arrêtent après le pivot_root, et ils rendent la main, laissant le noyau spawner init.
      • [^] # Re: pivot_root ?

        Posté par  . Évalué à 1.

        Ce que je peux t'assurer, c'est que ça fonctionne =)

        Ça fait un bail que je n'ai pas touché à ça, comme je le disais, c'était un travail durant un stage, et depuis, je fais d'autres choses (comprendre : mes souvenirs sur le sujet ne sont pas tous frais...).

        Ce qu'il faut savoir, c'est que j'avais codé une détection de disques durs et lecteurs cdrom/graveurs dans le linuxrc, et que donc devfs était monté avant le pivot_root dans l'ancienne racine. A ce moment là, le noyau est déjà chargé et si je ne me trompe pas (j'insiste) je crois qu'il ne tient pas compte du pivot_root qui a été fait si on le lance pas init comme je le fais. Le montage de devfs est fait pour que la console soit présente dans le nouveau /dev au lancement d'init.

        Voilà, je crois que c'est ça, mais c'est UNE manière de faire, et pas LA manière de faire, simplement, ça fonctionnait comme je le souhaitais.
  • # chezmoicamarche.net

    Posté par  . Évalué à 2.

    J'ai pensé alors que le système pourrait être lancé via le disque-dur, puis que l'on switcherait sur le cd-rw le moment voulu. Facile, me dis-je, il s'agit juste de changer les liens symboliques des dossiers dont un accès en lecture suffit, puisque le reste est en mémoire.

    Malheureusement, un sudo ls -l /proc/1/exe renvoie ceci:

    lrwxrwxrwx 1 root root 0 2004-07-30 05:57 /proc/1/exe -> /disque/sbin/init


    d'après ce que tu dis, il faudrait juste remplacer un lien :

    for DIR in bin boot lib root sbin usr
    do
    ln -s /mnt/disque/"$DIR" /mnt/"$DIR"
    done
    [...]
    pivot_root /mnt /mnt/initrd


    par

    for DIR in bin boot lib root sbin usr
    do
    if [ x$DIR = xsbin ] ; then
    ln -s /cdrom/"$DIR" /mnt/"$DIR"
    else
    ln -s /disque/"$DIR" /mnt/"$DIR"
    fi
    done
    [...]
    pivot_root /mnt /mnt/initrd


    comme ca au sortir du linuxrc, /sbin/init sera appelé à partir de /disque et pas de /cdrom
    • [^] # Re: chezmoicamarche.net

      Posté par  . Évalué à 2.

      comme ca au sortir du linuxrc, /sbin/init sera appelé à partir de /disque et pas de /cdrom

      euh, le contraire, en fait...
  • # Ce doit être possible !

    Posté par  . Évalué à 1.

    Merci à tous pour vos commentaires, auquels je répondrai par d'avantage de précisions.

    Lorsque je lance mon système directement à partir du cd-rw, *toute* l'initialisation est lente, et ce bien que j'ai un nombre limité de services à démarrer ; à titre indicatif, c'est le couple Xorg/Windowmaker le plus lent à se charger: 1 minute à lui seul, firefox trentes secondes, etc. Le tout dans une sollicitation constante du lecteur cdrom.

    Je souhaiterais donc effectivement profiter de la vitesse du disque-dur pour mettre en place complètement le système (lancement des mes logiciels favoris y compris), à la manière d'une distribution classique. Sauf qu'une fois le système lancé, je souhaiterais m'affranchir du disque-dur : l'endormir, et perdre ainsi la nuisance sonore qu'il implique. Mais pour l'endormir, il faut qu'il ne soit aucunement lié au système : l'idée est donc de trouver un moyen de switcher sur le cd-rw pour en faire la nouvelle source des données (i.e. le nouveau /).

    D'autant que si je trouve un moyen de switcher d'un média à l'autre facilement (du disque-dur au cdrom et vice versa), je peux imaginer complexifier le système présent sur le disque-dur (ajouter des outils de compilations, les sources du kernel, etc) puisque la contrainte de place du cd-rw ne tient plus, tout en gardant un système light sur le cd.

    Si je trouve quelque chose, je vous fait signe ;)

    _niouls_
    • [^] # Re: Ce doit être possible !

      Posté par  . Évalué à 1.

      Ca va surepetn pas marcher, mais j'aurais essayé un

      mount --bind /cdrom /
    • [^] # Re: Ce doit être possible !

      Posté par  (site web personnel) . Évalué à 1.

      Je ne suis pas expert du tout et ton probleme me dépasse un peu, mais juste un truc qui me passe par la tete.

      Est-ce que tes services sont sérialisés ou parrallélisés ?

      Puisque lancer plusieurs lectures simultanément sur le lecteur CDROM ralenti les transferts, non ?
    • [^] # Re: Ce doit être possible !

      Posté par  . Évalué à 1.

      et le laptopmode ?
      ça force le noyau à ne faire les écriture sur le disque que toutes les N minutes, ou si une lecture est faite sur une page non bufferisée. Le disque est donc utilisé qu'en cas de réel besoin, tu n'as qu'à utiliser un ram disque pour le cache de firefox et autres bidules du même genre. Ensuite tu mets le disque en économie d'énergie, avec une veille imédiate, et op plus de disque qui tourne. Je fais ça sur mon portable (pas pour le bruit mais pour l'autonomie) et ça marche très bien.
    • [^] # Re: Ce doit être possible !

      Posté par  . Évalué à 1.

      En mettant tout ton cdrom (ou ton HD) en mémoire dès le démarrage.

      => mettre tout dans un fichier a charger en ramdisk au démarrage.

      NB: Il te faudra beaucoup de mémoire (le ramdisk 483M + la mémoire vive 512M ~ 1Go)
  • # C'est possible !

    Posté par  . Évalué à 1.

    Merci à Thomas Douillard pour la piste du mount et à vous tous pour vos idées :p

    J'ai gardé la structure de départ (mise en place par un initrd):
    - /dev, /etc, /root, /var, /tmp en mémoire
    - /bin, /boot, /lib, /mnt, /sbin, /usr liens symboliques vers /source/"$DIR"
    - /home sur compactflash

    Étant entendu que le dossier /source est un point d'attache du disque-dur.

    Une fois le système chargé et les logiciels lancés:
    - mount /dev/cdrom /source (les dossiers du cd-rw vont se substituer à ceux du disque-dur)
    - réinitialisation de udev et de devpts
    - enfin, le salvateur hdparm -Y /dev/hda

    Soit un silence acquis en moins d'une minute !

    Encore merci :)

    _niouls_

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.