Встановлення бездискових станцій GNU/Linux (залежних вузлів)

За мотивами:


Вступ

Бездискові станції - комп'ютери без звичних завантажувальних пристроїв, таких, як жорсткі диски, дискети, оптичні носії. Вони завантажуються з мережі та потребують сервер, що надає свій дисковий простір, в замін звичного диску. Сервер, що надає свій дисковий простір, назвемо - "серверним вузлом", а бездискові станції - "залежними вузлами". Використання саме бездискових станцій значно спрощує обслуговування мережі, бо такі робочі станції зовсім не потребують адміністрування. Також ця технологія значно економить дисковий простір бо багатократне дублювання великих файлових систем (/usr /opt) не відбувається. Велике розповсюдження бездискові вузли мають в різних кластерних системах, як паралельних кластерів, так і в кластерах з балансуванням навантаження. Доцільно використовувати дану технологію і в навчальних класах, місцях надання публічних комп'ютерних послуг: доступу до мережі Інтернет та інших... Залежні вузли потребують мережеві карти з підтримкою PXE завантаження (або застарілих з підтримкою Etherboot).

На серверному вузлі мусить бути встановлений Лінукс та достатньо дискового простору для файлових систем бездискових станцій.

Налаштування серверного вузла

Для забезпечення надійної роботи бездискових станцій, у разі виходу з ладу сервера, виконайте інструкції описані в Drbd - кластер дисків.

Компіляція ядра GNU/Linux для серверного вузла

Однією з цілей створення мережі з бездисковими станціями є швидке розгортання кластеру openMosix, і якщо це саме Ваш випадок перегляньте документацію по компіляції ядра OpenMosix - кластер балансування навантаження.

Детальну інструкцію по збірці нового ядра можна знайти тут: Компіляція ядра GNU/Linux

Звичайно можете зібрати таке ядро для серверного вузлу, яке Вам подобається, але додатково, для підтримки залежних вузлів, необхідно додати:

Опції наведені для ядра 2.6.10

Code maturity level options  --->
 [*] Prompt for development and/or incomplete code/drivers

Device Drivers --->
 Networking options --->
   <*> Packet socket
   <*> Unix domain sockets
   [*] TCP/IP networking
   [*]   IP: multicasting

File systems --->
 Network File Systems  --->
   <*> NFS server support
   [*]   Provide NFSv3 server support

Налаштування залежних вузлів

Так як станції бездискові то всі налаштунки залежних вузлів робляться на серверному вузлі так само.

Специфіка компіляції ядра для залежних вузлів

Як і у випадку з серверним вузлом основну документацію для збірки ядра читаємо тут: OpenMosix - кластер балансування навантаження, Компіляція ядра GNU/Linux

Краще збирати ядро для залежних вузлів без модулів монолітним, для полегшення життя. Ну і звичайно бездискове ядро повинно бути мінімальним без будь-яких надлишків для швидкого завантаження. Можете збирати ядра залежних вузлів у томуж місці де збирали серверне ядро - для зменшення часу компіляції, але перед цим збережіть файл з конфігурацією серверного ядра:

# cp /usr/src/linux/.config /usr/src/.config_server

Додатково для підтримки бездискової роботи бажано відключити всі модулі, тобто ядро бажане монолітне, і як мінімум драйвери мережевої карти та мережеві опції мусять включатись в саме ядро, а також додати:

Code maturity level options  --->
 [*] Prompt for development and/or incomplete code/drivers

Device Drivers --->
 [*] Networking support
 Networking options --->
   <*> Packet socket
   <*> Unix domain sockets
   [*] TCP/IP networking
   [*]   IP: multicasting
   [*]   IP: kernel level autoconfiguration
   [*]     IP: DHCP support

File systems --->
 Network File Systems  --->
   <*> file system support 
   [*]   Provide NFSv3 client support
   [*]   Root file system on NFS

Налаштування директорій залежних вузлів

Потрібно створити директорії, які б містили файли залежних вузлів та необхідні системні файли. Наприклад створимо директорію /diskless

# mkdir /diskless

Файлову систему залежних вузлів можна взяти з серверного вузлу але із суттєвими змінами. Зараз важливо створити початкову кореневу файлову систему з необхідною конфігурацією та точками монтування. Кожний залежний вузол повинен мати свою кореневу директорію для запобігання конфліктам. Найзручніше назвати ці директорії за іменами вузлів чи їх ІР-шками.

# mkdir /diskless/10.0.0.101

Тепер копіюємо /etc з серверного вузлу та підлаштовуємо під потреби залежного вузлу:

# cp -r /etc /diskless/10.0.0.101/etc

Для створення точок монтування виконуємо:

