FreeBSD на бездисковых станциях


Лак на водной основе www.petri.ru.

С одной системой FreeBSD справиться совсем не сложно, но десятки и сотни практически идентичных систем могут стать тяжким бременем. Один из способов сделать сопровождение менее хлопотным заключается в использовании бездисковых систем. Бездисковые системы совсем необязательно не должны иметь дисков, просто они загружают операционную систему с сервера NFS, расположенного в сети.

Зачем нужны бездисковые системы на ферме серверов? С единственного сервера NFS можно загружать множество систем, что позволяет централизовать наложение заплат и уменьшить объем работ по поддержке. Это решение прекрасно подходит для групп терминалов, вычислительных кластеров и других ситуаций, когда у вас много идентичных систем. При таком подходе обновление операционной системы превращается в простую замену файлов на сервере NFS. Аналогично, когда в обновленной версии обнаруживаются ошибки, возврат к предыдущей версии заключается в не менее простом восстановлении файлов на сервере NFS. Единственное, что потребуется сделать на стороне клиента, — это перезагрузить систему. Так как клиенты имеют доступ к серверу только для чтения, никто из пользователей не сможет внести изменения в свои локальные системы так, чтобы они остались после перезагрузки. Если у вас всего пара локальных систем, выгоды от организации бездисковых систем не будут стоить потраченных усилий, но чем больше локальных систем, тем отчетливее видны преимущества.

Тест, тест, тест!

Ваша первая попытка организовать бездисковую систему во многом будет напоминать первую настройку брандмауэра: масса ошибок и неприятностей, доводящих до бешенства. Я настоятельно рекомендую тщательно тестировать каждый этап подготовки, что облегчит вам поиск и устранение проблем. Для каждого необходимого сервиса будут предложены инструкции по тестированию.

Для организации бездисковых систем, необходимы сервер NFS, сервер DHCP, сервер TFTP и оборудование, позволяющее выполнять загрузку по сети. Обратимся к каждой из этих составляющих и посмотрим, как они настраиваются.

Бездисковые клиенты

Машины, работающие как бездисковые станции, должны уметь отыскать в сети начальный загрузчик и операционную систему. Реализовать это можно с применением ВООТР и РХЕ. ВООТР, Internet Bootstrap Protocol (протокол начальной загрузки), — это старый, давно забытый стандарт. РХЕ, Intel’s Preboot Execution Environment (предварительная загрузка среды выполнения), уже в течение нескольких лет поддерживается всеми современными машинами, поэтому мы обратим свое внимание именно на этот способ.

Включите бездисковую станцию и зайдите в настройки BIOS. Где-то среди этих настроек должны находиться параметры, определяющие порядок выбора загрузочных устройств. Если машина поддерживает способ загрузки, основанный на РХЕ, одним из таких устройств будет сеть. Включите этот параметр и установите его первым в списке.

На этом подготовка бездискового клиента закончена. Теперь перейдем к подготовке сервера.

Настройка сервера DHCP

Многие считают DHCP лишь способом получения IP-адреса, но этот протокол способен на большее. Можно настроить сервер DHCP таким образом, что он будет сообщать о местоположении сервера TFTP, NFS и других сетевых ресурсов. Бездисковые системы широко используют DHCP, и вы обнаружите, что мы задействуем некоторые возможности DHCP, не рассмотренные ранее. В настройке сервера DHCP, предназначенного для обслуживания бездисковых систем, нет ничего сложного, если вам заранее известны МАС-адреса бездисковых станций.

МАС-адрес

Чтобы назначить конфигурационную информацию клиенту DHCP, необходимо знать МАС-адрес сетевой карты клиента. Некоторые реализации BIOS предоставляют информацию о МАС-адресах интегрированных сетевых карт, а на некоторых серверах даже наклеены ярлыки с МАС-адресами. Но это слишком просто, а мы попробуем пройти более сложным путем.

