Вопрос или проблема
Я попытался считать из fifo в Windows через samba, чтобы посмотреть, работает это или нет (если будет работать, у меня может быть что-то интересное с этим), и обнаружил, что это не так. ReadFile()
сразу возвращает 0 байт, где ожидается блокировка.
Поиск в интернете нашел одну интересную старую тему в google groups. https://groups.google.com/g/linux.samba/c/lkkziMXkgP4 Так что это когда-то работало в 2011 году. Забавно.
Вот мой smb.conf с удаленными конфиденциальными данными и комментариями.
[global]
name resolve order = bcast host lmhosts wins
max log size = 1000
logging = file
panic action = /usr/share/samba/panic-action %d
security = ads
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *Введите\sновый\s*\пароль:* %n\n *Повторите\sновый\s*\пароль:* %n\n *пароль\sуспешно\sобновлен* .
pam password change = yes
min protocol = SMB2
client signing = mandatory
server signing = mandatory
idmap uid = 10000-20000
idmap gid = 10000-20000
template homedir = /home/%D/%U
template shell = /bin/bash
root preexec = /etc/samba/makehomedir.sh %U
usershare allow guests = yes
[allusers]
comment = "Домашние директории пользователей"
guest ok = no
read only = no
[printers]
comment = Все принтеры
browseable = no
path = /var/tmp
printable = yes
guest ok = no
read only = yes
create mask = 0700
[print$]
comment = Драйверы принтеров
path = /var/lib/samba/printers
browseable = yes
read only = yes
guest ok = no
fifo находится в моей домашней директории. Сказать, что он должен быть в специальной директории, это вопрос, который я могу протестировать.
Есть одна важная вещь, которую вы не видите. Скрытие специальных файлов не установлено.
Так что вопрос в следующем: это ошибка конфигурации, ошибка в samba или действительно не ожидается, что это будет работать больше?
Версия Samba 4.17.12
Ответ или решение
Проблема Доступа к FIFO через Samba в Windows: Анализ и Решения
Введение
Доступ к именованным каналам (FIFO) в среде Windows через Samba может вызвать трудности, включая проблему, когда вызов ReadFile()
возвращает 0 байт сразу, вместо ожидаемой блокировки. Эта ситуация может возникнуть по различным причинам, включая конфигурацию Samba, особенности поддержки Windows и корректность средств доступа к файловой системе. В данном ответе мы рассмотрим возможные проблемы, их причины и предложим решения.
Анализ конфигурации Samba
При анализе вашего файла smb.conf
можно выделить следующие ключевые моменты:
-
Протокол smb: Вы используете
min protocol = SMB2
, что является хорошей практикой для обеспечения безопасности. Однако стоит убедиться, что обоим клиентам (Windows и Samba) доступны последние версии протокола. -
Разрешения на доступ к файлам: Убедитесь, что правами доступа к FIFO, находящемуся в вашей домашней директории, установлены такие параметры, что пользователь, под которым работает Samba, может читать и записывать данные. Проверка прав доступа может помочь выявить, может ли клиент осуществить необходимые операции.
-
Параметры папок: В вашем конфиге, секция
[allusers]
имеетread only = no
, что должно позволять запись в директорию, но проблема может заключаться в том, что CAN и SMB взаимодействуют совершенно иначе, чем через локальную файловую систему. Возможно, стоит проверить, как Samba обрабатывает свои внутренние права, поскольку samba требует иногда дополнительных указаний для работы с специфичными элементами, такими как FIFO. -
Поддержка специальных файлов: Отметив, что опция "Hide special files" не включена, вы упомянули, что FIFO находится в директории, доступной через Samba. Однако общая практика заключается в том, что named pipes (или FIFO) чаще всего не поддерживаются через SMB на Windows должным образом. Именно это может быть источником вашей проблемы.
Возможные решения
-
Размещение FIFO в специальной директории: Попробуйте разместить FIFO в директории, явно разрешенной для работы с Samba (например, в
/tmp
или специальной скрытой директории). Хотя вы упомянули, что можете протестировать данное решение, это может оказаться действенным. -
Клиентская конфигурация: Убедитесь, что клиентская сторона (Windows) не накладывает собственные ограничения на доступ к FIFO. Использование специализированных утилит, таких как Process Monitor, может помочь выявить проблемы с доступом.
-
Обновление Samba: Рассмотрите возможность обновления до последней версии Samba. Возможно, в текущей версии (4.17.12) присутствуют ошибки, которые уже исправлены в более поздних обновлениях.
-
Тестирование на других системах: Если есть возможность, протестируйте доступ к FIFO с других систем, чтобы удостовериться, что проблема не специфична для вашей текущей конфигурации или системы.
-
Консультации с сообществом: Поскольку ранее существовали сообщения о том, что данная функциональность работала, стоит рассмотреть возможность обращения к более свежим аспектам работы с FIFO через Samba, так как изменения в архитектуре могли затронуть поведение.
Заключение
Таким образом, доступ к FIFO через Samba в Windows действительно может вести себя неожиданно из-за множества факторов, включая конфигурацию Samba, особенности криптографии и ограничения на уровне файловой системы. Путем тестирования различных решений и обращений к сообществу, вы сможете выяснить, действительно ли возможность доступа к FIFO была утрачена или это следствие конфигурационной ошибки.