NFS mount on the OS X Mountain Lion and realtime encrypt files with EncFS

Уверен, что многие столкнулись с проблемой монтирования NFS (Network File System) из под OS X Mountain Lion. В этой версии Apple выпилила привычный инструмент монтирования через Disk Utility. Многие начали изобретать велосипеды или пользоваться чем-то вроде NFS Manager. Вот только все это ни к чему, достаточно внимательно почитать man и правильно настроить NFS Server. Пройдемся пошагово.

Для начала установим NFS Server на нашем *nix’овом сервере (в моем случае Debian):

apt-get install nfs-kernel-server nfs-common portmap

Правим ‘/etc/exports’ и прописываем монтируемые каталоги с правильными опциями:

# /etc/exports: the access control list for filesystems which may be exported
#       to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/hdd1/Downloads 192.168.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=1002,anongid=1002,insecure) 10.10.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=1002,anongid=1002,insecure)
/hdd1/webdav/itunes 192.168.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33,insecure) 10.10.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33,insecure)
/hdd1/webdav/efs 192.168.1.0/255.255.255.0(rw,sync,no_subtree_check,all_squash,anonuid=33,anongid=33,fsid=1,insecure)

Ключевой здесь является опция ‘insecure’, по сути, она избавляет от необходимости в опции ‘resvport’ на стороне клиента, которую раньше можно было выставить в Disk Utility. Опция ‘resvport’ применяется в случае, если NFS-сервер работает на привилегированном порту (ниже 1024), по умолчанию же, OS X пытается подключиться к NFS-серверу на непривилегированном порту, вот мы и повесим NFS на него, используя опцию ‘insecure’. Не забудьте исправить ‘anonuid’ и ‘anongid’ на uid и gid того пользователя и группы, из под которых хотите, чтобы велась запись. Обратите внимание на ‘fsid=1’, добавьте эту опцию для шары, в которой будет использоваться EncFS. Ну и не забудьте поменять разрешенные подсети на свои.

Перезапускаем сервис:

/etc/init.d/nfs-kernel-server restart

Чтобы посмотреть какие ресурсы предоставлены:

showmount -e

Если вы только добавляли ресурсы в файл ‘/etc/exports’, то их можно активировать без перезапуска службы NFS:

exportfs -a

Теперь перейдем к настройке EncFS, для упрощения я написал небольшой скрипт, подробно его прокомментировав, тем самым, не вижу смысла дублировать пояснения:

nano /usr/local/bin/efs
#!/bin/sh
# ----------------------------------------------------------------------------
# Simple script for EncFS with NFS access
# Written by ZeroChaos
# Version 1.0, 2013-02-26
# Site: https://zerolab.net/
# ----------------------------------------------------------------------------
## Install EncFS:
# apt-get install encfs
## If we mount under another user (with option "--public" it's not necessary):
# adduser username fuse
## RTM!:
# man encfs
## Just replace the variables $EFS_FOLDER and $MOUNT_POINT, and then run:
# efs -m
## For unmount:
# efs -u
## For force unmount:
# efs -f
# ----------------------------------------------------------------------------
# Are you using NFS for access to decrypted folder?
NFS_ACCESS="yes"
# Variables for encfs command
EFS_FOLDER="/hdd1/efs"
MOUNT_POINT="/hdd1/webdav/efs"
OPTIONS="--public"
#OPTIONS="--public --idle=60"
MNT_CMD="encfs $OPTIONS $EFS_FOLDER $MOUNT_POINT"
# If we mount under another user
#RUNAS="username"
#MNT_CMD="su - $RUNAS -c \"encfs $EFS_FOLDER $MOUNT_POINT\""
# Mount
mount() {
    $MNT_CMD
}
# Unmount
umount() {
    if [ $NFS_ACCESS = "yes" ]; then
        /etc/init.d/nfs-kernel-server stop >/dev/null 2>&1
        sleep 1
    fi
    fusermount -u $MOUNT_POINT
    if [ $NFS_ACCESS = "yes" ]; then
        sleep 1
        /etc/init.d/nfs-kernel-server start >/dev/null 2>&1
    fi
}
# Force unmount
force_umount() {
    ps ax | grep [e]ncfs | awk '{ print $1 }' | xargs kill >/dev/null 2>&1
    if [ $NFS_ACCESS = "yes" ]; then
        /etc/init.d/nfs-kernel-server restart >/dev/null 2>&1
    fi
}
ME=$(basename "$0")
print_help() {
    echo
    echo "Usage: $ME [OPTION...]"
    echo
    echo "Options:"
    echo "         -m     Mount:"
    echo "                efs -m"
    echo "         -u     Unmount:"
    echo "                efs -u"
    echo "         -f     Force unmount:"
    echo "                efs -f"
    echo "         -h     Help."
    echo
}
while getopts ":mufh" opt;
do
    case $opt in
        m) mount;
            ;;
        u) umount;
            ;;
        f) force_umount;
            ;;
        h) print_help;
            ;;
        *) echo "Wrong option";
            exit 1
            ;;
        esac
done
chmod 755 /usr/local/bin/efs

Вот и все, теперь монтируем шару через Finder (CMD+K):

nfs-encfs-01

Смонтированная шара:

nfs-encfs-02

При необходимости добавляем в автозагрузку (просто перетяните смонтированный том в ‘Объекты входа’):

nfs-encfs-03

Свою зашифрованную шару я монтировать и демонстрировать не буду, процесс ничем не отличается от того, что описан выше. Выполнили ‘efs -m’, ввели пароль, смонтировали через Finder шару, залили приватные данные, отмонтировали шару, выполнили ‘efs -u’. А так выглядят зашифрованные данные:

nfs-encfs-04

Приятного пользования!