Встановлення бездискових станцій 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).
На серверному вузлі мусить бути встановлений Лінукс та достатньо дискового простору для файлових систем бездискових станцій.
Налаштування серверного вузла
Для забезпечення надійної роботи бездискових станцій, у разі виходу з ладу сервера, виконайте інструкції описані в 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. Залежні вузли мусять мати доступ до серверу.
Література
- 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)