Vylepšenie prostredia

Vylepšenia prostredia

Pevné IP adresy

Považujem za dobré aby známi klienti v sieti používali vždy rovnaké IP adresy a toto nastavenie sa mi osvedčilo aj pre LTSP terminály, pretože je možné relatívne jednoducho identifikovať príslušného klienta.

Pre použitie pevných IP adries je treba vybrať rozsah IP adries, ktoré nepatria do rozsahu, z ktorého ich poskytuje DHCP server. Predvolene DHCP server poskytuje IP adresy v rozsahu 20 - 250 a toto nastavenie nádjete v súbore /etc/ltsp/dhcpd.conf v riadku:

    range 192.168.10.20 192.168.10.250;

Ak je potrebný väčší rozsah adries ako 2 - 19, prosto upravte rozsah podľa potreby.

Pre vytvorenie statických položiek stačí pridať za riadok s voľbou "option root-path" pre každého klienta tieto riadky:

host hostname {
    hardware ethernet MA:CA:DD:RE:SS:00;
    fixed-address 192.168.10.2;
}

Samozrejme MAC adresu nahraďte hodnotami podľa hodnôt klienta, ktorý má dostávať pevnú IP adresu. Položka fixed-address je hodnota IP adresy, ktorú má klient dostať a položka hostname je meno, ktoré klient dostane. Pre plné pochopenie tohoto nastavenia je dobré mať isté vedomosti o DHCP, ktoré tu však popisovať nebudem.

Sieťový swap

Technika swap je spôsob o virtuálne rozšírenie fyzickej veľkosti pamäte RAM o miesto na pevnom disku. keďže však tenké klienty často pevné disky nemajú, je treba v prostredí LTSP použiť iné riešenie. LTSP podporuje swapovanie po sieti pomocou NBD (Network Block Device) pomocou malého skriptu nbdswapd, ktorý je spúšťaný prostredníctvom inetd a stará sa o vytváranie swapovacieho súboru, nastavenie swapovania a odstránenie tohoto súboru, keď už nie je potrebný (po odhlásení terminálu).

Príslušný riadok v /etc/inetd.conf vyzerá takto:

9572 stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/nbdswapd

Predvolene majú súbory swap veľkosť 32 MB, čím je klientom pridané trochu RAM, ale nezaberá to veľa miesta na disku. Ak sa stretnete s podozrivým správaním, ako náhodné padanie Firefoxu pri prezeraní stránok s veľkým množstvom veľkých obrázkov, možno bude treba túto hodnotu zvýšiť. Nastavenie veľkosti súboru swap dosiahnete v súbore /etc/ltsp/nbdswapd.conf. Stačí do tohoto súboru vložiť riadok pre nastavenie premennej SIZE v MB, napr. pre 128 MB:

SIZE=128

Pri nastavovaní veľkosti sieťového swap dajte pozor na zabrané diskové miesto. Ak server obsluhuje 15 klientov a každý používa 128 MB swapu, zaberie to spolu 15 * 128 = 1920 MB, čiže skoro 2 GB miesta v adresári /tmp (kde sú tieto súbory ukladané).

Po nastavení veľkosti súboru NBD swap treba jeho používanie povoliť v konfigurácii lts.conf:

NBD_SWAP=true

Podľa východzieho nastavenia je povolenie NBD swapu cez inetd povolené v súbore /etc/hosts.allow:

nbdswapd: ALL: keepalive

Smerovanie a preklad adries

Ak je z nejakého dôvodu (napríklad lokálne aplikácie, synchronizácia času, ...) potrebný priamy prístup klientov k internetu, je treba na serveri povoliť smerovanie paketov a preklad sieťových adries (NAT). Smerovanie paketov sa postará o prechod paketov z jedného rozhrania servera na druhé. NAT sa postará o správnu manipuláciu odchádzajúcich (a potom i prichádzajúcich) paketov tak, aby okolitá sieť dokázala sieťovú komunikáciu poslať na správne miesto.