# mkdir /diskless/10.0.0.101/boot
# mkdir /diskless/10.0.0.101/dev
# mkdir /diskless/10.0.0.101/home
# mkdir /diskless/10.0.0.101/mnt/.initd
# mkdir /diskless/10.0.0.101/mnt
# mkdir /diskless/10.0.0.101/opt
# mkdir /diskless/10.0.0.101/proc
# mkdir /diskless/10.0.0.101/root
# mkdir /diskless/10.0.0.101/tmp
# chmod a+w /diskless/10.0.0.101/tmp
# mkdir /diskless/10.0.0.101/usr
# mkdir /diskless/10.0.0.101/var
# mkdir /diskless/10.0.0.101/var/empty
# mkdir /diskless/10.0.0.101/var/lock
# mkdir /diskless/10.0.0.101/var/log
# mkdir /diskless/10.0.0.101/var/run
# mkdir /diskless/10.0.0.101/var/spool

Тільки для openMosix:

# mkdir /diskless/10.0.0.101/mnt/mfs

Дуже погана ідея монтувати /diskless/10.0.0.101/var/log вірне рішення описане тут: Syslog-ng - записувач подій в UNIX!

Тобто створюємо майже звичне кореневе дерево каталогів UNIX. У файлі /diskless/10.0.0.101/etc/hostname прописуємо ім'я вузла. Також потрібно створити /dev/console для запобігання помилці: "unable to open initial console".

# mknod /diskless/10.0.0.101/dev/console c 5 1

Тепер маємо куди копіювати ядро:

# cp /usr/src/linux/arch/i386/boot/bzImage /diskless/10.0.0.101/boot

Створимо файлову систему залежних вузлів синхронну з сервером тобто візьмемо відповідні двійкові файли з сервера. Якщо сервер і залежні вузли різних архітектур то для залежних вузлів потрібно скомпілити відповідні їм двійкові файли.

# rsync -avz /bin /diskless/10.0.0.101
# rsync -avz /sbin /diskless/10.0.0.101
# rsync -avz /lib /diskless/10.0.0.101

Використання rsync -avz замість cp зумовлено належним копіюванням зсилок та прав допуску.

Опис файлу /diskless/10.0.0.101/etc/fstab наведено у розділі: Налаштування NFS серверу

Скрипти завантаження залежних вузлів

Звичайні скрипти завантаження перевіряють наявність кореня з допомогою checkroot, що не має сенсу на бездискових станціях. Важкий шлях — руками підправити скрипт /diskless/10.0.0.101/sbin/rc, але це створить багато проблем в майбутньому. Хитрість полягає в створенні файлу /fastboot, коли система завантажується. Цей файл вказує checkroot не перевіряти ніякі файлові системи, але він також витре цей файл коли закінчить завантажувальний процес. Тому мусимо створювати цей файл знову після кожного завантаження, наприклад так:

# touch /diskless/10.0.0.101/fastboot
# echo "touch /fastboot" >> /diskless/10.0.0.101/etc/conf.d/local.start

Скільки скриптів для завантаження сервісів має бути в /diskless/10.0.0.101/etc/runlevel на залежних вузлах залежить від їх призначення. Не використовуйте програму rc-update для додавання/вилучення сервісів на залежних вузлах, коли знаходитесь на серверному вузлі, бо цим ви натомість зміните його налаштування! Можна руками постворювати необхідні символічні посилання, або зайти по ssh чи локально на залежний вузол і тоді скористатись rc-update.

Приклад:

/diskless/10.0.0.101/etc/runlevels/:
total 16
drwxr-xr-x    2 root     root         4096 2003-11-09 15:27 boot
drwxr-xr-x    2 root     root         4096 2003-10-01 21:10 default
drwxr-xr-x    2 root     root         4096 2003-03-13 19:05 nonetwork
drwxr-xr-x    2 root     root         4096 2003-02-23 12:26 single

/diskless/10.0.0.101/etc/runlevels/boot:
total 0
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 bootmisc -> /etc/init.d/bootmisc
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 checkfs -> /etc/init.d/checkfs
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx    1 root     root           23 2003-10-18 17:28 consolefont -> /etc/init.d/consolefont
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 hostname -> /etc/init.d/hostname
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 keymaps -> /etc/init.d/keymaps
lrwxrwxrwx    1 root     root           22 2003-10-18 17:28 localmount -> /etc/init.d/localmount
lrwxrwxrwx    1 root     root           18 2003-10-18 17:28 net.lo -> /etc/init.d/net.lo
lrwxrwxrwx    1 root     root           20 2003-10-18 17:28 netmount -> /etc/init.d/netmount
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 portmap -> /etc/init.d/portmap
lrwxrwxrwx    1 root     root           21 2003-10-18 17:28 rmnologin -> /etc/init.d/rmnologin
lrwxrwxrwx    1 root     root           18 2003-10-18 17:28 serial -> /etc/init.d/serial
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 urandom -> /etc/init.d/urandom

