Ahoj, potřebuju vytvořit svůj vlastní FS do ubuntu(linuxu) pomocí FUSE, ale jediný co jsem k tomu našel je stránka vývojářů s jednoduchým příkladem. Neporadil by mi někdo nějakou literaturu nebo dalí ukázku implementace jak vlastně na to? Díky
Fórum › C / C++
File system pomocí FUSE
A hned na hlavní stránce projektu je odkaz na seznam spousty FS přes FUSE, můžeš se na ně podívat.
Nešlo mi ani tak o další již plný implementace jako spíš o jednoduchý ukázky. Momentálně mám problém s přístupovými právy. Chci ve složce tmp(root složka pro můj FS) vytvořit složku, ale systém mi zamítne přístup protože nemám dostatečná oprávnění.
Tady připojuji implementaci metody mkdir
static int fs_mkdir(const char *path, mode_t mode) {
int res;
res = mkdir(path, mode & 777);
if (res == -1)
return -errno;
return 0;
}
Ten parametr path je absolutní cesta (v rámci tvého fs), takže ji musíš "přeložit". A předpokládám, že ta maska na mode měla být osmičkové číslo, takže ti tam chybí počáteční 0.
Vyřešil bych to jednoduše parametrem z příkazové řádky, třeba nějak takhle:
static char *basepath;
static char *myrealpath(const char *fusepath)
{
char *real;
return asprintf(&real, "%s%s", basepath, fusepath) == -1 ? NULL : real;
}
static int fs_mkdir(const char *path, mode_t mode)
{
char *realpath = myrealpath(path);
if (!realpath) return -errno;
int res = mkdir(realpath, mode & 0777) == -1 ? -errno : 0;
free(realpath);
return res;
}
int main(int argc, char *argv[])
{
struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
for (int i = 0; i < argc; i++) {
if (i == 2) basepath = strdup(argv[i]);
else fuse_opt_add_arg(&args, argv[i]);
}
if (!basepath || basepath[0] != '/') {
fprintf(stderr, "zadej absolutni basepath jako druhy parametr\n");
return 1;
}
return fuse_main(args.argc, args.argv, &ops, NULL);
}
$ mkdir fuse real
$ ./myfs fuse $PWD/real
Chtěl jsem to vyzkoušet, ale bohužel při kompilaci mi vyskočilo několik warningů
FileSystem.c: In function ‘myrealpath’:
FileSystem.c:25:2: warning: implicit declaration of function ‘asprintf’ [-Wimplicit-function-declaration]
FileSystem.c: In function ‘fs_mkdir’:
FileSystem.c:50:3: warning: implicit declaration of function ‘free’ [-Wimplicit-function-declaration]
FileSystem.c:50:3: warning: incompatible implicit declaration of built-in function ‘free’ [enabled by default]
FileSystem.c: In function ‘main’:
FileSystem.c:95:2: error: ‘for’ loop initial declarations are only allowed in C99 mode
FileSystem.c:95:2: note: use option -std=c99 or -std=gnu99 to compile your code
Našel jsem, že to vyžaduje knihovny, která já však už includnutý mám.
spouštím kompilaci s těmito parametry:
gcc -Wall FileSystem.c `pkg-config fuse --cflags --libs` -o filesystem
include:
#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include <sys/statfs.h>
$ mkdir fuse real
$ ./myfs fuse $PWD/real
Když provedu tyhle příkazy tak mi systém ve složce fuse zahlásí chybu co jsem psal v příspěvku výše, ale ve druhé složce real se operace provede(zrcadlí se), což není úplně funkce kterou bych chtěl. Myslel jsem si, že když někde dám vytvořit novou složku, že se mi tam opravdu vytvoří, ale asi to funguje jinak než jsem předpokládal a očekával. Mohl by mi někdo vysvětlit jak to teda vlastně funguje ve skutečnosti?
To je přece správně, mkdir pro fuse vytváří složku v real. Nic víc. Zatím tam nejspíš máš jen těch pár základních funkcí a je jasné k čemu jsou.
Aby to bylo kompletní, tak ještě musíš upravit implementaci getattr. Ten mkdir na fs vyvolá getattr (ještě neexistuje), mkdir (tak se vytvoří), getattr (a už existuje). A aby pak ta složka ještě byla vidět ve výpisu, tak musíš upravit readdir.
Když při spouštení myfs přidáš ještě parametr -d, tak zůstane na popředí a bude vypisovat, co se děje. A můžeš si tam případně přidat i svoje ladící výpisy, kdyby to nestačilo.
Možná se ted zeptám dost hloupě ale nějak jsem se do toho celýho zamotal...je teda reálný abych spustil program tak,že budu mít jen jednu root složku a budu pracovat jen ní (vytvářet nové složky, mazat atd)?
Když ses ve fs_mkdir pokoušel volat mkdir, tak jsem předpokládal, že to děláš úmyslně, abys tu složku někde na disku vytvořil. Samozřejmě můžeš všechny informace třeba držet jen v paměti toho fs, jako je např. ten helloworld ve fuse.
Pokud ti jde o izolování nějakého programu, aby viděl jen vlastní root a jinam nemohl, tak na to je třeba chroot.
Právě vůbec nevím jak na to jsme tohle řešení našel v jiném tutorialu a myslel jsem si že tak vytvořím novou složku.
Já potřebuju udělat takový FS, který když spustim tak si v něm uživatel bude standardně vytvářet/mazat soubory a složky, přejmenovávat je atd a tohle všechno se bude dít v rámci té root připojené složky jako je tomu podobně v tom hello příkladu, ale právě vůbec nevím jakým způsobem dodělat ty ostatní funkce, proto jsem žádal o nějakou radu nebo dokumentaci
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Content Managed System alebo Bloggersky system... — založil Mega.Lama
Fuse bits — založil ja jan
Slackware - Fuse - Instalacia — založil olgo
FUSE operace write — založil Honza
Čtení souboru a vytvoření složky FUSE — založil Honza
Moderátoři diskuze