V Linuxe je možné nastavenie NAT v iptables dvoma spôsobmi, prvý sa volá MASQUERADING, ktorý sa hodí pre dynamicky nastavované vonkajšie rozhranie a SNAT, ktorý je zase vhodný v prípade statického nastavenia IP adresy.

Postup je jednoduchý:

  • povoliť smerovanie IPv4 ( aprípadne aj IPv6) paketov úpravou súboru /etc/sysctl.conf pomocou odkomentovania nasledujúcich riadkov:
net.ipv4.ip_forward=1
...
net.ipv6.conf.default.forwarding=1
  • spracovať urobené zmeny jadrom:
sysctl -p
  • nastaviť IP Masquerading pomocou jedného pravidla iptables:
iptables -t nat -A POSTROUTING -s 192.168.10.0/16 -o eth0 -j MASQUERADE
  • alebo nastaviť SNAT, rovnako pomocou jediného pravidla iptables:
iptables -t nat -A POSTROUTING -s 192.168.10.0/16 -o eth0 -j SNAT --to-source 192.168.0.112

Po zadaní jedného z predchádzajúcich príkazov začne smerovanie paketov fungovať, ale len do nasledujúceho reštartu. Pre plnú funkčnosť je treba zaistiť, aby sa toto nastavenie načítalo pri štarte systému, čo možno dosiahnuť viacerými spôsobmi, ja som použil spôsob popísaný v dokumentácii Ubuntu.

Najprv som si uložil aktuálny stav nastavenia iptables pomocou:

iptables-save > /etc/ltsp/nat

Vygenerované nastvenie je zbytočne podrobné, keďže potrebujem len pravidlo pre SNAT, ponechám len tieto riadky:

# Generated by iptables-save v1.4.1.1 on Wed Dec 16 19:08:11 2009
*nat
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 192.168.0.0/16 -o eth0 -j SNAT --to-source 192.168.0.112
COMMIT
# Completed on Wed Dec 16 19:08:11 2009

Nakoniec pridám riadok do nastavenia rozhrania terminálovej siete, v mojom prípade eth1, v súbore /etc/network/interfaces:

auto eth1
    iface eth1 inet static
    address 192.168.10.254
    netmask 255.255.255.0
    network 192.168.10.0
    broadcast 192.168.10.255
    up iptables-restore < /etc/ltsp/nat

Povolenie admina

V Ubuntu predvolene účet root nie je povolený, a tak i keď si povolíte konzolu, neprihlásite sa, pretože v chroot žiadny iný použiteľný účet nie je. Takže si buď vytvorte administračný účet, alebo povoľte root. Začnem povolením root, ale oba kroky majú spoločný začiatok a koniec, teda vstúpenie a vystúpenie z chroot a nakoniec generovanie nového obrazu klienta.

Vstúpenie do chroot:

chroot /opt/ltsp/i386
Povolenie root

Odomknem účet root v chroot:

passwd --unlock root

Nastavím mu heslo:

passwd root
Vytvorenie admin účtu

Možno lepšie riešenie ako povolenie účtu root je vytvorenie administračného účtu (povedzme s menom admin), ktorý bude používaný na prihlásenie k systému klienta. Takýto účet neexistuje, preto ho treba najprv pridať. Pri pridávaní mu zároveň nastavím členstvo v skupine sudo. nezabudnem ani na nastavenie hesla.

useradd -m admin -G sudo
passwd admin

Posledný krok, v oboch prípadoch, je opustenie chroot a aktualizácia obrazu klienta:

exit
sudo ltsp-update-image --arch i386

Synchronizácia času

Často je dobré mať na počítači presný čas, najmä ak používa časovo ovládané spúšťanie úloh (cron). Pre tento účel je potrebný časový server (pomocou NTP) a nástroj, ktorý dokáže z tohoto servera čas získať. Inštaláciou časového servera sa zaoberať nebudem a popíšem implementáciu na strane klienta, ktorý bude na synchronizáciu využívať časový server mimo LTSP siete.

Najprv je treba vstúpiť do chroot klienta:

chroot /opt/ltsp/i386

a tam nainštalovať klienta synchronizácie času:

aptitude install ntpdate

Pre jednoduché nastavenie spúšťania pri štarte možno vytvoriť priamo štartovací skript v príslušnom adresári /etc/rc?.d. Ukážem však postup ako využiť možnosť konfigurácie synchronizácie času bez potreby úpravy obrazu klienta zo súboru lts.conf.

Pre toto potrebujem vytvoriť spúšťací skript v adresári /usr/local/sbin, nazvaný ltsp_ntpdate s obsahom:

#!/bin/bash

# načítaj adresu NTP servera
LTSP_TIMESERVER=$(getltscfg TIMESERVER)

if [ -z "$LTSP_TIMESERVER" ]; then # ak nebola zadaná, použi ntp.org
LTSP_TIMESERVER=sk.pool.ntp.org
fi

# ak je dosiahnuteľný, tak synchronizuj čas
[ "$(ping $LTSP_TIMESERVER -qc1 -w1 > /dev/null && echo OK)" = "OK" ] && ntpdate $LTSP_TIMESERVER &

Tento skript je inšpirovaný skriptom Pierre Barcoa. Ak je v konfiguračnom súbore lts.conf nastavená premenná TIMESERVER, skript ju použije a bude s týmto serverom aktualizovať čas tenkého klienta. Ak lts.conf premennú neobsahuje neobsahuje, bude tenký klient synchronizovať svoj čas so skupinou serverov sk.pool.ntp.org.

Po vytvorení skriptu mu je treba nastaviť práva na spustenie:

chmod +x /usr/local/sbin/ltsp_ntpdate

Treba upraviť aj konfiguračný súbor ltsp.conf a do sekcie [default] pridať:

[default]
  TIMESERVER=192.168.0.1
  RCFILE_01=/usr/local/sbin/ltsp_ntpdate

Premenná TIMESERVER definuje IP adresu použitého časového servera. Premenná RCFILE_01 obsahuje cestu k skriptu ltsp_ntpdate a udáva, že tento skript bude spustený pri štarte klienta.

Nakoniec treba aktualizovať obraz klienta:

ltps-update-image --arch i386

Zapínanie a vypínanie

To čo mi chýbalo od začiatku, je možnosť zapínania a vypínania po sieti (riešil som to pomocou ističov). Zapínanie je relatívne jasné, teda sieťová karta musí podporovať Wake On Lan a musí mať túto možnosť zapnutú. Ohľadom vypínania sú možné dva postupy. Prvým je automatické vypínanie v určitom čase pomocou CRON alebo vzdialené vypínanie po sieti, ja popíšem to druhé.

Zapínanie

Aby bolo možné klienty vzdialene po sieti zapínať, musia túto možnosť jednak podporovať a jednak ju musia mať zapnutú v BIOSe. Po tomto povolení je potrebné na server (alebo iný vhodný počítač) nainštalovať balík wakeonlan.

aptitude install wakeonlan

Po nainštalovaní už môžem vyskúšať funkčnosť zadaním MAC adresy klienta, ktorého chcem zapnúť:

wakeonlan 44:4d:50:e2:51:f9

Ak sa nič nestalo (a mne sa nestalo), treba vyskúšať zadať rozhranie, cez ktoré sa má magický paket poslať. Rozhranie sa zadáva v podobe broadcastovej adresy príslušnej siete, v mojom prípade:

wakeonlan -i 192.168.10.255 44:4d:50:e2:51:f9

Ak to stále nefunguje, je možné, že operačný systém prepisuje nastavenie WoL sieťovej karty a treba mu ho implicitne zadať, ale to popíšem neskôr.

Ak to funguje, nastal čas na trochu spohodlnenie nastavenia. Aby som mohol klientov zobúdzať pomocou ich mena (pretože MAC sa dosť zle pamätá), je treba upraviť dva súbory, a to /etc/hosts a /etc/ethers. Začnime tým druhým (ktorý ešte nemusí existovať). Je to súbor, ktorý obsahuje medzerami oddelené dvojice MAC adresa a hostname, napríklad:

