OVH Cloud OVH Cloud

'objet' Unix avec certaines particularités?

29 réponses
Avatar
Erwann ABALEA
Bonjour,

Est-ce qu'il existe un 'objet' (fichier, socket, device, ...) Unix qui:
- puisse être accédé en lecture par plusieurs process simultanément
- supporte les appels type lseek (donc à accès aléatoire)
- dont le contenu puisse être 'virtuel' (i.e. un peu comme un tube
nommé, qui ne consomme quasimment rien sur disque)
- puisse être accédé comme un simple fichier, par un cat, more, grep, ...
(donc pas comme une socket)

Réunissant toutes ces conditions, je ne vois que les devices en mode
caractère, mais il est possible que j'oublie des trucs...

Un fichier simple, ça ne marche pas, le contenu est 'réel', et j'ai besoin
que ce contenu soit dépendant du bon vouloir d'une application, sans pour
autant devoir réécrire le fichier. De plus, je ne veux pas que ça occupe
beaucoup de place sur le disque, quelle que soit la quantité de données
accessible.

Un tube nommé, il ne peut y avoir qu'un seul lecteur à la fois, et le
lseek est limité au buffer interne du noyau (4k sous Linux).

Une socket Unix, ça n'est pas accessible pas un simple cat et ça ne
supporte pas le lseek (ou alors je me trompe?).

Merci.

--
Erwann ABALEA <erwann@abalea.com> - RSA PGP Key ID: 0x2D0EABD5
-----
nous semblons être entouré d'un quarteront de dénigreurs, qui non
seulement n'apportent pas de réponses, mais en plus sèment le doute dans
l'esprit des demandeur... Restez modeste ça fait du bien.
-+- Joe in: Guide du Neuneu d'Usenet - Neuneugaulle, le recours -+-

10 réponses

1 2 3
Avatar
Laurent Wacrenier
Erwann ABALEA écrit:
Est-ce qu'il existe un 'objet' (fichier, socket, device, ...) Unix qui:
- puisse être accédé en lecture par plusieurs process simultanément
- supporte les appels type lseek (donc à accès aléatoire)
- dont le contenu puisse être 'virtuel' (i.e. un peu comme un tube
nommé, qui ne consomme quasimment rien sur disque)
- puisse être accédé comme un simple fichier, par un cat, more, grep, ...
(donc pas comme une socket)

Réunissant toutes ces conditions, je ne vois que les devices en mode
caractère, mais il est possible que j'oublie des trucs...


Les fichiers d'un système de fichier sans disque.

Un fichier simple, ça ne marche pas, le contenu est 'réel', et j'ai besoin
que ce contenu soit dépendant du bon vouloir d'une application, sans pour
autant devoir réécrire le fichier. De plus, je ne veux pas que ça occupe
beaucoup de place sur le disque, quelle que soit la quantité de données
accessible.


Faut bien mettre les données quelque part. Dans un système de fichier
mémoire, par exemple.

Un tube nommé, il ne peut y avoir qu'un seul lecteur à la fois, et le
lseek est limité au buffer interne du noyau (4k sous Linux).


Ce n'est pas garanti que lseek fonctionne sur les tubes.

Avatar
Stephane Chazelas
2003/10/27, 18:26(+01), Erwann ABALEA:
Est-ce qu'il existe un 'objet' (fichier, socket, device, ...) Unix qui:
- puisse être accédé en lecture par plusieurs process simultanément
- supporte les appels type lseek (donc à accès aléatoire)
- dont le contenu puisse être 'virtuel' (i.e. un peu comme un tube
nommé, qui ne consomme quasimment rien sur disque)
- puisse être accédé comme un simple fichier, par un cat, more, grep, ...
(donc pas comme une socket)

Réunissant toutes ces conditions, je ne vois que les devices en mode
caractère, mais il est possible que j'oublie des trucs...
[...]


C'est pour quoi faire ?

Peut-etre que tu peux mettre un wrapper à base de LD_PRELOAD
autour des applications qui accèdent aux fichiers en redirigeant
les open, close, read, lseek.

--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

Avatar
Erwann ABALEA
Bonjour,

On Mon, 27 Oct 2003, Laurent Wacrenier wrote:

Erwann ABALEA écrit:
Est-ce qu'il existe un 'objet' (fichier, socket, device, ...) Unix qui:
- puisse être accédé en lecture par plusieurs process simultanément
- supporte les appels type lseek (donc à accès aléatoire)
- dont le contenu puisse être 'virtuel' (i.e. un peu comme un tube
nommé, qui ne consomme quasimment rien sur disque)
- puisse être accédé comme un simple fichier, par un cat, more, grep, ...
(donc pas comme une socket)

Réunissant toutes ces conditions, je ne vois que les devices en mode
caractère, mais il est possible que j'oublie des trucs...


Les fichiers d'un système de fichier sans disque.


Ah. Pas bête comme idée.

Un fichier simple, ça ne marche pas, le contenu est 'réel', et j'ai besoin
que ce contenu soit dépendant du bon vouloir d'une application, sans pour
autant devoir réécrire le fichier. De plus, je ne veux pas que ça occupe
beaucoup de place sur le disque, quelle que soit la quantité de données
accessible.


Faut bien mettre les données quelque part. Dans un système de fichier
mémoire, par exemple.


Ou tout simplement que ces données soient générées à la volée, comme pour
un tube nommé, par exemple. Dans ce cas, pas besoin que ces données
prennent une quelconque place quelque part.

Un tube nommé, il ne peut y avoir qu'un seul lecteur à la fois, et le
lseek est limité au buffer interne du noyau (4k sous Linux).


Ce n'est pas garanti que lseek fonctionne sur les tubes.


En plus. Mais le tube nommé ne répond pas à mes critères, de toute façon.

Donc à part le character device et le système de fichier virtuel, il
n'existe rien qui satisfasse aux conditions? Ces 2 solutions nécessitent
du code qui ne tourne pas en userland, et qui n'est certainement pas
portable. Génant.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
pendant 3jours de crosspostait avec une nouvelle adresse
() mais je suis vite repassé a
parce que faire suivre.com mettait du temps a activer cette boite.
-+- Cachalot in GNU : Je m'en bats l'aine et je me cache à l'eau -+-


Avatar
Erwann ABALEA
On Mon, 27 Oct 2003, Stephane Chazelas wrote:

2003/10/27, 18:26(+01), Erwann ABALEA:
Est-ce qu'il existe un 'objet' (fichier, socket, device, ...) Unix qui:
- puisse être accédé en lecture par plusieurs process simultanément
- supporte les appels type lseek (donc à accès aléatoire)
- dont le contenu puisse être 'virtuel' (i.e. un peu comme un tube
nommé, qui ne consomme quasimment rien sur disque)
- puisse être accédé comme un simple fichier, par un cat, more, grep, ...
(donc pas comme une socket)

Réunissant toutes ces conditions, je ne vois que les devices en mode
caractère, mais il est possible que j'oublie des trucs...
[...]


C'est pour quoi faire ?


Très bonne question. Le but est de 'réunir' plusieurs fichiers en un seul,
mais de façon virtuelle, en offrant un point d'entrée unique. On peut
imaginer la situation suivante:
- fichier /a/file1.dat
- fichier /b/file2.dat
- pseudo-fichier /c/merge.dat

Et toute lecture de /c/merge.dat renverra du contenu dépendant de
/a/file1.dat et /b/file2.dat (ce qui se trouve derrière le 'dépendant' n'a
pas besoin d'être expliqué). Je ne veux pas que merge.dat prenne de la
place disque (autrement que par sa représentation), puisque les données se
trouvent déjà ailleurs.

Je ne sais pas si mon exemple est suffisamment parlant.

Peut-etre que tu peux mettre un wrapper à base de LD_PRELOAD
autour des applications qui accèdent aux fichiers en redirigeant
les open, close, read, lseek.


Hmmmm. Possible, mais le système de fichier virtuel me parait plus
élégant, et le character device moins 'bricolage'. ;)
Je vais quand même y réfléchir. Ca me fait 3 mécanismes potentiels... Mais
rien de vraiment portable, et en tout cas rien qui tourne simplement en
userland...

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
CE>Je ne sais pas si vous etes la personne adequat mais il y a un
CE>"dégénéré mental " qui veut enculer tous le monde sur frsf
ne vous inquiétez pas, ce n'est pas possible via Usenet :)
-+-LW in Guide du Neuneu Usenet - Après les mouches, à qui le tour ? -+-



Avatar
Laurent Wacrenier
Erwann ABALEA écrit:
Donc à part le character device et le système de fichier virtuel, il
n'existe rien qui satisfasse aux conditions? Ces 2 solutions nécessitent
du code qui ne tourne pas en userland, et qui n'est certainement pas
portable. Génant.


Si tu veux pouvoir faire seek() sans avoir de cache, il faut que les
données puissent être recalculées aléatoirement. Si c'est la sortie
d'un programe, ce programme doit pouvoir intercepter l'appel à seek()
ce qui ne peut se faire sans collaboration du système de fichier.

Avatar
no
On Tue, 28 Oct 2003 12:14:13 +0100, Erwann ABALEA wrote:

On Mon, 27 Oct 2003, Stephane Chazelas wrote:

2003/10/27, 18:26(+01), Erwann ABALEA:
Est-ce qu'il existe un 'objet' (fichier, socket, device, ...) Unix qui:
- puisse être accédé en lecture par plusieurs process simultanément
- supporte les appels type lseek (donc à accès aléatoire)
- dont le contenu puisse être 'virtuel' (i.e. un peu comme un tube
nommé, qui ne consomme quasimment rien sur disque)
- puisse être accédé comme un simple fichier, par un cat, more, grep, ...
(donc pas comme une socket)

Réunissant toutes ces conditions, je ne vois que les devices en mode
caractère, mais il est possible que j'oublie des trucs...
[...]


C'est pour quoi faire ?


Très bonne question. Le but est de 'réunir' plusieurs fichiers en un seul,
mais de façon virtuelle, en offrant un point d'entrée unique. On peut
imaginer la situation suivante:
- fichier /a/file1.dat
- fichier /b/file2.dat
- pseudo-fichier /c/merge.dat

Et toute lecture de /c/merge.dat renverra du contenu dépendant de
/a/file1.dat et /b/file2.dat (ce qui se trouve derrière le 'dépendant' n'a
pas besoin d'être expliqué). Je ne veux pas que merge.dat prenne de la
place disque (autrement que par sa représentation), puisque les données se
trouvent déjà ailleurs.

Je ne sais pas si mon exemple est suffisamment parlant.

Peut-etre que tu peux mettre un wrapper à base de LD_PRELOAD
autour des applications qui accèdent aux fichiers en redirigeant
les open, close, read, lseek.


Hmmmm. Possible, mais le système de fichier virtuel me parait plus
élégant, et le character device moins 'bricolage'. ;)
Je vais quand même y réfléchir. Ca me fait 3 mécanismes potentiels... Mais
rien de vraiment portable, et en tout cas rien qui tourne simplement en
userland...


- 3éme solution :
C'est de passer par un serveur NFS en « userspace » comme l'ancien
serveur NFS de Linux (`nfs-server', avant que ça ne soit géré par le
kernel).
Tu as d'un coté une interface NFS classique accessible par
n'importe quel client (un simple mount), ensuite tu implementes toi même
les mécanismes internes du serveur et d'accés aux vrais fichiers avec ta
gestion de « merge »...

Tu as donc un système de fichier complet, portable, et même orienté
reseaux...



Avatar
Erwan David
no écrivait :

- 3éme solution :
C'est de passer par un serveur NFS en « userspace » comme l'ancien
serveur NFS de Linux (`nfs-server', avant que ça ne soit géré par le
kernel).
Tu as d'un coté une interface NFS classique accessible par
n'importe quel client (un simple mount), ensuite tu implementes toi même
les mécanismes internes du serveur et d'accés aux vrais fichiers avec ta
gestion de « merge »...

Tu as donc un système de fichier complet, portable, et même orienté
reseaux...


C'est comme ça que fonctionne cfs, le "serveur NFS" faisant le
chiffrement/déchiffrement des fichiers.

--
Erwan

Avatar
Erwann ABALEA
On Tue, 28 Oct 2003, Laurent Wacrenier wrote:

Erwann ABALEA écrit:
Donc à part le character device et le système de fichier virtuel, il
n'existe rien qui satisfasse aux conditions? Ces 2 solutions nécessitent
du code qui ne tourne pas en userland, et qui n'est certainement pas
portable. Génant.


Si tu veux pouvoir faire seek() sans avoir de cache, il faut que les
données puissent être recalculées aléatoirement. Si c'est la sortie


Pas exactement 'aléatoirement', mais je suppose que tu voulais dire que je
dois être capable de reconstruire les données même en cas d'accès
aléatoire. C'est effectivement un prérequis, et cela sera le cas.

