File system pomocí FUSE – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

File system pomocí FUSE – C / C++ – Fórum – Programujte.comFile system pomocí FUSE – C / C++ – Fórum – Programujte.com

 

Honza
~ Anonymní uživatel
451 příspěvků
13. 2. 2014   #1
-
0
-

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

Nahlásit jako SPAM
IP: 85.132.178.–
z
~ Anonymní uživatel
268 příspěvků
13. 2. 2014   #2
-
0
-

Na první straně dokumentace je těch příkladů víc.

Myslím si, že je ta dokumentace dostatečná, ale pokud něčemu nerozumíš, tak se klidně zeptej.

Nahlásit jako SPAM
IP: 78.156.159.–
z
~ Anonymní uživatel
268 příspěvků
13. 2. 2014   #3
-
0
-

A hned na hlavní stránce projektu je odkaz na seznam spousty FS přes FUSE, můžeš se na ně podívat.

Filesystems based on FUSE

Nahlásit jako SPAM
IP: 78.156.159.–
Honza
~ Anonymní uživatel
451 příspěvků
17. 2. 2014   #4
-
0
-

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;
}
Nahlásit jako SPAM
IP: 2001:718:2:80e:c574:dd13:...–
z
~ Anonymní uživatel
268 příspěvků
18. 2. 2014   #5
-
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
Nahlásit jako SPAM
IP: 88.101.8.–
Honza
~ Anonymní uživatel
451 příspěvků
18. 2. 2014   #6
-
0
-

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>
Nahlásit jako SPAM
IP: 2001:718:2:80e:80f5:347e:...–
z
~ Anonymní uživatel
268 příspěvků
18. 2. 2014   #7
-
0
-

Tak si to přepiš, nebo doplň toto:

#define _GNU_SOURCE //asprintf
#include <stdlib.h> //free
...

gcc -std=c99 ...
Nahlásit jako SPAM
IP: 78.156.159.–
Honza
~ Anonymní uživatel
451 příspěvků
18. 2. 2014   #8
-
0
-

Asi dělám něco špatně, protože když chci v tom svém FS vtvořit novou složku tak mi bohužel pořád Ubunutu hlásí: adresář „abcd“ nelze vytvořit: Adresář nebo soubor neexistuje

Nahlásit jako SPAM
IP: 2001:718:2:80e:a990:7187:...–
Honza
~ Anonymní uživatel
451 příspěvků
18. 2. 2014   #9
-
0
-

   

$ 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?

Nahlásit jako SPAM
IP: 2001:718:2:80e:a990:7187:...–
z
~ Anonymní uživatel
268 příspěvků
19. 2. 2014   #10
-
0
-

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. 

Nahlásit jako SPAM
IP: 88.101.8.–
Honza
~ Anonymní uživatel
451 příspěvků
19. 2. 2014   #11
-
0
-

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)?

Nahlásit jako SPAM
IP: 2001:718:2:80e:78fe:fa97:...–
z
~ Anonymní uživatel
268 příspěvků
19. 2. 2014   #12
-
0
-

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.

Nahlásit jako SPAM
IP: 78.156.159.–
Honza
~ Anonymní uživatel
451 příspěvků
19. 2. 2014   #13
-
0
-

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

Nahlásit jako SPAM
IP: 2001:718:2:80e:5de7:d4c5:...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 94 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý