Жизнь в пространстве пользователя

4 Мар
2008

Сегодня пользователю персонального компьютера приходится сталкиваться со многими технологиями, на их изучение требуется время, а навыки работы полученные ранее или привычные инструменты могут не пригодиться или показаться неудобными. Синтетические файловые системы работающие в пространстве пользователя, позволяют сгладить это различие и использовать для различных задач одни и те же инструменты.

Все является файлами — ключевая концепция Unix-систем. Файлами является даже периферийное оборудование компьютера, разделы жесткого диска, при этом для приложений доступ к файлу устройства или посылка данных другому процессу практически не отличается от доступа к обычному текстовому файлу, что позволяет пользователю применять одни и те же команды для копирования, печати и пр. Аналогичный подход реализуют и синтетические файловые системы работающие в пространстве пользователя. Файлами является все, с чем приходится иметь дело пользователю в такой файловой системе — почтовые ящики, web-страницы и ftp-серверы, защищенные SSH-соединения, архивы и другие локальные данные… Работа вне ядра упрощает установку и использование приложений, позволяет минимизировать последствия краха, использовать для программирования языки отличные от С, отлаживать такие приложения легче, появляется возможность вынести часть кода во внешние библиотеки, нет необходимости в переписывании кода для новых ядер, теперь можно создавать инструменты для самых разнообразных задач.

Проект FUSE

Первоначально разработанный для поддержки проекта AVFS (http://www.inf.bme.hu/~mszeredi/avfs/) FUSE (http://fuse.sourceforge.net) скоро стал отдельным проектом и на сегодня имеет приличный список файловых систем использующих его наработки. Код FUSE первоначально был включен в дерево ядра Эндрю Мортона (Andrew Morton), тем же кто использовал vanilla ядра приходилось устанавливать патч, но новая версия FUSE 2 уже по умолчанию включена в ядро Linux. Принцип работы такой системы прост. Модуль ядра перехватывает запросы к VFS и создает для пользователя иллюзию работы с обычной файловой системой, на которой эмулируется специальное дерево каталогов, отвечающее семантике хранимых в ней данных. Теперь для работы с этими файлами можно применять привычные утилиты, например, для копирования файлов через защищенное ssh-соединение достаточно воспользоваться cp. Модуль ядра и библиотека связываются через дескриптор специального файла /proc/fs/fuse/dev, через который и происходит взаимодействие.

Библиотеки FUSE используют и другие проекты, задача которой создание виртуальной файловой системы. Это SULF — Stackable User-Level Filesystem (http://pobox.com/~vgough/fuse-csharp.html) и FUSE-J (http://sourceforge.net/projects/fuse-j). Первый позволяет написать свою файловую систему на C#, второй на Java.

К сожалению, еще подобный проект LUFS — Linux Userland FileSystem (http://lufs.sourceforge.net/lufs) несмотря на надпись на сайте «Actively maintained» обновлялся в последний раз в конце 2003 года, поэтому уже можно говорить об прекращении работ.

На сайте проекта FUSE можно найти только небольшую программу — пример демонстрирующую возможности, основной же интерес представляют собой сторонние разработки, список которых можно найти на http://fuse.sourceforge.net/wiki/index.php/FileSystems. На момент написания статьи список насчитывал более 100 проектов. Хотя большая часть проектов еще не достигла состояния релиза и стабильная работа не гарантируется, в том числе и самими разработчиками, к тому же не все компилируются без проблем. Поэтому весь список перечислять не буду, остановлюсь только на самых интересных из них.

Шифрование информации

EncFS- Encrypted Filesystem (http://www.arg0.net/encfs) реализует зашифрованную файловую систему. Как и другие подобные файловые системы, основное назначение EncFs — защита персональных данных, резервных копий. Работа отличается от «loopback» систем работающих в режиме ядра. При этом в EncFs размер файловой системы может динамично изменяться. Некоторые метаданные остаются видимыми, что позволяет программе резервирования определить количество файлов, их размер, приблизительно количество знаков в имени (само имя шифруется), то есть узнать изменившиеся файлы. Но программа резервирования естественно не может их расшифровать, таким образом, резервные копии можно сделать без расшифровки.

Но програма резервирования естетсвенно не может их расшифровать, таким образом, резервные копии можно сделать без расшифровки. Работать с такой файловой системой можно как с локального, так и удаленного узла, а также сменных носителей вроде CD-ROM. Проверяем в работе.

Первым делом требуется установить fuse. Здесь ничего сложного. В репозитарии Kubuntu есть уже encfs поэтому установить его проще простого «sudo apt-get install encfs«, заодно будут загружены библиотеки и модули fuse. Для порядка проверим загружен ли необходимый для работы модуль.

$ /sbin/lsmod lsmod | grep fuse

fuse 38412 0

Новая файловая система должна быть в списке известных ФС.

$ cat /proc/filesystems | grep fuse

nodev fuse

После установки encfs будут доступны три исполняемых файла — еncfs, encfssh и encfsctl. С помощью первой, можно создать или смонтировать зашифрованную файловую систему. Создаем.

$ encfs ~/.crypt ~/crypt

По ходу будут заданы вопросы о создании всех необходимых для работы каталогов, при создании новой файловой системы доступно два предустановленых режима standard и paranoia (шифр AES, размер ключа 256, размер блока — 512), а также режим expert при использовании которого можно выбрать все параметры самому.

В последнем случае алгоритм шифрования, необходимость шифрования имени файла, и прочие параметры придется указывать самостоятельно. По окончании файловая система будет смонтирована, а пользователю будет выдан итог.

Конфигурация завершена. Создана файловая система

со следующими свойствами:

Шифр файловой системы: «ssl/blowfish», версия 2:1:1

Шифр файла: «nameio/block», версия 3:0:1

Размер ключа: 160 бит

Размер блока: 512 байт, включая 11 байт MAC заголовок

Каждый файл содержит 8-ми байтный заголовок с уникальными IV данными.

Файловые имена зашифруются с использованием IV цепочек.

Данные файла IV связаны с именем файла IV.

Проверяем как смонтирована новая файловая система.

$ mount | grep fuse

encfs on /home/grinder/crypt type fuse (rw,nosuid,nodev,default_permissions)

Теперь можно проверить работу вновь созданной ФС.

$ cd crypt/

$ echo «Это зашифрованное сообщение» > testfile

$ cat testfile

Это зашифрованное сообщение

$ cd

Теперь размонтируем и смотрим, что в каталоге.

$ fusermount -u ~/crypt

$ ls ./.crypt/

4bR5Ihisjfaa,5fdX40bTqgU

Невозможно прочитать и содержимое файлов.

Кроме того можно задать дополнительные параметры, которые позволяют автоматически размонтировать файловую систему в случае не активности в течении какого то промежутка времени, организовать доступ нескольким пользователям и некоторые другие. Используя утилиту encfsctl можно проверить параметры файловой системы или сменить пароль. Например:

$ encfsctl ./.crypt

Шифр файловой системы: «ssl/blowfish», версия 2:1:1

Шифр файла: «nameio/block», версия 3:0:1

Размер ключа: 160 бит

Размер блока: 512 байт, включая 11 байт MAC заголовок

Каждый файл содержит 8-ми байтный заголовок с уникальными IV данными.

Файловые имена зашифрованы с использованием IV цепочек.

Данные файла IV связаны с именем файла IV.

Относительно недавно появившаяся encfssh дает возможность смонтировать зашифрованный каталог в общедоступный к которому можно подключиться зная пароль.

Для использования в военных, правительственных и других организациях в которых уделяется особое внимание режиму секретности разработана Phonebook (http://www.freenet.org.nz/phonebook/) файловая система, использующая технологию, получившую название «Deniable Encryption technology», разработчики которой пытаются учесть «человеческий фактор», являющейся основной причиной многих неудач возникающих при защите информации. Кратко суть этой технологии заключается в использовании нескольких слоев кодирования, каждый со своим паролем, поэтому для того чтобы получить доступ необходимо знать уже два параметра: название слоя и пароль. В случае ошибки набора будет создан новый слой, никакого сообщения об ошибке выведено не будет. При этом есть возможность создать несколько слоев с одним именем, но разными паролями, в случае взлома будет раскрыта информация только в одном из них. Все файлы шифруются индивидуально (256-бит Blowfish, CFB режим, плюс SHA1 хеш), в случайном порядке изменяется и время доступа к файлу. Файлы могут быть записаны на CD-ROM или доступ к ним можно получить доступ через сеть (например, NFS).

Монтирования удаленных ресурсов

Следующая интересная файловая система sshfs доступная для закачки с сайта проекта fuse или через репозитарий Kubuntu «sudo apt-get install sshfs«. Эта утилита позволяет монтировать удаленные системы, используя зашифрованные ssh-соединения и работать с ними как с обычной локальной файловой системой. При этом от пользователя не требуется знаний особенностей работы и утилит. Команда для монтирования проста.

$ sshfs grinder@grinder.com:/tmp /media/other

После чего потребуется ввести пароль для доступа к удаленной системе. Проверить можно так.

$ mount | grep shfs

grinder@grinder.com: on /media/other type shfs (version=2,mnt=/mnt/local,fd=5)

Если теперь посмотреть в /media/other, то в нем обнаружите файлы расположенные на удаленном компьютере.

Подобным образом можно смонтировать и SMB-ресурсы Windows машин. Проект SMB for Fuse (http://www.ricardis.tudelft.nl/~vincent/fusesmb/) позволяет монтировать не только отдельные ресурсы, как это делается обычным способом при помощи smbclient и smbmount, но и полностью всю рабочую группу или компьютер. Затем к ресурсам можно обращаться из любого приложения, как к локальным файлам. Кеширование с помощью скрипта fusesmbcache ускоряет просмотр доступных ресурсов. Этот скрипт необходимо запустить используя cron.

$ sudo crontab -e

*/30 * * * * fusesmbcache &> /dev/null

И теперь монитуем ресурсы.

$ mkdir ~/net

$ sudo fusermount ~/net fusesmb &

Теперь в указанном каталоге появится дерево каталогов соответствующих рабочим группам, входящим в них компьютерам и доступным ресурсам.

Контроль версий файлов

Wayback (User-level Versioning File System for Linux, http://wayback.sourceforge.net/) позволяет сохранять старые версии текстовых файлов, независимо от их количества, и каталогов в которых они располагаются. Работает wayback на любом блочном устройстве с любой файловой системой. Для отката такая система ведет файл журнала, в котором описываются все изменения. Монтируется новая файловая система при помощи скрипта mount.wayback.

$ mount.wayback ~/wayback/ /media/disk

$ mount | grep fuse

/proc/fs/fuse/dev on /media/disk type fuse (rw,nosuid,nodev)

$ echo «test» > /media/disk/test

$ ls /media/disk/test

Смотрим что в

$ ls ~/wayback/

test test~. versionfs! version test. versionfs! version

$ echo «test2″ >> /media/disk/test

$ echo «test3″ >> /media/disk/test

$ ls ~/wayback/

test ~test ~test. versionfs! version test~. versionfs! version test. versionfs! version

Отмечается более быстрая работа с файлами по сравнению с CVS. Но если все-таки необходим доступ именно к системе CVS, то некоторые, возможно, предпочтут использовать довольно удобную cvsfs (http://sourceforge.net/projects/cvsfs) позволяющую смонтировать CVS и работать с ней как с локальной файловой системой. При этом пользователю будут доступны все изменения, без необходимости закачки всего архива.

Доступ к Gmail

Для пользователей почтового сервиса Gmail доступна файловая система GmailFS — Gmail Filesystem (http://richard.jones.name/google-hacks/gmail-filesystem/gmail-filesystem.html). Это приложение написанное на языке высокого уровня Питон, для связи с Gmail использует библиотеку libgmail (http://libgmail.sourceforge.net/). С его помощью можно смонтировать почтовый аккаунт, как обычную файловую систему и пользоваться в дальнейшем обычными командами вроде ls, rm, cp, grep и другими утилитами позволяющими быстро разобраться более чем с 1 Гб информации. Пользоваться GmailFS просто, к тому же он есть в репозитарии Kubuntu «sudo apt-get install gmailfs«.

$ sudo mount.gmailfs none /media/gmail -o username=gmail_user, password=gmail_password

Для удобства проще занести регистрационные данные в файл /etc/gmailfs/gmailfs.conf в поле username и password.

Работа с устройствами

Не менее интересны файловые системы позволяющие получить доступ к различным устройствам. Среди них btfs — Bluetooth FileSystemMapping (http://www.mulliner.org/bluetooth/btfs.php) используя, которую можно узнать обо всех доступных Bluetooth устройствах просто использовав команду ls.

$ ls -la /OPUSH

/OPUSH/SE_T630

А также переслать файлы обычным образом.

$cp file.txt /OPUSH/SE_T630

Хотя в данный момент получить файлы от устройств таким образом невозможно, да и проект уже три года как не обновлял версии.

Для доступа к памяти в мобильных телефонах Siemens разработана файловая система SieFS (http://chaos.allsiemens.com/siefs) которая работает с телефонами 45, 55 и 65 серий.

В статье показаны только некоторые проекты, но как видите при шифровании разделов, при доступе к файлам по сети, обращаясь к устройствам, используются одни и те же утилиты. Это делает работу более прозрачной, так как не приходится вникать в особенности. Linux forever!

4 Комментариев к Жизнь в пространстве пользователя

Аватар

Loki

Март 4th, 2008 | 8:50

Отличная статья! Огромное спасибо за такой подробный обзор файловых систем, использующих FUSE.

Аватар

kalebas

Март 4th, 2008 | 10:46

что то у меня не получается,помогите разобраться, выдает следующее:kalebas@kalebas:~$ sudo mount.gmailfs none /media/gmail -p
Gmail password:
HTTP Error 400: Bad Request
fuse: bad mount point `/media/gmail’: No such file or directory
Traceback (most recent call last):
File “/usr/bin/mount.gmailfs”, line 166, in
main(mountpoint, namedOptions, useEncfs)
File “/usr/bin/mount.gmailfs”, line 92, in main
gmailfs.main(mountpoint, namedOptions)
File “/usr/lib/python2.5/site-packages/gmailfs.py”, line 1180, in main
server.main()
File “/usr/lib/python2.5/site-packages/fuse.py”, line 713, in main
main(**d)
fuse.FuseError: filesystem initialization failed
Error in sys.excepthook:
Traceback (most recent call last):
File “/var/lib/python-support/python2.5/apport_python_hook.py”, line 42, in apport_excepthook
binary = os.path.realpath(os.path.join(os.getcwdu(), sys.argv[0]))
IndexError: list index out of range

Original exception was:
Traceback (most recent call last):
File “/usr/bin/mount.gmailfs”, line 166, in
main(mountpoint, namedOptions, useEncfs)
File “/usr/bin/mount.gmailfs”, line 92, in main
gmailfs.main(mountpoint, namedOptions)
File “/usr/lib/python2.5/site-packages/gmailfs.py”, line 1180, in main
server.main()
File “/usr/lib/python2.5/site-packages/fuse.py”, line 713, in main
main(**d)
fuse.FuseError: filesystem initialization failed

Аватар

grinder

Март 4th, 2008 | 10:48

Пишет что нет каталога
/media/gmail

Аватар

Andreyka

Июль 31st, 2008 | 18:27

Занимательная статья, кстати автору хочу предложить установить от яндекс.денег полезную фишку на сайт «Дай рубль». Я бы дал, так сказать на поддержание. ;)

Комментировать

Наверх