]> Git — Sourcephile - sourcephile-txt.git/blob - ddc/ddc8-logiciellerie-une_infra.md
ddc8: zfs
[sourcephile-txt.git] / ddc / ddc8-logiciellerie-une_infra.md
1 # Une première infrastructure informatique pour Sourcephile
2 - Demande de Critiques: 8
3 - De: Julien Moutinho (julm)
4 - À: Sourcephile
5 - Phase: Écriture
6 - Révision: 2 (2020-01-05)
7 - Licence: Creative Commons BY-SA
8
9 # Bilan approximatif
10 ## Boussoles analytiques
11 - [G] compétitive
12 - [G] charge
13 - [G] julm: on est sur une dépense de ~300€ de matériel (~100€ de plus s’il n’y avait pas le réemploi d’un SSD) pour une espérance de fonctionnement et d’usage >5ans, et un récurrent de ~60€/an pour l’hébergement. C’est un prix très correct pour ce que c’est.
14 - [C] produit
15 - [C] julm: aucun service non-lié à la production n’est proposé aux membres.
16 - [T] autonomie
17 - [T] julm: on a la main sur le matériel, le logiciel, mais sur l’hébergement (toutefois 15km, ça reste à portée de vélo).
18 - [T] scientifique
19 - [T] julm: on peut mettre du NixOS, mais ce n’est pas une machine avec beaucoup de CPU et de RAM, mais ça devrait largement suffire et me dépanner tant que je n’ai pas d’élec @home.
20 - [T] productive
21 - [T] julm: la machine peut suffire pour commencer, l’hébergement aussi mais peut rapidement être limitant (ce n’est qu’une VDSL2+). Côté sécurité on est en open-source, mais que partiellement en matériel ouvert. Mutualiser pleins de services sur une seule machine n’est pas l'idéal mais un cloisonnement LXC (sans virtualisation) devrait suffire puisque tous les services seront sous GNU/Linux et contrôlés par nous. L’hébergement est semi-professionnel, sécurité raisonnable vue les enjeux. Côté maintenance on peut mettre du NixOS ce qui me simplifiera la tâche. L’hébergeur n’offre pas (encore) de seconde connexion via le port série et n'est que semi-professionnel, par contre il est proche.
22 - [A] publique
23 - [A] julm: on est en logiciel libre, mais que partiellement en matériel ouvert. Deux raisons bloquantes à cela : le manque de support de NixOS (quid de Guix ? et plus gravement de Haskell pour les architectures ARM.
24 - [A] coopérative
25 - [A] Les machines sont fabriquées à l'autre bout de la planète dans des conditions sociales probablement déplorables.
26
27 ## Mentions possibles
28 - R: « À rejeter »
29 - C: « À clarifier »
30 - A: « À améliorer »
31 - T: « À tester »
32 - G: « À garder »
33
34 # Explications
35 ## Motivations
36 ### S'émanciper d'autogeree.net
37 Les logiciels que j'écris sont actuellement hébergés sur `chomsky.autogeree.net`, une machine virtuelle (VM) relativement modeste que me fournie Grésille depuis 2011 (en contre-partie d'un Dell R210 surnommé « chomsky » et acquis dans l'enthousiasme naïf de l'essaimage de FDN, puis resurnommé « rouf » par Grenode). Cette VM m'a longtemps servi de bac à sable pour jouer à l'adminsys, qui sert encore à un copain et moi-même pour avoir du mél et de l'IRC.
38
39 `chomsky` est une Debian dans une machine virtuelle Xen (1 CPU, 750Mo de RAM, 50Go de stockage **probablement** HDD), dans une machine hébergée professionnellement en datacenter à Grenoble. Cette machine est actuellement reliée à l'Internet par une autre infrastructure de Grenode à Lyon (au Netcenter via l'association Rézopole).
40 `chomsky` n’a pas vraiment les ressources d’une machine de développement (nixpkgs c’est déjà 10Go de stockage, stack 5Go, et le REPL de GHC ou de PureScript c’est minimum 0.5Go de RAM).
41
42 ### S'émanciper de Debian
43 Depuis que je me suis mis à NixOS, je ne suis plus enthousiasmé par Debian. En tant que dev il est bien plus facile de faire et de partager de manière reproductible et récente des paquets NixOS que des paquets Debian (dans le cas de paquets Haskell tout du moins). Et en tant qu'adminsys il est bien plus facile de maîtriser ce qu'il se passe sur une NixOS que sur une Debian. Le seul avantage de Debian en ce qui me concerne c'est sa plus grande portabilité sur des architectures basse conso ou OSHW comme certaines ARM ou MIPS. Mais ce n'est **certainement** qu'un avantage temporaire.
44 Pour approfondir ces raisons techniques, on peut voir par exemple les tutoriels francophones de Nokomprendo : https://nokomprendo.gitlab.io/
45
46 Cependant, il est **peu probable** que je puisse passer `chomsky` sous NixOS, car mon copain n’envisage pas de se mettre à NixOS, et puis c'est une opération risquée demandant une intervention délicate sur une machine hébergeant actuellement des services en production (essentiellement nos méls persos en MX n°1).
47
48 - https://www.fsf.org/resources/hw
49 - https://wiki.debian.org/FreedomBox/Hardware
50 - https://nixos.wiki/wiki/NixOS_on_ARM
51
52 ## Objectif
53 ### Objectif minimal : infra de publication
54 Cette infra adresse en priorité la diffusion au public des logiciels produits : dépôts des sources, dépôts des binaires, pages Web d'informations. Le public n'ya que des accès en lecture seule.
55 - Noms de domaine (nsd4, unbound)
56 - Shell distant SSH (openssh)
57 - Pare-feu (shorewall)
58 - Forge logicielle (gitolite, gitweb, nginx)
59 - Dépôts binaires (cachix, apt)
60 - Site Web de rendu des journaux de bord (nginx)
61 - Site Web de rendu des demandes de critiques (nginx)
62 - Site Web de rendu des documentations (nginx)
63 - Certificats X.509 pour du HTTPS (certbot, nginx)
64 - Clés de signature et d'authentification dédiées OpenPGP (gnupg, openpgp2ssh)
65 - Authentifications secondaires dédiées (yubikey)
66 - Monitoring (monit | nagios)
67
68 ### Objectif modeste : infra d'équipement interne
69 Cette infra adresse en priorité les besoins d'équipement des membres coopérants : stockages sécurisés et connexions sécurisées. Le public n'y a aucun accès d'usage, mais peut avoir des accès en écriture ou lecture selon des interfaces restreintes et contrôlées.
70 - Adresses méls (postfix, dovecot2, rspamd)
71 - Listes méls internes (aliases postfix)
72 - Écriture collaborative en ligne en temps réel (gobby | etherpad-lite | prose)
73 - Messagerie instantanée (prosody | matrix)
74 - Chiffrement du stockage (dm-crypt, dropbear)
75 - Gestion des accès (unix | openldap | ad hoc)
76 - Partages volumineux en ligne (nextcloud)
77 - Partages textuels jetables (pastebin)
78 - (optionnel) Calendriers en ligne (davical | nextcloud)
79 - (optionnel) VPN DNS (iodined)
80 - (optionnel) VPN (wireguard)
81 - (optionnel) Audioconf (mumble)
82 - (optionnel) Visioconf (jitsi)
83 - (optionnel) Partages binaires jetables (coquelicot)
84
85 ### Objectif honorable : infra de contribution publique
86 Cette infra adresse en priorité les besoins de la communication en ligne : sites Web de présentation et réseaux sociaux en ligne.
87 - Rapports de bugs (gitlab | gitea)
88 - Messagerie instantanée (salon IRC type #sourcephile@irc.geeknode.net | prosody interne | serveur Jabber externe)
89 - GitLab
90 - Site Web des (futures) démonstrations (judgmentphile, docuphile, ledgerphile, relotophile)
91 - Listes méls publiques (discourse)
92 - Forums publics (discourse)
93
94 ### Objectif ambitieux : infra de mise en commun
95 Cette infra adresse en priorité les besoins de la mise en commun en ligne :
96 - (optionnel) Microblogging (mastodon | serveur externe)
97
98 ### Objectif maximal : infra de services
99
100 # Actions
101 ## Machine de services : APU2D4 de PCengines
102 L’APU2 est un routeur conçu par une entreprise suisse (PCengines) et fabriqué à Taïwan. Le CPU est un AMD, dont l'architecture « x86_64 » est officiellement supportée par GHC, NixOS et ses caches binaires. Ce n'est pas complètement en matériel ouvert car certains composants clés comme le CPU ne le sont pas, mais PCengines publie ce qu'elle fait elle pour sa part (schémas et code source des modifications à Coreboot).
103
104 PCengines a une renommée et une maturité certaine dans la conception de machines (ce n'est pas leur première), il ne s'agit donc de produits issus d'une random startup d'amateur.rices, ou autres personnes davantage préoccupées par le time-to-market plutôt que par le long-time-support.
105
106 L’APU2 est généralement utilisé comme routeur, mais peut aussi servir de petit (en terme de services peu gourmands côté serveur) serveur, voire de petit (en taille de stockage) « NAS » (Network Attached Storage), voire de petite (en puissance de calculs) machine de développement pour dépanner.
107
108 L’APU a plusieurs versions : APU2, APU3 et APU4. L'APU2 est annoncé comme celui consommant le moins : 10W max contre 12W max pour l’APU3 et l’APU4, et la version 4Go de RAM de l'APU2 a une NIC i210AT légèrement meilleure que la i211AT des autres. L’APU3 est optimisé pour faire de la 3G/LTE. Et l’APU4 a un quatrième port Ethernet, mais ne rentre pas dans l’enclosure RMT-CASE-S1 permettant de mettre des disques supplémentaires.
109
110 Ressources :
111 - https://pcengines.ch/howto.htm
112 - https://openwrt.org/toh/pcengines/apu2
113 - https://www.cs.cmu.edu/~davide/howto/apu4c4.html
114 - https://blog.linuxserver.io/2016/12/17/review-pcengines-apu2-c4-prebuilt-by-linitx/#vpnperformance
115 - https://teklager.se/en/knowledge-base/
116
117 ### Caractéristiques
118 - Processeur : AMD G series GX-412TC (Turbo Core), 4x 1GHz Jaguar core with 64 bit support
119 - Specs :
120 - http://www.cpu-world.com/CPUs/Puma/AMD-G-Series%20GX-412TC.html
121 - http://support.amd.com/TechDocs/52740_16h_Models_30h-3Fh_BKDG.pdf
122 - 170€HT, http://store.clemanis.com (PCE-APU2D4)
123 - 148€HT, https://teklager.se/en/products/router-components/pc-engines-apu2d4
124 - 128€HT, https://www.wispmax.com/pc-engines-apu2b4-system-board.html
125 - Coprocesseur : AMD CCP avec AES-NI
126 - https://openwrt.org/toh/pcengines/apu2#cryptographic_hardware
127 - Cache L1 : 32K data cache + 32K instruction cache per core
128 - Cache L2 : 2MB shared
129 - Mémoire : 1x 4Go DDR3-DRAM 1333Mhz ECC (soudée !)
130 - Stockage : Boot from SD card (built-in adapter, connected through USB), USB or m-SATA SSD. 1 SATA data + power connector
131 - Électricité : 12V DC. About 6 to 10W depending on CPU load. Recommend for at least 1.5A to provide margin for peripherals
132 - Extensions : 2 miniPCI express (one with SIM socket for 3G modem), LPC bus, GPIO header, optional I2C bus, COM2 (3.3V RXD/TXD)
133 - Réseau : 3x Gigabit Ethernet (Intel i210AT), 1 DB9 serial port (console)
134 - https://www.intel.com/content/dam/www/public/us/en/documents/faqs/ethernet-controller-i210-i211-faq.pdf
135 - the i210AT is better, as it has 4 transmit and 4 receive queues, where the i211AT only has 2/2
136 - Firmware : CoreBoot open source system BIOS with support for iPXE and USB boot
137 - Enclosure :
138 - 35€HT, 245mm x 157mm x 39mm, espace pour 3 disques 2.5" (2 dedans, 1 dehors), http://store.clemanis.com (RMT-CASE-S1)
139 - 12€HT, 152,4mm x 152,4mm, aucun espace pour le moindre disque 2.5", https://teklager.se/en/products/router-components/pc-engines-apu-enclosure
140 - Refroidissement : conductive cooling from the CPU to the enclosure
141 - Conception : Suisse
142 - Fabrication : Taïwan
143
144 ### Micrologiciel (firmware)
145 Un disque avec des secteurs de 512B est utilisé mais si un disque avec des secteurs de 4KB est utilisé, un coreboot supportant UEFI devra être installé car GRUB ne supportera BIOS pour les disques 4KB : http://savannah.gnu.org/bugs/?46700
146 La taille physique des secteurs est donnée par fdisk -l ou /sys/block/sd*/queue/physical_block_size .
147
148 ### Mémoire (RAM)
149 4GB de RAM ce n’est pas énorme, c'est trop peu pour une machine de dév (surtout si elle n'est pas dédiée) ou de build, mais pour un serveur hébergeant des services de base c'est pas mal. D’un point de vue sécurité, il semble d'ailleurs préférable d'avoir plusieurs petites machines physiques distinctes qu’une grosse machine blindée hébergeant des machines virtuelles. Machines blindées qu'on ne trouvera d'ailleurs probablement pas de si tôt en matériel ouvert.
150 La RAM a de l’ECC (Error Correcton Code), supportée depuis peu dans le firmware de l’APU2.
151
152 4Go de RAM permet de rester en 32 bits, mais ZFS recommande 64 bits : https://github.com/zfsonlinux/zfs/wiki/FAQ#32-bit-vs-64-bit-systems
153
154 Il faudra faire attention à bien configurer ZFS pour qu'il ne consomme qu'une part contrôlée de la RAM. Il est fort probable qu'activer de la déduplication ZFS soit trop gourmande en RAM : https://wiki.freebsd.org/ZFSTuningGuide#Deduplication
155
156 ### Réseau
157 À PTT le réseau est une VDSL2, soit environ 40Mbps descendant et 12Mpbs montant (mais pour l'ensemble de l'hébergement !).
158 PCEngines note que :
159 > The throughput depends very much on the OS, Linux based distributions perform much better than BSD based. Under Linux forwarding packets without filtering etc. a throughput of about 900-950Mbps can be achieved. Under BSD based OS, like pfSense, OPNSense, etc the max. throughput is about 600-650Mbps.
160
161 Quelques commentaires signalent que l’APU2 sature à 45Mpbs avec OpenVPN en AES, OpenVPN ne pouvant utiliser qu'un seul coeur de CPU (single thread). L'APU2 aurait un horloge CPU trop lente et un cache L2 trop petit. Mais ici le VPN n'est pas un objectif.
162 - https://www.reddit.com/r/PFSENSE/comments/4nmuu4/my_pc_engines_apu2c4_experience/
163
164 Comme AES peut également être utilisé lors de connexion en HTTPS, on peut peut-être s'attendre au même genre de performances.
165
166 ### Maintenance
167 La présence d’un port série permet un accès de maintenance plus simple et plus sécurisé que de l’IPMI (qui est un second OS en parallèle).
168 Cependant PTT n'a pas de switch de ports série ou USB pour le moment.
169
170 Câbles utiles :
171 - USB to serial port
172 - 17€HT, https://www.ldlc.com/fiche/PB00026389.html
173 - 11€HT, https://teklager.se/en/products/router-components/serial-to-usb-cable
174 - 20€HT, http://store.clemanis.com/en/cables/566-kit-usb-to-serial-db9-female-for-alix-apu-3700667301720.html
175 - null-modem "DB9" serial cable, 5€HT, https://www.ldlc.com/fiche/PB00170050.html
176
177 ### Stockage
178 Le stockage choisi assure du cache (ZFS swap), du chiffrement (ZFS encryption), de la réplication (ZFS mirror), de la déduplication (ZFS dedup), de la réversibilité (ZFS snapshots), de la sauvegarde (ZFS send) et de la base de données (LUKS+ext4).
179
180 #### ZFS
181 Bien que je n’ai aucune expérience avec (ZFS n’est pas exotique, mais n’est pas non plus le défaut sous Linux), je choisis d’utiliser ZFS plutôt que le stack RAID+LUKS+LVM+ext4+rsync que je connais bien, car il me semble que l'approche intégrée de ZFS permet une configuration moins complexe, plus granulaire, plus évolutive, tout aussi mature, plus fiable contre la corruption des disques, et plus sécurisée du point de vue des sauvegardes.
182 ZFS est mature mais requiert de l’attention et de l’expertise, dans le cas contraire cela peut amener à de mauvaises performances, voire à de la perte de données.
183 ZFS a une multitude de fonctionnalités qui questionne de premier abord par rapport à la philosophie Unix de faire une seule chose mais de le faire bien. Il y a surement de très bonnes raisons de gérer ces fonctionnalités de manière intégrée, en tout cas la granularité et flexibilité que cela permet sont très appréciables quand on ne sait pas trop comment nos besoins vont évoluer.
184 ZFS a été premièrement pensé pour protéger les données de corruptions.
185 ZFS bénéficierait du travail d’environ 77 personnes par an, ce qui donne l’impression d’un développement aussi éclaté qu’actif : https://www.percona.com/blog/2017/11/15/zfs-from-a-mysql-perspective/
186 ZFS aurait une taille de son code source équivalente à 10 fois celle d’EXT4, mais ZFS remplace aussi MD, LVM, dm-crypt, …
187 ZFS ne peut légalement pas être intégré directement au noyau Linux mais cela est bien géré par NixOS.
188
189 Quelques fonctionnalités / concepts de ZFS :
190 - ZIL (ZFS Intent Log) : Utile si il y a beaucoup d’écriture synchrones ou servir des fichiers qui changent fréquemment.
191 - SLOG (Separate Intent Log) : ZIL sur disque (de préférence répliqué par RAID, car le perdre serait dramatique), généralement de quelques Gio, rapide pour les écriture séquentielles et les fsync().
192 - ARC (Adjustable Replacement Cache)/ : cache de ZFS sur la RAM. Utile pour servir des fichiers qui changent fréquemment.
193 - L2ARC (Level 2 ARC) : cache ZFS optionnel sur disque, de préférence SSD, qui stocke les données balayées de l’ARC. Un système avec moins de 8Gio de RAM n’a pas besoin de L2ARC, qui ne ferait que réduire les performances en imposant une pression sur l’ARC. jgreco : « Do not add L2ARC to an 8GB system. Period. Probably not to 16 either. Maybe at 24 or 32GB, but you have to remember that L2ARC stresses out the ARC and that you shouldn't exceed maybe a 4:1 ratio of L2ARC:ARC. »
194 - Scrubing (self-healing) : Si plus d’une copie (copies= strictement supérieur à 1) est disponible et qu’une des copie est détectée comme corrompue, ZFS retournera seulement la copie valide et réparera les enregistrement endommagés. Cela peut être déclenché manuellement avec la commande scrub.
195 - Send/Receive : ZFS permet d’envoyer et de recevoir entièrement ou incrémentalement des captures instantannées (snapshots) vers d’autres machines.
196 - Réplication : mirror, raidz-1, raidz-2, …, équivalents de RAID1, RAID5, RAID6, …. L’équivalent de la reconstruction du RAID s’appelle ici « resilvering ».
197 - Déduplication : ZFS peut découvrir que des fichiers ou enregistrements sont similaires et éviter leur duplication, mais cela demande beaucoup de RAM.
198
199 ##### Ressources
200 - https://wiki.debian.org/ZFS
201 - https://github.com/zfsonlinux/zfs/wiki/Debian-Buster-Root-on-ZFS
202 - https://wiki.archlinux.org/index.php/ZFS
203 - https://nixos.wiki/wiki/NixOS_on_ZFS
204 - https://wiki.freebsd.org/ZFSTuningGuide
205
206 #### Disques : 1x 250GB SSD
207 Bien que rendant le Gio plus cher à l'achat, utiliser du disque à état solide (SSD) est plus fiable, plus rapide et consomme moins que du disque mécanique : https://arstechnica.com/gadgets/2014/06/consumer-grade-ssds-actually-last-a-hell-of-a-long-time/
208 Tellement fiable qu'il ne semble pas raisonnable de répliquer en temps réel le disque mais juste de sauvegarder régulièrement (zfs send) le disque. La réplication apporterait tout de même une tranquilité d'esprit importante, surtout comme là quand l'hébergement est semi-pro et peut subir des coupures d'électricité lorsque les arbres tombent sur les lignes et qu'ERDF n'amène pas un groupe électrogène avant la fin des batteries de secours. Cependant les SSD pour particuliers n’on généralement pas de condensateur interne contre les coupures de courant : https://insights.samsung.com/2016/03/22/power-loss-protection-how-ssds-are-protecting-data-integrity-white-paper/
209
210 Il est possible de mettre facilement deux disques SSD : un sur le port mSATA et un sur le port SATA. Le port d'alimentation à 2 broches est un peu atypique et peut poser des problèmes (mauvaise connexion sur un modèle reçu par Franciliens). Le port mSATA est entrain d'être remplacé par le port M.2, ce qui pose la question de pouvoir trouver de bons SSD mSATA dans un futur proche.
211
212 Il est aussi possible de mettre une extension PCIe pour rajouter 4 ports SATA : https://pcengines.ch/howto.htm#add_on_cards
213 Il est également possible de mettre une carte SD, mais les cartes SD tendent à mourrir plus vite et sont plus lentes.
214
215 Pour benchmarker :
216 > dd if=/dev/zero of=/path/to/disk/tempfile bs=1M count=1024 conv=fdatasync,notrunc status=progress
217 > fio --name=seqread --rw=read --direct=1 --iodepth=32 --ioengine=libaio --bs=1M --numjobs=1 --size=10G --runtime=60 --group_reporting /path/to/disk/tempfile
218
219 Tous les connecteurs SATA ne sont pas créés égaux, le concepteur de la carte-mère peut mettre des connecteurs bons marchés mais peu performants, auquel cas rajouter une carte SATA peut améliorer la situation.
220
221 Concernant l'usage, à court et moyen terme les disques n'ont pas besoin d'être particulièrement grands, 64GB ou 128GB seront largement assez. Cependant il faut savoir que les petits SSD ont une vitesse d'écriture plus lente, dans la mesure où il y a plus de puces pour paralléliser les écritures (mais cela ne marche que pour des opérations parallélisables, cela ne s'applique à priori pas quand on a un seul processus) : https://www.tweaktown.com/reviews/5993/samsung-840-evo-128gb-msata-ssd-review/index.html
222
223 Ainsi un 128Go écrira séquentiellement à 320Mo/s (Kingston) ou 410Mo/s (Samsung). Mais un 250Go écrira séquentiellement à 500Mo/s (Kingston) ou 520Go/s (Samsung).
224 J’opte donc pour le réemploi d’un Samsung 840 EVO (mieux que QVO) de 250GB, sans condensateur interne; que je possède mais n’ai que très peu utilisé jusque là (janvier 2020) :
225 > % smartctl-tbw /dev/disk/by-id/ata-Samsung_SSD_840_EVO_250GB_S1DBNSAF340110R
226 > /dev/disk/by-id/ata-Samsung_SSD_840_EVO_250GB_S1DBNSAF340110R Power_On_Hours 1437 hours / 59 days / 0.16 years
227 > /dev/disk/by-id/ata-Samsung_SSD_840_EVO_250GB_S1DBNSAF340110R Wear_Leveling_Count 99 (% health)
228 > /dev/disk/by-id/ata-Samsung_SSD_840_EVO_250GB_S1DBNSAF340110R Airflow_Temperature_Cel 24
229 > /dev/disk/by-id/ata-Samsung_SSD_840_EVO_250GB_S1DBNSAF340110R Total_LBAs_Written 685441898 / 334688 mb / 326.8 gb / 0.319 tb
230 > /dev/disk/by-id/ata-Samsung_SSD_840_EVO_250GB_S1DBNSAF340110R mean writes per hour: 232.91
231
232 > % fdisk -l /dev/disk/by-id/ata-Samsung_SSD_840_EVO_250GB_S1DBNSAF340110R
233 > Disk /dev/disk/by-id/ata-Samsung_SSD_840_EVO_250GB_S1DBNSAF340110R: 232.9 GiB, 250059350016 bytes, 488397168 sectors
234 > Disk model: 2235
235 > Units: sectors of 1 * 512 = 512 bytes
236 > Sector size (logical/physical): 512 bytes / 512 bytes
237 > I/O size (minimum/optimal): 512 bytes / 33553920 bytes
238 > Disklabel type: gpt
239 > Disk identifier: E42083E9-58B2-4CD0-B716-2B923C6B8007
240
241 Estimations :
242 - 28GB NixOS
243 - 20GB Dépôts Git
244 - 20GB Boîtes méls
245 - 20GB Archives méls
246 - 20GB Nextcloud
247 - 2GB Logs
248 -
249
250 #### Swap cache : LUKS
251 Le swap est essentiel (sur une machine avec seulement 4G RAM) et pour tmpfs.
252 Mettre dans ZFS semble le plus propre mais il existe encore un bug connu sévère qui le déconseille : https://github.com/zfsonlinux/zfs/issues/7734
253 Il ne sert à rien de le mettre dans le RAID, il suffit juste de mettre le swap dans un LUKS dédié pour le chiffer (avec une nouvelle clé éphémère à chaque boot) et d’ajouter les devices déchiffrés à la liste des swaps gérés par le noyau Linux.
254
255 Benchmark :
256 > stress --vm 10 --vm-keep --vm-bytes 512M
257
258 #### Chiffrement : ZFS
259 Le chiffrement peut être assuré au niveau des secteurs par dm-crypt avec entêtes LUKS, et au niveau du contenu des fichiers par ZFS ou ecryptfs.
260
261 Le chiffrement par dm-crypt+LUKS au-dessous de ZFS a pour désavantages d'impliquer que les copies/réplications de ZFS sont chiffrées plusieurs fois, et que les clés doivent toujours être en mémoire. Il est par contre pertinent de l’utiliser pour le swap compte tenu que ZFS a encore un bug ouvert concernant le swap dans ZFS : https://github.com/zfsonlinux/zfs/issues/7734
262
263 Le chiffrement par ecryptfs ne permet ni compression, ni déduplication et rajoute des métadonnées en entête ce qui prend de la place.
264
265 Le chiffrement par ZFS permet la compression (contrairement à ecryptfs), permet de faire des sauvegardes de dossiers spécifiques sans déchiffrer les données.
266 D’après man zfs, sont chiffrées : zvol data, file attributes, ACLs, permission bits, directory listings, FUID mappings, and userused / groupused data.
267 Ne sont pas chiffrées : metadata related to the pool structure, including dataset and snapshot names, dataset hierarchy, properties, file size, file holes, and deduplication tables.
268
269 Le chiffrement peut être activé en cours de route, mais ne concernera que les données qui seront écrite par la suite.
270
271 Le chiffrement complet du disque (c’est-à-dire de l’initrd et du kernel, mais pas du firmware ou du bootloader) peut être envisagé, mais il faut utiliser un LUKS1 (et pas LUKS2) tant que GRUB ne supporte pas LUKS2.
272
273 Le coprocesseur AMD CCP (pour cryptographie AES) peut améliorer un peu le VPN, le HTTPS et le chiffrement du stockage lorsque de l'AES est utilisé.
274
275 Pour benchmarker LUKS :
276 > cryptsetup benchmark
277 - https://unix.stackexchange.com/questions/254017/how-to-interpret-cryptsetup-benchmark-results
278
279 AES-128 est considéré comme suffisamment sécurisant vu notre niveau de menace et de sécurité physique. https://xkcd.com/538/
280 Ce qui donne, pour LUKS (XTS sépare la clé en deux, donc il faut doubler --keysize) :
281 > cryptsetup luksFormat --iter-time 2s --hash sha256 --cipher aes-xts-plain64 --keysize 512 /dev/sdX
282 Et pour ZFS :
283 > aes-128-gcm
284
285 #### Réplication : ZFS
286 La réplication peut être assurée par RAID (RAID1) ou ZFS (mirror ou raidz).
287
288 La réplication entre deux disques ou plus permet de se prémunir contre la défaillance matérielle d'un des deux disques. Le coût à payer est d’acheter un deuxième disque (pas forcément d'emblée) et de supporter un temps de lecture qui peut aller jusqu'à la somme de celui de chaque disque, et un temps d'écriture qui égal à celui du disque le plus lent. Si cette pénalité devient trop importante, un RAID5 (ou raidz) pourra être envisagé : https://serverfault.com/questions/830708/raid-1-to-raid-5-using-mdadm . Voire plutôt RAID6 qui n'a pas qu'un seul disque de parité, car le remplacement d'un disque est facteur de défaillance des autres disques. RAID (notamment RAID-5) a aussi des problèmes lors de l’écriture : http://www.raid-recovery-guide.com/raid5-write-hole.aspx . Cependant comme les disques sont des SSD et non des HDD, en arriver là semble très improbable vu l'usage actuellement souhaité, une surveillance de l’usure des disques et des sauvegardes régulières peuvent suffire.
289
290 Utiliser RAID permet d’appliquer la réplication en dessous du chiffrement LUKS, alors que la réplication ZFS intervient en dessus du chiffrement LUKS, causant un chiffrement par disque de toute écriture. Toutefois, l’APU2 ayant un coprocesseur pour les AES-NI, en utilisant --cipher aes-xts-plain64 pour LUKS ces chiffrements supplémentaires ne devraient pas avoir un impact sur les performances justifiant d’abandonner la flexibilité de ZFS.
291
292 Le RAID logiciel peut être contrôlé par mdadm ou LVM (--type=raid), le backend mdraid est le même mais ce n'est pas compatible, mdadm est plus établi et abouti que LVM.
293
294 #### Réversibilité : ZFS
295 La réversibilité peut être assurée par LVM (snapshot) ou ZFS.
296
297 #### Sauvegardes : ZFS
298 - duplicity : sauvegardes incrémentales requérant un snapshot complet et une liste de différences jusque là.
299 - BorgBackup : déduplication.
300 - ZFS :
301
302 Contrairement aux autres, ZFS permet de faire des sauvegardes directement lisibles, il n'y a pas besoin de restaurer la dernière version, juste de la déchiffrer.
303
304 #### Bases de données : ZFS
305 Le copy-on-write (CoW) de ZFS fait que lorsqu’il a besoin de modifier un enregistrement, il ne l’écrase pas. Au lieu de ça il écrit un nouvel enregistrement, change les pointeurs et laisse son ramasse-miette (garbage-collector) libérer l’ancien si il n’est plus référencé. Cela est tout à fait dans l’esprit fonctionnel mais a un impact négatif sur les applications dont le cœur de métier est de modifier des fichiers en place, comme MySQL ou PostgreSQL : https://wiki.freebsd.org/ZFSTuningGuide#Application_Issues
306
307 Cependant il y a des atténuations possible à tester, il semble raisonnable à ce stade de ne pas chercher une optimisation prématurée en allouant une partition EXT4 de taille arbitraire et en s’imposant tout ce que ça implique de configuration de RAID/LUKS/LVM alors que ZFS nous permet justement de nous en passer.
308
309 Ressources :
310 - https://www.percona.com/blog/2018/02/16/why-zfs-affects-mysql-performance/
311 - https://www.percona.com/resources/webinars/zfs-mysql
312 - https://www.percona.com/blog/2018/05/15/about-zfs-performance/
313
314 #### Partitionnement
315 - /dev/sd{a,b}1 500Mio boot
316 - /dev/sd{a,b}2 4Gio luks-swap
317 - /dev/sd{a,b}4 200Gio luks-zfs
318
319 La table de partition est au format GPT, qui se retrouve de plus en plus dans les tutos que MSDOS, tout en étant bien supporté par les outils.
320 Les UUID sont randomisées (avec ˋsgdisk -Gˋ) et distincts d'un disque à l'autre.
321
322 Il ne semble pas nécessaire de faire une partition de secours (rescue), une clé USB, un accès par port série ou un busybox sur /boot devrait suffire.
323 La partition /tmp sera un tmpfs utilisant les 4 à 8G de swap.
324
325 Les logs sont sur une partition séparée pour garantir fortement qu'elle ne remplira pas celle des données, et pour que déchiffrer les logs, n'implique pas de déchiffrer les données.
326
327 ### Enclosure
328 Il existe de nombreuses enclosures, mais essentiellement deux modèles.
329 Les noires dissipent mieux la chaleur : https://openwrt.org/toh/pcengines/apu2
330 La RMT-CASE-S1 de Clemanis (pour APU2 ou APU3 seulement !) est 15€ plus chère que d’autres enclosures plus petites, mais permet de stocker deux disques 2.5" dans l'enclosure et un sur le dessus pour un total de 4 disques avec le mSATA, ou de mettre une extension : http://store.clemanis.com/en/cases/324-pc-engines-alix-2d22d32d13-apu1apu2-case-with-hdd-wifi-black-3700667301379.html
331
332 ### Espérance de fonctionnement
333 Après plus de 5 ans d’usage laptop relativement intensif, mon SSD Samsung 128G affiche encore 75% de santé.
334 Je vais commencer sans réplication en temps-réel, en disant qu’au pire à 50% de santé il faudra réformer le SSD.
335 Il est important de bien mettre en place une sauvegarde
336 Une redondance en RAID1 logiciel (mdadm) rendra **probablement** le remplacement assez simple.
337 La carte de l’APU2 devrait pouvoir durer plus de 10 ans.
338 Mais le fait que la RAM soit soudée fait qu'il faudra changer toute la carte mère si elle vient à avoir des défaillances.
339
340 ## Machine de compilations
341 - http://wiki.ant-computing.com/Choosing_a_processor_for_a_build_farm
342 > The intel Core as found in the Core i5 is performing very well, but hyperthreading brings little benefit here (13%). Thus a CPU should be chosen with real cores
343 > [...]
344 > In this test, the AMD was the fastest of all systems, and the ARM was the fastest fanless system and also the one delivering the highest throughput per cubic centimeter.
345 > [...]
346 > Some tests run with the ramlat utility showed that the build time almost solely depends on the L1 cache speed, then a little bit on the L2 cache speed and then finally on the DRAM speed. It does not exactly depend on the memory bandwidth but rather latency.
347
348 ## Hébergement chez PTT
349 PTT propose de l’hébergement à Tarnac (Corrèze).
350 L’hébergement se fait dans une petite salle dédiée et climatisée d’un "tier-lieu" (médiathèque, cyberespace) du village.
351 La connexion est derrière une VDSL2+ fournie par l’association Ilico.
352
353 - https://www.fnac.com/mp37714266/Transcend-ts128gmsa230s-ssd-interne-msata-iii-128-go-sata-iii-6-gbps-3d-tlc/w-4
354 - https://www.ldlc.com/fiche/PB00253086.html
355
356 ## Travaux futurs
357 ### Machine de sauvegardes
358 ### Machine de compilations
359
360 # Critiques
361 ## Inconvénients
362 ### Vulnérabilités Metldown et Spectre
363 Problème : l’AMD GX-412TC de l’APU2 est vulnérable à Meltdown et Spectre. L’atténuation n’est que partielle : https://blog.3mdeb.com/2019/2019-05-29-spectre-and-meltdown-on-apu2/
364
365 Réponse : tous les CPU Intel ou AMD sont plus ou moins affectés par ces vulnérabilités.
366
367 ### L'APU2 n'a pas une alimentation redondée
368 Problème : l'alimentation est l'un des composants les plus susceptibles de ne plus fonctionner.
369
370 Réponse : entreposer une seconde alimentation à côté du serveur, de sorte à minimiser le temps de hors-service et que cela puisse éventuellement être fait par l'hébergeur.
371
372 ### L'APU2 n'est pas adapté à la virtualisation
373 Problème : pour faire de la virtualisation il est préférable d'avoir des CPU avec des instructions adaptées (VT) et de la RAM en quantité (~512Mio/VM).
374
375 Réponse : la virtualisation est surtout adaptée lorsque ce ne sont pas les mêmes personnes qui gèrent les services, ou lorsqu'il faut faire tourner des OS différents. Mais dans le cas présent ce n'est pas le cas, donc des containers type LXC devraient suffire du point de vue d'une compartimentation sécuritaire.
376
377 ### nsd4 et iodined nécessitent tous deux le port 53
378 Problème : normalement nsd4 et iodined sont incompatibles sur une seule et même IPv4 (à 3€/mois ici), car ils requièrent tous deux l’écoute sur le port 53 du DNS.
379
380 Réponse : ce n’est pas très propre, mais il est possible de mutualiser ce port avec une règle iptables du genre : `-A nat -p udp --dport 53 -m string --algo kmp --from 40 --hex-string |01|i|05|plura|02|fr|00| -j DNAT --to-destination :5353` où iodined écoute maintenant sur le port 5353.
381
382 ### Utiliser des bases de données sous ZFS demande de la customisation
383 Problème : les bases de données ont des performances amoindries sous ZFS.
384
385 Réponse : on utilise actuellement du SSD pour tout (donc pour le ZIL) donc ça devrait aller sans L2ARC, et il existe de la documentation pour customiser les options de ZFS. Il restera toujours possible de rajouter un SSD avec LUKS+EXT4 dédié aux bases de données si c’est vraiment trop problématique.
386
387 ## Question non-résolues
388 ## Alternatives
389 ### TLsense
390 - Processeur : Intel i3 | i5 | i7
391 - i7 : https://teklager.se/en/products/routers/tlsense-i7-4lan
392 - Mémoire : 8Go
393 - Réseau : 4x Gigabit Ethernet
394 - Conception : Suède
395 - Fabrication : ?
396
397 ### Helios4
398 - Infos : https://kobol.io/helios4/
399 - Prix : 177€
400 Open hardware mais ARM pas x86, et plus en vente pour le moment.
401
402 ### HPE ProLiant MicroServer
403 - Processeur : AMD Opteron X3416 (2x 1.6–3.0GHz) | X3421 (4x 2.1–3.4GHz)
404 - Mémoire : 1x 8Go (max 2x 16Go) DDR4-SDRAM (X3416: 1600Mhz | X3421: 2400MHz) Unbuffered ECC (non-soudées)
405 - Cache L2 : X3416: 1Mo | X3421: 12Mo
406 - Réseau : 2x Gigabit Ethernet
407 - Électricité : 12-35W
408 - Stockage : 4x SATA 3.5"
409 - Extensions : 2x PCIe 3.0
410 - Prix :
411 - X3416 : 328€HT https://www.senetic.fr/product/873830-421
412 - X3421 : 415€HT https://www.senetic.fr/product/P04923-421
413 - Conception : USA
414 - Fabrication : ?