Posterous theme by Cory Watilo

Samba, AFP and OS X

Настраивал файлохранилище. В качестве эксперимента – добавил поддержку AFP. Поставить самбу – нетяжело, и особо вдаваться в детали я не стану. Все коробочное, кроме общей шары:

[storage]
  comment = General storage area
  path = /home/storage
  guest ok = yes
  browseable = yes
  create mask = 0666
  directory mask = 0777
  read only = no

Попробуйте на такую шару скопировать файл из-под винды. Правильно, права будут 0666. А теперь из-под линукса/мака. Права совсем не 0666, а скорее 0644 или 600. Кроме того, файл создастся от имени залогиненого пользователя. То есть пользователи не смогут удалить файлы оставленные им другими пользователями. Я долго копался, и благодаря Роману нашел решение:

[global]
  ...
  unix extensions = no
  ...

Это решает проблему с правами. Но чуть позже я вернул unix extensions и добавил в шару опцию

force user = nobody

Но на OS X 10.6.3 внезапно явилась проблема: при загрузке папки она ставит на нее расширенные аттрибуты. Ругается, и не дает загрузить файлы. Вручную же файлы именно вовнутри папки загружаются. Все это сопровождается сообщением “operation can’t be completed because you don’t have permission to access…” (раз, два). Решением стало добавление

[global]
  ...
  acl check permissions = no
  ...

С AFP в Ubuntu 10.04 все хорошо – пакет пересобирать не надо, он собран уже с шифрованой передачей пароля. Однако конфиг подровнять пришлось. В /etc/netatalk/afpd.conf в конце пишем:

- -transall -uamlist uams_dhx.so,uams_dhx2.so,uams_guest.so -nosavepassword

Кроме варианта по-умолчанию сюда добавлен uams_guest.so для доступа к анонимной свалке. Рядом в файле /etc/netatalk/AppleVolumes.default пишем:

~/              "Home Directory"                        options:usedots
/home/storage/  "Common storage" dperm:0777 fperm:0666  options:usedots

Как принудительно заставить писать от имени nobody в storage я не нашел, потому выставил соответствующие права. Опция usedots не дает преобразовывать точку в “:2e”.

Финальным шагом был анонс сервисов через бонжур при помощи avahi-daemon. В /etc/avahi/services/afpd.service:

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>
    <name replace-wildcards="yes">%h</name>
    <service>
        <type>_afpovertcp._tcp</type>
        <port>548</port>
    </service>
    <service>
        <type>_device-info._tcp</type>
        <port>0</port>
        <txt-record>model=Xserve</txt-record>
    </service>
</service-group>

В /etc/avahi/services/samba.service:

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>
    <name replace-wildcards="yes">%h</name>
    <service>
        <type>_smb._tcp</type>
        <port>139</port>
    </service>
</service-group>

Enjoy!