Встановлення бездискових робочих станцій (вузлів)
Матеріал з docs.linux.org.ua — збірника документації з Unix/Linux українською мовою.
Встановлення бездискових станцій GNU/Linux (залежних вузлів)
За мотивами:
man mknbi
http://www.gentoo.org/doc/en/diskless-howto.xml
http://www.linuxhq.com/ldp/howto/Bootdisk-HOWTO/index.html
http://www2.informatik.hu-berlin.de/%7Edraheim/boot/grub-netboot.html
Зміст
|
Вступ
Бездискові станції - комп'ютери без звичних завантажувальних пристроїв, таких, як жорсткі диски, дискети, оптичні носії. Вони завантажуються з мережі та потребують сервер, що надає свій дисковий простір, в замін звичного диску. Сервер, що надає свій дисковий простір, назвемо - "серверним вузлом", а бездискові станції - "залежними вузлами". Використання саме бездискових станцій значно спрощує обслуговування мережі, бо такі робочі станції зовсім не потребують адміністрування. Також ця технологія значно економить дисковий простір бо багатократне дублювання великих файлових систем (/usr /opt) не відбувається. Велике розповсюдження бездискові вузли мають в різних кластерних системах, як паралельних кластерів, так і в кластерах з балансуванням навантаження. Доцільно використовувати дану технологію і в навчальних класах, місцях надання публічних комп'ютерних послуг: доступу до мережі Інтернет та інших... Залежні вузли потребують мережеві карти з підтримкою PXE завантаження (або застарілих з підтримкою Etherboot http://Etherboot.org).
На серверному вузлі мусить бути встановлений Лінукс та достатньо дискового простору для файлових систем бездискових станцій.
Налаштування серверного вузла
Для забезпечення надійної роботи бездискових станцій, у разі виходу з ладу сервера, виконайте інструкції описані в 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 серверу" NFS - мережева файлова система
INIT скрипти залежних вузлів
Звичайні скрипти завантаження перевіряють наявність кореня з допомогою 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 http://syslinux.zytor.com, отож встановимо цей пакет. У 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 http://etherboot.sourceforge.net пакет для створення 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
Інші карти
Коли мережева карта не підтримує завантаження через мережу можна скористатись програмою http://www.rom-o-matic.net для створення 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 http://www.tcpdump.org/, для 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. Залежні вузли мусять мати доступ до серверу.
Література
man diskless :-D
http://osdev.berlios.de/netboot.html
http://www.stud.uni-goettingen.de/%7Edsuchod/ldc/node5.html
http://www.linux.org/docs/ldp/howto/Bootdisk-HOWTO/buildroot.html
http://www.linuxhq.com/ldp/howto/Clone-HOWTO/index.html
http://www.linuxhq.com/ldp/howto/Network-boot-HOWTO/index.html
--Svyat 23:48, 27 серп 2005 (EEST)