d'un programe, ce programme doit pouvoir intercepter l'appel à seek()
ce qui ne peut se faire sans collaboration du système de fichier.


En fait, ce point d'entrée sera 'nourri' de fichiers réels, auxquels le
programme appliquera une petite transformation. Le but est d'en changer la
présentation, tout en réunissant plusieurs fichiers (de structure
similaire).

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
Je voudrais savoir comment chercher n'importe quelle nationalités. S'il
y en a qui sont faciles à trouver, il y en a d'autres mêmes européennes
ou mondiales...
-+- ER in <http://neuneu.mine.nu> : C'est un monde ça -+-


Avatar
Erwann ABALEA
On Tue, 28 Oct 2003, no wrote:

[...]
- 3éme solution :
C'est de passer par un serveur NFS en « userspace » comme l'ancien
serveur NFS de Linux (`nfs-server', avant que ça ne soit géré par le
kernel).
Tu as d'un coté une interface NFS classique accessible par
n'importe quel client (un simple mount), ensuite tu implementes toi même
les mécanismes internes du serveur et d'accés aux vrais fichiers avec ta
gestion de « merge »...


Ca n'est pas une troisième solution, c'est la même chose que le système de
fichier virtuel. D'ailleurs ont peut supprimer le 'virtuel', il s'agit
d'un système de fichier tout court. Que les données soient physiquement
ici, ailleurs, ou générées à la volée, peu importe.

Il faut que je regarde comment le usermode NFS fonctionne. C'est déjà
mieux d'avoir ça en userland qu'en noyau, mais là non plus, ça n'est pas
très portable (comprendre: les détails seront forcément différents sous
Solaris, HP/UX, AIX, ...).

J'ai donc toujours 3 solutions, dont une peut être implémentée en
userland, mais aucune de portable. Et aucune d'aussi 'élégante' et simple
qu'un socket, un tube nommé, ou autre machin quasimment natif.

Merci pour vos réponses.

--
Erwann ABALEA - RSA PGP Key ID: 0x2D0EABD5
-----
JE SUIS TOTALEMENT DE TON AVIS !!
Ton argumentation reflète EXACTEMENT ce que je pense.
Il fallait que je le dise même si ça ne fait pas avancé le scmilblick
-+- Tigrou yodèle in GNU - AOL hi hi, la la la itou -+-

Avatar
Pascal Bourguignon
Erwann ABALEA writes:

On Tue, 28 Oct 2003, no wrote:

[...]
- 3éme solution :
C'est de passer par un serveur NFS en « userspace » comme l'ancien
serveur NFS de Linux (`nfs-server', avant que ça ne soit géré par le
kernel).
Tu as d'un coté une interface NFS classique accessible par
n'importe quel client (un simple mount), ensuite tu implementes toi même
les mécanismes internes du serveur et d'accés aux vrais fichiers avec ta
gestion de « merge »...


Ca n'est pas une troisième solution, c'est la même chose que le système de
fichier virtuel. D'ailleurs ont peut supprimer le 'virtuel', il s'agit
d'un système de fichier tout court. Que les données soient physiquement
ici, ailleurs, ou générées à la volée, peu importe.

Il faut que je regarde comment le usermode NFS fonctionne. C'est déjà
mieux d'avoir ça en userland qu'en noyau, mais là non plus, ça n'est pas
très portable (comprendre: les détails seront forcément différents sous
Solaris, HP/UX, AIX, ...).

J'ai donc toujours 3 solutions, dont une peut être implémentée en
userland, mais aucune de portable. Et aucune d'aussi 'élégante' et simple
qu'un socket, un tube nommé, ou autre machin quasimment natif.

Merci pour vos réponses.


Mais encore, faut il qu'un quelconque programme soit capable d'accéder
à ces fichiers virtuels?

Si c'est pour une application particulière et que seuls un nombre
limité de programmes ont a accéder à ces fichiers virtuels, on peut
faire trés portable en exposant l'API au niveau d'une bibliothèque
normale, sans avoir à passer par le système. Il suffit alors dans ces
programmes clients d'utiliser vcfs_open, vcfs_read, vcfs_write,
vcfs_seek et vcfs_close au lieu des classiques. (Virtual Concatenation
File System).

--
__Pascal_Bourguignon__
http://www.informatimago.com/


1 2 3