tag:blogger.com,1999:blog-41265644429979215062024-02-21T14:25:49.417+01:00Alex's BlogUnknownnoreply@blogger.comBlogger16125tag:blogger.com,1999:blog-4126564442997921506.post-87582714606375897702016-02-18T19:29:00.000+01:002016-03-02T21:21:51.120+01:00libvirt QEMU : resize en live d'une partition (guest) basé sur un LV (host)Pouet,<br />
<br />
sur mon super NAS maison (un HP Proliant Microserver Gen8), j'ai un système principal à base de CentOS qui me sert d'hyperviseur (libvirt+QEMU), et j'ai des VM dont une sous OpenMediaVault (OMV) qui sert de NAS (fournit une GUI pour les partages, toussa). Sur mes 3 disques, les 2 gros servent au NAS (l'autre est en mode miroir pour un espace sécurisé), j'utilise le génial LVM pour partitionner les disques (et en réalité, des partitions aussi, car plusieurs VG).<br />
<br />
Digression : je n'ai cependant pas profité de la fonctionnalité qui permet d'agréger des disques, c'est volontaire : lorsque les disques sont agrégés, c'est plus simple à l'usage car 1 seul FS, mais en cas de panne d'un des disques .. c'est effectivement tout cet unique FS qui est mort (et avec les bouts de fichiers probablement répartis partout sur les 2 disques, bonne chance pour une éventuelle récupération). J'ai donc 1 FS par disque, que OMV me permet d’agréger à l'aide de AUFS pour n'afficher qu'un FS à l'usage :).<br />
<br />
Pour la VM OMV, je garde de l'espace dans le VG au cas où, et il m'arrive d'avoir besoin d'allouer de cet espace à OMV, seulement il faut agrandir le LV, puis relancer la VM, ce que je n'ai pas toujours envie de faire ; ça serait quand même plus cool de pouvoir le faire en live, non ? Surtout que QEMU permet ça lorsque le mode virtio est utilisé :).<br />
<br />
Bref, assez de blabla, des commandes.<br />
<br />
Agrandissement du LV sur l'host :<br />
<pre><code>
[root@equuleus ~]# pvs -o pv_name,vg_name,pv_fmt,pv_attr,pv_size,pv_free,lv_name,seg_start_pe,seg_size_pe,seg_start,seg_size,segtype,seg_pe_ranges
PV VG Fmt Attr PSize PFree LV Start SSize Start SSize Type PE Ranges
/dev/sda3 sys lvm2 a-- 125.00g 72.00g root 0 2500 0 9.77g linear /dev/sda3:0-2499
/dev/sda3 sys lvm2 a-- 125.00g 72.00g home 0 3750 0 14.65g linear /dev/sda3:2500-6249
/dev/sda3 sys lvm2 a-- 125.00g 72.00g swap 0 2018 0 7.88g linear /dev/sda3:6250-8267
/dev/sda3 sys lvm2 a-- 125.00g 72.00g root_inst 0 2560 0 10.00g linear /dev/sda3:8268-10827
/dev/sda3 sys lvm2 a-- 125.00g 72.00g root_sinst7 0 2510 0 9.80g linear /dev/sda3:10828-13337
/dev/sda3 sys lvm2 a-- 125.00g 72.00g root 2500 60 9.77g 240.00m linear /dev/sda3:13338-13397
/dev/sda3 sys lvm2 a-- 125.00g 72.00g root_sinst7 2510 50 9.80g 200.00m linear /dev/sda3:13398-13447
/dev/sda3 sys lvm2 a-- 125.00g 72.00g swap 2018 30 7.88g 120.00m linear /dev/sda3:13448-13477
/dev/sda3 sys lvm2 a-- 125.00g 72.00g home 3750 90 14.65g 360.00m linear /dev/sda3:13478-13567
/dev/sda3 sys lvm2 a-- 125.00g 72.00g 0 18431 0 72.00g free
/dev/sda4 vm lvm2 a-- 125.00g 69.00g iso 0 2560 0 10.00g linear /dev/sda4:0-2559
/dev/sda4 vm lvm2 a-- 125.00g 69.00g images 0 3840 0 15.00g linear /dev/sda4:2560-6399
/dev/sda4 vm lvm2 a-- 125.00g 69.00g omv 0 2560 0 10.00g linear /dev/sda4:6400-8959
/dev/sda4 vm lvm2 a-- 125.00g 69.00g vm2 0 2560 0 10.00g linear /dev/sda4:8960-11519
/dev/sda4 vm lvm2 a-- 125.00g 69.00g t1 0 256 0 1.00g linear /dev/sda4:11520-11775
/dev/sda4 vm lvm2 a-- 125.00g 69.00g vm2_fresh 0 2560 0 10.00g linear /dev/sda4:11776-14335
/dev/sda4 vm lvm2 a-- 125.00g 69.00g 0 17663 0 69.00g free
/dev/sda5 data lvm2 a-- 2.48t 100.00g [secured_rmeta_2] 0 1 0 4.00m linear /dev/sda5:0-0
/dev/sda5 data lvm2 a-- 2.48t 100.00g [secured_rimage_2] 0 230400 0 900.00g linear /dev/sda5:1-230400
/dev/sda5 data lvm2 a-- 2.48t 100.00g 0 25600 0 100.00g free
/dev/sda5 data lvm2 a-- 2.48t 100.00g nas-1 0 395270 0 1.51t linear /dev/sda5:256001-651270
/dev/sdb2 data lvm2 a-- 931.51g 21.50g [secured_rmeta_0] 0 1 0 4.00m linear /dev/sdb2:0-0
/dev/sdb2 data lvm2 a-- 931.51g 21.50g [secured_rimage_0] 0 230400 0 900.00g linear /dev/sdb2:1-230400
/dev/sdb2 data lvm2 a-- 931.51g 21.50g nas-db 0 2560 0 10.00g linear /dev/sdb2:230401-232960
/dev/sdb2 data lvm2 a-- 931.51g 21.50g 0 5505 0 21.50g free
/dev/sdc5 data lvm2 a-- 5.21t 874.00g [secured_rmeta_1] 0 1 0 4.00m linear /dev/sdc5:0-0
/dev/sdc5 data lvm2 a-- 5.21t 874.00g [secured_rimage_1] 0 230400 0 900.00g linear /dev/sdc5:1-230400
/dev/sdc5 data lvm2 a-- 5.21t 874.00g 0 25600 0 100.00g free
/dev/sdc5 data lvm2 a-- 5.21t 874.00g nas-2 0 911361 0 3.48t linear /dev/sdc5:256001-1167361
/dev/sdc5 data lvm2 a-- 5.21t 874.00g 0 198144 0 774.00g free
[root@equuleus ~]# lvextend data/nas-2 -L +174G /dev/sdc5
Size of logical volume data/nas-2 changed from 3.48 TiB (911361 extents) to 3.65 TiB (955905 extents).
Logical volume nas-2 successfully resized.
[root@equuleus ~]# pvs -o pv_name,vg_name,pv_fmt,pv_attr,pv_size,pv_free,lv_name,seg_start_pe,seg_size_pe,seg_start,seg_size,segtype,seg_pe_ranges
PV VG Fmt Attr PSize PFree LV Start SSize Start SSize Type PE Ranges
[..]
/dev/sdc5 data lvm2 a-- 5.21t 700.00g [secured_rmeta_1] 0 1 0 4.00m linear /dev/sdc5:0-0
/dev/sdc5 data lvm2 a-- 5.21t 700.00g [secured_rimage_1] 0 230400 0 900.00g linear /dev/sdc5:1-230400
/dev/sdc5 data lvm2 a-- 5.21t 700.00g 0 25600 0 100.00g free
/dev/sdc5 data lvm2 a-- 5.21t 700.00g nas-2 0 955905 0 3.65t linear /dev/sdc5:256001-1211905
/dev/sdc5 data lvm2 a-- 5.21t 700.00g 0 153600 0 600.00g free
</code></pre>
<br />
On informe le driver de la VM que le disque à changé de taille (attention aux unités, kb != kib) :<br />
<pre><code>
[root@equuleus ~]# virsh help blockresize
NAME
blockresize - Resize block device of domain.
SYNOPSIS
blockresize <domain> <path> <size>
DESCRIPTION
Resize block device of domain.
OPTIONS
[--domain] <string> domain name, id or uuid
[--path] <string> Fully-qualified path of block device
[--size] <number> New size of the block device, as scaled integer (default KiB)
/!\ units ! (kb != kib) :
[root@equuleus ~]# man lvs
[root@equuleus ~]# lvs data/nas-2 --units m
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
nas-2 data -wi-ao---- 3823620.00m
[root@equuleus ~]# virsh blockresize OMV /dev/data/nas-2 3823620m
Block device '/dev/data/nas-2' is resized
</number></string></string></size></path></domain></code></pre>
<br />
<div>
On check le syslog du guest : </div>
<pre><code>
root@omv:~# dmesg
[3689800.752788] virtio_blk virtio7: new size: 7830773760 512-byte logical blocks (4.00 TB/3.64 TiB)
[3689800.752795] vde: detected capacity change from 3822525087744 to 4009356165120
[3689800.762729] VFS: busy inodes on changed media or resized disk vde
</code></pre>
<br />
<br />
<div>
On lance le resize du FS (qui peut mettre plusieurs minutes, prévoir un screen/tmux pour cette étape serait pas mal) : </div>
<pre><code>
root@omv:~# resize2fs -p /dev/vde
resize2fs 1.42.5 (29-Jul-2012)
Filesystem at /dev/vde is mounted on /media/211d3e2f-680f-4211-b597-203dcae5c756; on-line resizing required
old_desc_blocks = 446, new_desc_blocks = 467
Performing an on-line resize of /dev/vde to 978846720 (4k) blocks.
The filesystem on /dev/vde is now 978846720 blocks long.
</code></pre>
<div>
<br /></div>
<div>
Et voila :)<br />
<br />
Comme toujours, des sources & des liens :<br />
<br />
<ul>
<li><a href="https://serverfault.com/questions/324281/how-do-you-increase-a-kvm-guests-disk-space">https://serverfault.com/questions/324281/how-do-you-increase-a-kvm-guests-disk-space</a> (méthode un peu mano)</li>
<li><a href="https://bugzilla.redhat.com/show_bug.cgi?id=648594">https://bugzilla.redhat.com/show_bug.cgi?id=648594</a></li>
<li><a href="https://website-humblec.rhcloud.com/is-it-possible-to-do-online-resizing-of-guest-block-devices-or-without-shutdown/">https://website-humblec.rhcloud.com/is-it-possible-to-do-online-resizing-of-guest-block-devices-or-without-shutdown/</a> (!)</li>
</ul>
<br />
<br />
Au sujet de qmp (malheureusement pas encore complètement implémenté sous la forme actuelle dans la version CentOS de qemu il semblerait ; qmp_capabilities n'est pas reconnu par exemple) :<br />
<br />
<ul>
<li><a href="http://kashyapc.com/2013/03/31/multiple-ways-to-access-qemu-machine-protocol-qmp/">http://kashyapc.com/2013/03/31/multiple-ways-to-access-qemu-machine-protocol-qmp/</a></li>
<li><a href="http://dachary.org/?p=1474">http://dachary.org/?p=1474</a></li>
<li><a href="http://wiki.qemu.org/QMP">http://wiki.qemu.org/QMP</a></li>
<li><a href="https://lists.nongnu.org/archive/html/qemu-devel/2011-01/msg02376.html">https://lists.nongnu.org/archive/html/qemu-devel/2011-01/msg02376.html</a></li>
</ul>
</div>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4126564442997921506.post-91878815614117290042014-03-10T19:11:00.001+01:002014-03-10T20:10:00.072+01:00Format de sous-titres ASS, édition et capacitésC'est en voulant regarder le film d'animation japonais <a href="http://www.allocine.fr/film/fichefilm_gen_cfilm=224322.html">The Garden of Words</a> (<span style="background-color: white; font-family: sans-serif; font-size: 12.800000190734863px; line-height: 19.200000762939453px;">言の葉の庭</span>) que j'ai découvert quelques capacités du <a href="http://matroska.org/technical/specs/subtitles/ssa.html">format de sous-titres SSA/ASS</a>.<br />
En fait, celui-ci n'existe qu'en VO ou VOSTEN, mais même si il est possible de trouver des sous-titres en français (pour ne pas perdre de temps à la lecture, ratant de ce fait les images magnifiques), on perd alors le joli style (enfin la police quoi) donné aux écritures.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigHTwy1yGBRrlDwe2hQbuC2wzOASihiIXpd8jyGk6SJcrLA9gxxmEg6XF6DTkw9lpvZG16y4kp5_tF371oElNQgI5YvNrEbycnpYoB8pTOvIRpskjFEtDw8CA1PXju3UvxIPQbbiJpV8g/s1600/GOW+-+Letter.png" height="185" width="640" /></div>
<br />
Je suis donc parti dans l'adaptation de mon "pauvre" sous-titrage français au format SRT :<br />
<pre>1
00:00:38,706 --> 00:00:42,084
<i>Je ne connaissais pas ces choses-là
il y a encore deux mois,</i>
2
00:00:42,334 --> 00:00:43,586
<i>avant d'entrer au lycée.</i>
</pre>
<br />
vers le <a href="http://matroska.org/technical/specs/subtitles/ssa.html">format ASS</a> qui permet d'utiliser des polices :<br />
<br />
<pre>[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: garden,LTFinnegan Medium,72,&H00FFF7E7,&H000000FF,&H00042419,&H00475244,0,0,0,0,100,100,0,0,1,3.5,2,2,15,15,65,1
[...]
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:38.70,0:00:42.08,garden,Unknown,0,0,0,,{\i1}Je ne connaissais pas ces choses-là\Nil y a encore deux mois,{\i0}
Dialogue: 0,0:00:42.33,0:00:43.58,garden,Unknown,0,0,0,,{\i1}avant d'entrer au lycée.{\i0}
</pre>
<br />
<br />
D'abord, les sous-titres et les polices utilisées sont inclues dans le MKV.<br />
<br />
<pre>> mkvmerge -i "The_Garden_of_Words.mkv"
Fichier 'The_Garden_of_Words.mkv' : conteneur : Matroska
Piste numéro 0 : video (V_MPEG4/ISO/AVC)
Piste numéro 1 : audio (A_FLAC)
Piste numéro 2 : subtitles (S_TEXT/ASS)
Pièce jointe numéro 1 : type 'application/x-truetype-font', taille 4654020 octets, nom de fichier 'A-OTF-Jun501Pro-Bold.
otf'
Pièce jointe numéro 2 : type 'application/x-truetype-font', taille 4796008 octets, nom de fichier 'G-OTF-GJun501Pro-Bold
.otf'
Pièce jointe numéro 3 : type 'application/x-truetype-font', taille 42980 octets, nom de fichier 'ITCGaramondStd-Bk.otf'
Pièce jointe numéro 4 : type 'application/x-truetype-font', taille 45940 octets, nom de fichier 'LegacySerifStd-Book.otf
'
Pièce jointe numéro 5 : type 'application/x-truetype-font', taille 62536 octets, nom de fichier 'LT.ttf'
Pièce jointe numéro 6 : type 'application/x-truetype-font', taille 62480 octets, nom de fichier 'LT_3italic.ttf'
Pièce jointe numéro 7 : type 'application/x-truetype-font', taille 58700 octets, nom de fichier 'PPETRIAL.otf'
Pièce jointe numéro 8 : type 'application/x-truetype-font', taille 109200 octets, nom de fichier 'PPETRIAL.ttf'
Pièce jointe numéro 9 : type 'application/x-truetype-font', taille 172732 octets, nom de fichier 'segoepr.ttf'
Pièce jointe numéro 10 : type 'application/x-truetype-font', taille 35752 octets, nom de fichier 'TheGreatEscape.ttf'
Pièce jointe numéro 11 : type 'application/x-truetype-font', taille 93152 octets, nom de fichier 'Thin Pencil Handwritin
g.otf'
Pièce jointe numéro 12 : type 'application/x-truetype-font', taille 3419056 octets, nom de fichier 'epsonthora.ttf'
</pre>
<br />
Il est possible de tout extraire, mais seul le fichier de sous-titres ASS est utile :<br />
<br />
<pre>> mkvextract tracks "The_Garden_of_Words.mkv" 2:en.ass
Extraction de la piste 2 avec le codec 'S_TEXT/ASS' dans le fichier 'en.ass'. Format de conteneur : SSA/ASS text subtitles
Progression : 100%
</pre>
<br />
Ensuite commence le travail. J'ai choisi de conserver les temps du sous-titrage français, principalement parce que j'ai pu remarquer qu'a plusieurs endroits la découpe des dialogues est faite différemment.<br />
Une dizaine de regex dans Notepad++, quelques corrections de bugs (nombre de décimales), on rajoute les en-têtes du ASS d'origine et hop : le SRT devient un ASS, le principal est fait.<br />
<br />
Mais le fichier ASS d'origine contient plus que des dialogues, j'ai pu m'en rendre compte en comparant l'original à mon ASS modifié dans WinMerge. Une des grosse différence sert en fait .. à générer un texte animé lors du titre principal !<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqdc8nriBr9UUNWVX1pcawD0MQZn1LsLRD-q6tRaguGxc5qza7rjs9-eFcO6vsxYQvIvNW9HmidbGcpI7ucz4_Iok7ZBHbVQQB_3eMcLgNI1QTcLJekMqpHwxjDaNWh6S5tA-JnFBDLKo/s1600/GOW+-+Title.png" height="185" width="640" /></div>
<br />
Pour le reste, il s'agit en fait de texte incrusté, et si on ne le sait pas, il est facile de passer à côté.<br />
<br />
Quelques exemples :<br />
<br />
<ul>
<li>"June"<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFysLLLHA9achELk8hU4D-iwQcXuoaQsf6bYAdrLWqpIOmRekV9bTF-BdqVC7qk4B1Eoj6rkuApE-tuwLWHjDO48Gr7HtHWKUu48lOQ-JPDYmuAyemQ59EiJpHWRV_9okNw9H9XIhK2Ow/s1600/GOW+-+June.png" height="184" style="text-align: center;" width="640" /></li>
</ul>
<br />
<br />
<ul>
<li>"<a href="http://en.wikipedia.org/wiki/Tanka">Tanka</a>"<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1f4KKsfo-o8TK-PWyOX56LetPyKLtpZfbhEZCnrROs7TH72dut4E4D-r4McLl9B-cC9SIzrordb_2xWXEBte9PBwir9BjVBnCGPubF2oCq8Uz1_atAg5eL6qsreqpxq0AiahgNFa9x6I/s1600/GOW+-+Tanka.png" height="184" style="text-align: center;" width="640" /></li>
</ul>
<br />
Et d'autres sont vraiment cachés :<br />
<br />
<ul>
<li>l'examen<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEha2ev7ZkBhW5CoTxu1BTk52OhtbROg7LdEAkH1sRrB8kEO9QC_xkwDn4cj7UfJzwWrhhPi07TEvotv85Fe_DYjGmG7qOXZEDixu1v-1dXyKzT33Ui3alJu4zALRsvmqi_IISZYqgjaxKo/s1600/GOW+-+Exam.png" height="184" style="text-align: center;" width="640" /></li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li>les noms sur le portable ...<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOmuoeNCduzWWB9EATSSoBVKI4gGlUNQOylunshdLXbl_kyVJe8VMQFp0OoctwBdUX5qqBP-jv9GSmeUrWrjePeZjc5Y6pB-vvDLQsyQA_T-_Ab067hlRst3fWc4FSZ_5hxpz-050TyIs/s1600/GOW+-+Mobile.png" height="181" style="text-align: center;" width="640" /></li>
</ul>
Il a donc fallu traduire ces textes aussi, cette fois manuellement, et ça aura aussi permis de supprimer quelques traductions en trop comme "Juin" qui étaient présentes dans le SRT.<br />
<br />
Le plus gros travail aura été la chanson de fin, puisqu'il a fallu faire un découpage correct des textes pour remplacer la traduction existante.<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlM4T7MJE32ENxsTq-3ujO43_jpOUdLTi1LHNKpHW5JAnNbD_8CInf81Z3GcuF6Z8QGOY2r-FEno4jC-7KX_gGb3klR7E2xG2wPzDt-WLaGozq9NwKRdHH3mU2P2dGyICD_jk-fT_NwLg/s1600/GOW+-+Song.png" height="181" width="640" /></div>
<br />
Enfin, je me suis essayé à incruster une des traduction du SRT dans l'image, comme le fait le ASS, voila la résultat :<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAPmjuXaPX1CRLpFqUl3MRNZ_VuBlcXYRKuwzthyphenhyphener11ZaNfnq_XjtJ6iCnut1TRL0rir04_Ux-CNXxF-yiwyP05LXovJ9ktJR8Odj-kmSjHkLvdIK7Mjzsm4uYnWGIjzo3DT8lBbFRlk/s1600/GOW+-+Alcool.png" height="226" width="400" /></div>
<br />
En bref, j'ai été impressionné de voir les capacités des formats actuels de sous-titrage, adapter une traduction aura été un exercice sympa.<br />
<br />
「鳴る神の 少し響みて さし曇り 雨も降らぬか 君を留めむ」<br />
<br />
La traduction au format ASS : <a href="https://drive.google.com/file/d/0B63FLnZuVDrvVGcweHlEakhhNlE">https://drive.google.com/file/d/0B63FLnZuVDrvVGcweHlEakhhNlE</a><br />
<br />
<b>Annexes : </b><br />
<a href="http://matroska.org/technical/specs/subtitles/ssa.html">http://matroska.org/technical/specs/subtitles/ssa.html</a><br />
<a href="http://pireze.org/2013/anime-review-makoto-shinkais-the-garden-of-words-%E8%A8%80%E3%81%AE%E8%91%89%E3%81%AE%E5%BA%AD-kotonoha-no-niwa/">http://pireze.org/2013/anime-review-makoto-shinkais-the-garden-of-words-%E8%A8%80%E3%81%AE%E8%91%89%E3%81%AE%E5%BA%AD-kotonoha-no-niwa/</a><br />
<a href="http://mlr.inktails.com/2013/07/jp-movie-the-garden-of-words-2013/">http://mlr.inktails.com/2013/07/jp-movie-the-garden-of-words-2013/</a><br />
<a href="http://louvreuse.net/critique/the-garden-of-words.html">http://louvreuse.net/critique/the-garden-of-words.html</a><br />
<a href="http://www.imdb.com/title/tt2591814">http://www.imdb.com/title/tt2591814</a><br />
<a href="http://www.subsynchro.com/2012/the-garden-of-words.html">http://www.subsynchro.com/2012/the-garden-of-words.html</a> ("Byousuku 5 Centimeters" semble sympa à voir aussi)Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-4126564442997921506.post-84335536686308827042014-01-19T19:30:00.001+01:002014-01-19T19:35:02.376+01:00Hacking du module hid-wiimote pour fonctionner avec le Pro Controller U sous RetroPie<h2>
Introduction</h2>
Aujourd'hui, un article qui risque d'être assez long (et très probablement assez mal écrit) pour revenir sur mon activité de ces derniers jours.<br />
<br />
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJMcIhnwrs5PJbwxyE539gTa6Sv_oZ5n_DkNvmh7rrRnVL4Jt_wNpAMKS-aV6snHsgsaCkAhyCVn3t_pP9hYDlHVqjfs9JDjXgq9IxC286UgiBlN9kLv1PnDBz6KYRvERGdVIwV6U1nq4/s1600/IMAG0937.jpg" height="320" style="float: left; margin: 5px;" width="181" /><br />
Avant de commencer, le contexte : la plateforme RaspberryPi est équivalente à un téléphone portable et permet de faire de l'émulation de consoles grâce à des distributions comme <a href="http://blog.petrockblock.com/retropie/">RetroPie</a> (utilisant RetroArch, un des seul émulateur pi basé sur Pico capable de faire tourner certains jeux de Megadrive, comme Sonic Spinball, et EmulsationStation pour proposer une interface de lancement des jeux). Il existe aussi <a href="http://chameleon.enging.com/">Chameleon</a> et <a href="http://pimame.org/">PiMAME</a>, mais malheureusement l'émulateur Megadrive qui y est intégré ne fonctionne pas avec tout les jeux.<br />
<br />
J'ai pu valider cette partie, et tester avec une manette bas de gamme (moyennant quelques configurations à la main pour EmulationStation et RetroArch).<br />
Maintenant il peut être intéressant de pouvoir jouer à 2, et donc connecter 2 manettes, mais :<br />
<ul>
<li>les fils, c'est chiants</li>
<li>la Pi n'aime pas trop se faire tirer du courant, ça la fait planter</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
D'où cette idée : acheter un dongle bluetooth et utiliser des manettes sans fil. J'en ai commandé 2 sur Amazon : </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.amazon.fr/dp/B00C7WNUM4" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzdpMLx3QSs0Mj5vS9QMW-2UiLc4aQq_IyHXJrHGRWpLhSIPSFymvOMUEDuG2bjJ8_BLvzmttJlNbqXl8b7ozV9DX4QNlyBB5Urz2ulU6mRbuOucLlF8e5kwIUWE552bTvl7j4dZRNoz4/s1600/IMAG0978.jpg" height="181" width="320" /></a></div>
<br />
Cette première n'est absolument pas Bluetooth contrairement à ce qu'indique son nom .. Il faut utiliser leur gros dongle .. Amazon va la récupérer.<br />
L'autre manette est celle ci :<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.amazon.fr/gp/product/B00DDPRCXM/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3oBa9tdy11AooLZppJ0vUK_gSh7Y74TqitxxNMuwx2CZMHnphSi8B-iefokKG-1j3J-NuZuWtsSleMKqWnxC_heY7YgRZt1W9s1l55_56M40dRvBD-hs6qBzTCt1wo5Zmay67VtXsxXs/s1600/f3a7_pro_controller_u_for_wii_and_wii_u.jpg" height="228" width="320" /></a></div>
Qui n'est pas une manette WiiU Pro contrairement à ce qu'indique son nom, mais une <a href="http://www.thinkgeek.com/product/f3a7/">Wii Classic Controller Pro</a> (qui fait aussi Wiimote simple).<br />
Elle fonctionne en bluetooth comme les manettes Wii, on peut donc en associer plusieurs sur un <a href="http://www.amazon.fr/gp/product/B00F0CG0N4/">simple dongle bluetooth</a>.<br />
<h2>
Première approche</h2>
Ma première approche a été d'utiliser les tutos disponibles sur internet, tel que :<br />
<ul>
<li><a href="http://blog.petrockblock.com/forums/topic/tutorial-to-get-wiimotes-with-classic-controllers-to-work-with-retropie/">http://blog.petrockblock.com/forums/topic/tutorial-to-get-wiimotes-with-classic-controllers-to-work-with-retropie/</a></li>
<li><a href="https://github.com/petrockblog/RetroPie-Setup/wiki/Wiimotes-with-classic-controllers">https://github.com/petrockblog/RetroPie-Setup/wiki/Wiimotes-with-classic-controllers</a></li>
<li><a href="http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/robot/wiimote/">http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/robot/wiimote/</a></li>
</ul>
<div>
Ils se basent sur <a href="http://abstrakraft.org/cwiid/">cwiid</a> couplé avec <a href="http://abstrakraft.org/cwiid/wiki/wminput">wminput</a> pour gérer les boutons. Seulement .. avec cette manette, ça ne fonctionne pas, il y a des messages d'erreur ("Received unexpected write report") et la partie Classic (il y a un switch sur la manette) fait comme si aucune touche n'était pressée. J'ai tenté de compiler la derniere version de cwiid, qui m'a permit de jouer avec les leds, mais pas plus.</div>
<div>
<br /></div>
<div>
J'ai fait d'autres recherche et suis tombé sur quelques liens : </div>
<div>
<ul>
<li><a href="http://stackoverflow.com/questions/481943/python-with-wiimote-using-pywiiuse-module">http://stackoverflow.com/questions/481943/python-with-wiimote-using-pywiiuse-module</a></li>
<li><a href="https://systemausfall.org/wikis/howto/WiiRemote">https://systemausfall.org/wikis/howto/WiiRemote</a></li>
</ul>
<div>
Il existe donc aussi <a href="https://github.com/rpavlik/wiiuse">wiiuse</a>, utilisable en python avec <a href="https://code.google.com/p/pywiiuse/">pywiiuse</a>.</div>
</div>
<div>
Il a fallu compiler wiiuse (je passe les détails, c'est expliqué), mais je n'ai pas eu beaucoup plus de succès.</div>
<div>
<br /></div>
<div>
J'ai songé à un moment à parser les messages de la manette à la main, en prenant la méthode suitante : <a href="http://smus.com/prototyping-wii-remote-python/">http://smus.com/prototyping-wii-remote-python/</a> mais quand un rapide test montre que la manette balance des 0xFF en continu, c'est qu'il faut lui envoyer les bonnes données avant, et bon .. flemme.</div>
<h2>
L'approche xwiimote / hid-wiimote</h2>
<div>
C'est en faisant des recherche sur la WiiU Pro Controller que j'ai vu qu'il existait une manette pour WiiU, qui n'est donc pas la même, et qu'il existe des logiciels pour l'utiliser (mais la mienne n'est pas celle-ci, même si je l'ai cru à un moment, le nom de la manette prêtant à confusion) : </div>
<div>
<ul>
<li><a href="http://www.destructoid.com/wii-u-pro-controller-can-now-be-used-on-a-pc-mac-245781.phtml">http://www.destructoid.com/wii-u-pro-controller-can-now-be-used-on-a-pc-mac-245781.phtml</a></li>
<li><a href="http://gbatemp.net/threads/wii-u-pro-controller-to-pc-program-release.343159/">http://gbatemp.net/threads/wii-u-pro-controller-to-pc-program-release.343159/</a></li>
</ul>
<div>
Et la un <a href="http://gbatemp.net/threads/wii-u-pro-controller-to-pc-program-release.343159/page-25#post-4835679">message intéressant</a> donne le nom d'un driver sympa, <a href="http://dvdhrm.github.io/xwiimote/">xwiimote</a>.</div>
</div>
<blockquote class="tr_bq">
XWiimote is an open-source linux device driver for Nintendo Wii / Wii U Remotes and compatible devices. It is a relatively new driver that tries to supercede cwiid, wiiuse and others by integrating the driver into existing linux infrastructure. The project consists of an official linux kernel driver, which is part of the kernel since linux-3.1, an extension to bluez, the official linux bluetooth stack, an X11 input driver, some user-space helpers and test applications.</blockquote>
<div>
Surprise donc ! Il existe un <a href="http://dvdhrm.wordpress.com/tag/wii-u-pro-controller/">module kernel</a>, qui se prétend mieux que cwiid et wiiuse, et qui se trouve être présent dans RetroPie (kernel 3.6.11+). Il y a même un super programme qui affiche les touches de la Wiimote et ses extensions en ASCII (xwiishow) !</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGmEPtVzjgEAJxAWtMx1rHKwZwd5wSn2Reheym0_VgctOpKoP4nBdafPY96eVgaW3Pfiv8DSxw-kOLRb2m6SHDEh6rqePJ2ZH1jK9r3mr9W4IIlSkrR__4YlrsZbiLq2u3SeNhBpIwT5g/s1600/Terminal_062.png" height="200" style="margin-left: auto; margin-right: auto;" width="320" /></td></tr>
<tr><td class="tr-caption" style="text-align: center;">(tiré de http://leftbraintinkering.blogspot.fr/2014/01/wii-remote-plus-and-linux.html)</td></tr>
</tbody></table>
<div>
Mais après compilation de xwiishow, malheureusement même constat, le Classic controller ne fonctionne pas :(. Je commence à penser que la manette est défectueuse.</div>
<div>
A noter qu'il faut utiliser hidd pour associer la Wiimote, bluez demandant un PIN.</div>
<div>
<h2>
Hack de hid-wiimote</h2>
</div>
<div>
Ayant jeté un œil aux <a href="https://github.com/raspberrypi/linux/blob/rpi-3.6.y/drivers/hid/hid-wiimote-ext.c">sources du module hid-wiimote</a>, et n'ayant plus rien à perdre (a part renvoyer la manette, mais elle me plait vraiment avec sa forme à la SuperNES), je me lance dans la modification de ce module.<br />
Il faut pour ça pouvoir compiler, sur une Pi contrairement aux petits logiciels d'avant, c'est impensable, il faut donc passer par de la cross-compilation. l'avantage avec la Pi c'est qu'il existe plein de docs/tutos, on trouve donc des instructions pour cela : <a href="http://elinux.org/RPi_Kernel_Compilation">http://elinux.org/RPi_Kernel_Compilation</a>.<br />
Une VM Ubuntu x64, les libs pour exécuter des programmes x86, puis il suffit de suivre les instructions :<br />
<pre><code>
KERNEL_SRC=/home/user/raspbian-kernel/linux-rpi-3.6.y/
CCPREFIX=/home/user/raspbian-kernel/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi-
make mrproper
make ARCH=arm CROSS_COMPILE=${CCPREFIX} oldconfig
make ARCH=arm CROSS_COMPILE=${CCPREFIX}
make ARCH=arm CROSS_COMPILE=${CCPREFIX} modules
</code></pre>
<br />
A noter qu'il faut compiler le kernel (make) avant de compiler les modules (make modules), sinon :<br />
<pre>ERROR: could not insert 'hid_wiimote': Exec format error</pre>
<h3>
Reconnaissance du Classic Controller</h3>
Le principal problème étant que l'extensions Classic n'est pas reconnu, alors qu'a priori présente, je décide de la forcer :<br />
<pre><code> wmem = 0x55;
wiimote_cmd_write(ext->wdata, 0xa400f0, &wmem, sizeof(wmem));
wmem = 0x0;
wiimote_cmd_write(ext->wdata, 0xa400fb, &wmem, sizeof(wmem));
return WIIEXT_CLASSIC;
</code></pre>
Et la, même si rien n'est reconnu ou fonctionnel dans <span style="font-family: Courier New, Courier, monospace;">xwiishow</span>, <span style="font-family: Courier New, Courier, monospace;">evtest</span> affiche bien des boutons en mode Classic !</div>
Mais le stick gauche ne fonctionne pas en vertical et les triggers font 2 actions au lieu d'une.<br />
<h3>
Debug des controles</h3>
Pour voir ce qu'envoi la manette, j'essaye un débogage (comme je peux, le debugging de kernel je connais pas), c'est sale (mais fonctionnel) :<br />
<pre><code>#define BYTETOBINARYPATTERN "%d%d%d%d%d%d%d%d"
#define BYTETOBINARY(byte) \
(byte & 0x80 ? 1 : 0), \
(byte & 0x40 ? 1 : 0), \
(byte & 0x20 ? 1 : 0), \
(byte & 0x10 ? 1 : 0), \
(byte & 0x08 ? 1 : 0), \
(byte & 0x04 ? 1 : 0), \
(byte & 0x02 ? 1 : 0), \
(byte & 0x01 ? 1 : 0)
printk(KERN_INFO "Byte %d "BYTETOBINARYPATTERN"", 0, BYTETOBINARY(payload[0]));
printk(KERN_INFO "Byte %d "BYTETOBINARYPATTERN"", 1, BYTETOBINARY(payload[1]));
printk(KERN_INFO "Byte %d "BYTETOBINARYPATTERN"", 2, BYTETOBINARY(payload[2]));
printk(KERN_INFO "Byte %d "BYTETOBINARYPATTERN"", 3, BYTETOBINARY(payload[3]));
printk(KERN_INFO "Byte %d "BYTETOBINARYPATTERN"", 4, BYTETOBINARY(payload[4]));
printk(KERN_INFO "Byte %d "BYTETOBINARYPATTERN"", 5, BYTETOBINARY(payload[5]));
</code></pre>
Et ça donne pleiiiiin de lignes dans les logs :<br />
<pre><code>Jan 17 17:16:52 raspberrypi kernel: [65820.154165] Byte 1 00100000Byte 2 00010000
Jan 17 17:16:52 raspberrypi kernel: [65820.154198] Byte 3 00000000Byte 4 11111111
Jan 17 17:16:52 raspberrypi kernel: [65820.154221] Byte 5 11111111Byte 0 10100000
Jan 17 17:16:52 raspberrypi kernel: [65820.161071] Byte 1 00100000Byte 2 00010000
Jan 17 17:16:52 raspberrypi kernel: [65820.161100] Byte 3 00000000Byte 4 11111111
Jan 17 17:16:52 raspberrypi kernel: [65820.161121] Byte 5 11111111Byte 0 10100000
</code></pre>
Comme je disais, c'est sale, mais ça fonctionne et permet de repérer doucement les touches, je me suis alors construit une carte :<br />
<pre><code>Byte 0 10100000
^^-------RX(12)
^^^^^^-LX
Byte 1 00100000
^^-------RX(34)
^^^^^^-LY
Byte 2 00010000
^--------RX(5)
^^------TL
^^^^^-RY
Byte 3 00000000
^^^------TL
^^^^^-TR
Byte 4 11111111
^--------RIGHT
^-------DOWN
^------BTL
^-----MINUS
^----HOME
^---PLUS
^--BTR
^-1
Byte 5 11111111
^--------TL2
^-------B = ZL
^------Y
^-----A
^----X = ZR
^---TR2
^--LEFT
^-UP
</code></pre>
<h3>
Corrections</h3>
Il s'avère que cela correspond aux indications dans les sources de hid-wiimote .. C'est donc ailleurs que se situe le problème. Entre temps je tombe sur les sources du module pour le kernel 3.11, qui sont corrigées<br />
<pre><code> lx = payload[0] & 0x3e;
ly = payload[0] & 0x3e;
</code></pre>
lx = ly ? Oui, il y a comme un problème.<br />
Il y a aussi une double négation sur les touches qui fait qu'elle apparaissent comme pressées en permanence, c'est corrigé aussi.<br />
<br />
J'en profite aussi pour modifier les touches du D-Pad pour mapper des <a href="https://github.com/raspberrypi/linux/blob/rpi-3.6.y/include/linux/input.h">boutons</a> au lieu des touches UP/DOWN/LEFT/RIGHT, qui ne sont pas reconnues par <span style="font-family: Courier New, Courier, monospace;">retroarch-joyconfig</span>.<br />
Enfin il y a un dernier bug qui est apparu quand j'ai voulu tester l'utilisation avec 2 wiimotes (voir si les leds sont gérées .. la réponse est non), qui nécessite de supprimer l'intégration du report des informations batterie dans le kernel, sinon il tente de créer 2 fois le même périphérique, et alors :<br />
<pre><code>[178790.876742] ------------[ cut here ]------------
[178790.876794] WARNING: at fs/sysfs/dir.c:536 sysfs_add_one+0x88/0xc0()
[178790.876810] sysfs: cannot create duplicate filename '/class/power_supply/wiimote_battery'
[...]
[178790.883777] ---[ end trace 66509376675ee1a0 ]---
[178791.878245] power_supply wiimote_battery: driver failed to report `capacity' property: 4294967291
[178791.878349] wiimote 0005:057E:0306.0015: Cannot register battery device
[178792.882087] wiimote: probe of 0005:057E:0306.0015 failed with error -17
</code></pre>
<br />
Bref, l'ensemble des modification est visible ici :<br />
<a href="https://github.com/Alex131089/raspberrypi-linux/compare/raspberrypi:rpi-3.6.y...rpi-3.6.y-hid-wiimote">https://github.com/Alex131089/raspberrypi-linux/compare/raspberrypi:rpi-3.6.y...rpi-3.6.y-hid-wiimote</a><br />
<h2>
Conclusion</h2>
Bien que je ne soit pas entré dans le détail, j'ai une petite vue du fonctionnement des Wiimote, et de la gestion au niveau du kernel. Première expérience de cross-compilation aussi, merci au projet RaspberryPi qui a préparé les outils.<br />
<br />
Ma manette est donc fonctionnelle, il reste à tester en condition réelle, mais les contrôles semblent tous reconnus cette fois. Il reste à créer un script qui pourra scanner une liste de commande (<span style="font-family: Courier New, Courier, monospace;">hidd --connect</span>) ou toute commande (<span style="font-family: Courier New, Courier, monospace;">hidd --search</span>) pour s'y connecter, qui scannera en permanence, et qui affectera les bonnes leds (p1, p2) aux commandes, à coup de recherche dans <span style="font-family: Courier New, Courier, monospace;">/sys/class</span> ^^<br />
<br />
Je joins aussi mon <a href="https://drive.google.com/file/d/0B63FLnZuVDrvU0ZKMV81VnVYR2c">fichier de "travail"</a> qui contient moulte liens sur lesquels je suis tombé pendant mes recherches.Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-4126564442997921506.post-36310790804782025862013-06-17T17:29:00.000+02:002014-01-19T19:39:59.434+01:00Script Linux pour s'assurer de la connectivitéAujourd'hui, un petit script pour s'assurer de la connectivité IPv4 et IPv6 sur une interface qui ne récupère pas toujours ses adresses (vivent le wifi, une ipw2200).<br />
<br />
On ecrit le script qui fait le check : <br />
<pre><code>[root@Virgo ~]# cat /etc/perso-wifi.sh
#!/bin/bash
INTF=wlp1s5
IP4=$(ip addr show dev $INTF scope global primary | grep -c "inet ")
IP6=$(ip addr show dev $INTF scope global primary | grep -c "inet6 ")
echo "IPv4 : $IP4 / IPv6 : $IP6"
if [ "$IP4" -lt "1" -o "$IP6" -lt "1" ]; then
nohup systemctl restart netctl-auto@$INTF.service >/dev/null 2>&1 &
fi
</code></pre>
<br />
Il regarde les adresses de connectivité globale et primaire (il peut y en avoir plusieurs, surtout en IPv6 si use_tempaddr est utilisé, dans mon cas je veux que l'adresse principale soit présente) et compte leur nombre pour IPv4 et IPv6. Si il n'y en a pas pour une des connectivité, il y a un problème et le script demande au système de relancer la connexion sur cette interface (en fond de tache pour ne pas garder le la tache cron et sans interruption quand le cron quitte).<br />
<br />
On active ensuite le service de cron : <br />
<br />
<pre><code>systemctl enable cronie.service
systemctl start cronie.service
</code></pre>
<br />
Puis on y ajoute le script créé qui sera exécuté toutes les 5 minutes :<br />
<code></code><br />
<pre><code>[root@Virgo ~]# crontab -l
*/5 * * * * /etc/perso-wifi.sh
</code></pre>
<br />
Et voila, la machine est normalement joignable sur ses 2 connexions même en cas d'échec.<br />
Notez que je ne vérifie pas qu'internet est joignable (inutile de relancer la connexion si c'est la box qui fail) ni si la box est joignable (idem), juste qu'on nous a bien donné des adresses, ce qui n'est pas toujours le cas au reboot (wpa_supplicant se rate souvent), et qui fait perdre la main.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4126564442997921506.post-19080207791268181102013-05-19T13:38:00.000+02:002013-05-19T13:49:48.600+02:00fun_plug sur clé USB pour D-Link DNS-320LWComme moi, vous avez peut-être profité de l'offre de TopAchat proposant un NAS D-Link DNS-320LW + 2x2To (soit 4To) à 200€ (soit le prix des 2 disque sur, en fait).<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2a6IdDpwisF3G4HVWqF3l82c2TlLbeUXzgdtyHMKi5X7RtOMWTEfV9iY3XmDfqK8QDasZx_eEZlUKTQoxgFwd2db-CZuUrzYYOV9qzFNxzRv3GNFPsDXa1kiyomi7Od8X8568-tuMfAw/s400/DNS320LW.png" width="400" /></div>
De base, le NAS propose déjà pas mal de fonctions (FTPS, SMB, NFS, DLNA, des droits suffisamment fin, JBOD, interface de téléchargement, et j'en passe pas mal), mais il est possible (merci à D-Link pour cela) d'augmenter encore ses capacités !<br />
<br />
Une petite information au passage, parce que j'ai <a href="http://wolf-u.li/nas/geraete/d-link/dns-320l/">cherché</a> moi aussi : matériellement, la version 320L (et W pour white of course) est très proche du 320, mais possède le double de mémoire (<b>256Mo</b>) et un processeur de <b>1Ghz</b> (contre 800MHz). Le firmware semble être vraiment différent cependant, peut-être pas au niveau de l'interface, mais le 320 en est à la 2 alors que le 320L à la 1.<br />
<br />
Revenons à ce qui nous intéresse : fun_plug (ffp). Grâce à D-Link, il est possible d’exécuter un script au démarrage du NAS, parce que si un fichier fun_plug est présent sur le volume 1, il est appelé à la fin du démarrage, justement pour tolérer ce fonctionnement. Des gens ont donc compilé des binaires fonctionnants sur le NAS et on peut retrouver un vrai petit environnement Linux.<br />
<br />
Dans le fonctionnement de base, un place fun_plug et une archive fun_plug.tgz à la racine du volume 1, au 1er boot celle-ci est décompressé puis supprimé et offre un accès telnet, ce fut ma 1ère tentative (en passant par l'interface web d'envoi de fichier, qui own les fichier en root:root et mode en 777). Bien, on retrouve un accès root, un shell, c'est gagné.<br />
<br />
Mais au reboot, le 320L devient chiant car un effectue un chmod 777 -R sur tout les volumes, nos fichiers (ah oui au fait, en interne c'est de l'ext4) perdent donc leurs modes et par exemple :<br />
<ul>
<li>tout les scripts de <span style="font-family: Courier New, Courier, monospace;">/ffp/start/</span> (le init.d de ffp) sont +x, les services se retrouvent tous lancés au 2ème reboot</li>
<li>les fichiers clés d'sshd sont aussi en 777, accès libre pour tous, et comme sshd n'aime pas cela, il refuse de se lancer, plus de ssh, ou renvoi des erreurs dans les logs.</li>
</ul>
<div>
Autre petit souci, les scripts/binaires étant situés sur les disque dur, cela oblige ces derniers à être relancés régulièrement, on perd une partie du coté "éco". Il est possible de placer fun_plug sur une clé USB, et c'est ce que je vais expliquer (du moins, à ma façon). Arrivé ici, j'ai déjà un <a href="http://nas-tweaks.net/371/hdd-installation-of-the-fun_plug-0-7-on-nas-devices/">fun_plug installé</a> sur le disque dur, rebooté seulement pour son installation (avant le 2ème reboot qui chmod tout), avec juste le telnet. Sur le 320L, la clé USB est monté sur /mnt/USB/USB_c1 (il faut adapter).</div>
<h3>
Formater la clé USB</h3>
<div>
<pre><code>umount /dev/sdxx
fdisk /dev/sdx
d
c
p
1
w
mkfs.ext4 -O ^has_journal -E stride=2,stripe-width=1024 -b 4096 /dev/sdxx</code></pre>
</div>
<div>
En me fiant à <a href="http://blogofterje.wordpress.com/2012/01/14/optimizing-fs-on-sd-card/">http://blogofterje.wordpress.com/2012/01/14/optimizing-fs-on-sd-card/</a> pour les options de formattage car ma clé USB est en fait un lecteur de carte, mais je pense que ça s'applique de la même façon à une "vrai" clé USB.</div>
<h3>
Installer fun_plug dessus</h3>
<div>
<pre><code>cd /mnt/USB/USB1_c1
wget http://ffp.inreto.de/ffp/0.7/arm/fun_plug.tgz
tar xzf fun_plug.tgz -C ffp/
/ffp/bin/tar xzf fun_plug.tgz -C ffp/</code></pre>
</div>
<h3>
Utiliser un fun_plug compatible USB</h3>
<div>
J'ai utilisé ce <a href="https://funplug-dns320-dns325.googlecode.com/files/fun_plug.ffp">fun_plug</a> (venant d'<a href="http://forum.hardware.fr/hfr/reseauxpersosoho/Reseaux/link-sharecenter-320l-sujet_22398_57.htm#t576354">ici</a>) qui est une variante de l'original a peine modifié (je préfère) pour fonctionner en USB lorsque c'est possible. Le fichier <span style="font-family: Courier New, Courier, monospace;">fun_plug</span> lui reste sur le volume 1 (c'est ici que le firmware le cherchera), mais tout le dossier <span style="font-family: Courier New, Courier, monospace;">/ffp/</span> sera situé sur la clé USB. Celle-ci se trouve d'ailleurs dans /mnt/USB/USB_c1/ et non HD_c1, il faut donc modifier le fichier fun_plug : </div>
<div>
<span style="font-family: Courier New, Courier, monospace;">sed -ie 's#USB/HD_c1#USB/USB1_c1#g' /mnt/HD/HD_a2/fun_plug</span></div>
<div>
Je l'ai aussi modifié pour qu'il remonte la clé USB en noatime et nodiratime (qui feraient trop d'accès sur la clé) et sauve une copie du dmesg au boot, au final on obtient ceci : </div>
<pre><code>
#!/bin/sh
# switch to safe working directory on ramdisk
cd /
# fichier de trace
exec >>/mnt/HD/HD_a2/ffp.log 2>&1
# Bootlog
dmesg > /var/log/boot.log
# Activation de autoboot USB (O ou N)
AUTOBOOT_USB=O
# Emplacement du repertoire FFP
FFP_USB_DRIVE=/mnt/USB/USB1_c1
FFP_PATH_USB=$FFP_USB_DRIVE/ffp
FFP_PATH=/mnt/HD/HD_a2/ffp
</code></pre>
<pre><code>
</code></pre>
<pre><code># Si on utilise ffp sur USB et qu'elle est présente, on change les options de montage
if [ "$AUTOBOOT_USB" = "O" ] && [ -d $FFP_PATH_USB ]; then
FFP_PATH=$FFP_PATH_USB
mount -o remount,noatime,nodiratime $FFP_USB_DRIVE
fi
# where to search for the install tarball
FFP_TARBALL=/mnt/HD/HD_a2/fun_plug.tgz
# rc file path
FFP_RC=/ffp/etc/rc
echo "**** fun_plug script for DNS-320/325 ****"
echo "Demarrage sur $FFP_PATH"
date
# create /ffp link
echo "ln -snf $FFP_PATH /ffp"
ln -snf $FFP_PATH /ffp
# install tarball
if [ -r $FFP_TARBALL ]; then
echo "* Installing $FFP_TARBALL ..."
mkdir -p $FFP_PATH && tar xzf $FFP_TARBALL -C $FFP_PATH && /ffp/bin/tar xzf $FFP_TARBALL -C $FFP_PATH
if [ $? -eq 0 ]; then
echo "* OK"
fi
rm $FFP_TARBALL
fi
# suid busybox
if [ -x /ffp/bin/busybox ]; then
chown root.root /ffp/bin/busybox
chmod 0755 /ffp/bin/busybox
chmod u+s /ffp/bin/busybox
fi
# run fun_plug.init, if present
if [ -x /ffp/etc/fun_plug.init ]; then
echo "* Running /ffp/etc/fun_plug.init ..."
/ffp/etc/fun_plug.init
fi
# run fun_plug.local, if present
if [ -x /ffp/etc/fun_plug.local ]; then
echo "* Running /ffp/etc/fun_plug.local ..."
/ffp/etc/fun_plug.local
fi
# run commands
if [ -x $FFP_RC ]; then
echo "* Running $FFP_RC ..."
$FFP_RC
echo "* OK"
else
echo "$FFP_RC: Not found or not executable"
fi</code></pre>
<h3>
Empêcher le chmod 777</h3>
<div>
Comme je disais, le NAS effectue un bon gros chmod 777 sur tout les volumes, cela inclut la clé USB, il faut modifier un peu le système pour l'empêcher d'effectuer ceci au moins sur la clé USB, on commence par créer le fichier qui remplace chmod : </div>
<div>
<span style="font-family: Courier New, Courier, monospace;">cd /usr/local/config/</span></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace;">vi chmod_usb.sh</span></div>
<div>
<pre><code>
#!/bin/sh
# log everything to a file
exec >>/usr/local/config/chmod.log 2>&1
args="$@"
NOW=$(date +"%Y-%m-%d %T")
HD=USB1_c1
#these are the chmod args we want to suppress
suppress_args="777 -R /mnt/USB/$HD"
if [ "$args" != "$suppress_args" ]; then
echo "[$NOW] Executing chmod $args"
/bin/busybox chmod $@
else
echo "[$NOW] Suppressing chmod $args"
fi
</code></pre>
</div>
</div>
<div>
Suivi d'un <span style="font-family: Courier New, Courier, monospace;">chmod 777 chmod_usb.sh</span></div>
<div>
<br /></div>
<div>
Puis on effectuera le "remplacement" à chaque démarrage grâce au <span style="font-family: Courier New, Courier, monospace;">rc.init.sh</span><span style="font-family: inherit;"> </span>(on conserve une copie du init.rc) :<br />
<br /></div>
<div>
<pre><code>cd /usr/local/config/
cp -pf rc.init.sh rc.init.sh.orig
echo "# USB chmod Patch" >>rc.init.sh
echo "[ -x /usr/local/config/chmod_usb.sh ] && ln -nfs /usr/local/config/chmod_usb.sh /bin/chmod">>rc.init.sh
</code></pre>
</div>
<div>
<br /></div>
<div>
On peut effectuer le ln -nfs /usr/local/config/chmod_usb.sh /bin/chmod et s'assurer que la commande chmod fonctionne toujours.</div>
<h3>
Supprimer fun_plug du disque dur</h3>
<div>
Dans mon cas, je ne veux pas que fun_plug puisse fonctionner sur le disque dur, seulement la clé USB, la solution est donc simple et à effectuer avant le redémarrage qui lancera fun_plug depuis la clé USB : </div>
<div>
<span style="font-family: Courier New, Courier, monospace;">rm -rf /mnt/HD/HD_a2/ffp/</span></div>
<div>
<br /></div>
<div>
On peut redémarrer le NAS, on devrait retrouver l'accès telnet au bout de 2-3 minutes mais cette fois avec un fun_plug contenu dans la clé USB !</div>
<h3>
Personnaliser SSH</h3>
<div>
Un des avantages de fun_plug est d'avoit un accès SSH au NAS, il y a cependant quelques modifications à effectuer (maintenant et pas avant car on modifie des fichiers de la clé) ; pour ma part j'utilise une clé privé pour me connecter en SSH, je laisse donc le mot de passe root intouché (ie. vide), mais ce n'est pas gênant.</div>
<div>
<pre><code>
mkdir -p /ffp/home/root/.ssh
chmod og-w -R /ffp/home/root/.ssh
vi authorized_keys
cd /usr/local/config
sed -ie 's#:/home/root:#:/ffp/home/root:#g' passwd
sed -ie 's#root:/bin/sh#root:/ffp/bin/sh#g' passwd
cd /etc
cd /usr/local/config
sed -ie 's#:/home/root:#:/ffp/home/root:#g' passwd
sed -ie 's#root:/bin/sh#root:/ffp/bin/sh#g' passwd
pwconv
</code></pre>
</div>
<div>
<br /></div>
<div>
On défini la/les clés ssh autorisés pour le compte root, puis on modifie le HOME (c'est ici que sshd cherchera les clés) et le shell (pour un beau bash) de root dans le dossier permanent (/usr/local/config qui est dans la flash du NAS) et dans le dossier chargé actuellement (pour éviter un reboot), on assure la prise en compte avec un pwconv.</div>
<div>
<br /></div>
<div>
Ah, il faut aussi changer un petit test dans <span style="font-family: Courier New, Courier, monospace;">/ffp/start/sshd.sh</span> car il y a une référence à /etc/ssh et non /ffp/etc/ssh.</div>
<div>
<br /></div>
<div>
Enfin j'assure la sécurité en modifiant <span style="font-family: Courier New, Courier, monospace;">/ffp/etc/ssh/sshd_config</span> : </div>
<div>
<pre><code>
PermitRootLogin yes
PermitEmptyPasswords no
# Perso
AllowUsers root Alex
</code></pre>
</div>
<div>
<br /></div>
<div>
Root peut se connecter, pas de mot de passe vide possible (ça tombe bien, celui de root est vide, on ne pourra donc utiliser que la clé privé). Enfin seul root et Alex peuvent faire du SSH (si un utilisateur à un mot de passe faible, il pourrait offrir un accès SSH, on limite donc).</div>
<div>
<br /></div>
<div>
Enfin on peut lancer SSH : </div>
<div>
<pre><code>
chmod +x /ffp/start/sshd.sh
/ffp/start/sshd.sh start
</code></pre>
</div>
<div>
<br /></div>
<div>
On peut de nouveau redémarrer le NAS, on attend 2-3 minutes puis on s'assure de l'accès SSH. Si c'est ok, on peut couper telnet : </div>
<div>
<pre><code>
/ffp/start/telnetd.sh stop
chmod -x /ffp/start/telnetd.sh
</code></pre>
</div>
<div>
<br /></div>
<div>
Et voila !</div>
<div>
Je n'ai pour l'instant pas été beaucoup plus moins, mais j'ai déjà un accès ssh root, tout est donc possible à partir de maintenant :)</div>
<div>
Oh, et le NAS est parfaitement compatible IPv6 (l'interface web aussi !).</div>
<h3>
Quelques liens</h3>
<div>
Mon fichier de "travail" : <a href="https://docs.google.com/file/d/0B63FLnZuVDrvZFhZUUE3amszRjA/edit">https://docs.google.com/file/d/0B63FLnZuVDrvZFhZUUE3amszRjA/edit</a></div>
<div>
Les fichiers que j'ai modifié : <a href="https://docs.google.com/file/d/0B63FLnZuVDrvZDFKekhRMy1hU1U/edit">https://docs.google.com/file/d/0B63FLnZuVDrvZDFKekhRMy1hU1U/edit</a></div>
<div>
<br /></div>
<div>
<a href="http://ffp.inreto.de/ffp/">http://ffp.inreto.de/ffp/</a></div>
<div>
<a href="http://nas-tweaks.net/371/hdd-installation-of-the-fun_plug-0-7-on-nas-devices/">http://nas-tweaks.net/371/hdd-installation-of-the-fun_plug-0-7-on-nas-devices/</a></div>
<div>
<a href="http://forum.hardware.fr/hfr/reseauxpersosoho/Reseaux/link-sharecenter-320l-sujet_22398_1.htm">http://forum.hardware.fr/hfr/reseauxpersosoho/Reseaux/link-sharecenter-320l-sujet_22398_1.htm</a></div>
<div>
<a href="http://bernaerts.dyndns.org/dns325/224-dns325-funplug-07">http://bernaerts.dyndns.org/dns325/224-dns325-funplug-07</a></div>
<div>
<a href="http://bernaerts.dyndns.org/dns325/71-funplug07/242-dns325-ffp7-move-usb-key">http://bernaerts.dyndns.org/dns325/71-funplug07/242-dns325-ffp7-move-usb-key</a></div>
<div>
<a href="http://forum.hardware.fr/hfr/reseauxpersosoho/Reseaux/link-sharecenter-320l-sujet_22398_57.htm#t576354">http://forum.hardware.fr/hfr/reseauxpersosoho/Reseaux/link-sharecenter-320l-sujet_22398_57.htm#t576354</a></div>
<div>
<a href="http://www.dsmg600.info/howto:fun_plug">http://www.dsmg600.info/howto:fun_plug</a></div>
<div>
<a href="http://dns323.kood.org/howto:fun_plug">http://dns323.kood.org/howto:fun_plug</a></div>
<div>
<a href="https://code.google.com/p/funplug-dns320-dns325/downloads/list">https://code.google.com/p/funplug-dns320-dns325/downloads/list</a></div>
<div>
<br /></div>
Unknownnoreply@blogger.com7tag:blogger.com,1999:blog-4126564442997921506.post-34089427546900253412013-05-09T15:55:00.002+02:002013-05-09T16:01:12.649+02:00Mises à jour Windows Defender automatiques sous Windows 8Je n'utilise pas le paramètre recommandé "Installer les mises à jour automatiquement" pour Windows Update, principalement parce que celui-ci génère un message invitant à redémarrer le PC lorsque des mises à jour le demandent.<br />
C'est donc "Télécharger les mises à jour mais me laisser choisir s'il convient de les installer" que j'utilise. Un des effets de ce paramètre est que les mises à jour Windows Defender, proposant chaque jour un nouveau fichier de définitions, ne sont pas non plus installées et je suis donc invité chaque jour à les installer ... Enfin j'étais.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-P6H3RNwipT6o-6SM5unrhzAtNT_ap_aNh5qJuasUVFj5DPCTcSlJG45GakYjLJV2t9UnWG3FxzBsEuWzSj7N78iVxtt9V4vI8aoj73ky-Gc12MrpyHNjbwLBMIgNTeLDayKicw_J2ZI/s500/wu+auto.png" width="400" /></div><br />
Le problème était le même sous Windows 7 et j'avais trouvé le "truc", et visiblement sous Windows 8 certaines personnes cherchent aussi comment faire :<br />
<br />
<ul><li><a href="http://superuser.com/questions/117616/automatic-windows-defender-updates-with-manual-windows-microsoft-updates">http://superuser.com/questions/117616/automatic-windows-defender-updates-with-manual-windows-microsoft-updates</a></li>
<li><a href="http://answers.microsoft.com/en-us/windows/forum/windows_other-windows_update/windows-defender-automatic-update/595d0baa-cd63-4f13-9b82-30f362d781e2">http://answers.microsoft.com/en-us/windows/forum/windows_other-windows_update/windows-defender-automatic-update/595d0baa-cd63-4f13-9b82-30f362d781e2</a></li>
<li><a href="http://answers.microsoft.com/en-us/windows/forum/windows_8-windows_update/automatically-install-updates-for-windows-defender/43c41ebc-7bb5-4548-8a9a-52d406f9bb50">http://answers.microsoft.com/en-us/windows/forum/windows_8-windows_update/automatically-install-updates-for-windows-defender/43c41ebc-7bb5-4548-8a9a-52d406f9bb50</a></li>
</ul><div>Ma solution ne permet pas d'avoir les mises à jour "manuelles" mais seulement d'avoir les mises à jour majeures en manuel (celles qui demandent un redémarrage), les mineures comme les définitions de Defender seront automatiques.</div><div><br />
</div><div>Cela consiste donc à : </div><div><ul><li>mettre le paramètre sur "Télécharger les mises à jour mais me laisser choisir s'il convient de les installer" pour toutes les autres</li>
<li>et pour les mineures, ajouter une clé dans le registre dans :<br />
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU<br />
créez une valeur DWORD "AutoInstallMinorUpdates" avec la valeur 1<br />
(Doc WSUS : <a href="http://technet.microsoft.com/en-us/library/dd939844(v=ws.10).aspx">http://technet.microsoft.com/en-us/library/dd939844(v=ws.10).aspx</a>)</li>
</ul><div>Cette clé autorise donc l'installation automatique des mise à jour ne nécessitant pas de redémarrage.</div></div><div>On retrouve aussi ce paramètre dans gpedit.msc (Windows Components/Windows Update).</div><div><br />
</div><div>Mises à jour automatiques : oui, mais sans être dérangé (cette option devrait être disponible tiens).</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4126564442997921506.post-57634816862626793392013-05-09T15:08:00.000+02:002013-05-09T15:21:19.540+02:00Migrer ses jeux Steam lors d'une réinstallationBesoin de réinstaller ou changer de PC, mais pas envie de re-télécharger 150Go de jeux Steam ?<br />
C'est possible, et sans utiliser la fonction d'exportation des jeux (qui plante en plus) :).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzlJITmC6q8de77BAvB5ZZRxKt45APlQgfjM6gDYEpQOi1nAOXQ2kYETg1rgpZHk5zcsm3Pb4KwIpRLoA_LdPl97ppBoxbiwgJAhelKm_Ghc8Fw5RUYp99Bsu4EGOjFXkIzoFqJF7ij3s/s400/steam+size.png" width="400" /></div>
<br />
Les étapes :<br />
<ul>
<li><span style="text-align: center;">Faire une copie du dossier SteamApps qui se trouve dans le dossier de Steam (C:\Program Files (x86)\Steam par exemple) vers la nouvelle destination (lecteur, mais pas le dossier final)</span></li>
<li>Supprimer les fichiers appmanifest_<id-jeu>.acf qui s'y trouvent : il est possible de les conserver, mais alors Steam n’exécutera pas les actions effectuées au 1er lancement et qui peuvent être nécessaires (installation d'OpenAL, création de clés dans le registre, définition de l'emplacement des executables, ...)</li>
<li>Réinstaller Steam (<a href="http://cdn.steampowered.com/download/SteamInstall.msi">SteamInstall.msi</a> demande la langue à utiliser) à l'emplacement voulu (qui peut-être dans Program Files, mais aussi sur une autre partition)</li>
<li>Le lancer, attendre les mises à jour du client, le fermer complètement</li>
<li>Remettre le dossier SteamApps en place dans le nouveau dossier d'installation de Steam<br />
Note : depuis une mise à jour, il est possible pour certains jeux (les non-steam principalement) de les installer à un autre emplacement, il suffit alors d'indiquer dans les préférences cet emplacement pour ces jeux.</li>
<li>Relancer Steam, attendre plusieurs minutes pour les jeux qu'il détecte tout seul, pour les autres il suffit de lancer la demande d'installation, il va alors découvrir les fichiers déjà présents sur le disque et les valider ; normalement il ne lui reste quasiment rien à télécharger<br />
<img border="0" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibvP1ymjR04LvhCpOCPfBNmMlU6mpI2duL0sthN_qT0Tj-SOiKmpeoNK2aziygR0jw1C5STl77_mw4UGVUbI1hS6fL469GDpX2Pcfw2xg4RlCC28LBXfI0xiwyEXxk-3FdpN3wKKZTPDA/s320/steam+discover.png" width="320" /></li>
<li>Voilà, les jeux sont de nouveaux disponibles en quelques heures et non en quelques jours de téléchargement :)</li>
</ul>
Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4126564442997921506.post-91604119704156464062012-12-07T17:52:00.000+01:002012-12-07T17:52:46.097+01:00Créer une copie sécurisée de ses donnéesC'est parti pour une petite explication sur la création d'une copie sécurisée de ses données (enfin à ma façon). Il "existe" <a href="http://blog.wisefaq.com/2010/01/05/backups-with-the-3-2-1-rule/">3 règles de sauvegarde simples</a> :<br />
<ul>
<li><b>3 copie de sauvegarde des données à conserver</b>, parce qu'une copie peut se corrompre (les CD peuvent s'abîmer assez facilement par exemple) .. ou se perdre bêtement lorsqu'on tente d'y récupérer les données (oups, j'ai supprimé les mauvais fichiers .. Gnééé <img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmCg60GjA6Lz72nWP2G97KT0qzrXqxeQENKGWmYAS3_05xicuesp8sS3YacrtqdsfYKoUhW6UPfs7mkjy36GmS84x842zFz_yyqB9NlRpB0ZLaUtlHhjypCjH_XX2dLL5eT3elMmaY5Bk/s1600/vZtZT3LuffRM0Ia2wrtGSxGT39g=.png" />)</li>
<li><b>2 support de stockage différents</b>, pour éviter qu'un type de support vous lâche ; par exemple disque dur, mémoire flash (SSD, SD), CD/DVD, bande magnétique, en ligne.</li>
<li><b>1 site de stockage "hors site"</b>, càd pas chez vous : ben oui, si les 3 sauvegardes sont dans la même maison qui brûle, c'est fini.</li>
</ul>
Ici, l'idée c'est de faire une sauvegarde hors site (chez une personne de la famille) sur un disque dur, avec une petite variante, la sauvegarde sera chiffrée pour ne pas être lisible "hors ligne", en cas de vol par exemple. Cette sauvegarde se fait depuis un autre disque dur qui lui reste avec moi.<br />
<br />
<i>Note : je n'ai pas fait de lien dans l'article pour chaque annexe, mais elles font références à des remarques dans cet article, il peut donc être utile d'y jeter un œil.</i><br />
<br />
Grosso-modo, voici les étapes :<br />
<ol>
<li>ranger la source</li>
<li>la vérifier (chkdsk), faire un audit (fslog)</li>
<li>enlever ce disque source, préparer la destination (ici avec TrueCrypt)</li>
<li>remettre et monter la source en ReadOnly</li>
<li>lancer la copie (environ une bonne nuit pour 750Go)</li>
<li>vérifier cette copie (les fichiers, le filesystem, le conteneur chiffré)</li>
<li>remonter la source en RW</li>
</ol>
<div>
<b>Ranger la source :</b> simplement car c'est plus facile de le faire avant la réplication qu'après ; par exemple voici la racine de mon disque : </div>
<div>
<pre>Albums Jeux Photos !En vrac
Albums - tmp Jeux Steam Steam !Tmp
Archives Jeux console System Volume Information $RECYCLE.BIN
Docs Logiciels Vidéos _fslog
ATEPI Mangas Wii
Images Matériel ZTE Blade
Info Personalisation !Backup - Wuala
</pre>
</div>
<div>
<br /></div>
<div>
<b>Vérifier la source, faire un audit :</b> pour ne pas être emmerdé lors de la copie (un fichier corrompu qui gène ou serait copié, ..) et l'audit (contenant la liste des fichiers et leur propriétés) pour garder une trace du contenu à ce moment.<br />
Pour l'audit j'utilise un petit batch perso "fslog" qui me récupère et me compresse pour un lecteur :<br />
<ul>
<li>Tree /A et Tree /A /F : la liste des fichiers et dossiers sous forme d'arbre</li>
<li>Dir /A /S : le contenu des répertoires (avec les heures de modification donc)</li>
<li>Attrib /D /S : les attributs des fichiers</li>
<li>Streams -s et Streams -s -d : enregistre les flux alternatifs avant de les supprimer (indésirables)</li>
</ul>
<div>
Compressé cela me donne un fichier que je date, de quelques mégaoctets. Si ça intéresse quelqu'un je peux le passer.</div>
<br />
<b>Enlever la source/préparer la destination :</b> ici la destination est amenée à être formatée, ça serait dommage de se tromper de disque et perdre la source avant même de l'avoir copié .. Donc on l'enlève.<br />
On peut s'occuper de la destination, vérifier que le disque ne contient pas d'erreurs si il n'a jamais été utilisé et finalement préparer le conteneur TrueCrypt.<br />
J'ai choisi de le placer dans une partition de type NTFS Cachée (<a href="http://en.wikipedia.org/wiki/Partition_type">0x17</a>) que Windows n'essayera pas de monter : j'ai supprimé toute partition du disque, créé une partition simple, changé son type avec un éditeur comme <a href="http://www.pcdisk.com/">Active@ Partition Manager</a> :<br />
<div class="separator" style="clear: both; text-align: center;">
<span id="goog_1971732474"></span><span id="goog_1971732477"></span><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMW7jGcECe-hd0g1zcH4m3hBbObluX1WbCFHj2qys-EQGwId3pyDvkYk3INQfZp5tCI6K3xfztH9T23MBKJOCGYzMMd9KoFe5KYsZOik3FYWTHkW_UYci0TwWZdIB3SmHKrpHV-__p54U/s1600/part-type_ntfs-hidden.png" /><span id="goog_1971732478"></span><span id="goog_1971732475"></span></div>
Puis j'ai créé le conteneur TrueCrypt sur cette partition :<br />
<ul>
<li>Créer une volume</li>
<li>Chiffer une partition non système</li>
<li>choisir le type de volume, choisir le périphérique (de la forme \Device\Harddisk1\Partition1 du coup)</li>
<li>Create encrypted volume and format it (ne va pas essayer de convertir un éventuel contenu)</li>
<li>choisir le chiffrement/hashage (AES/SHA-512 convient très bien et AES est accéléré matériellement sur mon PC) ; voir le lien en annexe</li>
<li>confirmer la sélection, choisir une/des clefs (et ne pas les oublier !)</li>
<li>enfin choisir le système de fichier : je recommande NTFS qui est robuste et lisible au minimum partout, en formatage rapide (utile surtout si les traces d'anciens fichier qui pourraient persister peuvent rester avant de se faire écraser), puis c'est parti !</li>
</ul>
<br />
Quand c'est terminé, le conteneur peut être monté et devient accessible via le lecteur choisi.<br />
<br />
<b>Remonter la source en ReadOnly :</b> la destination est prête, on peut s'attaquer à la copie, mais a mon avis une étape importante est de bien placer la source en <i>lecture seule</i> pour éviter des erreurs bête telles que supprimer dans la source au lieu de la destination ou inverser source et destination lorsqu'on utilise robocopy en mode miroir (ce qui revient a supprimer la source si la destination est vide).<br />
Sous Windows (7) cela peut être fait assez simplement, en lançant une invite de commande en mode admin, pour accéder a diskpart :<br />
<pre>diskpart
list volume
select volume <x>
att vol set readonly</pre>
</div>
<br />
Puis vérifier qu'aucune création/suppression de fichier n'est possible.<br />
<br />
<b>Lancer la copie :</b> la source est "sécurisée", la copie peut être faite sans risque ; pour ma part j'ai utilisé Robocopy. Celui-ci est fourni dans Win7, mais <strike>bugg..</strike>featuré d'un log unicode illisible, j'ai donc utilisé la version précédente, XP026 trouvable dans <a href="http://tribblesoft.com/EasyRoboCopy.php"><span id="goog_1971732482"></span>Easy Robo<span id="goog_1971732490"></span><span id="goog_1971732491"></span>C<span id="goog_1971732487"></span><span id="goog_1971732488"></span>opy<span id="goog_1971732483"></span></a> par exemple (avec un p'tit coup de Winrar/7-zip sur le fichier d'install).<br />
<blockquote class="tr_bq">
It's not a bug, it's a feature <img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHTlkWDYB1w0EYGF8QIMGZZOHMdra2hv7Qio_U_itzAatvu8BEAMkzMX_O6EAF24Ei-AaHueCVh9zwClYXwc-sJpUoMqzf5M4OjApCH2GsJvp7O9XrBcWaJqSNKUHY_zU06JlpeHlrUdg/s1600/t+r+QR+OREY2jwEHOal3MqCYnwM=.gif" /></blockquote>
Et pour la ligne de commande :<br />
<pre>robocopy.xp026.exe H:\ G:\ /MIR /V /ETA /R:3 /XD "H:\$RECYCLE.BIN" "H:\System Volume Information" /X /TS /FP /BYTES /NP /TEE /UNILOG+:C:\tmp\robocopy.log</pre>
Explications :<br />
<ul>
<li>Lecteur H source, G destination</li>
<li>MIR : G aura exactement le même contenu que H, des fichiers peuvent donc être supprimés sur G si besoin (attention donc à ne pas inverser source et destination)</li>
<li>ETA : affiche les heures et un ETA pour chaque fichier (peut servir pour trouver ce qui prend du temps à copier)</li>
<li>R:3 : ne pas essayer de copier un fichier plus de 3 fois (! 1 million par défaut, et quand on oublie d'exclure System Volume Information, bah ça bloque)</li>
<li>XD : exclut ces chemins (liés à Windows, chaque volume possède sa version)</li>
<li>TS : affiche l'horodatage du fichier source</li>
<li>FP : affiche le chemin complet de chaque fichier</li>
<li>BYTES : affiche la taille en octets, pas d'affichage "humain" en mega/giga</li>
<li>NP : pas de progression (pourrit les logs avec des lignes de 1% 2% 3%)</li>
<li>TEE : permet d'afficher les informations tout en enregistrant dans un fichier de log</li>
<li>UNILOG+ : enregistre l'affichage dans un fichier de log, en unicode ; dans mon cas le fichier faisait ~80Mo non compressé au final</li>
<li>ah, et /L permet de faire une simulation de ce qui serait fait.</li>
</ul>
<br />
Plus qu'a laisser tourner une nuit.<br />
<br />
<b>Vérifications (fichiers, filesystem, conteneur) :</b> la copie terminée, pour Robocopy la même commande peut être relancée (en changeant le fichier de log de préférence) pour vérifier en 10 mins que la destination est bien un miroir, aucune modification ne devrait alors être faite. On peut aussi lancer un fslog sur la destination et comparer les Tree /A /F qui doivent être identiques à 1-2 lignes près.<br />
<br />
Ensuite un chkdsk peut être utile ("Vérifier" dans TC si ça ne fonctionne pas) pour s'assurer que le système de fichier est sain.<br />
<br />
Enfin on peut démonter le volume chiffré pour essayer de le remonter et s'assurer qu'il est bien lisible.<br />
<br />
<b>Remonter la source en RW :</b> bon, ben c'est fini pour la copie, on peut remonter la source en modification, ce qui donne dans diskpart<br />
<pre>att vol clear readonly</pre>
<br />
And it's done !<br />
<br />
A côté, on peut se rendre ce volume accessible à distance en étant relié à un petit serveur linux par exemple. TrueCrypt n'est pas très apprécié sous Linux il semblerait, j'ai utilisé tc-play qui s'installe en 5 secs sous linux (<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">yum install tcplay</span> de mémoire). Ensuite pour s'en servir, pas très compliqué (on retrouve les infos dans la man page) :<br />
<span style="font-family: Courier New, Courier, monospace;">tcplay -i -d /dev/sdc1</span> pour des infos sur le volume et<br />
<span style="font-family: Courier New, Courier, monospace;">tcplay -m tc_Teranium -d /dev/sdc1</span> pour le rendre accessible dans <span style="font-family: Courier New, Courier, monospace;">/dev/mapper/tc_Teranium</span>, puis il reste à le monter avec <span style="font-family: Courier New, Courier, monospace;">mount /dev/mapper/tc_Teranium /media/Teranium</span> par exemple :)<br />
Dans les 2 cas la clef est demandée pour pouvoir lire le volume.<br />
<br />
<pre>[alex@Virgo Teranium]$ ls -la /dev/mapper/
lrwxrwxrwx 1 root root 7 Dec 1 15:47 tc_Teranium -> ../dm-2
[alex@Virgo Teranium]$ ls -la /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 10 Dec 1 15:47 6234BB7C34BB51B1 -> ../../dm-2
[alex@Virgo Teranium]$ mount
/dev/mapper/tc_Teranium on /media/Teranium type fuseblk (rw,noexec,nosuid,nodev,allow_other,blksize=4096,default_permissions)
</pre>
<div>
<br /></div>
Me voici donc avec 2 copies de mes fichiers à 2 emplacements, et pour les plus importants, j'utilise <a href="http://www.wuala.com/referral/BGPJGCC5BK6APGGPGG3M">Wuala</a>, qui fait un chiffrement côté client, de la synchro, backup, .., un client java qui est d'ailleurs disponible sur un peu toutes les plateformes.<br />
<br />
3 sauvegardes, 2 supports différents, 3 emplacements différents (au moins, je ne sais pas ce fait Wuala), pas trop mal non ? Et sans forcément se ruiner ..<br />
<br />
<b>Les annexes : </b><br />
<a href="https://fedoraproject.org/wiki/Forbidden_items?rd=ForbiddenItems#TrueCrypt">https://fedoraproject.org/wiki/Forbidden_items?rd=ForbiddenItems#TrueCrypt</a><br />
<a href="https://github.com/bwalex/tc-play#readme">https://github.com/bwalex/tc-play#readme</a><br />
<a href="https://ask.fedoraproject.org/question/358/tcplay-usb-clean-unmount">https://ask.fedoraproject.org/question/358/tcplay-usb-clean-unmount</a><br />
<a href="http://leaf.dragonflybsd.org/cgi/web-man?command=tcplay&section=8">http://leaf.dragonflybsd.org/cgi/web-man?command=tcplay&section=8</a><br />
<br />
<a href="http://superuser.com/questions/213005/how-to-mount-an-ntfs-partition-read-only-in-windows">http://superuser.com/questions/213005/how-to-mount-an-ntfs-partition-read-only-in-windows</a><br />
<a href="http://superuser.com/questions/383333/truecrypt-ripemd-160-vs-sha-512-vs-whirlpool">http://superuser.com/questions/383333/truecrypt-ripemd-160-vs-sha-512-vs-whirlpool</a><br />
<a href="http://superuser.com/questions/295934/robocopy-unilog-output-is-gibberish">http://superuser.com/questions/295934/robocopy-unilog-output-is-gibberish</a><br />
<a href="http://christ-offer.blogspot.fr/2011/01/simple-backups-with-robocopy.html">http://christ-offer.blogspot.fr/2011/01/simple-backups-with-robocopy.html</a><br />
<a href="http://technet.microsoft.com/en-us/magazine/2009.04.utilityspotlight.aspx">http://technet.microsoft.com/en-us/magazine/2009.04.utilityspotlight.aspx</a><br />
<a href="http://tribblesoft.com/EasyRoboCopy.php">http://tribblesoft.com/EasyRoboCopy.php</a> (1.0.13)Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4126564442997921506.post-63256244161512526472012-11-19T17:58:00.000+01:002016-07-24T03:37:25.618+02:00Simplifier la sécurisation de son système (MAJ)Au menu d'aujourd'hui, quelques idées pour garder simplifier la sécurisation de son système (Windows 7 j'entend) et l'optimiser. Au programme :<br />
<br />
<ul>
<li>ouverture de session automatique mais sécurisée</li>
<li>sécurisation de la fermeture du capot</li>
<li>garder facilement ses mots de passe sous la main</li>
<li>se connecter facilement aux serveurs</li>
</ul>
<div>
Les 3 premiers points reposent sur la sureté du mot de passe de session, mais de toute façon le cran au dessus est probablement le chiffrage des données, qui est un poil plus lourd ..<br />
<br /></div>
<h4>
Ouverture de session automatique mais sécurisée</h4>
Je redémarre rarement mon système (la magie de la mise en veille quand les drivers fonctionnent <3), mais quand ça arrive j'ai tendance à appuyer sur le bouton démarrer et revenir quand c'est démarré ; le problème avec un mot de passe sur la session (mais aussi sans, je crois me rappeler qu'une mise à jour désactive la connexion automatique même sans mot de passe), c'est qu'il faut encore attendre que les programmes se chargent une fois la session ouverte.<br />
Le problème d'activer la connexion automatique, c'est qu'il suffit de rebooter le système pour ouvrir la session. La solution est simple : locker la session à son ouverture.<br />
<br />
Bon, dans un premier temps, l'ouverture automatique :<br />
<ol>
<li>Executer (Démarrer>Executer ou Win+R) "control userpasswords2" (ou netplwiz)</li>
<li>Décocher la case "Les utilisateurs doivent entrer un nom d'utilisateur et une mot de passe pour utiliser cet ordinateur."</li>
<li>On vous demande alors les informations pour se connecter automatiquement</li>
</ol>
<div>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoKcyqRRgYX6pRG53vPP0NzIRU5KGRHmHeGIiJ7slUa6Ro8d27zbiGZg_IzP0JVWH9oSEUEOSgqDAMdn9nIvLHfEzNXiTFCq9ZI4Wg0tcSLruMhts3GA_VC_Obrhv-KuqUVq2MIMPkT3A/s320/autologin.png" width="320" /></div>
<br />
Ensuite, le lock à l'ouverture ; pour cela on fait appel au petit <a href="http://www.nirsoft.net/utils/nircmd.html">nircmd</a> (l'utilitaire se cache en bas de la page) et son option lockws (lock workstation). Pour l'executer au démarrage de la session, 2 choix, le dossier "Démarrage" de l'utilisateur ou la clé de registre "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run". J'ai choisi la clé de registre, ça évite de l'enlever par erreur est c'est plus chiant à enlever qu'un simple fichier (avec un live cd par exemple ..) : </div>
<div>
<ol>
<li>Lancer l'éditeur de registre "regedit"</li>
<li>Naviguer jusqu'à la clé mentionnée</li>
<li>Créer une valeur chaîne, la nommer "BootLock" par exemple, et en valeur : "<le chemin vers nircmd.exe> lockws"</li>
</ol>
<div>
Exemple de clé extraite : </div>
</div>
<div>
<div>
<pre class="code">[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"BootLock"="\"C:\\Utils\\nircmd.exe\" lockws"</pre>
</div>
<br />
Voila, la session démarre en même temps que le système, sans pour autant être accessible sans le mot de passe.<br />
<br />
<h4>
Sécurisation de la fermeture du capot</h4>
Un truc bête, mais sans histoire de truc "AwayMode" (qui semble garder le PC éveillé ou un truc comme ça), pas possible de verouiller la session à la fermeture du capot. Et trouver le petit utilitaire qui fait ça sur internet n'est pas très évident, il se cache le petit !<br />
Mais j'ai fini par le trouver : <a href="http://akhaliq.com/?p=198">http://akhaliq.com/?p=198</a>, LCLock.exe.<br />
La source du programme est plus ou moins donnée sur la page, et au final comme pour le lock, il suffit de créer en entrée registre dans Run qui pointe vers ce programme qui tournera en tache de fond et lockera la session dès que l'écran est fermé.<br />
<br />
<div>
Exemple de clé extraite : </div>
<div>
<pre class="code">[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"Lock"="\"C:\\Utils\\LCLock.exe\""</pre>
<br />
<b>Edit :</b> un certain "Num" <a href="http://akhaliq.com/?p=198#comment-615">propose une version un peu améliorée (LidLock.exe)</a> en VB.net qui offre ces changements :<br />
<ul>
<li>disparition de la fenêtre fantôme "Form1"</li>
<li>ajout d'une icone dans le tray</li>
<li>option démarrage en même temps que la session dans le menu tray</li>
</ul>
<div>
J'en fais un miroir <a href="https://docs.google.com/file/d/0B63FLnZuVDrvN1pDMzBzQnd2V1E/edit?usp=sharing">ici</a> (source : http://skoffie.servebeer.com/LidLock.exe, n'existe plus), il fait 30ko.</div>
<br />
<pre class="code"></pre>
</div>
<h4>
Garder facilement ses mots de passe sous la main</h4>
Même si je me souviens d'une bonne partie de mes mots de passe, ça peut être utile de les stocker quelque part, comme dans KeePass dont la base peut être lisible sur toutes les plateformes. Et si on utilisait RoboForm, on peut les importer en utilisant ce script : <a href="http://ubuntuforums.org/showthread.php?t=722102">http://ubuntuforums.org/showthread.php?t=722102</a> (version FR page 2, et il semble exister ce script maintenant : <a href="http://code.google.com/p/robo2keepass/">http://code.google.com/p/robo2keepass/</a>).<br />
<br />
Bref, bien pratique d'avoir ses mots de passe sous la main, mais ouvrir la base à chaque fois est plutôt pénible, même au démarrage surtout avec un mot de passe/une clé un peu longue (et je ne parle pas de la possibilité d'utiliser un fichier clé sur une clé USB par exemple, qui est contraignant).<br />
<br />
Mais hier, en cherchant comment démarrer KeePass minimisé, je suis tombé sur un argument plutot sympa : "<a href="http://keepass.info/help/base/cmdline.html">-pw-enc</a>". Celui-ci permet d'ouvrir la base en utilisant le <a href="http://keepass.info/help/base/placeholders.html#passwordenc">mot de passe chiffré</a> avec les informations de la session de l'utilisateur actuel, il faut donc en théorie entrer dans la session pour que la base s'ouvre avec cette clé. J'ai testé, effectivement sur un autre PC la clé que j'avais généré n'était pas du tout valable :)<br />
<br />
Assez de bla bla, au final il faut créer une entrée temporaire dans KeePass qui contient le passe de la base, mettre "<span style="font-family: monospace; font-size: 13px;">{PASSWORD_ENC}</span>" comme URL, puis sur cette entrée créer, clic droit, URL, copier dans le presse-papier.<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibDO8vMQg25Xk5lT2i6lNCcM5gkGSLrkIcOrdSY_qAd5OsspO5dEhDaf4FTp-AJ5efjz6dBpcR4BSsyP-7T-tXdTCeoXx-f3_zLxILB_Vohzwg7qqnSAc1g81RsK_MG-wqpz736nydR-s/s320/password_enc.png" width="320" /></div>
<br />
On obtient alors un identifiant de la forme<br />
<div>
<pre class="code">AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAZ1QJmadtMEySLktoapckawAAAAACAAAAAAAQZgAAAAEAACAAAADxHsY7Co20ZPpMx/5ddzoBEX+pi3siw6EmJHIQyS8QbwAAAAAOgAAAAAIAACAAAACg7dldnb+L7nW24ogbs9MwMRglkJIoucPUx+kt4NSxTyAAAABtXX/TfO8xus3/FcXXDfbl9WrgEVR5PBRekHW9FzcMBUAAAACRDR7DBaT76gSxK8r1BXimMSBaXP+eOyNHBk5JQfQnbTJ9a80z906fiWery5YfS37uSpjFM+rJk7zxFTym7WRr</pre>
</div>
<div>
Pour l'utiliser pour un lancement au démarrage par exemple, pas possible d'utiliser un raccourci dans démarrer cette fois, l'identifiant ne tient pas dans le raccourci, et après test, il semble que ça ne fonctionne pas non plus dans le registre (la clé est bien présente mais le programme pas lancé), 3ème solution : un petit fichier batch KeePass.bat dans le dossier Démarrage contenant :<br />
<br />
<pre class="code">start "" C:\Users\Alexandre\Softs\KeePass\KeePass.exe -minimize -pw-enc:"AQAAANC[..]ym7WRr" "C:\Users\Alexandre\Privé\Pass.kdbx"</pre>
<br />
Notez le « "" » qui sert à indiquer le titre de la fenêtre (start /?), autrement c'est la prochaine chaîne entre guillemet qui pourrait être utilisée (ici le fichier) et le lancement ne fonctionnerait pas.<br />
Et voila donc une base qui s'ouvre toute seule en même temps que la session, minimisée :)<br />
<br /></div>
<h4>
Se connecter facilement aux serveurs</h4>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="72" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz4lAwQwaCYstLfDiEL86lvCBeRs5-n-TWDKYx3ADbkIzpNMqLj4TLLLMpU0xhpgwRjIBnOW88x_67BdrsDiJuZNd9ue_US0hKbQfLNdDL7_ySMVGl3l0qReISxtZtYdBDuVLLf4rr97I/s320/privpubkey.png" width="320" /></div>
<div>
Enfin, pour ceux qui s'amusent avec des serveurs ou a faire des transferts de fichiers via SFTP/SCP, un moyen simple pour s'authentifier est d'utiliser l'authentification par clé privée/publique. On trouve plein de tuto sur internet (plus ou moins bien faits mais bon), et au final c'est le petit utilitaire Pageant (ce truc dont on se demande bien a quoi il sert quand on utilise PuTTY) qui permet de garder les clés en mémoire.</div>
<div>
Encore une fois le plus simple est de le faire démarrer en même temps que la session, en lui indiquant en paramètre les clés a charger, ainsi au démarrage il suffit d'ouvrir les clés une fois, et les programmes tels que PuTTY ou WinSCP pourront s'en servir directement.<br />
<br />
<pre class="code">C:\Users\Alexandre\Softs\PuTTY\pageant.exe "C:\Users\Alexandre\Privé\Keys\key1.ppk" "C:\Users\Alexandre\Privé\Keys\key2.ppk"</pre>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEPqMrDiwWmqbJ037OarhpeiPkpa8wZUADCbR8CbAYHRuGzUjdPNIFMP9gOFZmap9eclrdELHOkIX5_vKhzIXTgFgVbb3RmCmCxfssSs090KG4TvDs0f8nt_YQiAfQT4zWfN95kn5KJ5I/s320/winscpprivpubkey.png" width="320" /></div>
<div>
<br /></div>
<div>
Enfin, un petit plus pour gérer les clés et certificats est le programme XCA : <a href="http://xca.sourceforge.net/">http://xca.sourceforge.net/</a> qui remplace très bien la ligne de commande pour la génération de certificats :)<br />
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="244" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHuSXSOn05NCSjls6OTLTKLlKVMgHO2XZejvnqANmHsPJLVQH0b8VTeVXMLTxPOesyw3dmVIUxvU9y5MWHgIsfQlEEAyJYVU7wkqAr9LhynYar9ihIfA7VwbnEXCuaORC9rfUXAA7VF_g/s320/xca.png" width="320" /></div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4126564442997921506.post-18858674684702080042012-10-14T00:21:00.000+02:002012-10-14T00:41:45.732+02:00Serveur FTP simple et limitation de débit[Les configurations sont à la fin]<br />
Bon alors voila, sur mon OpenG@te Pyxis (qui tourne sous Amahi, une Fedora 14 customisée pour en faire facilement une box centrale à la maison ; trop même dès fois puisqu'elle remplace le serveur DHCP par défaut), y'a un disque dur qui contient 2To de données que j'ai envie de rendre accessible à quelques personnes en lecture seule sans me prendre la tête.<br />
J'avais d'abord pensé proposer un accès SFTP/SCP, mais c'est pas forcément le plus simple (il faut créer des utilisateurs et s'assurer que ceux-ci n'ont accès qu'au partage) et surtout, je n'ai pas trouvé le moyen de brider le débit pour ne pas ralentir la connexion au quotidien (parce que quand l'upload est a fond, la navigation devient chiante).<br />
<br />
Je me suis donc tourné vers le bon vieux FTP, dans un premier temps en clair, puis ensuite en chiffré, à l'aide du simple mais efficace et sécurisé <a href="https://security.appspot.com/vsftpd.html">VsFTPd</a>. Il propose une gestion des utilisateurs anonyme qui convient très bien à mon usage : un utilisateur commun avec une liste de mots de passes valides (-> 1/personne) dans un fichier texte : c'est facile à maintenir.<br />
Pour le gestion des utilisateurs, c'est bon, il reste la gestion de la bande passante ; j'avais dans un premier temps pensé utiliser la directive "<a href="https://security.appspot.com/vsftpd/vsftpd_conf.html">anon_max_rate</a>" pour brider les anonymes .. le problème est qu'elle s'applique par connexion -> cela oblige à limiter l'accès au serveur à 1 connexion/client et 1 client. En plus, pour proposer le SSL explicite et implicite en IPv4 et IPv6, ce sont 4 instances du daemon qui tournent .. chacune ayant sa limitation .. Pas bon toussa.<br />
<br />
Je me dis qu'il y a bien un autre serveur qui proposera cette option, je retourne donc voir mes autres options :<br />
<ul><li><a href="http://www.proftpd.org/">ProFTPd</a> : configuration Apache-style qui me semble une usine à gaz, on oublie</li>
<li><a href="http://www.glftpd.org/">glFTPd</a> : semble presque abandonné, la gestion des utilisateurs ne me convient pas et semble prévue pour gérer du warez</li>
<li><a href="http://www.pureftpd.org/project/pure-ftpd">Pure-FTPd</a> : semble sympa, même si en mode virtuel il faut créer des utilisateurs dans une BDD spécifique, je vois une option "<span style="white-space: pre-wrap;"><a href="http://download.pureftpd.org/pub/pure-ftpd/doc/README">anonymousbandwidth</a>" sympa .. seulement en jetant un œil dans la <a href="http://download.pureftpd.org/pub/pure-ftpd/doc/FAQ">FAQ</a>, on y trouve</span><br />
<blockquote class="tr_bq"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;">* Global bandwidth limitation.<br />
-> How do I limit the *total* bandwidth for FTP?<br />
Pure-FTPd can limit bandwidth usage of every session. But limiting the total bandwidth is intentionally not implemented, because most operating systems already have very efficient algorithms to handle bandwidth throttling.</span></blockquote>Comme pour VsFTPd, la limitation est par session, et avec cette gestion des utilisateurs, c'est encore moins bon.</li>
</ul>Visiblement, un serveur simple avec une limitation globale de la BP ça n'existe pas, je décide donc de garder VsFTPD mais en suivant la méthode proposée par Pure-FTPd à base de TC (traffic control) pour limiter la BP.<br />
<ul></ul>Après une après-midi pour comprendre comment fonctionnent les QDisc, Class, Filter et pour ne pas casser le réglage qui semble exister par défaut (<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1</span>), j'ai enfin une limitation du débit qui fonctionne !<br />
<br />
En résumé, sur mon interface eth0 j'ai une qdisc htb qui me permet d'avoir 2 classes htb filles qui permettent une gestion du débit, l'une est à 100MBit/s (i.e. sans limite), par défaut, l'autre est bridée à 90kbps et accueillera les paquets selectionnés. Sous ces classes, je remet une gestion des priorités (dépendant du champ TOS) à l'aide de prio.<br />
<blockquote class="tr_bq"><pre class="prettyprint brush: text"> 1:0 htb envoi vers 1:1 par défaut
/ \
/ \
1:1 1:2 htb rate 100mbit et rate 90kbps
| |
10: 20:
(prio) (prio)
</pre></blockquote>Si j'ai compris, la racine de cet arbre est à la fois l'entrée et la sortie des paquets : le noyau les envoi puis ils sont rangés et ressortis des files par les différents moteurs selon les paramétrages (1:, 1:2, 20:, 1:2: 1:0 par exemple).<br />
<br />
Ensuite un filtre vient placer les paquets marqués par iptables dans la classe limitée ; ainsi, tout les paquets concernant le FTP (e/issl, ipv4/6) se retrouvent dans cette classe et partagent le même débit.<br />
<br />
Bref, fini les explications, voici les confs :<br />
<blockquote class="tr_bq"><pre class="prettyprint brush: text">[root@Pyxis vsftpd]# ls conf*
conf_ipv4_essl.conf conf_ipv4_issl.conf conf_ipv6_essl.conf conf_ipv6_issl.conf
[root@Pyxis vsftpd]# cat conf_ipv4_essl.conf
# Hey, Listen !
listen=YES
listen_ipv6=NO
implicit_ssl=NO
listen_port=21
#pasv_addr_resolve=no
pasv_address=78.232.184.204 #vela.lxdr.net
max_per_ip=4
max_clients=10
# Default
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
#
anonymous_enable=YES
local_enable=YES
local_umask=022
dirmessage_enable=YES
connect_from_port_20=YES
# Changes
banner_file=/etc/vsftpd/banner.txt
setproctitle_enable=YES
write_enable=NO
xferlog_enable=YES
dual_log_enable=YES
pasv_min_port=9800
pasv_max_port=9850
# Share
secure_email_list_enable=YES
#email_password_file=/etc/vsftpd/email_passwords
anon_root=/media/2t/Medias/
#anon_max_rate=87040
# SSL
ssl_enable=YES
#debug_ssl=YES
require_ssl_reuse=NO
#ssl_request_cert=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/vsftpd/wildcard.13x.fr.crt
rsa_private_key_file=/etc/vsftpd/wildcard.13x.fr.pem
allow_anon_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
#force_local_logins_ssl=YES
#force_local_data_ssl=YES
</pre></blockquote>Ensuite il suffit d'adapter pour chacune des instances :<br />
<blockquote class="tr_bq"><pre class="prettyprint brush: text">[root@Pyxis vsftpd]# diff conf_ipv4*
4,5c4,5
< implicit_ssl=NO
< listen_port=21
---
> implicit_ssl=YES
> listen_port=990
[root@Pyxis vsftpd]# diff conf_ipv4_essl.conf conf_ipv6_essl.conf
2,3c2,3
< listen=YES
< listen_ipv6=NO
---
> listen=NO
> listen_ipv6=YES
6,7d5
< #pasv_addr_resolve=no
< pasv_address=78.232.184.204 #vela.lxdr.net
</pre></blockquote>Avec une <a href="http://train.board8.com/ascii_det.php?id=1869">jolie</a> <a href="http://train.board8.com/ascii_det.php?id=134">banner</a> : <br />
<blockquote class="tr_bq"><span style="font-family: Courier New, Courier, monospace;">[root@Pyxis vsftpd]# cat banner.txt</span><br />
Hey, Listen !<br />
\\<br />
.........|''-,............................................,-''|<br />
.........|:.:.\........................................./:.:|<br />
.........'|:\:|:.\...................................../:\,/.|<br />
..........'|:.'-,:.\................................./:.\/:.'/<br />
...........\,,_\:.:\............................./-,:/,--:|...,-~~~~~~~~~-,<br />
.............'\,_\,-:'\........................./:./',,---/'...| .Look! Listen! |<br />
................''-,:\:.\.....,,--~~--,,...../:,-'_:.,-'.....'~-----,. . .,-----~'<br />
....................''-,\.\,-'':.. . . . ..:''-/,-/,,--'''...........,,-'. . ,-'<br />
....C201............'''',':.. . . . . . ..::','''............--''',,--~'''<br />
.........................;:.. . . . . . . ..::;.__<br />
...................,-~---',:. . . . . . ..::,''''.\:-,'''''/<br />
...................'--,/,,'-''-,,:. . . ..:,,-'.¯'''''~~'<br />
...............................¯'''''''''''''¯<br />
//</blockquote><br />
Et la configuration réseau :<br />
<blockquote class="tr_bq"><pre class="prettyprint brush: text">iptables -t mangle -A OUTPUT -p tcp --sport 20:21 -j MARK --set-mark 21
iptables -t mangle -A OUTPUT -p tcp --sport 990 -j MARK --set-mark 21
iptables -t mangle -A OUTPUT -p tcp --sport 9800:9850 -j MARK --set-mark 21
ip6tables -I INPUT 5 -p tcp --dport ftp -m state --state NEW -j ACCEPT
ip6tables -I INPUT 6 -p tcp --dport ftps -m state --state NEW -j ACCEPT
ip6tables -I INPUT 7 -p tcp --dport 9800:9850 -m state --state NEW -j ACCEPT
ip6tables -t mangle -A OUTPUT -p tcp --sport 20:21 -j MARK --set-mark 21
ip6tables -t mangle -A OUTPUT -p tcp --sport 990 -j MARK --set-mark 21
ip6tables -t mangle -A OUTPUT -p tcp --sport 9800:9850 -j MARK --set-mark 21
service iptables save
service ip6tables save
</pre></blockquote>Les paquets sont marqués, il reste à les filtrer :<br />
<blockquote class="tr_bq"><pre class="prettyprint brush: text">[root@Pyxis etc]# cat init.d/perso_ftp-throttling
#!/bin/sh
DEV=eth0
MAX=100mbit
FTP=90kbps
if [ $# -ne 1 ]; then
echo "Usage: "$0" (start|stop|status|monitor)"
exit 1
fi
case "$1" in
start)
echo "TC start dev $DEV"
# QDisc HTB principal, par défaut la sous classe 1 est utilisée
tc qdisc add dev $DEV root handle 13:0 htb default 1
# Ses classes, permettant de brider le débit
tc class add dev $DEV parent 13:0 classid 13:1 htb rate $MAX
tc class add dev $DEV parent 13:0 classid 13:2 htb rate $FTP
# Et on conserve les prio en fonction du TOS
tc qdisc add dev $DEV parent 13:1 handle 131 prio
tc qdisc add dev $DEV parent 13:2 handle 132 prio
# Les flux FTP marqués (21) sortants sont envoyés dans la classe 2 qui bride
tc filter add dev $DEV parent 13: protocol ip handle 21 fw classid 13:2
tc filter add dev $DEV parent 13: protocol ipv6 handle 21 fw classid 13:2
# Marquage des flux, table mangle (utilisée pour l'alteration des paquets)
#iptables -t mangle -A OUTPUT -p tcp --sport 20:21 -j MARK --set-mark 21
#iptables -t mangle -A OUTPUT -p tcp --sport 990 -j MARK --set-mark 21
#iptables -t mangle -A OUTPUT -p tcp --sport 9800:9850 -j MARK --set-mark 21
#ip6tables -I INPUT 5 -p tcp --dport ftp -m state --state NEW -j ACCEPT
#ip6tables -I INPUT 6 -p tcp --dport ftps -m state --state NEW -j ACCEPT
#ip6tables -I INPUT 7 -p tcp --dport 9800:9850 -m state --state NEW -j ACCEPT
#ip6tables -t mangle -A OUTPUT -p tcp --sport 20:21 -j MARK --set-mark 21
#ip6tables -t mangle -A OUTPUT -p tcp --sport 990 -j MARK --set-mark 21
#ip6tables -t mangle -A OUTPUT -p tcp --sport 9800:9850 -j MARK --set-mark 21
;;
status)
echo -e "\\tTC status dev $DEV"
echo
tc qdisc show dev $DEV
tc class show dev $DEV
tc filter show dev $DEV
;;
monitor)
CMD="
echo -e \\\t\\\tTC dev $DEV;
echo -e \\\tQDisk;
tc -s qdisc show dev $DEV;
echo;
echo -e \\\tClass;
tc -s class show dev $DEV
"
watch -n1 "$CMD"
;;
stop)
echo "TC stop dev $DEV"
tc qdisc del dev $DEV root
;;
*)
echo "Usage: "$0" (start|stop|status|monitor)"
exit 1
;;
esac
exit 0
</pre></blockquote><br />
<blockquote class="tr_bq"><pre class="prettyprint brush: text">[root@Pyxis etc]# cat rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
/etc/init.d/perso_ftp-throttling start
</pre></blockquote>Voila !<br />
<br />
Oh j'ai failli oublier, une anecdote et des liens utiles, plein :<br />
<blockquote>VRRP, c'est bien mais pas que : <br />
0-1024 -> 192.168.0.240 (ip virtuelle vrrp)<br />
9000-9999 -> 192.168.0.9 (ip réelle)<br />
<br />
Connexion au FTP, port 21 = utilisation de l'IP virtuelle pour arriver dessus<br />
<br />
vsftpd, je lui dis pas quelle est mon IP externe, c'est le NAT de la box qui s'amuse a trafiquer ça dans les paquets pour que le mode passif fonctionne (Passive Mode (192,168,0,240,37,251) -> Passive Mode (78,232,184,204,37,251)) ; mais en SSL, la box ne peut plus toucher aux paquets et alors forcément ça foire en passif.<br />
<br />
Donc je met pasv_address=78.232.184.204, comme ça vsftpd donne bien directement l'ip externe (la box n'a plus à toucher), le client se connecte port 21 (->0.240), demande a passer en passif (port 9xxx -> 0.9) et comme vsftpd s'attend a recevoir la connexion passive sur l'interface 0.240 (comme les commandes), mais que les ports 9xxx vont vers l'ip réelle 0.9, ben ça foire :)<br />
<br />
Bref, maintenant tout fonctionne (et vivement que le NAT saute avec IPv6).</blockquote><br />
<a href="http://linux-ip.net/articles/Traffic-Control-HOWTO/">http://linux-ip.net/articles/Traffic-Control-HOWTO/</a><br />
<a href="http://www.linuxembedded.fr/2011/06/utiliser-tc-pour-optimiser-lupload/">http://www.linuxembedded.fr/2011/06/utiliser-tc-pour-optimiser-lupload/</a><br />
<a href="http://www.cyberciti.biz/faq/linux-traffic-shaping-ftp-server-port-21-22/">http://www.cyberciti.biz/faq/linux-traffic-shaping-ftp-server-port-21-22/</a><br />
<a href="http://mirrors.bieringer.de/Linux+IPv6-HOWTO/x2523.html">http://mirrors.bieringer.de/Linux+IPv6-HOWTO/x2523.html</a><br />
<a href="http://download.pureftpd.org/pub/pure-ftpd/doc/FAQ">http://download.pureftpd.org/pub/pure-ftpd/doc/FAQ</a> * Global bandwidth limitation.<br />
<br />
<a href="http://sys-log.bencane.com/2012/07/tc-adding-simulated-network-latency-to-your-linux-server/">http://sys-log.bencane.com/2012/07/tc-adding-simulated-network-latency-to-your-linux-server/</a><br />
<a href="http://www.linuxfoundation.org/collaborate/workgroups/networking/netem">http://www.linuxfoundation.org/collaborate/workgroups/networking/netem</a><br />
<br />
<a href="http://lartc.org/howto/lartc.qdisc.filters.html">http://lartc.org/howto/lartc.qdisc.filters.html</a><br />
<a href="http://www.inetdoc.net/guides/lartc/">http://www.inetdoc.net/guides/lartc/</a><br />
<br />
<a href="http://linux-ip.net/articles/Traffic-Control-HOWTO/classful-qdiscs.html">http://linux-ip.net/articles/Traffic-Control-HOWTO/classful-qdiscs.html</a><br />
htb hfsc prio cbq<br />
pfifo, bfifo, pfifo_fast, sfq, esfq, gred, tbf<br />
drr, red<br />
<br />
<a href="http://www.inetdoc.net/guides/lartc/lartc.cookbook.ultimate-tc.html">http://www.inetdoc.net/guides/lartc/lartc.cookbook.ultimate-tc.html</a><br />
<a href="http://www.inetdoc.net/guides/lartc/lartc.qdisc.html">http://www.inetdoc.net/guides/lartc/lartc.qdisc.html</a><br />
<a href="http://www.inetdoc.net/guides/lartc/lartc.qdisc.classful.html">http://www.inetdoc.net/guides/lartc/lartc.qdisc.classful.html</a><br />
<a href="http://www.inetdoc.net/guides/lartc/lartc.cookbook.icmp-ratelimit.html">http://www.inetdoc.net/guides/lartc/lartc.cookbook.icmp-ratelimit.html</a><br />
<a href="http://www.inetdoc.net/guides/lartc/lartc.qdisc.filters.html">http://www.inetdoc.net/guides/lartc/lartc.qdisc.filters.html</a><br />
<a href="http://opalsoft.net/qos/DS.htm">http://opalsoft.net/qos/DS.htm</a> Linux Queuing Disciplines<br />
<br />
<a href="http://linuxfr.org/wiki/Une-introduction-au-contr%C3%B4le-du-trafic-r%C3%A9seau-avec-Linux">http://linuxfr.org/wiki/Une-introduction-au-contrôle-du-trafic-réseau-avec-Linux</a><br />
<a href="http://www.cyberciti.biz/faq/linux-traffic-shaping-ftp-server-port-21-22/">http://www.cyberciti.biz/faq/linux-traffic-shaping-ftp-server-port-21-22/</a><br />
<a href="http://www.linuxembedded.fr/2011/06/utiliser-tc-pour-optimiser-lupload/">http://www.linuxembedded.fr/2011/06/utiliser-tc-pour-optimiser-lupload/</a><br />
<br />
<a href="http://linuxmanpages.net/manpages/fedora14/man8/tc.8.html">http://linuxmanpages.net/manpages/fedora14/man8/tc.8.html</a><br />
<a href="http://linuxmanpages.net/manpages/fedora14/man8/tc-prio.8.html">http://linuxmanpages.net/manpages/fedora14/man8/tc-prio.8.html</a><br />
<br />
<a href="http://mirrors.bieringer.de/Linux+IPv6-HOWTO/x2523.html">http://mirrors.bieringer.de/Linux+IPv6-HOWTO/x2523.html</a><br />
<a href="http://linuxfr.org/wiki/pages?page=6">http://linuxfr.org/wiki/pages?page=6</a><br />
<a href="http://linuxfr.org/wiki/Exemple-de-script-pour-de-la-QoS">http://linuxfr.org/wiki/Exemple-de-script-pour-de-la-QoS</a><br />
<a href="http://wiki.openwrt.org/doc/howto/packet.scheduler/packet.scheduler">http://wiki.openwrt.org/doc/howto/packet.scheduler/packet.scheduler</a><br />
<br />
<br />
<div></div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-4126564442997921506.post-20075520850965413332012-02-08T22:11:00.000+01:002012-02-08T22:11:14.243+01:00Statistiques sur les SMS AndroidIl y a quelques jours, je me suis "amusé" à faire des statistiques sur la fréquence des échanges par sms avec une personne, voici donc comment je m'y suis pris.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsJ7_q4G0vTW8HbOAtnN9IFf9u7FbOIvjSZMA3gILUEoA1wCZIlPaD71nJkXkzPzok2f-vE1bSMLcL_XldnTX7jw6Vdc5Bj57kpl3eusJH8LuMbhO1UtkUpkO5_agMDWDU59xhnKnNHRg/s1600/tmp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsJ7_q4G0vTW8HbOAtnN9IFf9u7FbOIvjSZMA3gILUEoA1wCZIlPaD71nJkXkzPzok2f-vE1bSMLcL_XldnTX7jw6Vdc5Bj57kpl3eusJH8LuMbhO1UtkUpkO5_agMDWDU59xhnKnNHRg/s400/tmp.png" width="400" /></a></div>
<br />
En premier, il faut localiser la base contenant les SMS : il s'agit d'une base unique à toutes les applications, en cherchant un peu on a trouve à cet emplacement :<br />
<br />
<span style="font-family: 'Courier New', Courier, monospace;">/data/data/com.android.providers.telephony/databases/mmssms.db</span><br />
<br />
Maintenant, 2 choix : travailler directement dessus ou sur une copie. J'avais d'abord pensé récupérer la base mmssms.db pour la lire avec un logiciel tel que ou , mais la version utilisée par Android semble plus récente et ils n'ont pas réussis à ouvrir la base, j'ai donc fait un dump en utilisant sqlite3 du téléphone (.dump), puis j'ai importé ce dump dans une nouvelle base pour utiliser ces résultats plus facilement.<br />
<br />
On peut lire la base, c'est ensuite assez simple, une requête pour connaitre le nombre de sms reçu et une autre pour le nombre de sms émis par jour :<br />
<br />
<span style="font-family: 'Courier New', Courier, monospace;">select date(date/1000,'unixepoch'), count(*) from sms where address = "<i><TEL></i>" and person is not null group by date(date/1000,'unixepoch') order by _id asc;</span><span style="font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">select date(date/1000,'unixepoch'), count(*) from sms where address = "<i><TEL></i>" and person is null group by date(date/1000,'unixepoch') order by _id asc;</span><br />
<br />
Explications :<br />
<ul>
<li>on selectionne la date et le nombre d'enregistrements concernés par ce groupement, depuis la table sms</li>
<li>on selectionne l'interlocuteur (address) et : person est null pour les sms envoyés, c'est un nombre sinon</li>
<li>la date est au format timestamp unix ("unixepoch"), mais en millisecondes, il faut les retirer pour les traiter avec les fonctions SQLite (/1000)</li>
<li>on groupe les résultat par date identique (group by)</li>
</ul>
Le résultat nous donne le nombre de sms jour par jour, il suffit ensuite d'importer ces colonnes dans un excel (en bataillant un peu avec le type des données dans les dernières versions), de faire un petit graphe et voila :).Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-4126564442997921506.post-64635821636032926202010-12-18T15:18:00.004+01:002010-12-18T22:07:27.079+01:00Lecteur de SmartCards : KorriGo, Navigo, Carte Vitale, CB, ...<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYGYmWQoK2mD61Onv-B2s8OxWgoH2pLcewWgq_bpVBDEjGSwG1s8sbQsgWAxYQlJ0ysj1R0InfoD8C_CH31KfgHkhi5sA5EuQYCzLBe5BlNim7XK9FqjimTGEZ6V4qNqsKBza3XX9ONPk/s1600/sample-emv%255B1%255D.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYGYmWQoK2mD61Onv-B2s8OxWgoH2pLcewWgq_bpVBDEjGSwG1s8sbQsgWAxYQlJ0ysj1R0InfoD8C_CH31KfgHkhi5sA5EuQYCzLBe5BlNim7XK9FqjimTGEZ6V4qNqsKBza3XX9ONPk/s200/sample-emv%255B1%255D.jpg" width="200" /></a></div>
Il y a quelques jours, j'ai acheté un lecteur de Smartcards <a href="http://fr.wikipedia.org/wiki/KorriGo">KorriGo</a>, en partie car il permet de recharger sa carte en ligne, mais aussi par curiosité. Il s'agit d'un lecteur <a href="http://www.teobyxiring.com/ecommerce/?page_id=9">Teo by RIXING</a>, vendu 8€ (soit le prix proposé par le constructeur). La RATP <a href="http://fasmz.org/~pterjan/blog/?date=20091130">propose</a> (ou proposait) aussi <a href="http://support.gemalto.com/?id=46">un lecteur</a> au même prix.<br />
<br />
Pour le fonctionnement de ces smartcards (carte Navigo/KorriGo, carte sim, carte de décodeur, carte vitale, carte bleu, ...), je vous renvoi vers l'<a href="http://fr.wikipedia.org/wiki/Carte_%C3%A0_puce">article Wikipédia</a> en question et <a href="http://www.faqs.org/docs/Linux-HOWTO/Smart-Card-HOWTO.html">ce "How-To"</a>.<br />
<br />
Après quelques recherches (et des tentatives avec des packages "muscle"), j'ai finalement trouvé le logiciel <a href="http://code.google.com/p/cardpeek/">CardPeek</a> (utilisé sous Ubuntu; il faut probablement rajouter le paquet pcscd pour qu'il fonctionne), qui permet de lire et d'interpréter une partie du contenu des <a href="http://code.google.com/p/cardpeek/wiki/emv_FR">cartes monétaires</a>, cartes Monéo, cartes vitales et cartes de type <a href="http://en.wikipedia.org/wiki/Calypso_(electronic_ticketing_system)">Calypso</a>, telles que <a href="http://code.google.com/p/cardpeek/wiki/Navigo_FR">Navigo</a> et KorriGo. Pas forcément très utile, mais ça a satisfait ma curiosité :).<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDdEY_l8H7WPsjJZxeohtjFtUU83DLrS0aO7Erak-aYTLBALl0HR_F1LpuY9VdcVVS1GwbaO6Mz7EHybFxN1yz4rUGWg6aQx9z8UhrcqgIBOttdPUjJbyrUipC83hldjpstXMw41qjfUg/s1600/sample-navigo%255B1%255D.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="187" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDdEY_l8H7WPsjJZxeohtjFtUU83DLrS0aO7Erak-aYTLBALl0HR_F1LpuY9VdcVVS1GwbaO6Mz7EHybFxN1yz4rUGWg6aQx9z8UhrcqgIBOttdPUjJbyrUipC83hldjpstXMw41qjfUg/s320/sample-navigo%255B1%255D.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Informations contenues dans les cartes type Calypso</td></tr>
</tbody></table>
A titre d'information, voici donc les différents contenus qu'on peut retrouver dans les cartes (du moins, ceux que CardPeek sait interpréter) :<br />
<ul>
<li><b>KorriGo</b> : id de la carte, information sur l'abonnement (création [agent, date, appareil], zone, dates), des listes de contrats (abonnements ?), des listes d'évènements spéciaux (?), les 6 derniers "compostages" (horodatage, type [entrée train], fournisseur [SNCF], lieu, contrat utilisé, id réseau), informations a propos de la carte (id réseau [France], date de validité, date de naissance du détenteur, et probablement aussi nom/prénom [non parsé par CardPeek]).</li>
<li><b>Navigo</b> : id de la carte, information sur l'abonnement (création [agent, date, appareil], zone, dates), les 3 derniers "compostages" (horodatage, type [entrée metro], fournisseur [RATP], lieu, appareil, route, contrat utilisé), informations a propos de la carte (id réseau [France], date de validité, et probablement aussi nom/prénom.</li>
<li><b>Carte Vitale</b> : nom, prénom, date de naissance, numéro de sécurité sociale, photo (supposé, chiffrée), nationalité, date de validité, et probablement d'autres infos non parsées.</li>
<li><b>Carte bleu (EMV)</b> : un historique assez important des dernières transactions (35, avec montant, pays, devise, date), langue préférée, pays, la liste des usages (CB, Visa, Moneo), date de création/expiration, numéro de la carte, nom/prénom (ou initiale)/genre du détenteur, le nombre d'essais restant;</li>
<li><b>Carte Moneo</b> : pour le moment, des données brutes.</li>
</ul>
J'ai aussi <a href="http://en.wikipedia.org/wiki/List_of_smart_cards">découvert</a> que certains pays comme la Belgique semblent utiliser ce type de carte comme carte d'identité, ça semble plutôt sympa (et ça doit ouvrir des possibilités sur les services en ligne). Après il y a les histoires de vie privée, notamment car certaines de ces cartes peuvent <a href="http://fr.wikipedia.org/wiki/Near_Field_Communication">communiquer sans contact</a> (<a href="http://fr.wikipedia.org/wiki/RFID">apparenté</a>, <a href="http://www.differencebetween.net/technology/difference-between-rfid-and-nfc/">différences</a>).<br />
Bref.<br />
<br />
Pour finir, quelques liens divers que je n'ai pas pu caser dans l'article (utilisation pour authentification ?) :<br />
<a href="http://forums.gentoo.org/viewtopic-t-361844-start-0.html">http://forums.gentoo.org/viewtopic-t-361844-start-0.html</a><br />
<a href="http://www.openscdp.org/scripts/musclecard/index.html">http://www.openscdp.org/scripts/musclecard/index.html</a><br />
<br />
Nb : tout les liens de cet articles sont uniques ;)Unknownnoreply@blogger.com7tag:blogger.com,1999:blog-4126564442997921506.post-50875407754681092642010-11-09T19:10:00.000+01:002010-11-09T19:10:39.574+01:00Connexion pair-à-pair "Réseau non identifié" dans Windows 7Il semble que Windows 7 supporte assez mal les réseaux pair-à-pair (ie. relier 2 PC directement via un câble) : le type de réseau n'est pas détecté ("Réseau non identifié"), il prend donc sa valeur par défaut c'est-à-dire Public ... et ce n'est pas modifiable !<br />
Il en résulte que le partage de fichier ou même la réponse au ping sont désactivés sur cette interface réseau.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFIxmMqomclf27UjAx-a5yaNILRIYOTY-5qCaSyhV69z47VoSpFU0-wJzqFOHVNi-EH65WTbtfysUmNYsW5uhECyUZRaR7dw8JrLoidbPNk1sB0z9ZqaE575kxx1VGm2P9_DyapwhRbIE/s1600/tmp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFIxmMqomclf27UjAx-a5yaNILRIYOTY-5qCaSyhV69z47VoSpFU0-wJzqFOHVNi-EH65WTbtfysUmNYsW5uhECyUZRaR7dw8JrLoidbPNk1sB0z9ZqaE575kxx1VGm2P9_DyapwhRbIE/s1600/tmp.png" /></a></div>
<br />
<a name='more'></a>Il existe plusieurs solutions (de la plus simple à la moins simple) :<br />
<ul>
<li>configurer une passerelle, en mettant l'IP de l'autre PC connecté à l'interface.<br />Exemple : <br /><blockquote>
PC 1 (win7) : IP: 192.168.1.11 Masque: 255.255.255.0 Passerelle: 192.168.1.12<br />
PC 2 (ubuntu) : IP: 192.168.1.12 Masque: 255.255.255.0 Passerelle: inutile</blockquote>
Cette solution fonctionne bien, mais dans mon cas, le réseau se dédouble alors, en laissant un "Réseau non identifié" sur la même interface. Pas bien grave.</li>
<li>éditer les Paramètres de sécurité via gpedit.msc
<ul>
<li>exécuter gpedit.msc</li>
<li>naviguer vers Stratégie Ordinateur local > Configuration Ordinateur > Paramètres Windows > Paramètres de sécurité > Stratégie du gestionnaire de liste de réseau</li>
<li>éditer "Réseaux non identifiés" pour changer le type d'emplacement par "Privé" ("Autorisations des utilisateurs" ne semble pas agir)</li>
</ul>
Vous l'aurez compris, tout les réseaux non identifiés seront maintenant considérés comme réseau de confiance, ce qui n'est pas vraiment l'idéal niveau sécurité.</li>
<li>utiliser un script PowerShell, voir <a href="http://blogs.msdn.com/b/dimeby8/archive/2009/06/10/change-unidentified-network-from-public-to-work-in-windows-7.aspx">http://blogs.msdn.com/b/dimeby8/archive/2009/06/10/change-unidentified-network-from-public-to-work-in-windows-7.aspx</a></li>
</ul>
Sources :<br />
<a href="http://social.technet.microsoft.com/Forums/en/w7itpronetworking/thread/878f7c4f-f287-4c75-a708-a2097f931435">http://social.technet.microsoft.com/Forums/en/w7itpronetworking/thread/878f7c4f-f287-4c75-a708-a2097f931435</a><br />
<a href="http://www.tomshardware.com/forum/215-63-change-network-type">http://www.tomshardware.com/forum/215-63-change-network-type</a><br />
<a href="http://blogs.msdn.com/b/dimeby8/archive/2009/06/10/change-unidentified-network-from-public-to-work-in-windows-7.aspx">http://blogs.msdn.com/b/dimeby8/archive/2009/06/10/change-unidentified-network-from-public-to-work-in-windows-7.aspx</a>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-4126564442997921506.post-14472229059643193292010-11-09T16:26:00.003+01:002010-11-10T02:33:52.477+01:00Petites astuces pour BloggerBlogger n'est pas parfait, mais quand on ne dispose pas d'un hébergement correct (@home) ou qui ne permet pas d'utiliser un sous domaine sans devoir importer tout le domaine (1&1 ..), qu'on veut utiliser son domaine perso et qu'on veut avoir des articles dédiés a plus d'un élément (Tumblr&co), il peut faire l'affaire.<br />
<br />
Les thèmes maintenant proposés par défaut ne sont pas trop moches, on peut se servir d'un template comme base pour arriver a un résultat correct, mais il reste toujours la navbar et dans le cas d'un blog un minimum technique, il faut une coloration syntaxique.<br />
<br />
<a name='more'></a>Après quelques recherches, les 2 sont faisable, et même plus, puisque j'obtiens une navbar qui ne s'affiche que pour l'administrateur du site, plutôt utile :)<br />
<br />
Bref, voici les bouts de code utilisés :<br />
<br />
<u>Navbar seulement pour l'admin & suppression des boutons pour modifier les widgets</u><br />
CSS :
<br />
<pre class="prettyprint lang-css brush: css">.navbar {
display: none;
}
.quickedit {
display: none;
}
</pre>
HTML (justes après <body..>) :
<br />
<pre class="prettyprint lang-html brush: js"><script type='text/javascript'>
navbar = document.getElementById('navbar');
navbar.className += ' blog-admin';
</script>
</pre>
<br />
<u><a href="http://code.google.com/p/google-code-prettify/">Prettify</a></u><br />
HTML (vers la fin de la page) :
<br />
<pre class="prettyprint lang-html brush: js"><link href='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css' rel='stylesheet' type='text/css'/>
<script src='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js' type='text/javascript'/>
<script type='text/javascript'>
addEventListener('load', function (event) { prettyPrint() }, false);
</script>
</pre>
<u><a href="http://alexgorbatchev.com/SyntaxHighlighter/">SyntaxHighlighter</a></u><br />
CSS :
<br />
<pre class="prettyprint lang-css brush: css">pre {
margin-left: 10px;
margin-top: 0.7em;
margin-bottom: 0.7em;
}
.syntaxhighlighter {
margin-top: 0.7em;
margin-bottom: 0.7em;
}
.syntaxhighlighter .gutter .line {
margin-right: 3px;
}
</pre>
HTML (vers la fin de la page) :
<br />
<pre class="prettyprint lang-html brush: js"><link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'/>
<script type='text/javascript'>
function path()
{
var args = arguments,
result = []
;
for(var i = 0; i < args.length; i++)
result.push(args[i].replace('@', 'http://alexgorbatchev.com/pub/sh/current/scripts/'));
return result
};
SyntaxHighlighter.autoloader.apply(null, path(
'applescript @shBrushAppleScript.js',
'actionscript3 as3 @shBrushAS3.js',
'bash shell @shBrushBash.js',
'coldfusion cf @shBrushColdFusion.js',
'cpp c @shBrushCpp.js',
'c# c-sharp csharp @shBrushCSharp.js',
'css @shBrushCss.js',
'delphi pascal @shBrushDelphi.js',
'diff patch pas @shBrushDiff.js',
'erl erlang @shBrushErlang.js',
'groovy @shBrushGroovy.js',
'java @shBrushJava.js',
'jfx javafx @shBrushJavaFX.js',
'js jscript javascript @shBrushJScript.js',
'perl pl @shBrushPerl.js',
'php @shBrushPhp.js',
'text plain @shBrushPlain.js',
'py python @shBrushPython.js',
'ruby rails ror rb @shBrushRuby.js',
'sass scss @shBrushSass.js',
'scala @shBrushScala.js',
'sql @shBrushSql.js',
'vb vbnet @shBrushVb.js',
'xml xhtml xslt html @shBrushXml.js'
));
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.defaults['smart-tabs'] = false;
SyntaxHighlighter.defaults['tab-size'] = 2;
SyntaxHighlighter.defaults['toolbar'] = false;
SyntaxHighlighter.all();
</script>
</pre>
<br />
Autre petites modifications dans le template :<br />
<ul>
<li>suppression des liens pour les flux sous les articles (widget a la place), on retire cet include :<br /><pre class="prettyprint lang-html brush: html"><b:include name="feedLinks"></b:include></pre>
</li>
<li>suppression du lien "Accueil" (même emplacement), on retire cette ligne :<br />
<pre class="prettyprint lang-html brush:html"><a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a></pre>
</li>
</ul>
<br />
J'espère que cela pourra vous être utile :)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4126564442997921506.post-70886144912670117042010-11-06T21:16:00.007+01:002010-11-10T02:18:39.408+01:00Ubuntu 10.10 (Maverick), Samba 3.5.4 et Windows 7<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQZmPbh75NwTcnRiqXzYd7Mv90-3tQDc8Du3niwW69SOPXqLIISrynhrz5AWQ4x99lrY3oeFZjRlIS0rPeIOj_7IbCTyFfAAvKv0ePQXPM9NyDo8zQ97Oe_aX1GI6a8_5a6vOdpe0l2MQ/s1600/samba.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="153" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQZmPbh75NwTcnRiqXzYd7Mv90-3tQDc8Du3niwW69SOPXqLIISrynhrz5AWQ4x99lrY3oeFZjRlIS0rPeIOj_7IbCTyFfAAvKv0ePQXPM9NyDo8zQ97Oe_aX1GI6a8_5a6vOdpe0l2MQ/s200/samba.png" width="200" /></a></div>
Ubuntu permet grâce à Samba d'accéder aux fichiers partagés sur un poste Windows, seulement si on rajoute Windows Live Sign-in Assistant a Windows 7, Samba ne gère alors plus correctement la négociation de la sécurité et n'arrive pas à s'authentifier et accéder aux fichiers alors qu'ils sont publiques. <a href="http://social.technet.microsoft.com/Forums/en/w7itproappcompat/thread/e4fc6ba5-968e-4370-8a5c-680db85d326c">Plus d'informations ici.</a><br />
<br />
Ce bug a été corrigé dans la version 3.5.6 de Samba (le code <a href="https://bugzilla.samba.org/show_bug.cgi?id=7577">a été corrigé</a> avant la 3.5.5, mais il semble qu'elle ne soit qu'une release de sécurité), cependant elle n'est pas encore proposée pour Ubuntu 10.10 (ni même la 3.5.5 apparemment), voici donc un petit workaround pour ceux qui souhaitent à la fois conserver cet assistant (ou qui ne peuvent le retirer, du moins pas simplement, comme dans Windows Live 2011) et accéder a leurs fichiers.<br />
<br />
On peut trouver une version compilée de Samba 3.5.6 <a href="https://launchpad.net/ubuntu/+source/samba/2:3.5.6~dfsg-1ubuntu1/+build/2003956">ici</a> et c'est donc ce que j'ai utilisé (j'imagine que pour la version 64bits <a href="https://launchpad.net/ubuntu/+source/samba/2:3.5.6~dfsg-1ubuntu1/+build/2003954">ce lien</a> fonctionnera de la même façon).<br />
Les fichiers à récupérer pour la fonction client sont :<br />
<pre class="prettyprint brush: text">libsmbclient_3.5.6~dfsg-1ubuntu1_i386.deb
libwbclient0_3.5.6~dfsg-1ubuntu1_i386.deb
winbind_3.5.6~dfsg-1ubuntu1_i386.deb
samba-common_3.5.6~dfsg-1ubuntu1_all.deb
samba-common-bin_3.5.6~dfsg-1ubuntu1_i386.deb
smbclient_3.5.6~dfsg-1ubuntu1_i386.deb
</pre>
et pour pouvoir servir de serveur (non installé par défaut), il faut rajouter<br />
<pre class="prettyprint brush: text">samba_3.5.6~dfsg-1ubuntu1_i386.deb
</pre>
Puis on installe tout cela avec<br />
<pre class="prettyprint lang-sh brush: shell">dpkg -i <paquet></pre>
qui bronchera un peu moins à propos de dépendances cassées (temporairement), en commençant par les libs et winbind qui seront requises par les autres paquets. L'ordre des fichiers donné plus haut devrait être bon.<br />
Un redémarrage est peut-être nécessaire.<br />
On peut peut-être faire ça un peu plus proprement, mais je ne connais pas assez le système de paquet Ubuntu pour ça.<br />
<br />
Et voilà, vous vous retrouvez normalement avec la version 3.5.6 de Samba, qui ne pose plus de problèmes avec Windows 7 et son assistant :).Unknownnoreply@blogger.com5tag:blogger.com,1999:blog-4126564442997921506.post-80663370109205510202009-03-21T20:55:00.022+01:002016-09-29T23:45:36.423+02:00Boot sur OpenGate et débuts sous OpenBSD<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu67FVO5OANd0rb3JMU3DNz9q5PjXustymVmi2vezL5I241stQR04AwlMExPKxGN0u-qT4YjrcXQZ7z2QureEsZeOJuKz3LnUG49EFVc8tFMt_oePhMstffxQxNVaH5GEK938NT2iXLL0/s1600/opengate_3d-300x233%5B1%5D.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="155" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu67FVO5OANd0rb3JMU3DNz9q5PjXustymVmi2vezL5I241stQR04AwlMExPKxGN0u-qT4YjrcXQZ7z2QureEsZeOJuKz3LnUG49EFVc8tFMt_oePhMstffxQxNVaH5GEK938NT2iXLL0/s200/opengate_3d-300x233%5B1%5D.png" width="200" /></a></div>On m'a donné il y a plusieurs mois une OpenGate — un mini PC, projet de Neuf — qui était restée dans son carton.<br />
J'ai souhaité la ressortir pour faire mes premiers vrai pas dans le monde « unix », mais il s'est averé que l'OS présent, destiné aux débutants, empêchait toutes modifications du système.<br />
Devant le grand nombre de distributions linux, je me suis tourné vers les *BSD découvertes un peu avant. C'est OpenBSD qui sera choisie :).<br />
<br />
Cette OpenGate ne contenant qu'une mémoire flash de 512Mb comme disque dur, j'ai voulu installer le système sur une clé USB (qui pourrait en plus être transportable).<br />
<br />
<a name='more'></a><h2>Une clé USB Bootable</h2><br />
Le problème que j'ai rencontré, c'est que l'OpenGate ne supporte que des partitions de type DOS (?) pour pouvoir démarrer sur la clé USB; si une partition d'un autre type est active, le gate se freeze sur le logo du BIOS.<br />
Cela pose donc probleme pour pouvoir lancer une clé usb contenant un ArchLinux, ou encore une clé usb ayant un système sur une partition non DOS installé.<br />
<br />
Il faut donc faire appel à une partition DOS et un bootloader pour régler le problème.<br />
Dans mon cas, une partition de 32Mo (me permettant d'ajouter des outils comme Memtest, memdisk, cdrom44.fs (from cdemu44.iso - pour OpenBSD), et des fond d'écran), contenant un Grub.<br />
<br />
Ensuite après avoir installé le système voulu, il reste à modifier le Menu.lst pout y ajouter le système; pour OpenBSD c'est : <br />
<pre class="prettyprint brush: erl">title OpenBSD USB
root (hd0,3,a)
chainloader +1</pre>Il existe bien une commande Grub pour les noyaux BSD, mais ça semble ne pas fonctionner; le bootloader OpenBSD semble s'y retrouver tout seul dans les disques :).<br />
<h2>Le système</h2><br />
En utilisant un autre PC et le CD OpenBSD, l'installation se fait de mémoire sans problème.<br />
Mais il reste à régler un problème : le fstab, qui contient la liste (fixe) des partitions à monter (dynamique, selon le système).<br />
Pour cela, j'ai fais une modification du <em>/etc/rc</em>, après <strong>swapctl -A -t blk</strong>, j'ai ajouté : <br />
<pre class="prettyprint lang-sh brush: shell">#Perso
#Mount RamFS (2Mo) in /etc/ramfs
mount_mfs -s 4536 -m 0 swap /etc/ramfs 2>/dev/null >/dev/null
#Make fstab
hd=$(dmesg | awk '/root on/{ print $3 }' | sed -e "s/a//" | tail -n 1)
sed -e "s/USB_/${hd}/" /etc/fstab.ref > /etc/ramfs/fstab
#Perso</pre>et remplacé <strong>umount -a >/dev/null 2>&1</strong> par <strong>umount -a -t nomfs >/dev/null 2>&1</strong> pour empêcher de démonter la partition en RAM.<br />
Cela créé donc une partition en RAM de 8Mo (?), pour avoir une partition "writable", qui sera montée dans <em>/etc/ramfs</em>, et récupère dans le log dmesg le disque sur lequel le système a booté jusque la, pour remplacer dans le fstab de référence le mot "USB\_" par ce disque.<br />
Il faut donc aussi : <br />
<ul><li>créer <em>/etc/ramfs/</em> et y placer une copie du <em>fstab</em> actuel (au cas où le montage rate)</li>
<li>renommer <em>fstab</em> en <em>fstab.ref</em> et y ajouter "USB\_" où cela est necessaire</li>
<li>créer un lien symbolique de <em>/etc/fstab</em> vers <em>/etc/ramfs/fstab</em></li>
</ul><br />
La clé USB peut normalement maintenant booter n'importe où :).<br />
<br />
Pour avoir une interface graphique, on peut créer un <em>/etc/rc.conf.local</em> contenant <br />
<pre class="prettyprint brush: erl">xdm_flags=""</pre>etc ...<br />
<h2>Les problèmes</h2><ul><li>la clé usb : je me suis rendu compte en voulant me servir un peu de cette OpenBSD qu'extraire une archive contenant plein de fichiers (source de x11vnc, l'archive des ports) était très long, et peut mener au plantage du système après plusieurs heures ; j'imagine que c'est du à la clé usb ..</li>
<li>j'ai d'abord tenté d'installer une FreeBSD (qui m'attirait plus), mais le temps du chargement du kernel est très long (pour la version 7.1 en tout cas), beaucoup moins avec OpenBSD, même si cette étape peut bloquer quelques minutes, ou pas si j'appuis sur une touche (??).</li>
</ul><h2>Les bidouillages</h2><br />
<h3>Utiliser X11VNC comme "écran"</h3><br />
Il faut installer X11VNC et ajouter vers la fin de <em>/etc/X11/xdm/Xsetup_0</em> : <br />
<pre class="prettyprint brush: shell">/usr/local/bin/x11vnc -forever -bg -o /var/log/x11vnc.log</pre>ou même : <br />
<pre class="prettyprint brush: shell">/usr/local/bin/x11vnc -forever -gone 'dtaction LockDisplay' -passwd <pass> -ncache -http -bg -o /var/log/x11vnc.log</pre>qui ajoute :<br />
<ul><li>gone 'dtaction LockDisplay' ne fonctionne pas, à verifier</li>
<li>passwd <pass> : defini un pass pour l'accès</li>
<li>ncache : créé un cache des zones de l'écran, peut gêner selon les viewers</li>
<li>http : si la version le permet, créé un serveur web (port 5800 ?) avec une page web contenant un viewer en java</li>
</ul><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6L4mGwqaYNjTF3GQ7N7Kbhv_3MAcylpYhgPtK2BymKkXzT4olC5Jqtg6MW5nv9YJQxg_ubt_99S4yemDoiIhuJmEWG8O0QgEWGVJ4DQtVAODkJs0t1dppBk2PW7cYAh-aZ5lAvHWCEO4/s1600/x11vnc_gate%5B1%5D.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6L4mGwqaYNjTF3GQ7N7Kbhv_3MAcylpYhgPtK2BymKkXzT4olC5Jqtg6MW5nv9YJQxg_ubt_99S4yemDoiIhuJmEWG8O0QgEWGVJ4DQtVAODkJs0t1dppBk2PW7cYAh-aZ5lAvHWCEO4/s320/x11vnc_gate%5B1%5D.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"></div><br />
<br />
<h3>Obtenir un écran avec des caractères bizarres et clignotant</h3><br />
/!\ Risqué ?<br />
Il faut charger en mémoire avec memdisk l'un des iso ou fs proposés par le ftp openbsd, ou l'un des fs extrait des iso openbsd ; le résultat :<br />
<a href="http://alex.twb.fr/OpenGate/DSCF0838.JPG">http://alex.twb.fr/OpenGate/DSCF0838.JPG</a><br />
<a href="http://alex.twb.fr/OpenGate/DSCF0837.AVI">http://alex.twb.fr/OpenGate/DSCF0837.AVI</a><br />
<h2>Conclusion</h2><br />
Voila, je voulais partager mon expérience de boot avec l'OpenGate et de 1ers pas avec OpenBSD; j'espère que ce post servira (même si je n'ai pas détaillé certaines étapes).<br />
Je rajoute que même si j'ai deja un peu touché au monde unix, je suis encore un « Vista user ».<br />
<br />
Je joins : <br />
<ul><li>mon rc (v.4.4) modifié et fstab.ref ;</li>
<li>mon menu.lst ;</li>
<li>mon fichier OpenGate.txt, qui me sert de bookmark/bloc note ;</li>
<li>une page web disparue du net.</li>
</ul><br />
Merci à un certain « Pierre B. » pour la commande extractant le disque du dmesg, et aux personnes de #EasyGate (FreeNode), #FreeBSD (EpikNet) =).<br />
<h2>Fichiers joins :</h2><br />
<a href="http://alex.twb.fr/OpenGate/OpenBSD.zip">OpenBSD.zip</a><br />
<a href="http://alex.twb.fr/OpenGate/OpenGate.pdf">OpenGate.pdf</a>Unknownnoreply@blogger.com1