Пытаясь загрузиться через сеть, машина выполняет DHCP-запрос на получение конфигурационной информации. У вас пока нет конфигурации для бездисковых станций, тем не менее, любой сервер DHCP регистрирует МАС-адреса клиентов. Например, когда я попытался загрузить бездисковую станцию, в протоколе сервера DHCP появились следующие записи:

Jul 27 10:15:49 sardines dhcpd: DHCPDISCOVER from 00:00:24:c1:cb:a4 via fxp0
Jul 27 10:15:49 sardines dhcpd: DHCPOFFER on 192.168.1.78 to 00:00:24:c1:cb:a4 via fxp0

МАС-адрес этого клиента — 00:00:24:c1:cb:a4, и ему был предложен IP-адрес 192.168.1.78. Владея этой информацией, мы можем создать конфигурацию DHCP, чтобы присвоить этому хосту статический IP-адрес и предоставить загрузочную информацию.

Конфигурация DHCP: определенная бездисковая станция

Основные службы DHCP мы настроили в главе 15. В следующем примере приводится конфигурация dhcpd(8) для бездискового клиента. Эти параметры указываются уже не в инструкции subnet, а в отдельной инструкции верхнего уровня.

Здесь мы определили группу с именем diskless (1). Это позволило нам задать значения параметров для целой группы и добавить в нее хосты. Каждый хост в группе будет получать одни и те же значения параметров.

Параметр next-server (2) сообщает клиентам DHCP IP-адрес сервера TFTP, а параметр filename (3) — имя файла с загрузчиком, который находится на сервере TFTP. В главе 3 говорилось, что загрузчик — это программа, которая отыскивает и загружает ядро. Наконец, параметр option root-path (4) сообщает загрузчику, где находится корневой каталог для данной машины. Все эти параметры и настройки присваиваются всем клиентам в группе.

Затем выполняется привязка бездискового клиента к группе с помощью инструкции host с именем хоста (5). Наш первый клиент называется diskless1. Данный клиент идентифицируется по МАС-адресу (6) и ему присваивается статический IP-адрес (7). Кроме того, ему передается стандартная конфигурация группы.

Аналогичным образом можно добавить все остальные хосты в сети.

Перезапустите dhcpd(8), чтобы конфигурация вступила в силу. Теперь перезагрузите бездисковую станцию. В протоколе DHCP должны появиться записи, свидетельствующие о том, что этому клиенту предложен его статический IP-адрес. Однако клиент DHCP не может продолжить загрузку без загрузчика, а это означает, что нам следует настроить сервер TFTP.

Конфигурация DHCP: ферма бездисковых станций

Допустим, у вас есть много идентичных бездисковых станций, таких как «тонкие клиенты». Тогда вполне разумно отказаться от необходимости заводить статические записи в конфигурации DHCP для каждого из них. Позволим этим хостам получать загрузочную информацию с сервера DHCP без указания статическиех IP-адресов. В этом случае клиенты будут получать адреса из пула DHCP.

Кроме того, можно выполнять идентификацию хостов, запрашивающих информацию DHCP из РХЕ, и присваивать им определенные группы адресов. Хост, загружающийся через РХЕ, идентифицирует себя на сервере DHCP как клиент типа PXEclient. Можно написать правила для клиентов данного типа и конфигурировать их соответствующим образом. Загляните в руководство DHCP и поищите информацию о параметрах vendor-class-identifier и dhcp-client-identifier.

tftpd и загрузчик

Настройка сервера TFTP рассматривалась в главе 15. Сервер TFTP должен иметь файл pxeboot для бездисковых клиентов. FreeBSD устанавливает pxeboot в каталог /boot.

# ср /boot/pxeboot /tftpboot
# chmod +r /tftpboot/pxeboot

Попробуйте на своей рабочей станции загрузить pxeboot через TFTP. Если файл загрузился успешно, попробуйте перезагрузить бездисковую станцию и посмотрите, что из этого получится. На консоли должны появиться примерно такие сообщения:

Building the boot loader arguments
Relocating the loader and the BTX
Starting the BTX loader

Вы видели эти сообщения раньше, когда загружали FreeBSD с жесткого диска. На этом месте загрузка бездискового клиента должна остановиться, потому что он не может смонтировать пространство пользователя (userland), которого еще не существует. Это задача сервера NFS.

Сервер NFS и пространство пользователя для бездискового клиента

Многие руководства по организации бездисковых станций предлагают использовать корневую файловую систему сервера со всеми программами для обеспечения работы бездисковых клиентов. Сделать это довольно просто, но это крайне небезопасно. На сервере, обслуживающем бездисковые станции, скорее всего, есть программное обеспечение, которое не должно попасть в руки клиентов, и наверняка есть секретная информация, доступ к которой нельзя разрешать для целой группы рабочих станций. Более мудрым будет создать отдельную файловую систему со всем необходимым.

Реализовать отдельную файловую систему можно множеством способов, но, на мой взгляд, наиболее просто будет использовать немного измененную конструкцию jail(8) из главы 9. Сначала нужно создать каталог для бездисковых клиентов, а затем установить в этот каталог ядро и все необходимые программы и библиотеки. Ниже приводится пример установки программного обеспечения в каталог /var/diskless/1:

# mkdir -p /var/diskless/1
# cd /usr/src
# make installworld DESTDIR=/var/diskless/1
# make installkernel DESTDIR=/var/diskless/1
# make distribution DESTDIR=/var/diskless/1

Эти команды установят в каталог /var/diskless/1 все необходимое для пользователя программное обеспечение.

Теперь сообщим серверу NFS об этом каталоге. Я предполагаю развернуть в этой сети несколько бездисковых систем, поэтому экспортирую этот каталог через NFS сразу целой подсети. Клиентам не нужен доступ на запись к корневому каталогу NFS, поэтому экспорт выполняется только для чтения. Делается это с помощью следующей строки в файле /etc/exports:

/var/diskless/1 -ro -maproot=0 -alldirs -network 192.168.1.0 -mask 255.255.255.0

Перезапустите mountd(8) с помощью сценария /etc/rc.d/mountd, чтобы сделать доступным этот разделяемый ресурс, и попробуйте смонтировать его со своей рабочей станции. Проверьте, содержит ли каталог все необходимые программы и убедитесь, что у вас отсутствует право на запись в эту файловую систему. После этого перезагрузите бездисковую станцию и посмотрите, что произойдет. Клиент должен отыскать ядро и загрузиться в ненастроенный многопользовательский режим. В зависимости от производительности сервера, клиента и пропускной способности сети это может занять некоторое время. Мой ноутбук из сети загружается так же быстро, как с жесткого диска, тогда как устройство 266 MHz Soekris net4801 загружается несколько минут.

С этого момента можно дополнительно сконфигурировать набор приложений и библиотек, чтобы он точнее соответствовал потребностям вашего единственного клиента. Можно внести изменения в /etc, например, отредактировать /etc/fstab или скопировать файл паролей на место. Для единственного клиента этого было бы вполне достаточно, но инфраструктура FreeBSD проектировалась специально для поддержки десятков и даже сотен клиентов с одной и той же файловой системы. Посмотрим, как этого можно добиться.

Повышение безопасности NFS для бездисковых клиентов

Как только ферма бездисковых станций заработает, вернитесь на шаг назад и назначьте учетную запись root для NFS другому пользователю. Запустите команду find/var/diskless/1 -user 0 -exec chown nfsroot, которая отыщет все файлы, принадлежащие root, и определит им в качестве владельца пользователя nfsroot. После этого можно отредактировать файл /etc/exports, чтобы отобразить пользователя root в пользователя nfsroot. Вы пока только учитесь, поэтому не слишком увлекайтесь.

Комментарии запрещены.