файловая система FUSE

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 10 авг 2022, 11:51

Olej писал(а):
10 авг 2022, 11:47
Новый

Код: Выделить всё

olej@R420:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Linuxmint
Description:	Linux Mint 20.3
Release:	20.3
Codename:	una
Сама система FUSE сейчас устанавливается по дефаулту, из-за широты её использования:

Код: Выделить всё

olej@R420:~$ aptitude search fuse | grep ^i
i  exfat-fuse - драйвер чтения и записи exFAT для FUSE
i  fuse - файловая система в пользовательском окружении
i  gvfs-fuse - userspace virtual filesystem - fuse server
i  ifuse - FUSE-модуль для устройств iPhone и iPod Touch
i  libfuse2 - Filesystem in Userspace (library)
Но:

Код: Выделить всё

olej@R420:~$ pkg-config fuse --cflags --libs
Package fuse was not found in the pkg-config search path.
Perhaps you should add the directory containing `fuse.pc'
to the PKG_CONFIG_PATH environment variable
No package 'fuse' found
Т.е. средства собственной разработки нужно устанавливать дополнительно:

Код: Выделить всё

olej@R420:~$ sudo apt install libfuse-dev
[sudo] пароль для olej:
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Следующие НОВЫЕ пакеты будут установлены:
  libfuse-dev
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 105 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 596 kB.
Пол:1 http://ubuntu.volia.net/ubuntu-archive focal/main amd64 libfuse-dev amd64 2.9.9-3 [105 kB]
Получено 105 kB за 0с (752 kB/s)
Выбор ранее не выбранного пакета libfuse-dev.
(Чтение базы данных … на данный момент установлено 477514 файлов и каталогов.)
Подготовка к распаковке …/libfuse-dev_2.9.9-3_amd64.deb …
Распаковывается libfuse-dev (2.9.9-3) …
Настраивается пакет libfuse-dev (2.9.9-3) …

Код: Выделить всё

olej@R420:~$ pkg-config fuse --cflags --libs
-D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -lfuse -pthread

Код: Выделить всё

olej@R420:/usr/lib/x86_64-linux-gnu$ ls -l /usr/lib/x86_64-linux-gnu/*fuse*
-rw-r--r-- 1 root root 373720 мар  7  2020 /usr/lib/x86_64-linux-gnu/libfuse.a
lrwxrwxrwx 1 root root     38 мар  7  2020 /usr/lib/x86_64-linux-gnu/libfuse.so -> /lib/x86_64-linux-gnu/libfuse.so.2.9.9
lrwxrwxrwx 1 root root     16 фев 14  2021 /usr/lib/x86_64-linux-gnu/libfuse.so.2 -> libfuse.so.2.9.9
-rw-r--r-- 1 root root 252184 мар  7  2020 /usr/lib/x86_64-linux-gnu/libfuse.so.2.9.9

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 10 авг 2022, 14:04

Что итересно, что

Код: Выделить всё

сборщики
дистрибутивов (даже близких) собирают FUSE совершенно по=разному...
- Mint 20.3:

Код: Выделить всё

olej@R420:/lib/modules/5.4.0-122-generic/build$ grep FUSE /lib/modules/`uname -r`/build/.config
CONFIG_FUSE_FS=y
# CONFIG_AUFS_BR_FUSE is not set
И естественно - всё вкомпилировано в ядро:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/blkdev/?old_vers$ lsmod | grep fuse
olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/blkdev/?old_vers$ 
- LMDE5:

Код: Выделить всё

olej@nvme:/lib/modules/5.10.0-16-amd64/build/scripts$ grep FUSE /lib/modules/`uname -r`/build/.config
CONFIG_FUSE_FS=m
CONFIG_FUSE_DAX=y

Код: Выделить всё

olej@nvme:/lib/modules/5.10.0-16-amd64/build/scripts$ lsmod | grep fuse
fuse                  167936  5

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 10 авг 2022, 14:18

Olej писал(а):
11 мар 2015, 17:41
и всё ... ваша файловая система закрутилась
Тот пример (от авторов FUSE?) не собирается (раньше, наверное, собирался) ... Нужно менять Makefile:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/blkdev/fuse$ cat Makefile 
CC = gcc -Wall `pkg-config fuse --cflags --libs` 
PROGS = hello cusexmp fsel fselclient xmp fusexmp fusexmp_fh

%: %.c
	$(CC) $< -lfuse -o $@

all:    $(PROGS)

fusexmp_fh: fusexmp_fh.c
	$(CC) $< -lfuse -lulockmgr -o $@

clean:
	rm -f $(PROGS) *.o
После чего сборка (современная) идёт:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/blkdev/fuse$ make 
gcc -Wall `pkg-config fuse --cflags --libs`  hello.c -lfuse -o hello
gcc -Wall `pkg-config fuse --cflags --libs`  cusexmp.c -lfuse -o cusexmp
gcc -Wall `pkg-config fuse --cflags --libs`  fsel.c -lfuse -o fsel
gcc -Wall `pkg-config fuse --cflags --libs`  fselclient.c -lfuse -o fselclient
gcc -Wall `pkg-config fuse --cflags --libs`  xmp.c -lfuse -o xmp
In file included from /usr/include/fuse/fuse.h:26,
                 from xmp.c:16:
/usr/include/fuse/fuse_common.h:491:4: warning: #warning Compatibility with API version 11 is deprecated [-Wcpp]
  491 | #  warning Compatibility with API version 11 is deprecated
      |    ^~~~~~~
gcc -Wall `pkg-config fuse --cflags --libs`  fusexmp.c -lfuse -o fusexmp
gcc -Wall `pkg-config fuse --cflags --libs`  fusexmp_fh.c -lfuse -lulockmgr -o fusexmp_fh

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 10 авг 2022, 14:21

Olej писал(а):
10 авг 2022, 14:18
После чего сборка (современная) идёт:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/blkdev/fuse$ ls -l | grep ^-rwx
-rwxrwxr-x 1 olej olej 18152 авг 10 14:09 cusexmp
-rwxrwxr-x 1 olej olej 18672 авг 10 14:09 fsel
-rwxrwxr-x 1 olej olej 17048 авг 10 14:09 fselclient
-rwxrwxr-x 1 olej olej 19056 авг 10 14:09 fusexmp
-rwxrwxr-x 1 olej olej 28192 авг 10 14:09 fusexmp_fh
-rwxrwxr-x 1 olej olej 17536 авг 10 14:09 hello
-rwxrwxr-x 1 olej olej 18720 авг 10 14:09 xmp
Этих примеров более чем достаточно, чтобы самим начать создавать файловые системы под свои нужды налево и направо :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 10 авг 2022, 14:25

Olej писал(а):
10 авг 2022, 14:21
Этих примеров более чем достаточно, чтобы самим начать создавать файловые системы под свои нужды налево и направо :lol:
Вернуться к началу

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/fuse$ ./hello tmp

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/fuse$ mount | grep fuse.hello
/home/olej/2022/own.BOOKs/BHV.kernel/examples/fuse/hello on /home/olej/2022/own.BOOKs/BHV.kernel/examples/fuse/tmp type fuse.hello (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/blkdev/fuse$ tree tmp
tmp
└── hello

0 directories, 1 file

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/fuse$ ls -l tmp/
итого 0
-r--r--r-- 1 root root 13 янв  1  1970 hello

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/fuse$ cat tmp/hello
Hello World!

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/fuse$ echo 'привет' > tmp/hello
bash: tmp/hello: Отказано в доступе

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/fuse$ umount tmp

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/fuse$ ls -l tmp/
итого 0

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 10 авг 2022, 23:28

Olej писал(а):
10 авг 2022, 14:21
Этих примеров более чем достаточно, чтобы самим начать создавать файловые системы
Всё очеь просто...
Используйте fuse для написания собственной файловой системы под Linux
Writing a Simple Filesystem Using FUSE in C
Определяете таблицу операций, и функции реализующие эти операции в пространстве пользовавтеля:

Код: Выделить всё

struct fuse_operations {
	int (*getattr) (const char *, struct stat *);
	int (*readlink) (const char *, char *, size_t);
	int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
	int (*mknod) (const char *, mode_t, dev_t);
	int (*mkdir) (const char *, mode_t);
	int (*unlink) (const char *);
	int (*rmdir) (const char *);
	int (*symlink) (const char *, const char *);
	int (*rename) (const char *, const char *);
	int (*link) (const char *, const char *);
	int (*chmod) (const char *, mode_t);
	int (*chown) (const char *, uid_t, gid_t);
	int (*truncate) (const char *, off_t);
	int (*utime) (const char *, struct utimbuf *);
	int (*open) (const char *, struct fuse_file_info *);
	int (*read) (const char *, char *, size_t, off_t,
		     struct fuse_file_info *);
	int (*write) (const char *, const char *, size_t, off_t,
		      struct fuse_file_info *);
	int (*statfs) (const char *, struct statvfs *);
	int (*flush) (const char *, struct fuse_file_info *);
	int (*release) (const char *, struct fuse_file_info *);
	int (*fsync) (const char *, int, struct fuse_file_info *);
	int (*setxattr) (const char *, const char *, const char *, size_t, int);
	int (*getxattr) (const char *, const char *, char *, size_t);
	int (*listxattr) (const char *, char *, size_t);
	int (*removexattr) (const char *, const char *);
	int (*opendir) (const char *, struct fuse_file_info *);
	int (*readdir) (const char *, void *, fuse_fill_dir_t, off_t,
			struct fuse_file_info *);
	int (*releasedir) (const char *, struct fuse_file_info *);
	int (*fsyncdir) (const char *, int, struct fuse_file_info *);
	void *(*init) (struct fuse_conn_info *conn);
	void (*destroy) (void *);
	int (*access) (const char *, int);
	int (*create) (const char *, mode_t, struct fuse_file_info *);
	int (*ftruncate) (const char *, off_t, struct fuse_file_info *);
	int (*fgetattr) (const char *, struct stat *, struct fuse_file_info *);
	int (*lock) (const char *, struct fuse_file_info *, int cmd,
		     struct flock *);
	int (*utimens) (const char *, const struct timespec tv[2]);
	int (*bmap) (const char *, size_t blocksize, uint64_t *idx);
	int (*ioctl) (const char *, int cmd, void *arg,
		      struct fuse_file_info *, unsigned int flags, void *data);
	int (*poll) (const char *, struct fuse_file_info *,
		     struct fuse_pollhandle *ph, unsigned *reventsp);
	int (*write_buf) (const char *, struct fuse_bufvec *buf, off_t off,
			  struct fuse_file_info *);
	int (*read_buf) (const char *, struct fuse_bufvec **bufp,
			 size_t size, off_t off, struct fuse_file_info *);
	int (*flock) (const char *, struct fuse_file_info *, int op);
	int (*fallocate) (const char *, int, off_t, off_t,
			  struct fuse_file_info *);
};

Не определённые вами здесь функции - они будут вести себя (для разных операций) более-менее логичным образом, или возвращать ошибку "не поддерживается".
И поехали:

Код: Выделить всё

static struct fuse_operations operations = {
...
};

int main( int argc, char *argv[] )
{
	return fuse_main( argc, argv, &operations, NULL );
}
И у вас работающая файловая система. :!:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: файловая система FUSE

Непрочитанное сообщение Olej » 10 авг 2022, 23:43

Olej писал(а):
10 авг 2022, 14:18
Нужно менять Makefile:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/blkdev/fuse$ cat Makefile 
CC = gcc -Wall `pkg-config fuse --cflags --libs` 
PROGS = hello cusexmp fsel fselclient xmp fusexmp fusexmp_fh

%: %.c
	$(CC) $< -lfuse -o $@

all:    $(PROGS)

fusexmp_fh: fusexmp_fh.c
	$(CC) $< -lfuse -lulockmgr -o $@

clean:
	rm -f $(PROGS) *.o
Заинтересовало, почему собиравшийся раньше проект - перестал собираться новыми инструментами?
Это проявление вот этого эффекта: gcc -Wl,--as-needed ... - то что произошло в новых версиях GCC начиная примерно с 2016г.
Достаточно поменять последовательность параметров и опций GCC:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/blkdev/fuse$ 
cat Makefile 
CC = gcc -Wall 
COPT = `pkg-config fuse --cflags --libs` 
PROGS = hello cusexmp fsel fselclient xmp fusexmp fusexmp_fh

%: %.c
	$(CC) $< $(COPT) -o $@

all:    $(PROGS)

fusexmp_fh: fusexmp_fh.c
	$(CC) $< $(COPT) -lulockmgr -o $@

clean disclean:
	rm -f $(PROGS) *.o
И всё поехало:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/blkdev/fuse$ make
gcc -Wall  hello.c `pkg-config fuse --cflags --libs`  -o hello
gcc -Wall  cusexmp.c `pkg-config fuse --cflags --libs`  -o cusexmp
gcc -Wall  fsel.c `pkg-config fuse --cflags --libs`  -o fsel
gcc -Wall  fselclient.c `pkg-config fuse --cflags --libs`  -o fselclient
gcc -Wall  xmp.c `pkg-config fuse --cflags --libs`  -o xmp
In file included from /usr/include/fuse/fuse.h:26,
                 from xmp.c:16:
/usr/include/fuse/fuse_common.h:491:4: warning: #warning Compatibility with API version 11 is deprecated [-Wcpp]
  491 | #  warning Compatibility with API version 11 is deprecated
      |    ^~~~~~~
gcc -Wall  fusexmp.c `pkg-config fuse --cflags --libs`  -o fusexmp
gcc -Wall  fusexmp_fh.c `pkg-config fuse --cflags --libs`  -lulockmgr -o fusexmp_fh

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей