Захотелось тут мне совместить папки пользователя (они же домашние каталоги) на Linux и винде. Ставить левые драйвера на винду для доступа к ext3 не захотелось, поэтому решил подмонтировать NTFS-раздел под Linux.
Тут же столкнулся с проблемой прав доступа - ntfs-3g не понимает виндовых прав доступа к файлам, поэтому они все будут с owner=root:root и заданным umask'ом, а домашней директорией каждого пользователя должен владеть (на уровне FS) он сам.
При настройке будем считать, что NTFS-раздел с папками пользователей автоматически монтируется на /mnt/win_docs и пользователи в винде называются так же, как и в Linux (при этом желательно установить права доступа к этой папке как 700 - чтобы никто, кроме root, не имел доступа к ней).
Решение же заключается в том, чтобы использовать bindfs для перемонтирования (биндинга) каждой папки пользователя с NTFS-раздела на /home со сменой прав доступа на нужные и pam-mount для автоматического выполнения данной операции при входе пользователя в систему.
Для начала разберёмся с настройкой bindfs. Bindfs - файловая система типа FUSE. Её использование похоже на использование mount --bind, с одним только отличием - она позволяет изменять отображаемые права доступа файлов в конечной точке монтирования - то есть как раз то, что нам и нужно.
Bindfs есть в репозиториях Ubuntu, поэтому установка (если только ваше ядро поддерживает FUSE) сводится к
# apt-get install bindfs
Монтировать её можно двумя способами:
mount.fuse -t bindfs <исходная папка> <целевая папка> -o <параметры>
или
mount -t fuse bindfs#<исходная папка> <целевая папка> -o <параметры>
Параметрами же задаются подставные права доступа, они у нас будут такими (для всех файлов):
владелец/группа - как у пользователя, чей этот домашний каталог;
разрешения - 755 (владельцу - все права, остальным - чтение/исполнение);
новым файлам будут присваиваться тот же владелец и права доступа;
операция chmod будет игнорироваться;
поддержка расширенных атрибутов (xattrs) будет отключена.
Этим условиям соответствует строка параметров
perms=755,user=<user>,group=<group>,create-as-user,chmod-ignore,xattr-none
Теперь настала очередь pam-mount. Его основная задача - примонтировать папку на NTFS-разделе на домашний каталог каждого пользователя динамически, при входе оного в систему.
Установка этого модуля PAM также проста, если сама система PAM (Pluggable Authentication Modules) уже установлена (Ubuntu использует эту систему по умолчанию, поэтому никаких проблем возникнуть не должно). Он есть в репозиториях Ubuntu и устанавливается командой
# apt-get install libpam-mount
После установки он автоматически добавляется в список используемых модулей PAM.
Конфигурационный файл модуля (XML) находится в /etc/security/pam_mount.conf.xml .
В нём надо добавить только одну строчку, задающую параметры монтирования файловой системы bindfs.
Вот она:
<volume noroot="0" fstype="fuse" path="bindfs#/mnt/win_docs/%(USER)" mountpoint="/home/%(USER)" options="perms=755,user=%(USER),group=%(GROUP),create-as-user,chmod-deny,xattr-none"> <not> <uid>0-999</uid> </not> </volume>
Здесь тип файловой системы закодирован в исходном пути (как во втором варианте вызова mount), конструкции %(USER) и %(GROUP) будут преобразованы в имя и группу входящего в систему пользователя.
Параметр noroot="0" указывает на то, что файловую систему нужно монтировать с правами root (обычно FUSE монтируется с правами пользователя, но здесь bindfs требует прав root из-за параметра "create-as-user" и чтобы получить доступ к папке /mnt/win_docs).
Конструкция внутри тега volume (<not> ... </not>) задаёт минимальный UID, при котором будет выполнена данная операция, равный 1000 (всё, что меньше - системные пользователи). Если у вас UID'ы распределены по-другому, нужно подправить эту запись (man pam_mount.conf за синтаксисом).
Эту запись желательно расположить после всех остальных, но перед финальным закрывающим тегом (предпоследней строкой, не считая комментариев).
После этого желательно перезагрузиться, чтобы сбросить счётчик входов в систему (pam_mount монтирует при первом входе, и размонтирует при последнем выходе данного пользователя).
Надеюсь, что это будет кому-нибудь полезно.