mémoire→thesis

This commit is contained in:
Marc Beninca 2020-10-12 10:25:48 +02:00
parent 3b62292654
commit 86b7e4a5e0
21 changed files with 0 additions and 0 deletions

3
cnam/travaux/thesis/.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
/*.pdf
/*.pdf.asc
/*.pdf.vrf

159
cnam/travaux/thesis/build.py Executable file
View file

@ -0,0 +1,159 @@
#! /usr/bin/python3 -B
import os
import shutil
import subprocess
import sys
AUTHOR = 'Marc BENINCA'
MAIN = 'main'
TMP = 'tmp'
ENGLISH = 'en'
FRENCH = 'fr'
LANGUAGES = [ENGLISH, FRENCH]
DOCUMENTS = [
{ENGLISH: 'thesis', FRENCH: 'mémoire'},
{ENGLISH: 'presentation', FRENCH: 'présentation'},
]
TITLE = {
ENGLISH: 'Incremental Live Operating Systems',
FRENCH: 'Systèmes d’exploitation autonomes incrémentaux',
}
SUBTITLE = {
ENGLISH: 'a reversal of conventional approaches',
FRENCH: 'une inversion des approches conventionnelles',
}
DATE = {
ENGLISH: 'Month DD, 2021',
FRENCH: 'JJ Mois 2021',
}
def run(command):
subprocess.call(command)
def errun(command):
return subprocess.check_output(
command, stderr=subprocess.STDOUT)
def build(directory, sign):
# temporary directory
tmp = os.path.join(directory, TMP)
# for each language
for language in LANGUAGES:
# languages
other_languages = [lang for lang in LANGUAGES if lang is not language]
languages = [language, *other_languages]
other_languages = ','.join(other_languages)
summaries = ''.join(
[f'\\input{{summary.{lang}}}' for lang in languages])
# display languages
for item in ['', language, other_languages, languages, summaries]:
print(item)
# for each document
for document in DOCUMENTS:
# display language
print()
print(document[language])
# clean
os.chdir(directory)
wipe(tmp)
os.makedirs(tmp)
# move into document directory
os.chdir(document[ENGLISH])
# prepare variables
variables = {
'author': AUTHOR,
'title': TITLE[language],
'subtitle': SUBTITLE[language],
'date': DATE[language],
'mainlanguage': language,
'otherlanguages': other_languages,
'summaries': summaries,
}
# transform variables
variables = ''.join([f'\\def\\{k}{{{v}}}'
for k, v in variables.items()])
# prepare build command
command = ['xelatex',
'-output-directory', tmp,
f'{variables}\\input{{{MAIN}}}',
]
# if it's the main document
if document[ENGLISH] == 'thesis':
# pre build
run(command)
# build glossaries
run(['makeglossaries', '-d', tmp, MAIN])
# build references
run(['biber',
'--input-directory', tmp,
'--output-directory', tmp,
MAIN,
])
# re build
run(command)
# final build
run(command)
# rename the document
pdf = f'{document[language]}.pdf'
os.rename(os.path.join(tmp, f'{MAIN}.pdf'),
os.path.join(tmp, pdf),
)
# if signature is disabled
if not sign:
# fetch the document from temporary directory
os.rename(os.path.join(tmp, pdf),
os.path.join(directory, pdf),
)
# if signature is enabled
else:
# sign the document
run(['gpg',
'--armor',
'--detach-sign',
os.path.join(tmp, pdf),
])
signature = f'{pdf}.asc'
# fetch the document and signature from temporary directory
for f in [pdf, signature]:
os.rename(os.path.join(tmp, f),
os.path.join(directory, f),
)
# verify the document signature
lines = errun(['gpg', '--verify',
os.path.join(directory, signature),
os.path.join(directory, pdf),
]).decode('u8').splitlines()
id = lines[2].index('"')
lines = [
lines[0],
lines[1],
lines[2][:id] + lines[4][id:]
.replace('@', ' @ ')
.replace('.', ' ⋅ ')
] + lines[5:]
# write verification file
buffer = os.linesep.join(lines).encode('u8')
with open(os.path.join(directory, f'{pdf}.vrf'), 'bw') as f:
f.write(buffer)
# clean
wipe(tmp)
def wipe(directory):
shutil.rmtree(directory, ignore_errors=True)
def main():
file = os.path.realpath(__file__)
directory = os.path.dirname(file)
build(directory, len(sys.argv) == 1)
if __name__ == '__main__':
main()

View file

@ -0,0 +1,38 @@
Mémoire
=======
:download:`Sujet <sujet.pdf>`
=========================================== ===========================================
Français English
=========================================== ===========================================
:download:`Mémoire <mémoire.pdf>` :download:`Thesis <thesis.pdf>`
:download:`Présentation <présentation.pdf>` :download:`Presentation <presentation.pdf>`
=========================================== ===========================================
.. literalinclude:: mémoire.pdf.vrf
=============================================== ===============================================
Signatures numériques Digital signatures
=============================================== ===============================================
:download:`Mémoire <mémoire.pdf.asc>` :download:`Thesis <thesis.pdf.asc>`
:download:`Présentation <présentation.pdf.asc>` :download:`Presentation <presentation.pdf.asc>`
=============================================== ===============================================
.. todo::
* mémoire
* vérifier les marges
* séparer les chapitres
* rédiger l’introduction
* rédiger la conclusion
* présentation
* logo du CNAM
* couleur des barres
* page de garde
* plan
* marges
* page de fin

View file

@ -0,0 +1,7 @@
\input{settings}
\begin{document}
\end{document}

View file

@ -0,0 +1 @@
\documentclass[12pt]{extarticle}

View file

@ -0,0 +1,11 @@
\ml
{\def\acronyms{Acronyms}}
{\def\acronyms{Abréviations}}
\printglossary[type=\acronymtype,
title=\acronyms]
\newacronym{os}
{\ml{OS}{SE}}
{\ml{Operating System}{Système d’Exploitation}}
\pagebreak

View file

@ -0,0 +1,19 @@
\ml
{\def\back{Summaries}}
{\def\back{Résumés}}
\chapter*{}
\addcontentsline{toc}{chapter}{\back}
\begin{center}\begin{large}\textbf{
\title\\
\subtitle
}\end{large}\end{center}
\ml{CNAM Master's thesis}{Mémoire d’Ingénieur CNAM},\\
Bordeaux 2021.
\summaries
\thispagestyle{empty}
\pagebreak

View file

@ -0,0 +1,5 @@
\def\outro{Conclusion}
\chapter*{\outro}
\addcontentsline{toc}{chapter}{\outro}
\pagebreak

View file

@ -0,0 +1,4 @@
\renewcommand{\listfigurename}{Figures}
\listoffigures
\pagebreak

View file

@ -0,0 +1,64 @@
\begin{center}
\includegraphics[height=2.54cm]{../../cnam}
{\bfseries
\begin{large}
{\larger[2] C}ONSERVATOIRE {\larger[2] N}ATIONAL
DES {\larger[2] A}RTS ET {\larger[2] M}ÉTIERS
\ml
{ASSOCIATE REGIONAL CENTER OF NEW-AQUITAINE}
{CENTRE RÉGIONAL ASSOCIÉ DE NOUVELLE-AQUITAINE}
\hrq
\ml{THESIS}{MÉMOIRE}
\ml{defended in order to obtain}{présenté en vue d’obtenir}
\ml{MASTER'S DEGREE from the CNAM}{le DIPLÔME d’INGÉNIEUR CNAM}
\ml{SPECIALIZATION: Computer Science}{SPÉCIALITÉ : Informatique}
\ml
{OPTION: Networks, Systems and Multimedia}
{OPTION : Réseaux, Systèmes et Multimédia}
\vfill
\ml{by}{par}
\vfill
\author
\hrq
\title\\
\subtitle
\ml
{Defended on \date}
{Soutenu le \date}
\hrq
JURY
\end{large}
\vspace{1em}
\begin{small}
{\renewcommand{\arraystretch}{1.5} \begin{tabular}[t]{rllll}
\ml{PRESIDENT:}{PRÉSIDENT :} & \tt & \first & \last & \textit{\renewcommand{\arraystretch}{1} \begin{tabular}[t]{@{}l@{}}\role\\\org\end{tabular}} \\
\ml{MEMBERS:}{MEMBRES :} & \tt & \first & \last & \textit{\renewcommand{\arraystretch}{1} \begin{tabular}[t]{@{}l@{}}\role\\\org\end{tabular}} \\
& \tt & \first & \last & \textit{\renewcommand{\arraystretch}{1} \begin{tabular}[t]{@{}l@{}}\role\\\org\end{tabular}}
\end{tabular}}
\end{small}
}
\end{center}
\thispagestyle{empty}
\pagebreak

View file

@ -0,0 +1,7 @@
\ml
{\def\gloss{Glossary}}
{\def\gloss{Glossaire}}
\printglossary
[title=\gloss]
\pagebreak

View file

@ -0,0 +1,7 @@
\def\intro{Introduction}
\chapter*{\intro}
\addcontentsline{toc}{chapter}{\intro}
\gls{os}
\pagebreak

View file

@ -0,0 +1,114 @@
\input{settings}
\input{variables}
\begin{document}
\singlespacing
\input{front}
\onehalfspacing
\input{thanks}
\input{acronyms}
\input{glossary}
\input{toc}
\input{introduction}
\ml
{\chapter{\todo}}
{\chapter{Problématique : maintenance des systèmes d’exploitation}}
\ml
{\section{\todo}}
{\section{Systèmes de fichiers, installés sur partitions, avec accès en écriture}}
\ml
{\subsection{\todo}}
{\subsection{Système de fichiers conventionnel}}
\ml
{\subsection{\todo}}
{\subsection{Système de fichiers géré par des recettes configuration}}
\ml
{\subsection{\todo}}
{\subsection{Système de fichiers avec gestion d’instantanés}}
\ml
{\section{\todo}}
{\section{Images autonomes, sans installation, avec accès en lecture seule}}
\ml
{\subsection{\todo}}
{\subsection{Amorçage sans gestion de persistance}}
\ml
{\subsection{\todo}}
{\subsection{Amorçage avec gestion de persistance}}
\ml
{\chapter{\todo}}
{\chapter{Proposition : fonctionnement autonome incrémental}}
\ml
{\section{\todo}}
{\section{Miroirs de dépôts officiels distribution et éditeurs tiers}}
\ml
{\section{\todo}}
{\section{Construction d’un système de fichiers autonome (Debian GNU/Linux)}}
\ml
{\section{\todo}}
{\section{Encapsulation dans un fichier image}}
\ml
{\section{\todo}}
{\section{Sécurité du fichier image produit}}
\ml
{\section{\todo}}
{\section{Amorçage de fichier(s) image(s) sécurisé(s)}}
\ml
{\section{\todo}}
{\section{Mise à niveau incrémentale}}
\ml
{\chapter{\todo}}
{\chapter{Automatisations potentiellement implémentables}}
\ml
{\section{\todo}}
{\section{Vérification d’intégrité de dépôts}}
\ml
{\section{\todo}}
{\section{Construction de systèmes de fichiers autonomes complets}}
\ml
{\section{\todo}}
{\section{Création de nouveaux fichiers par mise à jour d’images}}
\ml
{\section{\todo}}
{\section{Génération à la volée de menus de démarrage}}
\input{conclusion}
\appendix
\ml
{\chapter{Appendix}}
{\chapter{Annexe}}
\pagebreak
\input{figures}
\input{tables}
\singlespacing
\input{back}
\end{document}

View file

@ -0,0 +1,76 @@
% set default size and document class
\documentclass[12pt]{report}
% acronyms, glossary
\usepackage[acronym,toc]{glossaries}
\makeglossaries
% tune table of contents
\usepackage{tocloft}
% links
\usepackage[colorlinks,
citecolor=blue,
filecolor=blue,
linkcolor=blue,
urlcolor=blue,
]{hyperref}
% adjust chapter titles
\usepackage{etoolbox}
\makeatletter
\patchcmd{\@makechapterhead}{50\p@}{0pt}{}{}
\patchcmd{\@makeschapterhead}{50\p@}{0pt}{}{}
\makeatother
% set paper geometry
\usepackage[a4paper,portrait,
bmargin=20mm,lmargin=20mm,rmargin=20mm,tmargin=20mm]{geometry}
% images
\usepackage{graphicx}
% set fonts
\usepackage{fontspec}
% set relative sizes
\usepackage{relsize}
\setlength{\parindent}{0em}
\setlength{\parskip}{1em}
\setmainfont{DejaVu Sans}
\setmonofont{DejaVu Sans Mono}
% set spacings
\usepackage{setspace}
% lists of figures, tables
\usepackage{tocbibind}
% set languages
\usepackage{polyglossia}
% recommended
\usepackage{csquotes}
\setmainlanguage{\mainlanguage}
\setotherlanguages{\otherlanguages}
% simple commands
\newcommand{\hr}{\rule{\textwidth}{1pt}}
\newcommand{\hrq}{\rule{.25\textwidth}{1pt}}
% handle multiple languages
\newcommand{\ifstreq}[4]{\expandafter\ifstrequal\expandafter{#1}{#2}{#3}{#4}}
\def\todo{TODO}
\newcommand{\ml}[2]{%
\ifstreq{\mainlanguage}{en}{\ifstrempty{#1}{\todo}{#1}}{%
\ifstreq{\mainlanguage}{fr}{\ifstrempty{#2}{\todo}{#2}}{%
ERROR%
}}%
}
\newcommand{\en}[1]{\textenglish{#1}}
\newcommand{\fr}[1]{\textfrench{#1}}

View file

@ -0,0 +1,18 @@
\begin{center}
\hr
\textbf{SUMMARY}
\end{center}
.\\
.\\
.
.\\
.\\
\textbf{Key words: ?, ?, ?, ?,\\
?, ?, ?, ?.}

View file

@ -0,0 +1,18 @@
\begin{center}
\hr
\textbf{RÉSUMÉ}
\end{center}
.\\
.\\
.
.\\
.\\
\textbf{Mots clés : ?, ?, ?, ?,\\
?, ?, ?, ?.}

View file

@ -0,0 +1,7 @@
\ml
{\def\tables{Tables}}
{\def\tables{Tableaux}}
\renewcommand{\listtablename}{\tables}
\listoftables
\pagebreak

View file

@ -0,0 +1,7 @@
\ml
{\def\thanks{Acknowledgements}}
{\def\thanks{Remerciements}}
\chapter*{\thanks}
\addcontentsline{toc}{chapter}{\thanks}
\pagebreak

View file

@ -0,0 +1,10 @@
\ml
{\def\toc{Contents}}
{\def\toc{Plan}}
\renewcommand{\contentsname}{\toc}
\renewcommand{\cftchapleader}{\cftdotfill{\cftdotsep}}
\tableofcontents
\pagebreak

View file

@ -0,0 +1,5 @@
\def\first{\ml{First}{Prénom}}
\def\last{\ml{LAST}{NOM}}
\def\org{\ml{Organization}{Organisme}}
\def\role{\ml{Role}{Fonction}}
\def\tt{\ml{Title}{Civilité}}

View file

@ -0,0 +1,177 @@
\documentclass[10pt]{article}
\usepackage{fontspec}
\usepackage[a4paper,portrait,
bmargin=10mm,lmargin=15mm,rmargin=15mm,tmargin=10mm]{geometry}
\pagenumbering{gobble}
\setlength{\parindent}{0em}
\setlength{\parskip}{0em}
\setmainfont{DejaVu Sans}
\newcommand{\hr}{\rule{\textwidth}{1pt}}
\newenvironment{itmz}{\begin{itemize}
\setlength{\itemsep}{0em}
}{\end{itemize}}
\begin{document}
CNAM / UAMM91 \hfill Mémoire ingénieur / Sujet (version n°1) \hfill IRSM ↔ CYC9104A
Marc Beninca \hfill \textbf{Systèmes d’exploitation autonomes incrémentaux} \hfill 2020 → 2021
\hr
\section{Problématique : maintenance des systèmes d’exploitation}
En fonction des cas d’utilisation, maintenir des systèmes d’exploitation peut nécessiter de penser :\\
mises à jour, indisponibilité, sauvegardes, tests, instantanés, restaurations, recettes de configuration.
\subsection{Systèmes de fichiers, installés sur partitions, avec accès en écriture}
\subsubsection{Système de fichiers conventionnel : ext2, ext3, ext4, jfs, xfs}
\begin{itmz}
\item{\textbf{avantages} : instantanéité de toutes les modifications apportées aux fichiers du système}
\item{\textbf{inconvénients} : nécessité de régulièrement réaliser et tester des sauvegardes du système}
\end{itmz}
\subsubsection{Système de fichiers géré par des recettes de configuration : ansible, chef, puppet}
\begin{itmz}
\item{\textbf{avantages} : possibilité de remettre rapidement en état certains pans entiers du système}
\item{\textbf{inconvénients} : pas de résolution des écarts de configuration non gérés par les recettes}
\end{itmz}
\subsubsection{Système de fichiers avec gestion d’instantanés : btrfs, zfs}
\begin{itmz}
\item{\textbf{avantages} : permet de sauvegarder et restaurer un état des fichiers du système à un instant}
\item{\textbf{inconvénients} : réduit progressivement l’espace disponible, pas encore utilisé par défaut}
\end{itmz}
\subsection{Images autonomes, sans installation, avec accès en lecture seule}
\subsubsection{Amorçage sans gestion de persistance}
\begin{itmz}
\item{\textbf{avantages} : démarrer sur un système autonome dans un état ayant été figé au préalable}
\item{\textbf{inconvénients} : perdre au redémarrage toutes modifications faites aux fichiers du système}
\end{itmz}
\subsubsection{Amorçage avec gestion de persistance}
\begin{itmz}
\item{\textbf{avantages} : conservation sur une partition marquée des fichiers modifiés depuis le démarrage}
\item{\textbf{inconvénients} : pas de séparation entre la persistance des fichiers systèmes et des données}
\end{itmz}
\hr
\section{Proposition : fonctionnement autonome incrémental}
Mettre en œuvre un système d’exploitation hybride entre un système installé et un système autonome :\\
cumuler les avantages des deux, en images incrémentales ou complètes, sans les divers inconvénients.
\begin{itmz}
\item{\textbf{avantages} : redémarrage = restauration, mise à jour = sauvegarde, séparation système/données}
\item{\textbf{inconvénients} : maintenance exhaustive si effectuée régulièrement et d’une façon manuelle}
\end{itmz}
\subsection{Miroirs de dépôts officiels distribution et éditeurs}
\begin{itmz}
\item{synchronisation locale pour accès rapide, stable et hors-ligne : \textbf{apt-mirror}, \textbf{debmirror}, \textbf{ftpsync}}
\item{vérification d’intégrité des dépôts locaux avant utilisation de leurs paquets logiciels synchronisés}
\end{itmz}
\subsection{Construction d’un système de fichiers autonome (debian gnu/linux)}
\begin{itmz}
\item{prise en compte du type de machine hôte pour le choix des paquets de base : physique, virtuelle}
\item{création d’un système de fichiers de base minimal à partir des dépôts locaux : \textbf{debootstrap}}
\item{intégration des paquets nécessaires à la construction d’autres systèmes autonomes, si besoin}
\item{transformation effective en système d’exploitation autonome : \textbf{live-boot}, \textbf{update-initramfs}}
\item{détermination des autres paquets logiciels à installer et à configurer, en fonction des besoins}
\item{déport des données à rendre persistantes, avec des liens symboliques pointant vers partition(s)}
\end{itmz}
\subsection{Encapsulation dans un fichier image}
\begin{itmz}
\item{utilisation d’un format de fichier amorçable adapté au montage en lecture seule : \textbf{squashfs}}
\item{choix d’un des divers algorithmes de compression disponibles : \textbf{gzip}, \textbf{lzma}, \textbf{lzo}, \textbf{lz4}, \textbf{xz}, \textbf{zstd}}
\item{niveau supplémentaire d’encapsulation avec un format de fichier amorçable hybride : \textbf{iso}}
\end{itmz}
\subsection{Sécurité du fichier image produit}
\begin{itmz}
\item{assurer l’intégrité du fichier final par le calcul d’une somme de contrôle : \textbf{sha256}, \textbf{sha512}}
\item{garantir l’authenticité de l’image grâce à une signature numérique associée au fichier : \textbf{gpg}}
\end{itmz}
\subsection{Amorçage de fichier(s) image(s) sécurisé(s)}
\begin{itmz}
\item{chargeur de démarrage avec gestion de signature numérique : \textbf{grub}, \textbf{bios}, \textbf{uefi}, \textbf{secure boot}}
\item{création d’un menu de démarrage à choix multiple d’images : \textbf{grub.cfg}, \textbf{squash4}, \textbf{iso9660}}
\item{vérification d’authenticité et d’intégrité de fichiers images : \textbf{gcry\_sha256}, \textbf{gcry\_sha512}, \textbf{pgp}}
\item{chargement d’image(s) en mémoire vive d’une machine hôte : complet, partiel avec \textbf{overlayfs}}
\end{itmz}
\subsection{Mise à niveau incrémentale}
\begin{itmz}
\item{fabrication d’une nouvelle image, à partir de la plus récente, pour le prochain redémarrage}
\item{si le redémarrage est différé, mise à jour du système d’exploitation actuellement en mémoire}
\item{si le redémarrage est nécessaire et critique, réduction de sa durée effective : \textbf{kexec-tools}}
\end{itmz}
\section{Automatisations potentiellement implémentables}
\begin{itmz}
\item{vérification d’intégrité des dépôts, voire le processus de synchronisation, de façon parallélisée}
\item{construction de systèmes de fichiers autonomes complets, à partir de différents profils versionnés}
\item{création de nouveaux fichiers images, par la mise à jour d’images amorçables déjà existantes}
\item{génération à la volée de menus de démarrage, à choix multiples d’images amorçables détectées}
\end{itmz}
\hr
\appendix
\section{Contexte professionnel}
En tant que militaire engagé de carrière, depuis 19 ans envers le Ministère des Armées, je travaille :
\begin{itmz}
\item{depuis 2001 pour le corps des sous-officiers d’active de l’actuelle Armée de l’Air et de l’Espace}
\item{depuis 2016 sous la Direction Interarmées des Réseaux d’Infrastructure et Systèmes d’Information}
\end{itmz}
\subsection{Restrictions diverses}
\begin{itmz}
\item{interdiction, en tant que militaire, d’exercer simultanément une autre activité professionnelle}
\item{pas de droits d’administration sur le gestionnaire de l’infrastructure virtuelle distante partagée}
\item{stations de travail locales sans possibilité de virtualisation, administrées par une entité extérieure}
\item{ordinateurs portables réquisitionnés pour le personnel pouvant exercer son activité en télétravail}
\end{itmz}
\subsection{Propriété intellectuelle}
\begin{itmz}
\item{tout développement effectué sur le temps de travail devient directement la propriété du Ministère}
\item{le fonctionnement ici proposé a un champ d’application plus large que le seul cadre de mon emploi}
\item{une solution pour son automatisation aurait donc plus de portée si publiée sous une licence libre}
\end{itmz}
\section{Cadre de production du mémoire}
Compte tenu des circonstances précédemment énoncées, et dans l’intérêt du projet en lui-même :
\begin{itmz}
\item{m’est-il possible de conduire la réalisation de ce mémoire ingénieur « Hors Temps de Travail » ?}
\end{itmz}
\end{document}