Samba и symlinks (симлинки) на CentOS 6

Уже много лет как я не настраивал сервер Samba, типа а зачем, если один раз сделал и забыл? Но вот на днях возникла такая необходимость. На моих samba-шарах есть симлинки и вот тут я наступил по полной программе! Оказывается с тех пор так много воды утекло, что надо садиться и разбираться со всем этим хозяйством по новой!

Итак. У меня есть шара: /mnt/free, в которой симлинками подключены несколько каталогов/разделов с других жётских дисков. На сервере это имеет следующий внешний вид:

# ls -al /mnt/free/
итого 8
drwxrwxr-x.  2 victor users 4096 Май  6 17:32 .
drwxr-xr-x. 10 root   root  4096 Май  6 17:31 ..
lrwxrwxrwx.  1 victor users   14 Май  6 17:32 vol1 -> /mnt/sdb1/free
lrwxrwxrwx.  1 victor users   14 Май  6 17:32 vol2 -> /mnt/sdc1/free
lrwxrwxrwx.  1 victor users   14 Май  6 17:32 vol3 -> /mnt/sdd1/free

В smb.conf я как белый человек вписал на шару:

follow symlinks = yes

пытаемся это дело монтирвать на клиенте той же самой командой, которой я делал это несколько лет назад:

mount -t cifs -o uid=victor,username=victor,password=xxxx //router/free /mnt/free

после чего смотрим в каталог на клиенте и охреневаем: там пусто! В логах samba на сервере ничего путного нет! Зная, что может так непредстказуемо вести себя в системе смотрим SELinux - это оно! Либо отключите SELinux вообще (что в общем-то здравая идея если вы понимаете, что вы делаете), либо установите следующие настройки в момент загрузки системы:

setsebool samba_enable_home_dirs=on
setsebool samba_export_all_ro=on
setsebool samba_export_all_rw=on
Я далёк от мысли, что вам не может понадобится что-то ещё, так что смотрите:
getsebool -a |grep samba
getsebool -a |grep smb
Итак, снова монтируем на клиенте и снова охреневаем: символьные ссылки видны как ЛОКАЛЬНЫЕ символьные ссылки (битые), т.е. вместо каталогов, которые я бы должен был получить, на клиенте вот такая картина:

# ls -al /mnt/free
итого 4
drwxrwxr-x  2 victor users    0 май  6 17:32 .
drwxr-xr-x. 5 root   root  4096 май  8 17:47 ..
lrwxrwxrwx  1 victor users   14 май  6 17:32 vol1 -> /mnt/sdb1/free
lrwxrwxrwx  1 victor users   14 май  6 17:32 vol2 -> /mnt/sdc1/free
lrwxrwxrwx  1 victor users   14 май  6 17:32 vol3 -> /mnt/sdd1/free

Естественно на клиенте таких точек монтирования как /mnt/sdb1/free, /mnt/sdc1/free, /mnt/sdd1/free не было и в помине! Тупо глядя в монитор спрашиваю себя "какогого х...???" Начинаю разбираться, гуглить и вот что выясняется. Некоторое время назад в samba появилась глобальная опция

unix extensions = yes

включенная по умолчанию. Из-за этой опции, клиент начинает считать, что встретившиеся на шаре симлинки должны обрабатываться ЛОКАЛЬНО! Т.е. сервер не разруливает эти ссылки на своём уровне, а просто транслирует их клиенту! Посмотрев man на mount.cifs я даже нашёл опцию на клиенте, отключающую это поведение и команда монтирования приняла такой вид:

mount -t cifs -o nounix,uid=victor,username=victor,password=xxxx //router/free /mnt/free

перестартовал smbd, перемонтировал шару и опять впал в ступор. Каталоги вместо симлинков появились, но теперь при заходе в них было пусто! Включил в глобальной секции smb.conf логгирование

log level = 2
перестартовал smbd и увидел следующщее сообщение в логе:
symlink outside the share path

Снова полез гуглить и нашёл, что есть ещё одно нововведение. Оказалось, что некоторое время назад, в samba нашли дыру, благодаря которой при определённых значениях опций, включенных по умолчанию, можно было получить через симлинки практически любой файл на файловой системе сервера. И они эту дыру прикрыли. Работа с symlinks (символьными ссылками) поменялась координально. Теперь, чтобы обеспечить старое поведение samba нужно выполнить следующее:

  1. В глобальной секции smb.conf выставить:
    unix extensions = no
    
  2. В настройках шары выставить:
    follow symlinks = yes
    wide links = yes
    
    При чём, если вы не сделаете первый пункт, то wide links автоматически будут в "no", чтобы вы не выставили!
Ну вот, теперь можно перестартовать smbd и наслаждаться! И кстати опция "nounix" на клиенте даже не нужна!

Благодарности как всегда принимаются на почту. Ваш Виктор Вислобоков.