/diskless/10.0.0.101/etc/runlevels/default:
total 0
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 distccd -> /etc/init.d/distccd
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 local -> /etc/init.d/local
lrwxrwxrwx    1 root     root           19 2003-10-18 17:28 syslog-ng -> /etc/init.d/syslogng
lrwxrwxrwx    1 root     root           22 2003-10-18 17:28 ntp-client -> /etc/init.d/ntp-client
lrwxrwxrwx    1 root     root           16 2003-10-18 17:28 ntpd -> /etc/init.d/ntpd
lrwxrwxrwx    1 root     root           16 2003-10-18 17:28 sshd -> /etc/init.d/sshd
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 vixie-cron -> /etc/init.d/vixie-cron

/diskless/10.0.0.101/etc/runlevels/nonetwork:
total 0
lrwxrwxrwx    1 root     root           17 2003-10-18 17:28 local -> /etc/init.d/local

/diskless/10.0.0.101/etc/runlevels/single:
total 0

Налаштування DHCP

Детальну інструкцію з прикладами, як налаштувати DHCP сервер читаємо тут: DHCP сервер.

Щоб подивитись процес завантаження заглядаємо в логи, в ідеалі:

DHCPDISCOVER from 00:00:00:00:00:00 via eth0
DHCPOFFER on 10.0.0.101 to 00:00:00:00:00:00 via eth0
DHCPREQUEST for 10.0.0.101 from 00:00:00:00:00:00 via eth0
DHCPACK on 10.0.0.101 to 00:00:00:00:00:00 via eth0

Налаштування TFTP серверу та Grub, PXELinux чи Etherboot завантажувачів

Детальну інструкцію по налаштуванні TFTP серверу читаємо тут: TFTP сервер.

Завантажувач PXELINUX

Цей розділ непотрібний якщо користуєтесь завантажувачем Etherboot.

PXELINUX - мережевий завантажувач еквівалентний до LILO чи GRUB він обслуговується через TFTP сервер. Фактично PXELINUX представляє собою пару інструкцій, що вказують клієнту де знаходиться ядро та початкова файлова система, а також дозволяє вказувати опції ядра.

Нам потрібний файл pxelinux.0 який знаходиться в пакеті SYSLINUX, отож встановимо цей пакет. У Gentoo потрібно виконати:

# emerge sys-boot/syslinux

Тепер копіюємо необхідні нам файли:

# mkdir -p /diskless/boot/pxelinux.cfg
# cp /usr/lib/syslinux/pxelinux.0 /diskless/boot
# touch /diskless/boot/pxelinux.cfg/default

При завантажені бінарний файл pxelinux.0 шукає в директорії pxelinux.cfg файл, чиє ім'я співпадає з адресою MAC, якщо такого нема то шукає файл, чиє ім'я співпадає з адресою ІР клієнта в шістнадцятковому записі. Якщо такого файлу не знайшлось, то він відкидає крайній правий розряд та шукає знов і так поки не скінчаться всі розряди. І в кінці кінців, якщо нічого не знайде, використовує файл default.

Тобто коли МАС клієнта 01-00-40-63-c2-ca-c9, а ІР 10.0.0.101 то pxelinux.0 в директорії pxelinux.cfg шукатиме за такими файлами і в такому порядку:

01-00-40-63-c2-ca-c9
0A000065
0A00006
0A0000
0A000
0A00
0A0
0A
0
default

Всі імена мають бути в нижньому регістрі!

Глянемо на типовий вмість цього файлу:

# cat /diskless/pxelinux.cfg/default
DEFAULT /10.0.0.101/bzImage
APPEND ip=dhcp root=/dev/nfs nfsroot=10.0.0.12:/diskless/10.0.0.101

Опція DEFAULT вказує на ядро bzImage котре ми перед цим встановили. Опція APPEND додає параметри завантаження ядра. Так як ми скомпілили ядро залежних вузлів з NFS_ROOT_SUPPORT, то вказуємо тут також опцію nfsroot. Перший ІР є ІР серверного вузлу а другий - директорія файлової системи залежного вузла.

Завантажувач Etherboot

Вам не потрібно читати цей розділ, якщо маєте мережеві картки з підтримкою PXE.

Завантажувач Etherboot - мережевий завантажувач, що вантажить образ з TFTP серверу. Подібно PXE він еквівалентний до LILO чи GRUB.