cat /etc/ethers
44:4d:50:e2:52:55 ltsp101
44:4d:50:e2:50:ec ltsp102
44:4d:50:e2:51:f9 ltsp103
...

Ale tento zoznam nebude fungovať bez funkčného prekladu hostname na IP adresu, preto najjednoduchšie je ich pridanie do súboru /etc/hosts, ktorý zase obsahuje medzerami oddelené dvojice IP adresa a hostname. V systéme už iste existuje a má aj nejaký obsah, preto na jeho koniec stačí pridať, napríklad:

...
192.168.0.101 ltsp101
192.168.0.102 ltsp102
192.168.0.103 ltsp103
...

Pre istotu pripomeniem, že aby to správne (a hlavne trvalo) fungovalo, je treba nastaviť DHCP server pre prideľovanie stále rovnakých IP adries, ako som písal už skôr. Po tejto úprave už možno klienta zobúdzať napríklad pomocou:

wakeonlan -i 192.168.10.255 ltsp101

Ako som spomínal vyššie, klientovi nemusí vždy stačiť nastavenie v BIOSe a treba ho trochu vylepšiť. Aby mi to teda fungovalo, musel som do chroot prostredia klienta nainštalovať balík ethertool:

chroot /opt/ltsp/i386
aptitude install ethertool
aptitude clean
exit

Po nainštalovaní nástroja som ešte musel zaistiť jeho správne spúšťanie po štarte systému s parametrom g. Vytvoril som súbor /opt/ltsp/i386/usr/local/sbin/wolfix (áno, už som opustil prostredie chroot) s obsahom:

#!/bin/bash
# oprava funkčnosti WoL

/usr/sbin/ethtool -s eth0 wol g

Samozrejme nastavil mu práva na spustenie:

chmod +x /opt/ltsp/i386/usr/local/sbin/wolfix

Teraz možno vygenerovať nový obraz klienta:

ltsp-update-image --arch i386

A už známym postupom som pridal štartovací súbor do lts.conf:

RCFILE_02 = /usr/local/sbin/wolfix

Tentokrát som premennej RCFILE pridal číslo 02, pretože inak by som si prepísal predchádzajúci skript.

Samozrejme, celé to začalo fungovať až po nasledujúcom vypnutí, aby sa tento skriptík aspoň raz vykonal.

Vypínanie

Čítal som návod pre nastavenie vypínania klientov v určenom čase na základe úlohy pre CRON. Tento spôsob sa mi ale nepáčil, pretože mi príde trochu obmedzujúci, a to tým, že nevypína stroje vždy keď to potrebujem, ale len vo vopred určenom čase. I preto som rozmýšľal na iným riešením. Hoci som uvažoval o odľahčenej implementácii pomocou "švajčiarskeho nožíka" na TCP/IP siete, zvaného netcat (nc), nakoniec som toto riešenie, kvôli nulovej bezpečnosti, zavrhol a použil odľahčený SSH server dropbear.

Ako prvú vec je treba nainštalovať dropbear v chroot prostredí klienta:

export LTSP_HANDLE_DAEMONS=false
chroot /opt/ltsp/i386/
aptitude install dropbear
aptitude clean
exit

Po nainštalovaní klienta by som mohol (a vy pokojne môžete) vygenerovať nový obraz klienta, nabootovať ho a overiť si, že na klientovi skutočne beží SSH server, lenže zatiaľ vyžaduje zadanie hesla, čo nie je najvhodnejšie. Preto je ďalším krokom nastavenie autentifikácie pomocou kľúčov. Najprv je potrebné vygenerovať si na serveri kľúč, ak ho ešte nemáte. Tento si môžem vygenerovať ako root, ale lepšie bude ako bežný používateľ (aby som sa mohol prihlasovať bez poteby root):

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/slavko/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/slavko/.ssh/id_rsa.
Your public key has been saved in /home/slavko/.ssh/id_rsa.pub.

Ako vidno vo výpise, kľúč som nechal vygenerovať do východzieho umiestnenia (/home/slavko/.ssh/id_rsa) a nezadal som passphrase. Po vygenerovaní kľúča ho ešte musím dostať do prostredia klienta, ale samozrejme iba jeho verejnú časť, ktorá je v súbore .ssh/id_rsa.pub.

Stačí prosté presmerovanie výstupu, ale už zase ako root:

mkdir /opt/ltsp/i386/root/.ssh
chmod 700 /opt/ltsp/i386/root/.ssh
cat /home/slavko/.ssh/id_rsa.pub >> /opt/ltsp/i386/root/.ssh/authorized_keys
chmod 700 /opt/ltsp/i386/root/.ssh/authorized_keys

A teraz je ta správna chvíľa na vygenerovanie nového obrazu:

ltsp-update-image --arch i386

Potom už len nabootovať a prihlásiť sa, nezabúdajte, že ssh sa predvolene pokúša prihlásiť pomocou mena práve prihláseného používateľa, preto mu treba meno zadať napríklad pomocou parametra -l alebo priamo k adrese pomocou zavináča:

ssh root@ltsp101

Pripomínam, že najprv je treba pozbierať digitálne podpisy klientov (dajte pozor na priraďovanie IP adries). S úspechom možno využiť nástroj ssh-keyscan.

Od tejto chvíle možno vypínať klientov pomocou príkazu (dropbear kašle na nastavenie PATH, tak je dobré zadávať príkazy s plnou cestou):

ssh root @ltsp101 /sbin/halt

prípadne reštartovať (napr. kvôli načítaniu nového obrazu):

ssh root @ltsp101 /sbin/reboot

Pre hromadné vypínanie/reštartovanie si možno pripraviť jednoduchý skript, ktorý postupne vykonáva ssh príkaz na jednotlivé klienty.

Hromadný skript

Pre zjednodušenie života som si napísal jednoduchý skript, pomocou ktorého môžem naraz obslúžiť celú triedu:

#!/bin/bash
# skript pre poslanie príkazu všetkým LTSP klientom

# Počet klientov, počiatočná a konečná IP
CELKOM=15
MIN=101
MAX=$(($MIN + $CELKOM -1))

case $1 in
    start)
PAUZA="sleep 1.5"
POKEC="Zapínam klienta "
PRIKAZ="wakeonlan -i 192.168.10.255 ltsp"
ULOHA=""
;;
stop)
PAUZA="sleep 0.5"
POKEC="Vypínam klienta "
PRIKAZ="ssh root @192.168.10."
ULOHA="/sbin/halt"
;;
restart)
PAUZA="sleep 1.5"
POKEC="Reštartujem klienta "
PRIKAZ="ssh root @192.168.10."
ULOHA="/sbin/reboot"
;;
free)
PAUZA=""
POKEC="Stav pamäte klienta "
PRIKAZ="ssh root @192.168.10."
ULOHA="/usr/bin/free -m"
;;
*)
echo "Použitie:"
echo "$(basename $0) start | stop | restart | free"
exit 2
;;
esac

for CISLO in $(seq $MIN $MAX); do
$PAUZA
echo $POKEC$CISLO
$PRIKAZ$CISLO $ULOHA
done

Skript spúšťam pomocou samovysvetľujúcich parametrov, ktoré skript vypíše, keď ho spustím bez parametrov.

Článok (seriál) je prevzatý zo Sprievodcu dedinčana svetom IT, a je zverejnený pod licenciou Creative Commons Attribution-Share Alike 3.0 Unported License (CC-by-sa). Inými slovami, tu zverejnené informácie môžete rozmnožovať, rozširovať, vystavovať dielo a odvodené diela za podmienky uvedenia autora a použitia rovnakej licencie, a to aj na komerčné účely.