From 039efeecbe3651512fee282fe08aa7400296d0c7 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Fri, 13 Mar 2015 12:19:27 +0100 Subject: Add documentation files. --- doc/filesystem.md | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 doc/filesystem.md (limited to 'doc/filesystem.md') diff --git a/doc/filesystem.md b/doc/filesystem.md new file mode 100644 index 0000000..99f58a9 --- /dev/null +++ b/doc/filesystem.md @@ -0,0 +1,119 @@ +(sorry, in french for the moment) + +# Idée de layout pour les fichiers dans une installation classique : + +Le layout tel que peut le constater l'utilisateur : + +- `io:/` : périphériques système et accès aux ressources contrôlées + par le processus parent, peut changer quand on entre dans une "boîte". + Lecture seule, contôlé par l'init et le desktop manager (ou n'importe quel processus qui crée une "boîte") + - `io:/keyboard`, `io:/mouse`, `io:/display`, `io:/sound` : interfaces spécialisées + sur chacun, accessibles via une API fournie dans `libkogata` + +- `root:/` : partition système. Contenu géré par l'administrateur du système. + - `root:/boot/kernel-2.bin` : le noyau (V2) + - `root:/boot/init-4.bin` : l'init et gestionnaire de paquets système (V4) + - `root:/pkg/` : les paquets du système, montés en overlay sur `sys:` et sur `cmd:` + - `root:/pkg/kogata` : paquets essentiels du système + - `root:/pkg/kogata/kogata-r2.pkg` : release 2 du système kogata de base (contenu à choisir précisément) + - `root:/pkg/kogata/kogata-compat-r2.pkg` : librairies compatibles avec les anciennes API mais fonctionnant avec le système R2 actuel + - `root:/pkg/kogata/kogata-dev-r2.pkg` : binaires ligne de commande et en-têtes de dév pour la release 2 + - `root:/pkg/kogata/kogata-extras-r2.pkg` : ressources, bibliothèques et utilitaires supplémentaires + - `root:/pkg/kogata/kogata-langpack-ja-r2.pkg` : fichiers nécessaires pour utiliser le système en japonais (au pif !) + - `root:/pkg/themes/` : fichiers de personnalisation de l'interface : polices, icônes, fonds d'écran + - `root:/pkg/filetypes/` : extensions à libfiles pour la gestion de types de fichiers nouveaux + - `root:/apps/` : applications et utilitaires supplémentaires, ne peuvent pas dépendre de + bibliothèques non inclues dans `kogata-rx.pkg` ou `kogata-extras-rx.pkg` + et doivent inclure elle-même les fichiers `.so` correspondant + - `root:/services/` : applications du serveur + - `root:/config/` : configurations du système (plusieurs sous-dossiers pour plusieurs configurations) + - `root:/users/` : à défaut d'utiliser une partition séparée, dossiers des utilisateurs + - `root:/services/` : données des serveurs + +- `config:/` : bind-mount de `root:/config/config-en-cours`, contient les fichiers de configuration du système + +- `sys:/` : librairies, binaires et ressources du système, c'est un overlayfs constitué à partir d'images pré-préparées contenues dans `root:/pkg/`. Tout ce qui est dans `sys:` est considéré de source sûre. + - `sys:/lib` : librairies + - `sys:/lib/libkogata/libkogata-1.so` : `libkogata` avec compatibilité API V1 + - `sys:/lib/libkogata/libkogata-dev.so` : `libkogata` sans compatibilité (version de développement) + - `sys:/lib/libkogata/libkogata-sys.so` : `libkogata` avec compatibilité API avec les binaires du système + - `sys:/lib/libc/libc-1.so` + - `sys:/lib/libalgo/libalgo-1.so` + - `sys:/lib/libgui` : bibliothèque de dessin à l'écran, rendu des polices, toolkit graphique + - `sys:/lib/libfiles` : bibliothèque pour la manipulation de fichiers de différents formats ; extensible + - `sys:/filetypes` : extensions à `libfiles` pour gérer des fichiers + - `sys:/filetypes/jpeg-1.so` : plugin pour charger des JPEG + - `sys:/filetypes/mp3-1.so` : plugin pour charger des MP3 + - `sys:/fonts` : extensions à `libgui`, polices d'écriture + - `sys:/input` : extensions à `libgui`, méthodes d'entrée et keymaps + - `sys:/input/keymaps` : keymaps + - `sys:/icons` : extensions à `libgui`, thèmes d'icônes + - `sys:/icons/default` : icônes par défaut + - `sys:/wallpapers` : fonds d'écran + - `sys:/bin` : binaires du système + - `sys:/bin/login.bin` : login manager + - `sys:/bin/desktop.bin` : le gestionnaire de bureau (wm-compositor, multiplexage des périphériques, boxing, IPC-master & gestionnaire d'autorisations) + - `sys:/bin/config.bin` : éditeur de configuration utilisateur + - `sys:/bin/admin.bin` : éditeur de configuration système et autres outils d'admin + - `sys:/cmd` : binaires utilisables en ligne de commande, essentiellement pour le dév ; hiérarchie type unix + - `sys:/cmd/bin/` + - `sys:/cmd/lib/` + - `sys:/cmd/include/` + - `sys:/cmd/share/` + +- `apps:/` : dossier contenant les paquets d'application pour les applications utilisateurs, c'est un bind-mount de `root:/apps` essentiellement +- `services:/` : dossier contenant les paquets d'application pour les services du système, bind-mount de `root:/services` +- `user:/` : bind-mount de `root:/users/utilisateur-actuel`, lecture-écriture, géré à la discrétion de l'utilisateur + - `user:/apps` : paquets d'application + - `user:/data` : configuration et données des applications + +Ligne d'init typique : + + kernel /boot/kernel-12.bin root=io:/disk/ata0p0 init=root:/boot/init-12.bin config=test-config + +Hiérarchie telle que la voit une application qui tourne dans une boîte (c'est-à-dire n'importe quelle application de `apps:/` ou `home:/apps`) : + +- `io:/` : accès contrôlé aux ressources du système et à l'extérieur + - `io:/display`, `io:/mouse`, ... accessible via une inter-couche dans `desktop.bin` qui gère les autorisations + - `io:/desktop` : communication contrôlée avec les autres processus (notifications, demandes d'accès, ...) +- `sys:/` : accès en lecture seule permettant d'utiliser les libs du système +- `app:/` : dossier application (lecture-seule, correspond à `apps:/nom-appli.pkg` ou `user:/apps/nom-appli.pkg`) +- `data:/` : dossier de données de l'application pour l'utilisateur (lecture-écriture, correspond à `user:/data/nom-appli`) +- `user:/` : sous-portion séléctivement autorisée en lecture seule et en lecture-écriture du dossier `user:/` + +Hiérarchie telle que la voit un service du système qui tourne dans une boîte (c'est-à-dire n'importe quel serveur) + +- `sys:/` : accès en lecture seule permettant d'utiliser les libs du système +- `app:/` : dossier du service, correspond à `services:/nom-service.pkg` +- `data:/` : bind-mount de `root:/services/nom-service` + +Du coup ce qu'il faut en termes de systèmes de fichiers : + +- il faut que seul le processus qui a créé un FS puisse l'adminsitrer (ie faire des add-source) +- `pkgfs` : capable de prendre un nombre arbitraire de fichiers `.pkg` et de faire apparaître leur contenu comme un dossier + - il faut que les fichiers `.pkg` puissent facilement contenir des métadonnées + - au moment du mount, soit copier en RAM (typiquement pour les paquets système ou pour les applis utilisateurs dans certains cas), soit lire à la demande à partir du support sous-jaccent + - toujours read-only + - charger un `.pkg` correspond à un add-source +- Nativement dans la couche VFS inclure une fonctionnalité `fs_subfs` qui permet de : + - prendre un sous-dossier comme racine + - restreindre les droits (ie enlver tous droits d'écriture, typiquement) + - dans un premier temps, cette seconde fonctionnalité peut suffire, on n'utilise simplement pas encore de fichiers `.pkg` mais par exemple un cdrom avec un dossier `sys` que l'on binde comme `sys:/` par exemple. + +Rôle des différents binaires du système : + +- `init.bin` : fait le setup de `config:/` puis de `sys:/`, `apps:/` et + `services:/`, lance `sys:/bin/login.bin` avec tous les droits (pour les + services on verra plus tard mais il y aura sans doute un + `sys:/bin/svcmgr.bin`) +- `login.bin` : authentification, fait le setup de `user:/`, puis lance + `sys:/bin/desktop.bin` avec les droits associés à l'utilisateur (`sys` et + `config` en RO, éventuellement déjà un partage des périphériques pour prévoir + plusieurs sessions simultanées - un `login.bin` primitif ne fait rien de tout + ça évidemment) +- alternativement `login.bin` peut lancer `admin.bin` (console + d'administration) avec tous les droits, sur authentification appropriée +- `desktop.bin` : gère les périphériques au niveau utilisateur, crée des boîtes + pour lancer les applications utilisateur + + -- cgit v1.2.3