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 joseph bourez . Évalué à 1.
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 KiKouN . Évalué à 2.
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 Pat Le Nain . Évalué à 1.
[^] # Re: initrd ?
Posté par Alexandre Boeglin . Évalué à 2.
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 eolyte . Évalué à 2.
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 eolyte . Évalué à 1.
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 Frédéric COIFFIER . Évalué à 1.
[^] # Re: pivot_root ?
Posté par Alexandre Boeglin . Évalué à 2.
[^] # Re: pivot_root ?
Posté par Alexandre Boeglin . Évalué à 3.
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 eolyte . Évalué à 1.
Ç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 Alexandre Boeglin . Évalué à 2.
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 Alexandre Boeglin . Évalué à 2.
euh, le contraire, en fait...
# Ce doit être possible !
Posté par niouls . Évalué à 1.
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 Thomas Douillard . Évalué à 1.
mount --bind /cdrom /
[^] # Re: Ce doit être possible !
Posté par Philippe MAES (site web personnel) . Évalué à 1.
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 jiceb . Évalué à 1.
ç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 fred point . Évalué à 1.
=> 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 niouls . Évalué à 1.
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.