З допомогою утиліти mknbi можна створити різні образи використовуючи різноманітні опції. Отож встановлюємо mknbi — пакет для створення Etherboot образів. Цей інструмент створить налаштований образ ядра для завантаження по мережі з оригінального ядра. У Gentoo потрібно виконати:

# emerge net-misc/mknbi

Створюємо простий etherboot образ. Так, як DHCP сервер дає в опції "option root-path" файлу dhcp.conf кореневий шлях клієнта можна його і не включати в образ. Нижченаведена команда створить завантажувальний образ ELF, здатний отримати ІР і кореневий шлях з dhcp.

# mkelf-linux -ip=dhcp /diskless/10.0.0.101/boot/bzImage > /diskless/10.0.0.101/boot/vmlinuz

Інші карти

Коли мережева карта не підтримує завантаження через мережу можна скористатись програмою rom-o-matic для створення образу Etherboot для вашої мережевої карти та завантажувати цей образ з дискети чи компакт диску призапуску системи.

Завантажувач Grub

Grub підтримує завантаження через мережу також! Для цього вам необхідна мережева картка з підтримкою PXE чи EtherBoot та наявність її драйверу в Grub. для того щоб Grub міг завантажувати систему через мережу необхідно його зібрати з підтримкою бездискових станцій. Для Gentoo:

USE=netboot emerge grub

для решти збираємо руками, можна включити тільки необхідні драйвери мережевих плат:

./configure --prefix=/usr --host=i586-pc-linux-gnu --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --libdir=/lib --datadir=/usr/lib/grub --exec-prefix=/ --disable-auto-linux-mem-opt --enable-diskless --enable-3c503 --enable-3c507 --enable-3c509 --enable-3c529 --enable-3c595 --enable-3c90x --enable-cs89x0 --enable-davicom --enable-depca --enable-eepro --enable-eepro100 --enable-epic100 --enable-exos205 --enable-ni5210 --enable-lance --enable-ne2100 --enable-ni5010 --enable-ni6510 --enable-natsemi --enable-ne --enable-ns8390 --enable-wd --enable-otulip --enable-rtl8139 --enable-sis900 --enable-sk-g16 --enable-smc9000 --enable-tiara --enable-tulip --enable-via-rhine --enable-w89c840 --build=i586-pc-linux-gnu
make
make install

Коли мережева карта не має BOOTROM але підримується в Grub то можна створити дискету для завантаження по мережі, наприклад з допомогою скрипта DYSTRYK/bin/mknetbootfloppy.sh.

Якщо ви використовували для створення бездискових вузлів DYSTRYK/bin/mkdisklessroot.sh, то необхідні файли налаштувань для PXE та Grub створяться автоматично.

Налаштування сервера NFS

Все що потрібно зробити в загальному в деталях описано в NFS - мережева файлова система.

Включаємо залежні вузли

Якщо все запрацювало приймайте поздоровлення як гордий власник бездискових станцій :-)

Якщо ні — набирайтесь терпіння і пошукайте помилку. Наступний розділ саме для Вас ;-)

Скрипт для автоматизованого створення бездискових вузлів

Є скрипт котрий повністю автоматизує створення та настройку нового бездискового вузла mkdisklessroot.sh його можна знайти в пакеті DYSTRYK, в каталозі DYSTRYK/bin/mkdisklessroot.sh.

Можливі проблеми та шляхи їх розв'язання

Можна зробити кілька речей для виявлення проблем мережевого завантаження. Ну наприклад використати tcpdump для моніторингу процесу мережевого завантаження. Встановлюємо tcpdump, для Gentoo потрібно виконати:

# emerge net-analyzer/tcpdump

З його допомогою можна прослуховувати мережевий трафік між серверним вузлом та залежними і проаналізувати чи все відбувається нормально. Якщо щось не працює потрібно перевірити декілька речей.

Перш за все переконайтесь що ваш сервер і залежні вузли фізично з'єднанні кабелями (собаками, що переносять інформацію між компами :-D), концентраторами, комутаторами, вірно налаштованими з DHCP-relay маршрутизаторами.

Якщо серверна чи залежна вузла не дістає запит на конкретний порт перевірте мережеві екрани (firewall).

Для слідкування за активністю між двома компами виконайте:

# tcpdump host client_ip server_ip

Для прослуховування конкретного порта:

# tcpdump port 69

Частою помилкою є PXE-E32: TFTP open time-out — це, скоріше за все, проблема з мережевим екраном. Якщо користуєтесь xinetd перевірте також /etc/hosts.allow і etc/hosts.deny. Залежні вузли мусять мати доступ до серверу.

Література

--Svyat 23:48, 27 серп 2005 (EEST)