ам требуется устройство для записи компакт-дисков на машине A, но оно установлено на машине B? Или, может быть, вам нужен доступ к разделу жесткого диска, или даже к файловой системе на диске? Нет проблем! Просто экспортируйте устройство по сети с помощью модуля geom_gate и смонтируйте его на другой машине.
Зачем возиться с экспортом устройства, когда достаточно просто войти на другую машину? Возможно, вам потребуется приложение, которое подразумевает использование диска, а не файла. Возможно, вам потребуется снять образ с отмонтированного раздела, а на машине с этим разделом недостаточно свободного места, чтобы сохранить этот образ. Возможно, вам потребуется использовать gmirror(8) по сети, чтобы в случае выхода из строя одной машины у вас сохранилась свежая копия диска. Или, может быть, просто потому, что это круто и заставит других системных администраторов смотреть на вас снизу вверх. geom_gate — это приложение типа клиент-сервер: система с экспортируемым устройством является сервером, а система, которая монтирует удаленное устройство, — клиентом. Обеим системам, и клиенту и серверу, требуется загруженный модуль ядра geom_gate.ko.
Безопасность geom_gate
Соединение geom_gate между клиентом и сервером не шифруется, поэтому любой, кто сможет перехватить трафик, сможет увидеть транзакции. Замечу лишь, что ему будет очень сложно идентифицировать содержимое этого трафика! Если вы используете geom_gate в сетях общего доступа, желательно настроить VPN или хотя бы создать туннель SSH. Для своей работы geom_gate по умолчанию использует порт TCP с номером 3080. (Если вам требуется нечто действительно интересное, попробуйте расположить geom_gate поверх GELI!)
Управление доступом на стороне сервера производится с помощью файла экспорта, подобно NFS. Сервер экспортирует только устройства, указанные в файле exports, и только указанным клиентам.
Настройка сервера geom_gate
С помощью geom_gate можно экспортировать только CD-ROM, образы дисков и разделы. Вы не можете экспортировать накопители на магнитной ленте и такие устройства, как /dev/random, /dev/io или терминальные устройства. Если устройство нельзя смонтировать утилитой mount(8), оно недоступно для экспорта. Однако устройство не может быть смонтировано, пока оно экспортируется; это должно быть устройство, доступное для монтирования, но не смонтированное.
Чтобы выполнить экспорт устройства, укажите информацию о нем в файле экспорта модуля geom_gate, /etc/gg.exports. Все записи в этом файле имеют следующий формат:
хост права_доступа устройство
Хост можно указать в виде IP-адреса (например, 192.168.1.2), в виде адреса сети (например, 192.168.1.0/24) или в виде имени хоста (например, pesty.blackhelicopters.org).
Для каждого экспортированного устройства нужно указать права доступа: «чтение-запись» (RW), «только для чтения» (RO) или «только для записи» (WO).
Наконец, нужно указать файл устройства, которое требуется экспортировать. Например, ниже мы разрешаем доступ только для чтения к приводу CD-ROM на сервере с любого хоста из моей частной сети, а также доступ для чтения и записи к дисковому устройству /dev/da0 с IP-адреса моего ноутбука:
192.168.1.0/24 RO /dev/acd0 192.168.1.202 RW /dev/da0
Теперь можно запустить ggated(8). К моменту написания этих строк команда ggated(8) еще не была интегрирована в систему начальной загрузки rc.d. К счастью, вы уже прочитали главу 12 и знаете, как написать сценарий rc.d, который может быть интегрирован во FreeBSD. Команда ggated(8) не требует аргументов:
# ggated
Теперь модуль geom_gate будет принимать запросы клиентов, прослушивая порт TCP 3080.
Настройка клиента geom_gate
Теперь, когда у нас настроен экспорт нескольких устройств, можно запустить клиент. Для настройки клиента не требуется конфигурационный файл, достаточно выполнить команду ggatec(8). При создании локального файла устройства, который соответствует устройству, экспортированному удаленным сервером, используется следующий синтаксис:
# ggatec create -o права_доступа имя_сервера имя_устройства
Предположим, что нам нужен доступ только для чтения к приводу компакт-дисков сервера. Имя сервера — sardines.blackhelicopters.org, устройство CD-ROM — /dev/acd0. Это устройство присутствует в файле /etc/gg.exports на стороне сервера.
# ggatec create -o ro sardines /dev/acd0 ggate0
Команда ggatec отвечает созданием локального файла устройства (/dev/ggate0), соответствующего удаленному файлу устройства (/dev/acd0). Если это действительно экспортированный привод компакт-дисков, я должен иметь возможность увидеть компакт-диск в этом приводе.
# mount -t cd9660 /dev/ggate0 /cdrom/
Простая команда ls /cdrom показывает, что компакт-диск на стороне сервера теперь смонтирован клиентом. Круто, да?
Следующий вопрос: как далеко можно зайти? Давайте экспортируем фактический жесткий диск и проверим, какие ошибки можно допустить при обращении к нему.
# ggatec create -o ro sardines /dev/da0 ggate1
Первое, что приходит в голову, — попробовать работать с этим устройством как с обычным жестким диском. Можно ли использовать такие утилиты, как fdisk(8), disklabel(8) и newfs(8), с этим устройством? Ответ: нет, нельзя. Утилита fdisk(8) не сможет выполнить запись в первый сектор диска. Мы не сможем использовать disklabel(8), потому что эта утилита работает с участками дисков, а не с целыми дисками, а мы экспортировали не /dev/da0s1, а только /dev/da0. Если экспортировать /dev/da0s1, мы не сможем получить доступ к разделам, а только к целому участку. Следует быть очень внимательным к тому, что экспортируется, но даже в этом случае вы не сможете выполнять низкоуровневые операции. Однако если серверный диск поделен на разделы, которые содержат файловые системы, вы сможете монтировать их и получать доступ к данным.
# ggatec create -o ro sardines /dev/da0s1a ggate3 # mount /dev/ggate3 /mnt
Теперь удаленный диск /dev/da0s1a смонтирован в локальный каталог /mnt.
Идентификация устройств geom_gate
Некоторое время поработав с geom_gate, легко можно забыть, какое устройство с какой машины было смонтировано. Имя устройства /dev/ggate мало что напомнит о фактическом устройстве. У утилиты ggatec(8) есть команда list, которая выводит сведения об устройствах geom_gate, смонтированных локально. Чтобы получить более подробную информацию об удаленных устройствах, используйте ключ -v:
# ggatec list -v NAME: ggate0 info: sardines:3080 /dev/acd0 access: read-only timeout: 0 queue_count: 0 ...
Хотя ggatec(1) выводит достаточно много сведений о каждом устройстве, самые важные для нас — имя удаленного сервера, имя удаленного устройства и тип доступа к этому устройству.
Остановка geom_gate
По окончании работы с экспортируемыми устройствами их нужно удалить с клиента. Сначала нужно размонтировать локальное устройство на стороне клиента, а потом вызвать функцию destroy команды ggatec(8). Предположим, что у нас имеется устройство /dev/ggate0, смонтированное в каталоге /cdrom:
# umount /cdrom # ggatec destroy -u 0
Ключу -u передается номер устройства ggate, которое требуется удалить. Мы использовали -u 0, потому что останавливаем устройство ggate0.
На стороне сервера достаточно просто остановить ggated(8) командой pkill(1):
# pkill ggated
Все! Ваши сетевые устройства больше не экспортируются.
Ой!.. Восстановление geom_gate
Предположим, что вы оказались были неосторожны с geom_gate, когда остановили его. Например, я размонтировал /cdrom перед уничтожением устройства /dev/ggate0, но у меня осталось устройство /dev/ggate3, смонтированное в каталоге /mnt. Теперь у меня нет доступа к этому разделу, я не могу размонтировать его, а если я попытаюсь скопировать на него какие-либо данные, команда зависнет. Что делать? У утилиты ggatec(8) есть команда rescue, предназначенная именно для таких ситуаций. Перезапустите ggated(8) на стороне сервера, а потом запустите новый процесс ggatec(8) на стороне клиента. Синтаксис команды rescue очень похож на синтаксис команды create, за исключением того, что ей можно передать номер файла устройства ggate. Ниже мы реактивизируем устройство /dev/ggate3, смонтированное в каталоге /mnt:
# ggatedc rescue -o rw -u 3 sardines /dev/da0s1a