Первым делом надо создать саму структуру каталогов. Я создаю всех клиентов в каталоге /clients/имя_машины, я буду использовать это в примерах, приведенных ниже. Это, конечно, можно изменить на что-нибудь другое. Сначала создадим соответствующие каталоги в корневом каталоге клиента. Нужно создать следующие каталоги:
bin , dev , etc , home , lib , mnt , proc , sbin , server , tmp , usr , var
и другие, которые вы возможно захотите иметь в своей системе.
Каталоги local, proc, и dev будут использоваться отдельно на каждой машине, в то время как остальные каталоги будут частично или полностью с другими клиентами.
Несмотря на то, что каталог dev может быть разделен, правильнее будет создать отдельный каталог для каждого клиента. Вы можете создать клиентский каталог dev при помощи соответствующего скрипта MAKEDEV, хотя, в большинстве случаев значительно проще скопировать его с сервера командой:
bash# cp -a /dev /clients/hostname |
Вы должны помнить, что /dev/mouse, /dev/cdrom и /dev/modem это символьные ссылки на настоящие устройства, поэтому необходимо убедиться в том, что они указывают на правильные устройства, в соответствии с конфигурацией клиентской машины.
Несмотря на то, что мы подключаем все с сервера, существует минимум, который необходимо скопировать каждому клиенту. Во-первых нам необходим "init", наша система не сможет ничего запустить до запуска "init" (это автор выяснил в результате долгих и мучительных поисков ;-). Итак, во-первых, вам надо скопировать файл /sbin/init в каталог sbin вашего клиента, и для того, чтобы заработал rc.S, надо скопировать /bin/sh в каталог bin клиента. Также для того, чтобы подключить все, что надо, скопируйте /sbin/mount в каталог sbin клиента. Это минимум, предполагающий, что первая строка в вашем файле rc.S содержит команду mount -av. Однако, я советую скопировать еще немного файлов: update, ls, rm, cp и umount, чтобы у вас был минимальный набор средств в том случае, если будут проблемы с подключением. Также, если вы решите оставить включение swap до подключения файловых систем, необходимо будет скопировать программу swapon.
Так как большинство этих программ по умолчанию созданы с использованием динамических связей, вам также будет нужна большая часть каталога /lib:
bash# cp -a /lib/ld* /lib/libc.* /lib/libcursses.* /client/hostname/lib |
Лучше будет создать жесткие ссылки на эти файлы, вместо их копирования. Прочтите комментарии к этому в разделе 2.1 этого Howto.
Заметьте также, что вся приведенная выше информация предполагает, что сетевые параметры передаются ядру при загрузке. Если вы планируете использовать rarp или bootp, то вам для этого, возможно, также понадобятся соответствующие программы.
В общем случае, вам понадобится минимум файлов, который позволит сконфигурировать сеть и запустить скрипт rc.S до точки, где он подключает остальную файловую систему. Убедитесь в том, что вы проверили файлы /etc/init и rc.S, и уверены, что там нет "сюрпризов", которые потребуют доступа к другим файлам до подключения файловых систем. Если таковые есть, найдите эти файлы и либо скопируйте их тоже, либо удалите соответствующие части файлов init и rc.S.
Каталог var, в большинстве случаев, должен быть уникален для каждого клиента. Однако, многое может быть разделено. Создайте в каталоге /server подкаталог var. Сюда мы подключим каталог /var сервера. Чтобы создать локальный каталог var, наберите:
bash# cp -a /var /clients/hostname/ |
Теперь у вас есть выбор, что сделать отдельно для каждого клиента, а что сделать разделенным. Любой каталог файл, который вы хотите разделить между клиентами, удалите из клиентского каталога, и создайте для него символьную ссылку или на /server/var/, или на ../server/var, но НЕ НА /clients/hostname/server/var, так как это не будет работать, поскольку корень системы изменяется.
Обычно я советую создать для каждого клиента отдельные каталоги /var/run, /var/lock, /var/spool, и /var/log.
etc подробно описывается в следующем разделе.
mnt и proc существуют для локальных целей.
usr и home - обычные точки подключения.
tmp - это решать вам. Вы можете создать отдельные каталоги tmp для каждого клиента или создать несколько каталогов /clients/tmp, и подключить их для каждого каталога в их /tmp. Я бы рекомендовал иметь для каждого клиента отдельный каталог tmp.
Замечание: Заметьте, что в этой секции описывается построение каталога etc, который большей частью разделен между клиентами. Если ваши бездисковые клиенты имеют отдельных системных администраторов, лучше создать отдельный каталог etc для каждого клиента.
Несмотря на то, что мы создаем отдельные каталоги etc для каждого клиента, большинство файлов в них мы все-таки разделим между клиентами. Вообще, разделение файлов etc с каталогом /etc сервера - это плохая идея, поэтому я советую создать каталог /clients/etc, в котором будет информация, необходимая клиентам. Для начала просто скопируйте каталог /etc сервера в каталог /clients/etc.
Вы должны добавить в этот каталог все не-машинно-уникальные файлы конфигурации, например motd, issue , и т.п. и те файлы, которые одинаковы для всех клиентов.(т.е. inittab или fstab)
Наиболее важным изменениям подвергнется ваш каталог rc.d. Во-первых, вам надо будет изменить файл rc.inet1 для того, чтобы он соответствовал локальной настройке. Я передаю все мои сетевые параметры ядру через LILO/Loadlin, поэтому я почти все удалил из файла rc.inet1. Единственное, что я там оставил - это ifconfig и route для локальной машины. Если вы используете rarp или bootp, то придется настроить его соответственно.
Во-вторых, отредактируйте ваш файл rc.S. Сначала уберите оттуда все части, ответственные за проверку дисков fsck, так как fsck запускается при загрузке сервера. Затем найдите строки, в которых подключаются ваши файловые системы. Они должны выглядеть примерно так:
mount -avt nonfs
Ключ -t nonfs присутствует здесь потому, что обычные машины сначала запускают rc.S и только потом конфигурируют Ethernet в скрипте rc.inet1. Так как эта строка не подключает NFS-разделов, то ее можно удалить. Поменяйте ее на mount -av. Если вам надо запустить rarp/bootp для настройки сети, сделайте это в rc.S (или запустите соответствующий скрипт из rc.S) до команды mount и убедитесь в том, что ваши каталоги bin и sbin содержат все необходимые файлы.
После того, как выполнится команда mount -av, вы получите работоспособную файловую систему. Создайте общий fstab, чтобы скопировать его позднее каждому клиенту. Ваш файл fstab должен выглядеть примерно так:
Таблица 1. fstab
server:/clients/hostname | / | nfs | default | 1 | 1 |
server:/bin | /bin | nfs | default | 1 | 1 |
server:/usr | /usr | nfs | default | 1 | 1 |
server:/sbin | /sbin | nfs | default | 1 | 1 |
erver:/home | /home | nfs | default | 1 | 1 |
server:/lib | /lib | nfs | default | 1 | 1 |
server:/clients/etc | /server/etc | nfs | default | 1 | 1 |
server:/clients/var | /server/var | nfs | default | 1 | 1 |
none | /proc | proc | default | 1 | 1 |
Заметьте, что ключевое слово default может не работать в некоторых версиях команды mount. Вам возможно придется сменить его на rw или ro, или убрать все части default 1 1.
Также убедитесь, что ваш файл /etc/exports на сервере выглядит примерно так:
Таблица 2. /etc/exports
/clients/hostname | hostname.domainname(rw,no_root_squash) |
/clients/etc | hostname.domainname(ro,no_root_squash) |
/clients/var | hostname.domainname(ro,no_root_squash) |
/usr | hostname.domainname(ro,no_root_squash) |
/sbin | hostname.domainname(ro,no_root_squash) |
/bin | hostname.domainname(ro,no_root_squash) |
/lib | hostname.domainname(ro,no_root_squash) |
/home | hostname.domainname(rw,no_root_squash) |
В отличие от первой строки, которая должна быть отдельна для каждого хоста, остальные строки могут содержать маску хостов для того, чтобы использоваться для всех ваших машин (например, pc*.domain - однако помните, что * подходит для всех строк, не содержащих внутри себя точку). Я предполагаю, что вы сделаете большинство каталогов только для чтения, но это зависит от вас. Флаг no_root_squash указывает на то, что пользователи root на клиентских машинах будут иметь настоящие права root-а также и на nfsd. Читайте man exports(5). Если вы хотите, чтобы пользователи на клиентских машинах могли запускать passwd, убедитесь что каталог /etc имеет разрешение на запись. Однако, я бы этого вам не советовал.
Отметьте также еще одну вещь, касающуюся файла rc.S. В дистрибутиве Slackware по умолчанию файлы /etc/issue и /etc/motd создаются заново каждый раз, как система запускается. Эта функция ДОЛЖНА быть запрещена, если эти файлы подключаются в режиме "только для чтения" с сервера, я бы посоветовал отключить эту функцию в любом случае.
И последнее. Если вы хотите, чтобы на клиентской машине был тот же набор пользователей, что и на сервере, вы должны выбрать между 1) использованием NIS (Желтые Страницы - прочтите yp-howto), и поэтому у каждого клиента будут свои файлы /etc/passwd и /etc/group, так как он получает их с NIS-сервера. 2) В большинстве случаев, обычной символьной ссылки будет достаточно. Таким образом, вам придется сделать ссылку /clients/etc/passwd на файл /etc/passwd, жесткую или символьную - какую вы предпочитаете (и не как то по-другому, так как клиенты не подключают каталог /etc сервера). Проделайте то же самое для файла /etc/group.
В общем случае, большинство файлов в каталогах etc клиентов будут представлять из себя символьные ссылки на соответствующие файлы в каталоге /server/etc. Однако, некоторые файлы различны для каждой машины, и некоторые просто должны быть там, пока загружается ядро. Минимум файлов, который вы должны иметь в клиентском каталоге etc приведен ниже:
resolv.conf |
hosts |
inittab |
rc.d/rc.S |
fstab |
В то время, как эти 5 файлов могут быть одинаковыми у всех клиентов, вы можете создать жесткие ссылки или просто скопировать их. Однако, я рекомендую создать отдельные файлы rc.S и fstab для каждого клиента. Вам также может понадобиться отдельный файл etc/HOSTNAME для каждого клиента. Я лично советую иметь отдельные rc.d-файлы для каждого клиента, так как конфигурация и оборудование могут различаться.
Для каждого клиента добавьте в fstab соответствующую строку, касающуюся swap :
Остальные файлы каталога /etc клиента могут представлять из себя или жесткие ссылки на файлы /clients/etc* или символьные ссылки на файлы каталога /server/etc (который является точкой подключения каталога /clients/etc).
Убедитесь в том, что ваша машина правильно распознает (resolve) хосты, с помощью named или через etc/hosts. Не очень плохая идея - хранить IP-адрес сервера в файле etc/hosts, нежели полагаться на распознавание (resolving). Если вы будете полагаться только на named, проблема с named не даст загрузиться вашим клиентам.
Теперь, вы сделали все для того, чтобы ваша машина загрузилась, скрестите пальцы и надейтесь, что все будет работать так, как оно должно :-).