{"id":1437,"date":"2014-03-18T21:23:53","date_gmt":"2014-03-18T19:23:53","guid":{"rendered":"http:\/\/stephane.weblog.starend.org\/?p=1437"},"modified":"2014-03-18T21:23:53","modified_gmt":"2014-03-18T19:23:53","slug":"racine-en-lecture-seule","status":"publish","type":"post","link":"http:\/\/stephane.weblog.starend.org\/?p=1437","title":{"rendered":"Racine en lecture seule"},"content":{"rendered":"<p style=\"text-align: justify;\">Dans l&rsquo;article sur la mise en place d&rsquo;un <a title=\"Syst\u00e8me bootable chiffr\u00e9 sur deux cl\u00e9s USB interd\u00e9pendantes\" href=\"http:\/\/stephane.weblog.starend.org\/?p=1404\" target=\"_blank\">syst\u00e8me sur deux cl\u00e9s USB interd\u00e9pendantes<\/a>, il \u00e9tait question de faire tourner le syst\u00e8me sur une cl\u00e9 en lecture seule. Il faut notamment que la racine soit sur cette cl\u00e9, mais potentiellement une grande partie du syst\u00e8me pour que cela soit int\u00e9ressant.<\/p>\n<p style=\"text-align: justify;\">C&rsquo;est aussi un int\u00e9r\u00eat pour la dur\u00e9e de vie de la cl\u00e9 supportant le syst\u00e8me. La technologie des m\u00e9moires FLASH dans les cl\u00e9s USB ne supporte pas \u00e9norm\u00e9ment de cycles d&rsquo;\u00e9criture. Ainsi, emp\u00eacher l&rsquo;\u00e9criture revient \u00e0 r\u00e9duire consid\u00e9rablement ce risque de panne.<\/p>\n<p style=\"text-align: justify;\">Il y a plusieurs fa\u00e7ons de r\u00e9aliser l&rsquo;op\u00e9ration :<\/p>\n<ol>\n<li style=\"text-align: justify;\">Partitionner le syst\u00e8me de fa\u00e7on \u00e0 avoir certaines parties en lecture seule (<code>\/<\/code>, <code>\/boot<\/code>, <code>\/bin<\/code>, <code>\/usr<\/code>, <code>\/lib<\/code>, <code>\/sbin<\/code>) et d&rsquo;autres en lecture\/\u00e9criture (<code>\/home<\/code>, <code>\/var<\/code>, <code>\/tmp<\/code>, etc&#8230;). CF <a title=\"ReadonlyRoot\" href=\"https:\/\/wiki.debian.org\/ReadonlyRoot\" target=\"_blank\">https:\/\/wiki.debian.org\/ReadonlyRoot<\/a> .<\/li>\n<li style=\"text-align: justify;\">Utiliser une surcouche au syst\u00e8me de fichier pour que celui-ci soit comme si il \u00e9tait en lecture\/\u00e9criture, mais en fait rien n&rsquo;est jamais \u00e9crit sur le disque. Toute modification reste en m\u00e9moire vive et est ainsi perdu au red\u00e9marrage. Il faut cependant faire attention dans notre exemple \u00e0 l&rsquo;occupation de la m\u00e9moire qui va in\u00e9vitablement grossir avec le temps d&rsquo;utilisation. CF <a title=\"Unioning file systems: Implementations, part 2\" href=\"http:\/\/lwn.net\/Articles\/327738\/\" target=\"_blank\">http:\/\/lwn.net\/Articles\/327738\/<\/a> .<\/li>\n<li style=\"text-align: justify;\">Faire en sorte que les programmes qui \u00e9crivent sur le disque soit n&rsquo;ai plus besoin de le faire, soit qu&rsquo;ils soient arr\u00eat\u00e9s ou d\u00e9sinstall\u00e9s. Cela veut dire que certains programmes seront inutilisables parce qu&rsquo;ils n\u00e9cessitent pour leur fonctionnement d&rsquo;\u00e9crire (compulsivement).<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Il peut y avoir un probl\u00e8me avec les mots de passes \u00e0 g\u00e9rer. Il est possible de g\u00e9rer plusieurs partitions chiffr\u00e9es sans avoir autant de mot de passe \u00e0 taper qu&rsquo;il y a de partitions. Une m\u00e9thode, que je n&rsquo;ai pas essay\u00e9, est de dire \u00e0 <code>cryptsetup<\/code> que le mot de passe est commun \u00e0 plusieurs partitions. Une autre m\u00e9thode est d&rsquo;utiliser des des mots de passes dans des fichiers (voir un seul) et finalement de ne plus avoir qu&rsquo;un mot de passe \u00e0 saisir, celui de la partition qui contient les fichiers de mots de passes. Et enfin, on peut utiliser <em>LVM<\/em> par dessus une seule partition chiffr\u00e9e, et sous-partitionner gr\u00e2ce \u00e0 <em>LVM<\/em>. Cette derni\u00e8re solution marche bien et est r\u00e9alisable d\u00e8s l&rsquo;installation du syst\u00e8me (au moins sous <em>Debian<\/em> et <em>Ubuntu alternate<\/em>).<\/p>\n<p style=\"text-align: justify;\"><!--more--><\/p>\n<h2 style=\"text-align: justify;\">Mise en pratique<\/h2>\n<p style=\"text-align: justify;\">On va ici faire un mixe de la surcouche du syst\u00e8me de fichier pour certains dossiers sp\u00e9cifiques et la d\u00e9sactivation des processus ou de leur m\u00e9thode de journalisation.<\/p>\n<h3 style=\"text-align: justify;\">\/var\/log<\/h3>\n<p style=\"text-align: justify;\">On va rendre le dossier <code>\/var\/log<\/code> modifiable, mais tout sera d\u00e9tourn\u00e9 vers <code>\/tmp\/log<\/code>. La base des fichiers qui se trouvent r\u00e9ellement dans <code>\/var\/log<\/code> sera bien en lecture seule.<\/p>\n<p style=\"text-align: justify;\">Il faut ajouter au cours du processus de d\u00e9marrage :<\/p>\n<pre>mkdir \/tmp\/log\nmount -t aufs -o br:\/tmp\/log:\/var\/log=ro none \/var\/log<\/pre>\n<p style=\"text-align: justify;\">Le script au d\u00e9marrage doit \u00eatre plac\u00e9 avant qu&rsquo;un d\u00e9mon ne soit lanc\u00e9 et n&rsquo;utilise le dossier <code>\/var\/log<\/code>, et apr\u00e8s le montage et nettoyage de <code>\/tmp<\/code>.<\/p>\n<h3 style=\"text-align: justify;\">D\u00e9mon rsyslog<\/h3>\n<p style=\"text-align: justify;\">A-t-on besoin de garder les journaux ?<br \/>\nSi oui, alors ils vont arriver dans <code>\/tmp\/log<\/code>.<br \/>\nSi non, il suffit de d\u00e9sactiver <em>rsyslog<\/em>.<\/p>\n<h3 style=\"text-align: justify;\">Serveur Xorg<\/h3>\n<p style=\"text-align: justify;\">Au lancement du serveur graphique X, celui-ci ouvre un fichier de journalisation <code>\/var\/log\/Xorg.0.log<\/code>.<\/p>\n<h3 style=\"text-align: justify;\">Gestionnaire de connexion GDM<\/h3>\n<p style=\"text-align: justify;\">GDM utilise un dossier pour diff\u00e9rentes choses. Il est pr\u00e9f\u00e9rable de monter ce dossier en m\u00e9moire. On va garder le dossier utilis\u00e9 par d\u00e9faut mais le r\u00e9utiliser \u00e0 chaque d\u00e9marrage sans le modifier. Puis on va mettre en place un script au d\u00e9marrage pour initialiser ce dossier en m\u00e9moire et avec un contenu ad\u00e9quat.<\/p>\n<p style=\"text-align: justify;\">Commencer par arr\u00eater GDM = revenir en console texte. Ce peut \u00eatre fait avec :<\/p>\n<pre>service gdm3 stop<\/pre>\n<p style=\"text-align: justify;\">Ensuite, on renomme le dossier <code>\/var\/lib\/gdm3<\/code> en <code>gdm3.init<\/code> :<\/p>\n<pre>mv \/var\/lib\/gdm3 \/var\/lib\/gdm3.init<\/pre>\n<p style=\"text-align: justify;\">Cr\u00e9er le fichier de script <code>\/etc\/init.d\/mounttmpfs.sh<\/code> :<\/p>\n<pre>#!\/bin\/sh\n### BEGIN INIT INFO\n# Provides:          mounttmpfs\n# Required-Start:    mountall-bootclean\n# Required-Stop:\n# Default-Start:     S\n# Default-Stop:\n# Short-Description: Mount tmpfs filesystems.\n# Description:\n### END INIT INFO\n[ ! -d \/var\/lib\/gdm3 ] &amp;&amp; mkdir -p \/var\/lib\/gdm3\nmount -n -t tmpfs -o size=1M none \/var\/lib\/gdm3\ncp -rp \/var\/lib\/gdm3.init\/* \/var\/lib\/gdm3\/\ncp -rp \/var\/lib\/gdm3.init\/.[cdfp]* \/var\/lib\/gdm3\/\nchmod Debian-gdm.Debian-gdm \/var\/lib\/gdm3<\/pre>\n<p style=\"text-align: justify;\">Le rendre ex\u00e9cutable et l&rsquo;activer :<\/p>\n<pre>chmod 755 \/etc\/init.d\/mounttmpfs.sh\nupdate-rc.d<\/pre>\n<p style=\"text-align: justify;\">V\u00e9rifier au red\u00e9marrage que dossier a bien \u00e9t\u00e9 remplit. Le montage avec l&rsquo;option -n fait que ce n&rsquo;est pas \u00e9crit dans <code>\/etc\/fstab<\/code>&#8230; puisque l&rsquo;on veut \u00e9viter les \u00e9critures inutiles pour rendre le tout en lecture seule. Mais on peut v\u00e9rifier avec la commande <code>mount<\/code> que le montage a march\u00e9.<\/p>\n<h2 style=\"text-align: justify;\">Et apr\u00e8s ?<\/h2>\n<p style=\"text-align: justify;\">On peut continuer comme \u00e7a si on a d&rsquo;autres programmes qui posent probl\u00e8me. On peut mixer diff\u00e9rentes m\u00e9thodes et utiliser le script de d\u00e9marrage pour faire \u00e0 la fois des montages en <code>tmpfs<\/code> et\/ou <code>aufs<\/code>&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans l&rsquo;article sur la mise en place d&rsquo;un syst\u00e8me sur deux cl\u00e9s USB interd\u00e9pendantes, il \u00e9tait question de faire tourner le syst\u00e8me sur une cl\u00e9 en lecture seule. Il faut notamment que la racine soit sur cette cl\u00e9, mais potentiellement une grande partie du syst\u00e8me pour que cela soit int\u00e9ressant. C&rsquo;est aussi un int\u00e9r\u00eat pour &hellip; <a href=\"http:\/\/stephane.weblog.starend.org\/?p=1437\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Racine en lecture seule<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[43,48,10,11,26],"tags":[81,187,188,338,384,423],"_links":{"self":[{"href":"http:\/\/stephane.weblog.starend.org\/index.php?rest_route=\/wp\/v2\/posts\/1437"}],"collection":[{"href":"http:\/\/stephane.weblog.starend.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/stephane.weblog.starend.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/stephane.weblog.starend.org\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/stephane.weblog.starend.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1437"}],"version-history":[{"count":0,"href":"http:\/\/stephane.weblog.starend.org\/index.php?rest_route=\/wp\/v2\/posts\/1437\/revisions"}],"wp:attachment":[{"href":"http:\/\/stephane.weblog.starend.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1437"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/stephane.weblog.starend.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1437"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/stephane.weblog.starend.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1437"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}