{"id":4355,"date":"2015-10-19T06:00:16","date_gmt":"2015-10-19T05:00:16","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=4355"},"modified":"2015-12-05T17:35:22","modified_gmt":"2015-12-05T16:35:22","slug":"renforcer-une-distribution-raspbian-jessie","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2015\/10\/19\/renforcer-une-distribution-raspbian-jessie\/","title":{"rendered":"Renforcer une distribution Raspbian Jessie"},"content":{"rendered":"<p><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2015\/10\/Raspbian-Jessie.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright wp-image-4397 size-full\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2015\/10\/Raspbian-Jessie.png\" alt=\"Raspbian Jessie\" width=\"250\" height=\"200\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Depuis quelques jours une nouvelle <a href=\"https:\/\/www.raspberrypi.org\/downloads\/raspbian\/\" target=\"_blank\">distribution Raspbian<\/a> est disponible pour le Raspberry Pi&nbsp;: la version <em><strong>Jessie<\/strong><\/em>. Il s&rsquo;agit de l&rsquo;adaptation de la distribution Debian 8 sortie au printemps.<\/p>\n<p style=\"text-align: justify;\">L&rsquo;avantage de Debian est de disposer ais\u00e9ment d&rsquo;un tr\u00e8s large \u00e9ventail d&rsquo;applications, utilitaires, biblioth\u00e8ques pr\u00e9-configur\u00e9s et faciles \u00e0 installer. En outre il s&rsquo;agit en quelque sorte de la distribution de r\u00e9f\u00e9rence lorsqu&rsquo;on parle d&rsquo;un syst\u00e8me Linux.<\/p>\n<p style=\"text-align: justify;\">L&rsquo;inconv\u00e9nient, \u00e0 mes yeux, de Raspbian est qu&rsquo;elle est pr\u00e9vue pour une utilisation \u00ab\u00a0<em>desktop<\/em>\u00a0\u00bb qui convient tr\u00e8s bien pour un PC mais pas vraiment pour un syst\u00e8me embarqu\u00e9. Je lui reproche entre autre de ne pas \u00eatre tr\u00e8s robuste vis-\u00e0-vis des coupures d&rsquo;alimentation. Mais rien ne nous emp\u00eache de la configurer comme un syst\u00e8me embarqu\u00e9 classique. Essayons&#8230;<br \/>\n<!--more-->\n<\/p>\n<h1>Premier boot, premi\u00e8res impressions<\/h1>\n<p style=\"text-align: justify;\">Je d\u00e9marre la distribution <strong>Raspbian Jessie<\/strong> sur un Raspberry Pi mod\u00e8le 1 B, et j&rsquo;observe les traces de <em>boot<\/em> sur la console s\u00e9rie.<\/p>\n<pre>[    0.000000] Linux version 4.1.7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) ) #817 PREEMPT Sat Sep 19 15:25:36 BST 2015\n[    0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d\n[    0.000000] CPU: PIPT \/ VIPT nonaliasing data cache, VIPT nonaliasing instruction cache\n[    0.000000] Machine model: Raspberry Pi Model B Rev 2<\/pre>\n<p style=\"text-align: justify;\">Le mod\u00e8le est bien identifi\u00e9 (<em>Raspberry Pi Model B<\/em>), et nous voyons que le noyau est plut\u00f4t r\u00e9cent (4.1.7), compil\u00e9 le 19 septembre 2015. Il s&rsquo;agit de la 817\u00e8me compilation depuis l&rsquo;extraction des sources.<\/p>\n<p style=\"text-align: justify; padding-left: 60px;\">Je me demande si cette valeur est bien r\u00e9elle. Le noyau 4.1.7 a \u00e9t\u00e9 publi\u00e9 sur www.kernel.org le 13 septembre, cela repr\u00e9sente donc une moyenne de 136 compilations par jour ce qui est tr\u00e8s intensif, m\u00eame dans le cas, d&rsquo;un portage sur une nouvelle plate-forme&nbsp;!<\/p>\n<p style=\"text-align: justify;\">Au bout de quelques secondes de <em>boot<\/em>, nous apercevons la fin des messages&nbsp;:<\/p>\n<pre>[    3.552810] systemd[1]: Starting Forward Password Requests to Wall Directory Watch.\n[    3.565385] systemd[1]: Started Forward Password Requests to Wall Directory Watch.\n[    3.577346] systemd[1]: Expecting device dev-ttyAMA0.device...\n[    3.588483] systemd[1]: Starting Remote File Systems (Pre).\n[    3.599047] systemd[1]: Reached target Remote File Systems (Pre).\n[    3.607838] systemd[1]: Starting Arbitrary Executable File Formats File System Automount Point.\n[    3.624897] systemd[1]: Set up automount Arbitrary Executable File Formats File System Automount Point.\n[    3.638953] systemd[1]: Starting Encrypted Volumes.\n[    3.649175] systemd[1]: Reached target Encrypted Volumes.\n[    3.657151] systemd[1]: Starting Swap.\n[    3.666030] systemd[1]: Reached target Swap.\n[    3.672566] systemd[1]: Expecting device dev-mmcblk0p1.device...\n[    3.683667] systemd[1]: Starting Root Slice.\n[    3.692723] systemd[1]: Created slice Root Slice.\n[    3.699726] systemd[1]: Starting User and Session Slice.\n[    3.710168] systemd[1]: Created slice User and Session Slice.\n[    3.718224] systemd[1]: Starting \/dev\/initctl Compatibility Named Pipe.\n[    3.730063] systemd[1]: Listening on \/dev\/initctl Compatibility Named Pipe.\n[    3.739330] systemd[1]: Starting Delayed Shutdown Socket.\n[    3.749556] systemd[1]: Listening on Delayed Shutdown Socket.\n[    3.757494] systemd[1]: Starting Journal Socket (\/dev\/log).\n[    3.767964] systemd[1]: Listening on Journal Socket (\/dev\/log).\n[    3.776167] systemd[1]: Starting udev Control Socket.\n[    3.786159] systemd[1]: Listening on udev Control Socket.\n[    3.793864] systemd[1]: Starting udev Kernel Socket.\n[    3.803610] systemd[1]: Listening on udev Kernel Socket.\n[    3.811114] systemd[1]: Starting Journal Socket.\n[    3.820696] systemd[1]: Listening on Journal Socket.\n[    3.828070] systemd[1]: Starting System Slice.\n[    3.837506] systemd[1]: Created slice System Slice.\n[    3.844769] systemd[1]: Starting File System Check on Root Device...\n[    3.860653] systemd[1]: Starting system-systemd\\x2dfsck.slice.\n[    3.882537] systemd[1]: Created slice system-systemd\\x2dfsck.slice.\n[    3.897474] systemd[1]: Starting system-autologin.slice.\n[    3.915110] systemd[1]: Created slice system-autologin.slice.\n[    3.924527] systemd[1]: Starting system-serial\\x2dgetty.slice.\n[    3.939584] systemd[1]: Created slice system-serial\\x2dgetty.slice.\n[    3.949190] systemd[1]: Starting Increase datagram queue length...\n[    3.971123] systemd[1]: Starting Restore \/ save the current clock...\n[    4.011520] systemd[1]: Mounting POSIX Message Queue File System...\n[    4.045988] systemd[1]: Mounted Huge Pages File System.\n[    4.114605] systemd[1]: Mounting Debug File System...\n[    4.220232] systemd[1]: Started Set Up Additional Binary Formats.\n[    4.279891] systemd[1]: Starting Load Kernel Modules...\n[    4.312892] systemd[1]: Starting udev Coldplug all Devices...\n[    4.358785] systemd[1]: Starting Create list of required static device nodes for the current kernel...\n[    4.403001] fuse init (API version 7.23)\n[    4.434562] systemd[1]: Starting Slices.\n[    4.462789] systemd[1]: Reached target Slices.\n[    4.523991] systemd[1]: Mounted Debug File System.\n[    4.545602] systemd[1]: Mounted POSIX Message Queue File System.\n[\u00a0\u00a0\u00a0 4.569828] i2c \/dev entries driver\n[\u00a0\u00a0\u00a0 4.588558] systemd[1]: Started File System Check on Root Device.\n[\u00a0\u00a0\u00a0 4.627558] systemd[1]: Started Increase datagram queue length.\n[\u00a0\u00a0\u00a0 4.641169] systemd[1]: Started Restore \/ save the current clock.\n[\u00a0\u00a0\u00a0 4.657331] systemd[1]: Started Load Kernel Modules.\n[\u00a0\u00a0\u00a0 4.685012] systemd[1]: Started Create list of required static device nodes for the current kernel.\n[\u00a0\u00a0\u00a0 4.723014] systemd[1]: Time has been changed\n[\u00a0\u00a0\u00a0 4.883663] systemd[1]: Started udev Coldplug all Devices.\n[\u00a0\u00a0\u00a0 5.095077] systemd[1]: Starting Create Static Device Nodes in \/dev...\n[\u00a0\u00a0\u00a0 5.112404] systemd[1]: Starting Apply Kernel Variables...\n[\u00a0\u00a0\u00a0 5.146732] systemd[1]: Mounting Configuration File System...\n[\u00a0\u00a0\u00a0 5.199784] systemd[1]: Mounting FUSE Control File System...<\/pre>\n<p style=\"text-align: justify;\">Clairement, <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Systemd\" target=\"_blank\"><strong>systemd<\/strong><\/a> a pris beaucoup d&rsquo;ampleur dans cette version de la distribution Raspbian. Comme beaucoup de Linux \u00ab\u00a0historiques\u00a0\u00bb, je ne suis pas tr\u00e8s enthousiaste devant ce syst\u00e8me, tout particuli\u00e8rement dans le domaine de l&#8217;embarqu\u00e9. Je le trouve plut\u00f4t complexe et difficile \u00e0 ma\u00eetriser. Pour des syst\u00e8mes restreints, que l&rsquo;on doit ajuster pr\u00e9cis\u00e9ment pour un besoin particulier, je trouve plus ais\u00e9 de reposer sur quelques scripts shell, plut\u00f4t que sur un enchev\u00eatrement de services imbriqu\u00e9s et peu configurables.<\/p>\n<pre>raspberrypi login: <strong>pi<\/strong>\nPassword: (<strong>raspberry<\/strong>)<\/pre>\n<p style=\"text-align: justify;\">Je suis connect\u00e9 sur la console s\u00e9rie du syst\u00e8me (sur les broches 8 et 10 du <a href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2014-08-07\/Connecteur_P1.pdf\">Connecteur P1<\/a>). Cet acc\u00e8s para\u00eet certainement un peu aride \u00e0 la plupart des utilisateurs, mais \u00e9tant habitu\u00e9 \u00e0 travailler sur des syst\u00e8mes embarqu\u00e9s restreints, je suis plus \u00e0 l&rsquo;aise sur le Raspberry Pi en console texte que dans un terminal graphique qui \u00ab\u00a0rame\u00a0\u00bb un peu sur les mod\u00e8les 1B et 1B+.<\/p>\n<p style=\"text-align: justify;\">Utilisons quelques commandes d&rsquo;administration simples pour examiner le syst\u00e8me.<\/p>\n<pre>$ <strong>mount<\/strong>\n\/dev\/mmcblk0p2 on \/ type ext4 (rw,noatime,data=ordered)\ndevtmpfs on \/dev type devtmpfs (rw,relatime,size=218252k,nr_inodes=54563,mode=755)\nsysfs on \/sys type sysfs (rw,nosuid,nodev,noexec,relatime)\nproc on \/proc type proc (rw,relatime)\ntmpfs on \/dev\/shm type tmpfs (rw,nosuid,nodev)\ndevpts on \/dev\/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)\ntmpfs on \/run type tmpfs (rw,nosuid,nodev,mode=755)\ntmpfs on \/run\/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)\ntmpfs on \/sys\/fs\/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)\ncgroup on \/sys\/fs\/cgroup\/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=\/lib\/systemd\/systemd-cgroups-agent,name=systemd)\ncgroup on \/sys\/fs\/cgroup\/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)\ncgroup on \/sys\/fs\/cgroup\/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)\ncgroup on \/sys\/fs\/cgroup\/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)\ncgroup on \/sys\/fs\/cgroup\/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)\ncgroup on \/sys\/fs\/cgroup\/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)\ncgroup on \/sys\/fs\/cgroup\/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)\nsystemd-1 on \/proc\/sys\/fs\/binfmt_misc type autofs (rw,relatime,fd=22,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)\nmqueue on \/dev\/mqueue type mqueue (rw,relatime)\ndebugfs on \/sys\/kernel\/debug type debugfs (rw,relatime)\nconfigfs on \/sys\/kernel\/config type configfs (rw,relatime)\nfusectl on \/sys\/fs\/fuse\/connections type fusectl (rw,relatime)\n\/dev\/mmcblk0p1 on \/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)\ntmpfs on \/run\/user\/1000 type tmpfs (rw,nosuid,nodev,relatime,size=44508k,mode=700,uid=1000,gid=1000)\ngvfsd-fuse on \/run\/user\/1000\/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)\n$<\/pre>\n<p style=\"text-align: justify;\">Il y a un nombre important de montage de syst\u00e8mes de fichiers virtuels, notamment dans la hi\u00e9rarchie des <em>Control Groups<\/em>. Leur pr\u00e9sence sur un syst\u00e8me embarqu\u00e9 peut \u00eatre discutable.<\/p>\n<pre>$ <strong>df<\/strong>\nFilesystem     1K-blocks    Used Available Use% Mounted on\n\/dev\/root        4031552 3197560    609480  84% \/\ndevtmpfs          218252       0    218252   0% \/dev\ntmpfs             222520       0    222520   0% \/dev\/shm\ntmpfs             222520    4548    217972   3% \/run\ntmpfs               5120       4      5116   1% \/run\/lock\ntmpfs             222520       0    222520   0% \/sys\/fs\/cgroup\n\/dev\/mmcblk0p1     57288   20232     37056  36% \/boot\ntmpfs              44508       0     44508   0% \/run\/user\/1000<\/pre>\n<p style=\"text-align: justify;\">Il reste un peu de place dans le syst\u00e8me de fichiers principal. Tant mieux car je ne compte pas l&rsquo;agrandir pour le moment.<\/p>\n<h1>D\u00e9sactivation du swap<\/h1>\n<pre>$ <strong>free<\/strong>\n             total       used       free     shared    buffers     cached\nMem:        445044     149644     295400       4960      17156      77196\n-\/+ buffers\/cache:      55292     389752\nSwap:       102396          0     102396<\/pre>\n<p style=\"text-align: justify;\">Horreur&nbsp;! une zone de swap est r\u00e9serv\u00e9e sur la carte SD. C&rsquo;est une mauvaise id\u00e9e, car dans le cas d&rsquo;un syst\u00e8me satur\u00e9 on va r\u00e9aliser un tr\u00e8s grand nombre de lectures et d&rsquo;\u00e9critures sur la m\u00e9moire Flash, ce qui peut avoir comme effet un vieillissement pr\u00e9matur\u00e9. Je conseille tr\u00e8s fortement de d\u00e9sactiver ce m\u00e9canisme. Pour cela le plus simple, est de d\u00e9sinstaller le package <code>dphys-swapfile<\/code> utilis\u00e9 pour le support du swap int\u00e9gr\u00e9 dans un syst\u00e8me de fichiers.<\/p>\n<pre>$ <strong>sudo apt-get remove dphys-swapfile<\/strong>\nReading package lists... Done\nBuilding dependency tree       \nReading state information... Done\nThe following packages will be REMOVED:\n  dphys-swapfile\n0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.\nAfter this operation, 85.0 kB disk space will be freed.\nDo you want to continue? [Y\/n] <strong>y<\/strong>\n[...]<\/pre>\n<p style=\"text-align: justify;\">Bien que le package <code>dphys-swapfile<\/code> ait \u00e9t\u00e9 supprim\u00e9, le fichier de 100 Mo qu&rsquo;il utilisait pour proposer cette m\u00e9moire alternative subsiste encore&#8230; \u00e9liminons-le&nbsp;!<\/p>\n<pre>$ <strong>ls -l \/var\/swap<\/strong>\n-rw------- 1 root root 104857600 Sep 24 15:33 \/var\/swap\n\n$ <strong>sudo rm -f \/var\/swap<\/strong>\n\n$ <strong>free<\/strong>\n             total       used       free     shared    buffers     cached\nMem:        445044     220612     224432       4960      20384     142052\n-\/+ buffers\/cache:      58176     386868\nSwap:            0          0          0<\/pre>\n<p style=\"text-align: justify;\">Je pr\u00e9f\u00e8re cette situation&nbsp;! Nous voyons au passage qu&rsquo;une bonne part de la m\u00e9moire est encore potentiellement libre (386868 ko).<\/p>\n<h1>Syst\u00e8me de fichiers en lecture seule<\/h1>\n<p style=\"text-align: justify;\">Sur un syst\u00e8me embarqu\u00e9, je trouve important de laisser le syst\u00e8me de fichiers principal, celui qui contient les ex\u00e9cutables binaires, les biblioth\u00e8ques, etc. en lecture-seule. Ainsi en cas d&rsquo;interruption brutale d&rsquo;alimentation \u00e9lectrique, le syst\u00e8me de fichiers restera intact, aucune \u00e9criture ne pouvant \u00eatre en cours d&rsquo;ex\u00e9cution au moment de la coupure. Cela r\u00e9clame quelques efforts.<\/p>\n<p style=\"text-align: justify;\">Tout d&rsquo;abord, afin de simplifier les manipulations ult\u00e9rieures, j&rsquo;ai coutume de me cr\u00e9er deux petits scripts, que je nomme <code>ro<\/code> (read only) et <code>rw<\/code> (read\/write), qui ont pour r\u00f4les respectifs de basculer le syst\u00e8me de fichiers en lecture-seule ou lecture-\u00e9criture. Je les cr\u00e9e rapidement&nbsp;:<\/p>\n<pre><strong>\/usr\/local\/bin\/ro:<\/strong>\n#! \/bin\/sh\n\nmount \/ -o ro,remount<\/pre>\n<p style=\"text-align: justify;\">et<\/p>\n<pre><strong>\/usr\/local\/bin\/rw:<\/strong>\n#! \/bin\/sh\n\nmount \/ -o rw,remount<\/pre>\n<p style=\"text-align: justify;\">Il ne faut pas oublier de rendre ces scripts ex\u00e9cutables&nbsp;:<\/p>\n<pre>$ <strong>sudo chmod +x \/usr\/local\/bin\/ro \/usr\/local\/bin\/rw<\/strong><\/pre>\n<p style=\"text-align: justify;\">Nous pouvons toujours essayer d&rsquo;invoquer <code>ro<\/code>, mais il \u00e9chouera car certains processus maintiennent d\u00e9j\u00e0 ouverts des fichiers de l&rsquo;arborescence principale.<\/p>\n<pre>$ <strong>sudo ro<\/strong>\nmount: \/ is busy<\/pre>\n<p style=\"text-align: justify;\">Lors du boot, le noyau monte lui-m\u00eame la racine du syst\u00e8me de fichier en s&rsquo;appuyant sur le contenu du param\u00e8tre <code>root=<\/code> transmis par le <em>bootloader<\/em>. Sur le Raspberry Pi, les param\u00e8tres de d\u00e9marrage du noyau se trouvent dans le fichier <code>\/boot\/cmdline.txt<\/code>. Le bootloader en ajoute d&rsquo;autres \u00e9galement, mais cela ne nous concerne pas ici.<\/p>\n<p style=\"text-align: justify;\">Par d\u00e9faut, le noyau monte son arborescence en lecture-\u00e9criture, mais la pr\u00e9sence du mot-cl\u00e9 <code>ro<\/code> dans ses param\u00e8tres de d\u00e9marrage lui demande de r\u00e9aliser le montage en lecture-seule. Je vais donc commencer par \u00e9diter le fichier <code>\/boot\/cmdline.txt<\/code> pour ajouter ce mot-cl\u00e9.<\/p>\n<pre><strong>\/boot\/cmdline.txt:<\/strong>\n<strong>ro<\/strong> dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=\/dev\/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait<\/pre>\n<p style=\"text-align: justify;\">J&rsquo;ai ins\u00e9r\u00e9 ici le mot-cl\u00e9 en d\u00e9but de ligne, mais on peut le placer n&rsquo;importe o\u00f9 sur celle-ci. Attention&nbsp;: il faut bien que toutes les options soient sur la m\u00eame ligne.<\/p>\n<p style=\"text-align: justify;\">Une fois le boot du noyau termin\u00e9, l&rsquo;espace utilisateur prend le relais, par l&rsquo;interm\u00e9diaire de <code>init<\/code> et ses scripts sur les distributions de type Syst\u00e8me V ou de <code>systemd<\/code> pour la plupart des distributions r\u00e9centes. Durant cette \u00e9tape de d\u00e9marrage, le syst\u00e8me de fichiers principal peut \u00eatre remont\u00e9 en lecture-\u00e9criture s&rsquo;il est configur\u00e9 ainsi.<\/p>\n<p style=\"text-align: justify;\">Pour m&rsquo;assurer que la racine du syst\u00e8me de fichiers reste en lecture-seule apr\u00e8s le <em>boot<\/em> du noyau, j&rsquo;\u00e9dite le fichier <code>\/etc\/fstab<\/code> qui contient la configuration des partitions et je rajoute le mot cl\u00e9 <code>ro<\/code> sur la ligne d\u00e9crivant le montage de \u00ab\u00a0<code>\/<\/code>\u00ab\u00a0. Attention \u00e0 ne pas ajouter d&rsquo;espaces autour du mot-cl\u00e9 ou des virgules.<\/p>\n<pre><strong>\/etc\/fstab:<\/strong>\nproc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/proc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 proc\u00a0\u00a0\u00a0 defaults\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\n\/dev\/mmcblk0p1\u00a0 \/boot\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vfat\u00a0\u00a0\u00a0 defaults\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2\n\/dev\/mmcblk0p2\u00a0 \/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ext4\u00a0\u00a0\u00a0 defaults,<strong>ro,<\/strong>noatime\u00a0 0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1<\/pre>\n<p style=\"text-align: justify;\">J&rsquo;en ai profit\u00e9 pour effacer les deux derni\u00e8res lignes de commentaire qui parlaient de <code>dphys-swapfile<\/code> (que nous avons supprim\u00e9 pr\u00e9c\u00e9demment).<\/p>\n<p style=\"text-align: justify;\">V\u00e9rifions le fonctionnement&nbsp;:<\/p>\n<pre># <strong>reboot<\/strong>\n[...]\nraspberrypi login: <strong>pi<\/strong>\nPassword: (<strong><em>raspberry<\/em><\/strong>)\npi@raspberrypi:~$ <strong>sudo -i<\/strong>\n# <strong>echo hello &gt; \/test<\/strong>\n-bash: \/test: Read-only file system\n# <strong>rw<\/strong>\n# <strong>echo hello &gt; \/test<\/strong>\n# <strong>cat \/test<\/strong>\nhello\n# <strong>rm \/test<\/strong>\n# <strong>ro<\/strong>\nmount: \/ is busy\n#<\/pre>\n<h1>Syst\u00e8mes de fichiers temporaires non persistants<\/h1>\n<p style=\"text-align: justify;\">Notre syst\u00e8me d\u00e9marre bien en mode lecture-seule, et nous ne pouvons pas \u00e9crire sur le syst\u00e8me de fichiers principal. Une fois bascul\u00e9 explicitement en mode lecture-\u00e9criture, il devient possible de modifier le contenu de ce syst\u00e8me de fichiers.<\/p>\n<p style=\"text-align: justify;\">N\u00e9anmoins, il est impossible de revenir en mode lecture-seule, car des processus ont profit\u00e9 du laps de temps o\u00f9 le syst\u00e8me est mont\u00e9 en lecture-\u00e9criture pour y ouvrir des fichiers en \u00e9criture et les maintenir ouverts. Essayons de savoir quels fichiers sont concern\u00e9s. Tout d&rsquo;abord, je cherche la liste des processus qui tiennent un fichier ouvert dans cette arborescence.<\/p>\n<pre># <strong>fuser -v -m \/<\/strong>\n                     USER        PID ACCESS COMMAND\n\/:                   root     kernel mount \/\n                     root          1 .rce. systemd\n                     root          2 .rc.. kthreadd\n                     [...]\n                     root         60 .rc.. kworker\/0:1H\n                     root         91 .rce. systemd-journal\n                     root         93 frce. systemd-udevd\n                     root        180 .rc.. kworker\/0:3\n                     root        375 .rc.. cfg80211\n                     root        450 .rce. sshd\n                     root        451 .rce. cron\n                     root        455 .rce. systemd-logind\n                     avahi       471 .rce. avahi-daemon\n                     messagebus    478 .rce. dbus-daemon\n                     avahi       490 .rce. avahi-daemon\n                     nobody      492 .rce. thd\n                     ntp         501 .rce. ntpd\n                     root        502 Frce. rsyslogd\n                     root        521 .rce. login\n                     root        522 .rce. login\n                     pi          534 .rce. systemd\n                     pi          545 .rce. (sd-pam\n                     pi          571 .rce. bash\n                     root        599 .rce. dhcpcd\n                     pi          697 .rce. bash\n                     root        707 .rce. sudo\n                     root        714 .rce. bash\n                     root        740 frce. lightdm\n                     root        745 Frce. Xorg\n                     root        758 .rce. lightdm\n                     pi          771 Frce. lxsession\n                     pi          795 Frce. ssh-agent\n                     pi          798 .rce. dbus-launch\n                     pi          799 .rce. dbus-daemon\n                     pi          805 .rce. gvfsd\n                     pi          809 .rce. gvfsd-fuse\n                     pi          820 Frce. openbox\n                     pi          821 Frce. lxpolkit\n                     pi          823 Frce. lxpanel\n                     pi          825 Frce. pcmanfm\n                     pi          832 Frce. ssh-agent\n                     root        834 .rce. polkitd\n                     pi          847 .rce. gvfs-udisks2-vo\n                     root        849 .rce. udisksd\n                     pi          859 .rce. gvfs-afc-volume\n                     pi          864 .rce. gvfs-mtp-volume\n                     pi          868 .rce. gvfs-gphoto2-vo\n                     pi          872 .rce. gvfs-goa-volume\n                     pi          881 Frce. menu-cached\n                     pi          888 .rce. gvfsd-trash\n<\/pre>\n<p style=\"text-align: justify;\">J&rsquo;ai \u00e9limin\u00e9 de la liste les threads du noyau sur lesquels je n&rsquo;ai pas vraiment de contr\u00f4le. Les processus qui nous int\u00e9ressent sont ceux maintenant un fichier ouvert en lecture-\u00e9criture. Ceci est caract\u00e9ris\u00e9 par un <code>F<\/code> majuscule en d\u00e9but de troisi\u00e8me champ. Je filtre ces processus et affiche la liste compl\u00e8te des descripteurs dont ils disposent. La liste est \u00e9norme car il y a \u00e9galement les terminaux, les sockets, les pipes, les fichiers ex\u00e9cutables, etc&#8230;<\/p>\n<pre># <strong>fuser -v -m \/ 2&gt;&amp;1 | awk '($3 ~ \/F.*\/){ print \"\/proc\/\"$2\"\/fd\"}' | xargs ls -l<\/strong>\n[...]<\/pre>\n<p style=\"text-align: justify;\">\u00c0 l&rsquo;aide d&rsquo;une longue s\u00e9quence de <code>grep<\/code> successifs, je ne conserve que la liste des fichier qui m&rsquo;int\u00e9ressent.<\/p>\n<pre># <strong>fuser -v -m \/ 2&gt;&amp;1 | awk '($3 ~ \/F.*\/){ print \"\/proc\/\"$2\"\/fd\"}' | xargs ls -l| grep '^l.w' | grep -v socket: | grep -v \/dev\/ | grep -v \"\/proc\" | grep -v anon_inode | grep -v pipe<\/strong>\n\nl-wx------ 1 root root 64 Oct  4 15:52 10 -&gt; \/var\/log\/auth.log\nl-wx------ 1 root root 64 Oct  4 15:52 11 -&gt; \/var\/log\/user.log\nl-wx------ 1 root root 64 Oct  4 15:52 6 -&gt; \/var\/log\/syslog\nl-wx------ 1 root root 64 Oct  4 15:52 7 -&gt; \/var\/log\/kern.log\nl-wx------ 1 root root 64 Oct  4 15:52 8 -&gt; \/var\/log\/messages\nl-wx------ 1 root root 64 Oct  4 15:52 9 -&gt; \/var\/log\/daemon.log\nl-wx------ 1 root root 64 Oct  4 15:55 0 -&gt; \/var\/log\/Xorg.0.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 1 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 2 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 1 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 2 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 4 -&gt; \/home\/pi\/.cache\/openbox\/openbox.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 1 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 2 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 1 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 2 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 1 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log\nl-wx------ 1 pi pi 64 Oct  4 15:55 2 -&gt; \/home\/pi\/.cache\/lxsession\/LXDE-pi\/run.log<\/pre>\n<p style=\"text-align: justify;\">Nous voyons que les fichiers ouverts en \u00e9criture servent essentiellement \u00e0 enregistrer des traces d&rsquo;activit\u00e9.<\/p>\n<p style=\"text-align: justify;\">Sur un syst\u00e8me embarqu\u00e9 les traces servent au moment de la mise au point, mais ne sont plus utiles apr\u00e8s le basculement en production. Nous pouvons donc accepter de les placer sur un disque <em>tmpfs<\/em> (ramdisk automatiquement format\u00e9 et dimensionn\u00e9 par le noyau) o\u00f9 elles resteront accessibles pendant le fonctionnement du syst\u00e8me mais ne survivront pas \u00e0 un reboot du Raspberry Pi. Nous avons vu plus haut, dans le r\u00e9sultat de la commande <code>mount<\/code>, que le r\u00e9pertoire <code>\/run<\/code> est un point de montage d&rsquo;un <em>tmpfs<\/em>. Utilisons-le pour y stocker les fichiers de trace.<\/p>\n<pre># <strong>rm -rf \/var\/log<\/strong>\n# <strong>ln -s \/run\/log \/var\/log<\/strong><\/pre>\n<p style=\"text-align: justify;\">Il existe \u00e9galement un cas particulier dans les fichiers de configuration du syst\u00e8me&nbsp;: <code>\/etc\/resolv.conf<\/code>. Lorsque le syst\u00e8me utilise le m\u00e9canisme DHCP pour demander \u00e0 un serveur local (une <em>box<\/em> par exemple) les param\u00e8tres du r\u00e9seau, il enregistre dans ce fichier l&rsquo;adresse du DNS (le serveur de noms qui permet de r\u00e9soudre un nom de machine par exemple <em>www.kernel.org<\/em> en une adresse IP comme 199.204.44.194). Le fichier doit donc \u00eatre accessible en \u00e9criture pendant le fonctionnement normal du syst\u00e8me. Pour cela le plus simple est de le rediriger via un lien symbolique vers un r\u00e9pertoire sur un syst\u00e8me de fichier <em>tmpfs<\/em>.<\/p>\n<pre># <strong>rm  -f  \/etc\/resolv.conf<\/strong>\n# <strong>ln  -sf  \/run\/resolv.conf  \/etc\/<\/strong>\n# <strong>reboot<\/strong><\/pre>\n<h1>Syst\u00e8me de fichiers modifiables et persistants<\/h1>\n<p style=\"text-align: justify;\">Nous pouvons \u00e9galement \u00eatre amen\u00e9s \u00e0 utiliser des fichiers qui devront \u00eatre modifiables pendant le fonctionnement du syst\u00e8me, mais qui devront aussi \u00eatre persistants, c&rsquo;est-\u00e0-dire survivre \u00e0 un red\u00e9marrage de la machine. Nous allons les placer sur une partition sp\u00e9cifique en sachant que leur situation est n\u00e9anmoins un peu plus pr\u00e9caire que le reste du syst\u00e8me en cas de coupure d&rsquo;alimentation \u00e9lectrique.<\/p>\n<p style=\"text-align: justify;\">Cr\u00e9ons une partition, que nous utiliserons par la suite pour le r\u00e9pertoire <code>\/home\/pi<\/code>. Ceci permettra ainsi de sauvegarder les fichiers de traces applicatives que nous avons observ\u00e9s plus haut. Je voudrais coller cette partition \u00e0 la fin de l&rsquo;espace disque libre, pour pouvoir ensuite agrandir la partition syst\u00e8me (celle en lecture seule) afin de disposer de place suppl\u00e9mentaire si je veux installer de nouveaux packages. Je vais cr\u00e9er une partition de <code>\/home\/pi<\/code> de 2\u00a0Go.<\/p>\n<pre># <strong>fdisk \/dev\/mmcblk0<\/strong>\n\nWelcome to fdisk (util-linux 2.25.2).\nChanges will remain in memory only, until you decide to write them.\nBe careful before using the write command.\n\n\nCommand (m for help): <strong>p<\/strong>\nDisk \/dev\/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical\/physical): 512 bytes \/ 512 bytes\nI\/O size (minimum\/optimal): 512 bytes \/ 512 bytes\nDisklabel type: dos\nDisk identifier: 0xba2edfb9\n\nDevice         Boot  Start     End Sectors Size Id Type\n\/dev\/mmcblk0p1        8192  122879  114688  56M  c W95 FAT32 (LBA)\n\/dev\/mmcblk0p2      122880 8447999 8325120   4G 83 Linux<\/pre>\n<p style=\"text-align: justify;\">Notre syst\u00e8me dispose d\u00e9j\u00e0 de deux partitions&nbsp;: la premi\u00e8re contient le bootloader et le noyau (nous y reviendrons plus bas), la seconde notre syst\u00e8me de fichiers principal. Nous voyons dans le r\u00e9sultat de la commande &lsquo;<code>p<\/code>&lsquo; que la taille des secteurs est de 512 octets et que la carte SD contient 15523840 secteurs. Je vais donc d\u00e9marrer ma partition au secteur 15523840 &#8211; 4*1024*1024 = 11329536.<\/p>\n<pre>Command (m for help): <strong>n<\/strong>\nPartition type\n   p   primary (2 primary, 0 extended, 2 free)\n   e   extended (container for logical partitions)\nSelect (default p): <strong>p<\/strong>\nPartition number (3,4, default 3): <strong>3<\/strong>\nFirst sector (2048-15523839, default 2048): <strong>11329536<\/strong>\nLast sector, +sectors or +size{K,M,G,T,P} (11329536-15523839, default 15523839): <strong>(<em>Entr\u00e9e<\/em>)<\/strong>\n\nCreated a new partition 3 of type 'Linux' and of size 2 GiB.\n\nCommand (m for help): <strong>p<\/strong>\nDisk \/dev\/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical\/physical): 512 bytes \/ 512 bytes\nI\/O size (minimum\/optimal): 512 bytes \/ 512 bytes\nDisklabel type: dos\nDisk identifier: 0xba2edfb9\n\nDevice         Boot    Start      End Sectors Size Id Type\n\/dev\/mmcblk0p1          8192   122879  114688  56M  c W95 FAT32 (LBA)\n\/dev\/mmcblk0p2        122880  8447999 8325120   4G 83 Linux\n\/dev\/mmcblk0p3      11329536 15523839 4194304   2G 83 Linux\n\n\nCommand (m for help): <strong>w<\/strong>\nThe partition table has been altered.\nCalling ioctl() to re-read partition table.\nRe-reading the partition table failed.: Device or resource busy\n\nThe kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).\n#<\/pre>\n<p style=\"text-align: justify;\">Le message final m&rsquo;indique que le noyau n&rsquo;a pas honor\u00e9 la demande de <code>fdisk<\/code> concernant la relecture de la nouvelle table de partition. Pour s&rsquo;assurer qu&rsquo;elle soit bien prise en compte, red\u00e9marrons.<\/p>\n<pre># <strong>reboot<\/strong>\n[...]\n[    5.202270] systemd[1]: Mounting FUSE Control File System...\n\nRaspbian GNU\/Linux 8 raspberrypi ttyAMA0\n\nraspberrypi login: <strong>pi<\/strong>\nPassword: (<strong>raspberry<\/strong>)\nLast login: Sun Oct  4 16:13:30 UTC 2015 on tty1\nLinux raspberrypi 4.1.7+ #817 PREEMPT Sat Sep 19 15:25:36 BST 2015 armv6l\n\nThe programs included with the Debian GNU\/Linux system are free software;\nthe exact distribution terms for each program are described in the\nindividual files in \/usr\/share\/doc\/*\/copyright.\n\nDebian GNU\/Linux comes with ABSOLUTELY NO WARRANTY, to the extent\npermitted by applicable law.\npi@raspberrypi:~$ <strong>sudo -i<\/strong>\n# <strong>ls -l \/dev\/mmcblk0*<\/strong>\nbrw-rw---- 1 root disk 179, 0 Oct  4 16:13 \/dev\/mmcblk0\nbrw-rw---- 1 root disk 179, 1 Oct  4 16:13 \/dev\/mmcblk0p1\nbrw-rw---- 1 root disk 179, 2 Oct  4 16:13 \/dev\/mmcblk0p2\nbrw-rw---- 1 root disk 179, 3 Oct  4 16:13 \/dev\/mmcblk0p3\n<\/pre>\n<p style=\"text-align: justify;\"><a name=\"vfat\"><\/a>La partition 3 est bien pr\u00e9sente. Formattons-la.<\/p>\n<pre># <strong>mkfs.vfat -n HOME \/dev\/mmcblk0p3<\/strong>\nmkfs.fat 3.0.27 (2014-11-12)\n<\/pre>\n<p style=\"text-align: justify;\">J&rsquo;ai choisi un format <em>vfat<\/em> pour mon syst\u00e8me de fichiers. Ce choix peut para\u00eetre <em>a priori<\/em> surprenant, il s&rsquo;agit d&rsquo;un format limit\u00e9, ne supportant ni le choix d&rsquo;appartenance des fichiers (ils appartiennent tous \u00e0 <em>root<\/em> par d\u00e9faut), ni la modifications des droits (<code>rwxr-xr-x<\/code> pour tous les fichiers), ni les fichiers sp\u00e9ciaux de p\u00e9riph\u00e9riques, ni les sockets, ni les tubes nomm\u00e9s, ni m\u00eame les liens symboliques. Autant dire que pour un syst\u00e8me de type Unix, ce format est particuli\u00e8rement restrictif. Mais justement, c&rsquo;est ce qui lui donne une bonne robustesse en cas de coupure d&rsquo;alimentation pendant une \u00e9criture. Naturellement le fichier en cours de modifications sera incomplet, mais le syst\u00e8me de fichiers lui-m\u00eame ne sera pas endommag\u00e9. Peut-\u00eatre que quelques secteurs seront \u00ab\u00a0perdus\u00a0\u00bb car ils seront consid\u00e9r\u00e9s comme utilis\u00e9s alors qu&rsquo;aucun fichier ne permettra d&rsquo;y acc\u00e9der, mais il n&rsquo;y aura pas d&rsquo;incoh\u00e9rence au niveau de la partition elle-m\u00eame. C&rsquo;est ce que notre exp\u00e9rience quotidienne des cl\u00e9s USB nous apprend&nbsp;: m\u00eame si un utilisateur l&rsquo;arrache de l&rsquo;ordinateur sans l&rsquo;avoir d\u00e9mont\u00e9e proprement, la cl\u00e9 reste utilisable m\u00eame si le fichier en cours d&rsquo;\u00e9criture peut \u00eatre \u00e9ventuellement incomplet.<\/p>\n<p style=\"text-align: justify;\">C&rsquo;est pour cette propri\u00e9t\u00e9 de <em>vfat<\/em> que je le pr\u00e9f\u00e8re \u00e0 d&rsquo;autres syst\u00e8mes comme <em>ext2<\/em> qui peuvent n\u00e9cessiter une \u00e9tape de r\u00e9cup\u00e9ration (une v\u00e9rification avec <code>fsck<\/code>) avant d&rsquo;\u00eatre remont\u00e9s en cas d&rsquo;arr\u00eat intempestif. Bien s\u00fbr pour une partition syst\u00e8me en lecture seule je pr\u00e9f\u00e8re tr\u00e8s largement <em>ext2<\/em> qui offre tout le support des fichiers Unix, mais pour un r\u00e9pertoire de sauvegarde simple (comme <code>\/home\/pi<\/code> ici) le format <em>fat32<\/em> conviendra parfaitement.<\/p>\n<p style=\"text-align: justify;\">J&rsquo;ai cit\u00e9 \u00e0 dessein <em>ext2<\/em> plut\u00f4t que <em>ext3<\/em> ou <em>ext4<\/em> car je refuse habituellement l&rsquo;usage d&rsquo;un journal lorsque le p\u00e9riph\u00e9rique de support est une m\u00e9moire flash. Avec la journalisation propos\u00e9e par <em>ext3<\/em> et <em>ext4<\/em> on multiplie par trois le nombre d&rsquo;\u00e9critures en cas de modification d&rsquo;un fichier. Ce qui divise donc par trois la dur\u00e9e de vie de la m\u00e9moire flash&#8230; Ceci n&rsquo;a pas d&rsquo;influence lorsque le syst\u00e8me de fichiers est en lecture seule comme notre partition principale.<\/p>\n<p style=\"text-align: justify;\">La partition est pr\u00eate, il faudra la monter automatiquement au d\u00e9marrage, je l&rsquo;ajoute donc dans <code>\/etc\/fstab<\/code> avec des options <code>uid<\/code> et <code>gid<\/code> qui fixent l&rsquo;appartenance par d\u00e9faut des fichiers qu&rsquo;elle contient&nbsp;:<\/p>\n<pre># <strong>rw<\/strong>\n# <strong>nano \/etc\/fstab<\/strong>\n\nproc            \/proc           proc    defaults                0    0\n\/dev\/mmcblk0p1  \/boot           vfat    defaults                0    2\n\/dev\/mmcblk0p2  \/               ext4    defaults,ro,noatime     0    1\n\/dev\/mmcblk0p3  \/home\/pi        vfat    defaults,uid=pi,gid=pi  0    1\n\n# <strong>reboot<\/strong>\n[...]\nRaspbian GNU\/Linux 8 raspberrypi ttyAMA0\n\nraspberrypi login: <strong>pi<\/strong>\nPassword: (<strong>raspberry<\/strong>)\n[..]\npi@raspberrypi:~$ <strong>ls<\/strong>\npi@raspberrypi:~$ <strong>echo hello &gt; test<\/strong>\npi@raspberrypi:~$ <strong>ls<\/strong>\ntest\npi@raspberrypi:~$ <strong>cat test<\/strong>\nhello\npi@raspberrypi:~$<\/pre>\n<p style=\"text-align: justify;\">Nous avons bien r\u00e9ussi \u00e0 cr\u00e9er un fichier sur la partition mont\u00e9e sur le r\u00e9pertoire <code>\/home\/pi<\/code>.<\/p>\n<p style=\"text-align: justify;\">J&rsquo;aimerais \u00e9galement augmenter la taille de la partition principale au maximum afin qu&rsquo;elle remplisse tout l&rsquo;espace restant de la carte SD pour pouvoir ajouter \u00e9ventuellement d&rsquo;autres applications. C&rsquo;est ce que fait habituellement l&rsquo;utilitaire <code>raspi-config<\/code> de la distribution Raspbian. Malheureusement il ne peut pas fonctionner ici car il n&rsquo;accepte que de redimensionner la derni\u00e8re partition de la liste, ce qui n&rsquo;est pas notre cas.<\/p>\n<p style=\"text-align: justify;\">Commen\u00e7ons donc par agrandir avec <code>fdisk<\/code> la partition sans toucher au syst\u00e8me de fichiers. Pour cela, il faut la d\u00e9truire et la reconstruire avec le m\u00eame secteur de d\u00e9part et une longueur plus grande.<\/p>\n<pre>pi@raspberrypi:~$ <strong>sudo fdisk \/dev\/mmcblk0 <\/strong>\n[...]\nCommand (m for help): <strong>p<\/strong>\nDisk \/dev\/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical\/physical): 512 bytes \/ 512 bytes\nI\/O size (minimum\/optimal): 512 bytes \/ 512 bytes\nDisklabel type: dos\nDisk identifier: 0xba2edfb9\n\nDevice         Boot    Start      End  Sectors  Size Id Type\n\/dev\/mmcblk0p1          8192   122879   114688   56M  c W95 FAT32 (LBA)\n\/dev\/mmcblk0p2        122880  8447999  8325120   4G 83 Linux\n\/dev\/mmcblk0p3      11329536 15523839  4194304    2G 83 Linux\n\nCommand (m for help): <strong>d<\/strong>\nPartition number (1-3, default 3): <strong>2<\/strong>\n\nPartition 2 has been deleted.\n\nCommand (m for help): <strong>n<\/strong>\nPartition type\n   p   primary (2 primary, 0 extended, 2 free)\n   e   extended (container for logical partitions)\nSelect (default p): <strong>p<\/strong>\nPartition number (2,4, default 2): <strong>2<\/strong>\nFirst sector (2048-15523839, default 2048): <strong>122880<\/strong>\nLast sector, +sectors or +size{K,M,G,T,P} (122880-11329535, default 11329535): <strong>(<em>Entr\u00e9e<\/em>)<\/strong>\n\nCreated a new partition 2 of type 'Linux' and of size 5.4 GiB.\n\nCommand (m for help): <strong>p<\/strong>\nDisk \/dev\/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical\/physical): 512 bytes \/ 512 bytes\nI\/O size (minimum\/optimal): 512 bytes \/ 512 bytes\nDisklabel type: dos\nDisk identifier: 0xba2edfb9\n\nDevice         Boot    Start      End  Sectors  Size Id Type\n\/dev\/mmcblk0p1          8192   122879   114688   56M  c W95 FAT32 (LBA)\n\/dev\/mmcblk0p2        122880 11329535 11206656  5.4G 83 Linux\n\/dev\/mmcblk0p3      11329536 15523839  4194304    2G 83 Linux\n\nCommand (m for help): <strong>w<\/strong>\nThe partition table has been altered.\nCalling ioctl() to re-read partition table.\nRe-reading the partition table failed.: Device or resource busy\n\nThe kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8).\n# <strong>reboot<\/strong><\/pre>\n<p style=\"text-align: justify;\">Apr\u00e8s red\u00e9marrage nous pouvons redimensionner le syst\u00e8me de fichiers sans perdre son contenu<\/p>\n<pre>pi@raspberrypi:~$ <strong>sudo rw<\/strong>\npi@raspberrypi:~$ <strong>sudo resize2fs \/dev\/mmcblk0p2<\/strong>\npi@raspberrypi:~$ <strong>sudo reboot<\/strong>\n[...]\npi@raspberrypi:~$ <strong>df<\/strong>\nFilesystem     1K-blocks    Used Available Use% Mounted on\n\/dev\/root        5449836 3121868   2047096  61% \/\ndevtmpfs          218240       0    218240   0% \/dev\ntmpfs             222512       0    222512   0% \/dev\/shm\ntmpfs             222512    4784    217728   3% \/run\ntmpfs               5120       4      5116   1% \/run\/lock\ntmpfs             222512       0    222512   0% \/sys\/fs\/cgroup\n\/dev\/mmcblk0p1     57288   24256     33032  43% \/boot\n\/dev\/mmcblk0p3   2093048 1010248   1082800  49% \/home\/pi<\/pre>\n<h1>Recompilation du noyau<\/h1>\n<p style=\"text-align: justify;\">Une derni\u00e8re phase de personnalisation consiste \u00e0 recompiler notre noyau. Pourquoi cela&nbsp;? Tout d&rsquo;abord pour le plaisir de voir notre syst\u00e8me fonctionner sur un kernel que nous pouvons configurer et ajuster \u00e0 notre guise. Ensuite pour disposer de tout l&rsquo;environnement n\u00e9cessaire (fichiers d&rsquo;en-t\u00eate, Makefiles, et fichiers de configuration) n\u00e9cessaires \u00e0 la compilation de modules suppl\u00e9mentaires personnels.<\/p>\n<p style=\"text-align: justify;\">Cette compilation est facile \u00e0 r\u00e9aliser, elle n\u00e9cessite surtout un temps de traitement assez long (deux bonnes heures avec un Raspberry Pi 2, et huit environ avec le mod\u00e8le 1).<\/p>\n<p style=\"text-align: justify;\">Installons les packages n\u00e9cessaires non pr\u00e9sents dans la distribution de base&nbsp;:<\/p>\n<pre>pi@raspberrypi:~$ <strong>sudo rw<\/strong>\npi@raspberrypi:~$ <strong>sudo apt-get install -y bc libncurses5-dev<\/strong><\/pre>\n<p style=\"text-align: justify;\">Ensuite r\u00e9cup\u00e9rons les sources du noyau adapt\u00e9es pour le Raspberry Pi&nbsp;:<\/p>\n<pre>pi@raspberrypi:~$ <strong>git clone https:\/\/github.com\/raspberrypi\/linux rpi-linux<\/strong>\nremote: Counting objects: 4521622, done.\nremote: Compressing objects: 100% (4139\/4139), done.\nremote: Total 4521622 (delta 3292), reused 400 (delta 400), pack-reused 4517078\nR\u00e9ception d'objets: 100% (4521622\/4521622), 1.26 GiB | 1.80 MiB\/s, done.\nR\u00e9solution des deltas: 100% (3735624\/3735624), done.\nV\u00e9rification de la connectivit\u00e9... fait.\nChecking out files: 100% (49945\/49945), done.<\/pre>\n<p style=\"text-align: justify;\">Nous allons compiler un noyau 4.1&nbsp;:<\/p>\n<pre>pi@raspberrypi:~$ <strong>cd rpi-linux<\/strong>\npi@raspberrypi:~\/rpi-linux$ <strong>git checkout rpi-4.1.y<\/strong><\/pre>\n<p style=\"text-align: justify;\">Voyons les configurations existantes pour notre syst\u00e8me&nbsp;:<\/p>\n<pre>pi@raspberrypi:~\/rpi-linux$ <strong>make help<\/strong>\n  [..]\n  bcm2709_defconfig        - Build for bcm2709\n  bcm2835_defconfig        - Build for bcm2835\n  bcm_defconfig            - Build for bcm\n  bcmrpi_defconfig         - Build for bcmrpi\n  bockw_defconfig          - Build for bockw\n  cerfcube_defconfig       - Build for cerfcube\n  clps711x_defconfig       - Build for clps711x\n  [..]<\/pre>\n<p style=\"text-align: justify;\">Celle qui nous int\u00e9resse pour le Raspberry Pi mod\u00e8le 1 (B, A B+) est <code>bcmrpi<\/code> (Broadcom Raspberry Pi).<\/p>\n<pre>pi@raspberrypi:~\/rpi-linux$ <strong>make bcmrpi_defconfig<\/strong><\/pre>\n<p style=\"text-align: justify;\">Pour un Raspberry Pi mod\u00e8le 2, on fera&nbsp;:<\/p>\n<pre>pi@raspberrypi:~\/rpi-linux$ <strong>make bcm2709_defconfig<\/strong><\/pre>\n<p style=\"text-align: justify;\">Nous partons de cette configuration mais pouvons la modifier quelque peu&nbsp;:<\/p>\n<pre>pi@raspberrypi:~\/rpi-linux$ <strong>make menuconfig<\/strong><\/pre>\n<p style=\"text-align: justify;\">Je lance la compilation avec deux jobs en parall\u00e8le sur Raspberry Pi mod\u00e8le 1 B, on peut en lancer environ 8 en parall\u00e8le sur un mod\u00e8le 2.<\/p>\n<pre>pi@raspberrypi:~\/rpi-linux$ <strong>make -j 2<\/strong><\/pre>\n<p style=\"text-align: justify;\">Huit heures plus tard environ sur un mod\u00e8le 1 (ou 1h30 sur un mod\u00e8le 2) j&rsquo;installe le nouveau noyau et ses modules&nbsp;:<\/p>\n<pre>pi@raspberrypi:~\/rpi-linux$ <strong>sudo make modules_install<\/strong>\npi@raspberrypi:~\/rpi-linux$ <strong>sudo  cp  \/boot\/kernel.img   \/boot\/kernel.img.prev<\/strong>\npi@raspberrypi:~\/rpi-linux$ <strong>sudo  cp  \/boot\/kernel7.img  \/boot\/kernel7.img.prev<\/strong>\npi@raspberrypi:~\/rpi-linux$ <strong>sudo  cp  arch\/arm\/boot\/zImage  \/boot\/kernel.img<\/strong>\npi@raspberrypi:~\/rpi-linux$ <strong>sudo  cp  arch\/arm\/boot\/zImage  \/boot\/kernel7.img<\/strong>\npi@raspberrypi:~\/rpi-linux$ <strong>sudo  reboot<\/strong><\/pre>\n<p style=\"text-align: justify;\">Notez que le <em>bootloader<\/em> charge l&rsquo;image <code>kernel.img<\/code> sur les Raspberry Pi 1 et <code>kernel7.img<\/code> sur les Raspberry Pi 2. Nous avons sauvegard\u00e9 les images pr\u00e9c\u00e9dentes au cas o\u00f9 le nouveau noyau ne fonctionne pas&#8230; Apr\u00e8s le red\u00e9marrage nous pouvons v\u00e9rifier notre version&nbsp;:<\/p>\n<pre>pi@raspberrypi:~$ <strong>uname -a<\/strong>\nLinux raspberrypi 4.1.10-cpb #1 PREEMPT Mon Oct 5 10:58:11 UTC 2015 armv6l GNU\/Linux<\/pre>\n<h1>Conclusion<\/h1>\n<p style=\"text-align: justify;\">Nous avons pris ainsi possession d&rsquo;une distribution Raspbian standard et \u00e0 travers quelques modifications (qui ne changent pas la compatibilit\u00e9 pour les mises \u00e0 jour) am\u00e9lior\u00e9 sa r\u00e9silience en cas de coupure d&rsquo;alimentation, prot\u00e9g\u00e9 son syst\u00e8me de fichiers principal contre les modifications involontaires, \u00e9vit\u00e9 l&rsquo;usure pr\u00e9matur\u00e9e due au swap et conserv\u00e9 une partition sp\u00e9cifique pour l&rsquo;utilisateur.<\/p>\n<p style=\"text-align: justify;\">Je pense que ces modifications sont particuli\u00e8rement utiles si l&rsquo;on souhaite utiliser le Raspberry Pi dans un contexte de syst\u00e8me embarqu\u00e9 plut\u00f4t qu&rsquo;en <em>desktop<\/em> classique.<\/p>\n<p style=\"text-align: center;\">Toutes les remarques, corrections, critiques sont les bienvenues&nbsp;!<\/p>","protected":false},"excerpt":{"rendered":"<p>Depuis quelques jours une nouvelle distribution Raspbian est disponible pour le Raspberry Pi&nbsp;: la version Jessie. Il s&rsquo;agit de l&rsquo;adaptation de la distribution Debian 8 sortie au printemps. L&rsquo;avantage de Debian est de disposer ais&eacute;ment d&rsquo;un tr&egrave;s large &eacute;ventail d&rsquo;applications, utilitaires, biblioth&egrave;ques pr&eacute;-configur&eacute;s et faciles &agrave; installer. En outre il s&rsquo;agit en quelque sorte de [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,11],"tags":[],"class_list":["post-4355","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4355","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=4355"}],"version-history":[{"count":44,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4355\/revisions"}],"predecessor-version":[{"id":4442,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/4355\/revisions\/4442"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=4355"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=4355"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=4355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}