Осознание того, что я попал в импортозамес пришло не сразу. Только когда из вышестоящей организации свежие поставки ПК стали стабильно приезжать с дистрибутивом «Альт Линукс» на борту, я заподозрил неладное.
Однако в процессе прохождения по стадиям принятия неизбежного я втянулся и даже немного начал получать удовольствие от процесса. А в какой-то момент подумал, что такими темпами рано или поздно мне придётся расставаться с решениями по организации службы каталогов от Microsoft и двигаться в сторону чего-то более экзотичного. Поэтому, чтобы заранее подготовиться к неизбежному, и по возможности выловить побольше подводных камней, было решено развернуть тестовый стенд, включающий в себя:
- DC1 — Windows Server 2012R2
- DC2 — Альт Сервер 8.2
- File Server — Windows Server 2012R2
- PC1 — Windows 7
- PC2 — Альт Рабочая станция 8.2
Задачи стенда:
- Развернуть домен на базе w2k12r2. Создать минимальный набор групповых политик (аналогично использующимся в рабочей инфраструктуре), включая политику переноса рабочих папок пользователей (Загрузки/Документы/Рабочий стол). В конечном итоге хочется, чтобы при смене пользователем рабочего места с Windows на Linux и обратно он имел комфортный доступ к своим рабочим документам.
- Ввод Samba DC вторым контроллером. Проверка репликации службы каталогов и DNS
- Настройка клиентов Linux на работу с перемещаемыми папками
Реализация:
- Установка и ввод нового контроллера
С установкой MS Windows 2012R2 всё просто и более менее понятно. В интернете есть 1001 мануал по развертыванию домена на Windows как с помощью GUI так и средствами Powershell, поэтому повторять лишний раз не буду, оставлю только ссылку на офф. документацию, для любопытствующих и тех кто захочет освежить память.
Однако один важный момент в данном пункте всё таки есть. На сегодняшний день Samba не умеет работать со схемами каталога выше 2008R2.
Заголовок спойлераВернее разработчиками данная поддержка заявлена в качестве экспериментальной. Но на практике попытка ввода самбы в качестве второго DC в существующий домен Windows со схемой 69 — встретит вас следующей ошибкой
DsAddEntry failed with status WERR_ACCESS_DENIED info (8567, 'WERR_DS_INCOMPATIBLE_VERSION')
Проблема в том, что Windows 2012 и 2012R2 используют инструменты WMI для работы с доменами и лесами, стабильная поддержка которых анонсирована только к версии Samba 4.11, которая должна выйти до конца этого года.
Из этого следует, что единственным вариантом для введения самбы в домен AD, развернутый на 2012R2 сервере, является понижение схемы с 69 до 47. Разумеется на рабочей инфраструктуре без веских причин этого делать не надо, но у нас тут тестовый стенд, так что почему бы собственно и нет.
Ставим Альт Сервер 8.2. Во время установки выбираем профиль «Сервер Samba-DC (контроллер AD)». На развернутом сервере производим полное обновление системы, и устанавливаем пакет task-samba-dc, который потянет за собой всё необходимое
# apt-get install task-samba-dc
Если вдруг task-samba-dc, вопреки заверениям документации Альта откажется ставить всё необходимое сам.# apt-get install python-module-samba-DC samba-DC-common samba-DC-winbind-clients samba-DC-winbind samba-DC-common-libs libpytalloc-devel
Далее переходим к настройке Kerberos и получению тикета. Открываем файл krb5.conf, переходим в раздел [libdefaults], и приводим к следующему виду:
# vim /etc/krb5.conf
dns_lookup_kdc = true dns_lookup_realm = true default_realm = TEST.LOCAL
Запрашиваем билет
# kinit administrator Password for administrator@TEST.LOCAL:
Проверяем список полученых тикетов Kerberos
# klist Ticket cache: KEYRING:persistent:0:0 Default principal: administrator@TEST.LOCAL Valid starting Expires Service principal 16.05.2019 11:51:38 16.05.2019 21:51:38 krbtgt/TEST.LOCAL@TEST.LOCAL renew until 23.05.2019 11:51:35
Теперь удаляем или переименовываем существующий конфиг самбы.
# mv smb.conf smb.conf.bak1
И наконец вводим в домен AD вторым контроллером:
# samba-tool domain join test.local DC -U"TEST\administrator"
Успешный ввод будет сопровождаться следующим логомFinding a writeable DC for domain 'test.local' Found DC DC1.TEST.LOCAL Password for [TEST\administrator]: Reconnecting to naming master e31d7da6-8f56-4420-8473-80f2b3a31338._msdcs.TEST. LOCAL DNS name of new naming master is DC1.TEST.LOCAL workgroup is TEST realm is TEST.LOCAL Adding CN=DC2,OU=Domain Controllers,DC=TEST,DC=LOCAL Adding CN=DC2,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC =TEST,DC=LOCAL Adding CN=NTDS Settings,CN=DC2,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN =Configuration,DC=TEST,DC=LOCAL Adding SPNs to CN=DC2,OU=Domain Controllers,DC=TEST,DC=LOCAL Setting account password for DC2$ Enabling account Calling bare provision Looking up IPv4 addresses Looking up IPv6 addresses No IPv6 address will be assigned Setting up share.ldb Setting up secrets.ldb Setting up the registry Setting up the privileges database Setting up idmap db Setting up SAM db Setting up sam.ldb partitions and settings Setting up sam.ldb rootDSE Pre-loading the Samba 4 and AD schema A Kerberos configuration suitable for Samba AD has been generated at /var/lib/sa mba/private/krb5.conf Provision OK for domain DN DC=TEST,DC=LOCAL Starting replication Schema-DN[CN=Schema,CN=Configuration,DC=TEST,DC=LOCAL] objects[402/1426] linked _values[0/0] Schema-DN[CN=Schema,CN=Configuration,DC=TEST,DC=LOCAL] objects[804/1426] linked _values[0/0] Schema-DN[CN=Schema,CN=Configuration,DC=TEST,DC=LOCAL] objects[1206/1426] linke d_values[0/0] Schema-DN[CN=Schema,CN=Configuration,DC=TEST,DC=LOCAL] objects[1608/1426] linke d_values[0/0] Schema-DN[CN=Schema,CN=Configuration,DC=TEST,DC=LOCAL] objects[1743/1426] linke d_values[0/0] Analyze and apply schema objects Partition[CN=Configuration,DC=TEST,DC=LOCAL] objects[402/2240] linked_values[0/ 24] Partition[CN=Configuration,DC=TEST,DC=LOCAL] objects[804/2240] linked_values[0/ 24] Partition[CN=Configuration,DC=TEST,DC=LOCAL] objects[1206/2240] linked_values[0 /24] Partition[CN=Configuration,DC=TEST,DC=LOCAL] objects[1608/2240] linked_values[0 /24] Partition[CN=Configuration,DC=TEST,DC=LOCAL] objects[1772/2240] linked_values[2 4/24] Replicating critical objects from the base DN of the domain Partition[DC=TEST,DC=LOCAL] objects[109/110] linked_values[26/29] Partition[DC=TEST,DC=LOCAL] objects[394/5008] linked_values[29/29] Done with always replicated NC (base, config, schema) Replicating DC=DomainDnsZones,DC=TEST,DC=LOCAL Partition[DC=DomainDnsZones,DC=TEST,DC=LOCAL] objects[42/42] linked_values[0/0] Replicating DC=ForestDnsZones,DC=TEST,DC=LOCAL Partition[DC=ForestDnsZones,DC=TEST,DC=LOCAL] objects[20/20] linked_values[0/0] Exop on[CN=RID Manager$,CN=System,DC=TEST,DC=LOCAL] objects[3] linked_values[0] Committing SAM database Adding 1 remote DNS records for DC2.TEST.LOCAL Adding DNS A record DC2.TEST.LOCAL for IPv4 IP: 192.168.90.201 Adding DNS CNAME record 6ff1df40-cbb5-41f0-b7b3-53a27dde8edf._msdcs.TEST.LOCAL for DC2.TEST.LOCAL All other DNS records (like _ldap SRV records) will be created samba_dnsupdate o n first startup Replicating new DNS records in DC=DomainDnsZones,DC=TEST,DC=LOCAL Partition[DC=DomainDnsZones,DC=TEST,DC=LOCAL] objects[1/42] linked_values[0/0] Replicating new DNS records in DC=ForestDnsZones,DC=TEST,DC=LOCAL Partition[DC=ForestDnsZones,DC=TEST,DC=LOCAL] objects[1/20] linked_values[0/0] Sending DsReplicaUpdateRefs for all the replicated partitions Setting isSynchronized and dsServiceName Setting up secrets database Joined domain TEST (SID S-1-5-21-3959064270-1572045903-2556826204) as a DC
В оснастке ADUC должна появиться запись о новом DC в домене TEST.LOCAL, а в диспетчере DNS — новая А запись, соответствующая DC2. - Репликация между контроллерами
Для начала проверим работу службы репликации каталогов (DRS)
# samba-tool drs showrepl
Все попытки репликации в выводе должны быть успешными. В списке объектов KCC, в течение 15 минут после ввода, должен появится наш DC1 на WindowsDefault-First-Site-Name\DC2 DSA Options: 0x00000001 DSA object GUID: 0e9f5bce-ff59-401e-bdbd-fc69df3fc6bf DSA invocationId: 017997b5-d718-41d7-a3f3-e57ab5151b5c ==== INBOUND NEIGHBORS ==== DC=ForestDnsZones,DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Mon May 27 12:56:31 2019 MSK was successful 0 consecutive failure(s). Last success @ Mon May 27 12:56:31 2019 MSK DC=DomainDnsZones,DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Mon May 27 12:56:32 2019 MSK was successful 0 consecutive failure(s). Last success @ Mon May 27 12:56:32 2019 MSK CN=Schema,CN=Configuration,DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Mon May 27 12:56:32 2019 MSK was successful 0 consecutive failure(s). Last success @ Mon May 27 12:56:32 2019 MSK DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Mon May 27 12:56:32 2019 MSK was successful 0 consecutive failure(s). Last success @ Mon May 27 12:56:32 2019 MSK CN=Configuration,DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Mon May 27 12:56:33 2019 MSK was successful 0 consecutive failure(s). Last success @ Mon May 27 12:56:33 2019 MSK ==== OUTBOUND NEIGHBORS ==== DC=ForestDnsZones,DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Thu May 23 16:40:03 2019 MSK was successful 0 consecutive failure(s). Last success @ Thu May 23 16:40:03 2019 MSK DC=DomainDnsZones,DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Thu May 23 16:40:03 2019 MSK was successful 0 consecutive failure(s). Last success @ Thu May 23 16:40:03 2019 MSK CN=Schema,CN=Configuration,DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Thu May 23 16:40:08 2019 MSK was successful 0 consecutive failure(s). Last success @ Thu May 23 16:40:08 2019 MSK DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Thu May 23 16:40:08 2019 MSK was successful 0 consecutive failure(s). Last success @ Thu May 23 16:40:08 2019 MSK CN=Configuration,DC=test,DC=local Default-First-Site-Name\DC1 via RPC DSA object GUID: 60fb339d-efa3-4585-a42d-04974e6601b7 Last attempt @ Mon May 27 12:12:17 2019 MSK was successful 0 consecutive failure(s). Last success @ Mon May 27 12:12:17 2019 MSK ==== KCC CONNECTION OBJECTS ==== Connection -- Connection name: 6d2652b3-e723-4af7-a19f-1ee48915753c Enabled : TRUE Server DNS name : DC1.test.local Server DN name : CN=NTDS Settings,CN=DC1,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=test,DC=local TransportType: RPC options: 0x00000001 Warning: No NC replicated for Connection!
Предупреждение «No NC replicated for Connection!» можно смело игнорировать. Оно появляется из за того, что при регистрации нового DC самба неверно устанавливает некоторые флаги репликации.
Так же неплохо будет проверить репликацию LDAP.
# samba-tool ldapcmp ldap://dc1.test.local ldap://dc2.test.local -Uadministrator
Указанная выше команда сравнит значения атрибутов объектов всего каталога на DC1 и DC2.
Пример успешной репликации* Comparing [DOMAIN] context... * Objects to be compared: 249 * Result for [DOMAIN]: SUCCESS * Comparing [CONFIGURATION] context... * Objects to be compared: 1750 * Result for [CONFIGURATION]: SUCCESS * Comparing [SCHEMA] context... * Objects to be compared: 1739 * Result for [SCHEMA]: SUCCESS * Comparing [DNSDOMAIN] context... * Objects to be compared: 42 * Result for [DNSDOMAIN]: SUCCESS * Comparing [DNSFOREST] context... * Objects to be compared: 20 * Result for [DNSFOREST]: SUCCESS
В ряде случаев атрибуты объектов на разных контроллерах могут отличаться, и вывод команды даст об этом знать. Но далеко не во всех случаях это будет признаком проблемы с репликацией.
Следующим этапом необходимо вручную настроить стабильную репликацию каталога SysVol.
Дело в том, что самба пока не поддерживает DFS-R, впрочем как не поддерживала более раннюю FRS. Поэтому для репликации между DC Samba и Windows единственным на сегодняшний день рабочим решением является односторонняя репликация средствами утилиты Robocopy из комплекта Windows Server 2003 Resource Kit Tools.
Разработчики самбы, во избежание проблем с совместимостью, рекомендуют сначала установить комплект утилит на обычную рабочую станцию, и после этого скопировать Robocopy на контроллер в папку «C:\Program Files (x86)\Windows Resource Kits\Tools\»
После установки, в планировщике задач на контроллере с Windows создаём задание на выполнение репликации со следующими параметрами:
— Выполнять для всех пользователей
— Триггер на выполнение Ежедневно каждые 5 минут в течение дня
— В действиях прописываем путь к утилите robocopy, в качестве аргументов указываем:
\\DC1\SYSVOL\test.local\ \\DC2\SYSVOL\test.local\ /mir /sec
В конкретном случае копируем содержимое каталога SysVol с DC1 на DC2.
- Переносимые папки пользователей с помощью конфигурации pam_mount
Опытным путём я нащупал два жизнеспособных варианта решения этой задачи с его помощью.
- Полное монтирование папки с профилем из сети в раздел /home
Простой вариант. Отлично отрабатывает, если названия папок Мои документы, Загрузки и Рабочий стол совпадают в обеих операционных системах. Подразумевается, что ПК на Linux уже введён в домен и пользователи логинятся под своими доменными учётными записями, используя в качестве механизма аутентификации и авторизации sssd.
# vim /etc/security/pam_mount.conf.xml
<volume uid="100000000-2000000000" fstype="cifs" server="dfs" path="Profile_Users/%(USER)" mountpoint="~" options="sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775"/>
где:
- uid=«100000000-2000000000» — диапазон UID, присваиваемый доменным пользователям от SSSD
- server=«dfs» — имя файлового сервера
- path=«Profile_Users/%(USER)» — ресурс на файловом сервере, с размещенным профилем пользователя
- mountpoint="~" — путь монтирования в домашнюю папку пользователя
Логин пользователя передается в макропеременную "%(USER)", используемую pam_mount, для подключения нашего сетевого ресурса, в том виде, в котором он введен в дисплейном менеджере. Поэтому важно, чтобы в ДМ логин вводился без явного указания доменного имени.
В sssd.conf это решается комментированием, либо выставлением значения False в опцию use_fully_qualified_names, которая включает режим полных имён (включая домен) для пользователей и групп.
- Второй способ менее прямолинейный и топорный, и на мой взгляд более удобный и предпочтительный. Отличие от первого только в конфигурации pam_mount
# vim /etc/security/pam_mount.conf.xml
<volume uid="100000000-2000200000" fstype="cifs" server="dfs" path="Profile_Users/%(USER)/Рабочий стол" mountpoint="~/Рабочий стол" options="sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775"/> <volume uid="100000000-2000200000" fstype="cifs" server="dfs" path="Profile_Users/%(USER)/Downloads" mountpoint="~/Загрузки" options="sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775"/> <volume uid="100000000-2000200000" fstype="cifs" server="dfs" path="Profile_Users/%(USER)/Мои документы" mountpoint="~/Документы" options="sec=krb5,cruid=%(USERUID),nounix,uid=%(USERUID),gid=%(USERGID),file_mode=0664,dir_mode=0775"/>
То есть просто отдельно монтируем каждую нашу папку в соответствующий ей каталог
- Полное монтирование папки с профилем из сети в раздел /home
Выводы
За пол месяца работы на тестовом стенде данная связка успешно пережила несколько попеременных долговременных и кратковременных отключений обоих контроллеров, практически без последствий для клиентов (один раз клиент на Windows7 потерял доверительные отношения).
В целом у меня остались довольно приятные впечатления от работы с этим продуктом, даже не смотря на все нюансы, с которыми пришлось столкнуться как в статье, так и «за кулисами».
Подводные камни есть, их много, и по ходу работы с самбой их придётся вылавливать в большом количестве. Тем не менее на сегодняшний день нет иных решений, позволяющих организовывать гибридную среду, с использованием службы каталогов и без использования Windows.
Комментарии (26)
beremour
06.06.2019 00:39А для чего DC1 и FileServer должны быть на Windows?
Osennij_Lis Автор
06.06.2019 08:52Тестовый стенд по виндовой части создавался похожим на рабочую инфраструктуру, поэтому DC1 и File server на Windows. Они еще не «импортозамещены».
awsswa59
06.06.2019 07:47А чем стандартный вариант не подошел?
Через доверенные отношения и два раздельных контроллера с alt и windows
Односторонний вариант когда alt доверяет windows на их сайте расписан (правда не обновляли они его как несколько лет)
Я собирал тестовую лабу под заказчика. Все работает без проблем.Osennij_Lis Автор
06.06.2019 08:48Сложно назвать это стандартным вариантом. Это просто один из вариантов. Тем не менее, я его тоже рассматриваю для реализации не стенде.
DaemonGloom
06.06.2019 07:53Но зачем использовать русские имена папок, если английские Desktop, Downloads и прочие тоже прекрасно работают? Там же русское имя создаётся файлом desktop.ini и не отменяет оригинальное. Равно как и сама папка Users всегда доступна по своему изначальному названию помимо локализованного.
vasilisc
06.06.2019 08:19Возможно, более грамотно будет реализовать мысль разработчиков FreeIPA?
Для linux машин сделать домен средствами FreeIPA, так как она лучше «знает» специфику Linux систем, а windows клиенты оставить в AD, и настроить доверительные отношения?
www.freeipa.org/page/IPAv3_Architecture
edskii
06.06.2019 08:33А что насчёт DNS параметров при установке? Надо ли указывать BIND9 DLZ backend или все будет и так работать с SAMBA_INTERNAL?
Кстати версия Samba 4.10.3 не заводится ни при каких Active Directory Schema Version (44,47,69). Как только попробовал другую версию(4.9.8) в связке с Windows Server 2012R2 с пониженной схемой 47, удалось присоединить самбу к windows домену.Osennij_Lis Автор
06.06.2019 08:44У меня она собрана с дефолтным DNS Samba_Internal. Но конечно он малофункционален, и если в перспективе избавляться от DC на Windows и оставлять только самбу — безусловно нужно разворачивать BIND.
На стенде в статье я использую версию 4.7, но перед этим я собирал 4.10.2 и всё так же работало, тем не менее не буду отрицать возможность вашего варианта. Самба очень капризная вещь.
duronus
06.06.2019 14:00А кто нибудь может посоветовать чем заменить DFS, что бы была и репликация и ссылки на несколько серверов с одной и той же папкой?
babkinstas
06.06.2019 15:22У меня стоит классический домен на FreeIPA с довериями(и MS AD), красиво настраиваться через веб-морду, имеет динамические днс, и возможность управлять правами доступа, в том числе и раздавать sudo, и еще много чего и существуют вместе и гораздо проще.
Loxmatiymamont
Какая жесть.
Очень напоминает картинку про троллейбус из буханки хлеба.
Как-бы, конечно здорово, что оно работает, но зачем…
rsashka
Тут скорее вопрос, зачем такой комментарий?
:-)Автор же в самом начале написал, для чего ему это нужно
Loxmatiymamont
Так неизбежное здесь это полный переход на линукс, а не построение франкенштейнов…
rsashka
Зачем выкидывать уже купленное ПО?
Гораздо выгоднее делать постепенный переход по мере того, как заканчиваются корпоративные лицензии на винду.
remzalp
Трабл в том, что сверху спускают цифры 90% (к примеру) отечественного ПО к 2020 году. Причем учитывается именно используемое. Так что даже посидеть на старой WinXP в стареньком 2007 офисе — не получится.
Chugumoto
кстати это же делается очень просто! расширяем кол-во пользователей и парк соответственно в 10 раз… вот старые и смогут использовать… :)
nexio
Вы видимо не работали в здравоохранении и не знаете сколько и каких проблем в госсекторе можно встретить. Автор как раз и делает постепенный переход. Уверен еще ближайшие лет 10 полный переход не получится осуществить. Спасибо автору за статью, искренне верю — что к светлому будущему мы придём.
2PAE
Вы ещё ТФОМС забыли упомянуть. Из за них, до сих пор IE8 на некоторых машинах максимум который можно позволить для работы. :(
RNigmatullin
Уверен все это тянется с вышестоящих органов власти, с ФФОМС. Но как мы видим за последнее время покупается много отечественного ПО, компьютеров. Конечно качество сильно страдает, но это только пол беды. Здравоохранение не банк и не полиция, не должно импортозамещение негативно сказываться на качестве лечения, но увы и ах. Зачастую некоторое оборудование и приборы работают только на windows и они уникальны и в ближайшем обозримом будущем это никак не исправить.
NoOne
А какие варианты то есть? Я серьезно спрашиваю, мы тоже ищем варианты, и пока их, скажем так, не густо… FreeIPA (389 directory service), zentyal, Alt/Astra Linux domain и AD… это же как сравнивать велосипед и теслу, например… Ехать, конечно, можно, но недалеко, вручную (вножную) и с огромным трудом. Банально, нет понятий OU, а если даже где-то есть, то это какой-то нефункиональный аппендикс..
Так что, чем пользоваться в больших инфраструктурах от 1000 пользователей/компов?
SwifTKZ
В данный момент, я не нашел как можно адекватно управлять парком из Linux и Windows машин. А если и есть, то цена такого решения заоблачная. Проще обновить весь парк из 40 машин Windows 7 до 10 чем купить такое решение.
Naves
Какие варианты рассматривали?
Windows управляется как обычно групповыми политиками.
Linux любой pull based системой, например, puppet.
А единого управления, нет и не будет.
Авторизация в linux давно успешно интегрируется с Active Directory, или у вас что-то конкретное не заработало?
SwifTKZ
Рассматривал FreeIPA.
puppet интересная штука. Попробую покрутить. Спасибо.
Авторизация работает.
oldbie
На 100% отказаться от win не всегда реально. Нампример — специфичное проф. оборудование с 7ми значным ценником и win-only драйверами контроллера.