DHCP mind-teaser – revealed

Ramasesem dator cu povestirea questului meu cu dhcp de acum cateva zile, si adineauri am cam terminat partile esentiale, asa ca povestesc mai jos, poate pescuieste cineva ceva interesant:

Atentie, o sa fie lung!

Mai intai datele problemei:

Am un server cu Xen pe care vreau sa fac si sa desfac masini virtuale, si ma intereseaza foarte tare sa le fac cat mai "hands-off" se poate. Pentru asta imi trebuie (evident) DHCP, dar ca sa definesc hosturi individuale, imi trebuie sa tin evidenta mac-ip-hostname si sa ma asigur ca nu le incurc. IP si hostname sa zicem ca imi trebuie pentru DNS si cfengine (sau puppet pentru cui ii place ruby), dar MAC-urile le-as tine doar pt. declaratiile in dhcpd.conf (mai ales ca le poate genera Xen in locul meu). Si atunci a fost momentul cand mi-am zis: trebuie sa se poata fara!

Stiam eu ca printre valorile transmise de pachetele DHCP (standardul le spune "optiuni", asa ca le voi nu mi si eu la fel in continuare) este si hostname-ul si mi-am zis ca sigur se poate ca serverul sa se ia nu dupa MAC-ul cererii ci dupa optiunea specificata in pachet. Am gasit ceva la http://www.miquels.cistron.nl/isc-dhcpd/ cum ca nu merge chiar direct, dar se poate. Am pregatit un config de dhcpd cam ca acolo (mai tarziu m-am prins ca agent.* sunt optiuni de dhcp-relay si ca voiam host-name), dar am realizat ca eu instalez cu debian-installer caruia nu stiu cum sa-i zic hostname. Dupa ce am cautat prin manual la pagina gresita si m-am facut de ras pe Freenode am gasit netcfg/dhcp_hostname. Fabulos!

Stupoare! Nu se intampla nimic! Dupa ce m-am dat cu tcpdump si wireshark pe pachete (btw, wireshark e spectaculos cand vrei sa interpretezi un pachet si nu stii pe de rost protocolul si in care din cele tzshpe RFC-uri e ce-ti trebuie), am constatat ca nu apare nimic in plus in cererile dhcp si ca atare, isi ia adresa din pool-ul de "unknown". Dupa inca mai multe cautari prin sursele lui netcfg, m-am lamurit: trebuie lasat sa nu-si gaseasca adresa si abia dupa aceea ai optiunea sa cauti cu hostname-ul setat. Am mai dat preseed la intrebarile intermediare (o sa dau scripturile mai jos) si am scos pool-ul "liber" (mai tarziu l-am readaugat, excluzand insa clientii cu option-ul vendor="d-i"). Bun, acum mergea, dar nu se salva hostname-ul si in configul de dhcp final, ca sa mearga corect si dupa reboot. Cum tot aveam de gand sa rulez ceva scripturi de post-install, i-am trantit un sed si acum merge cum trebuie (cu inca un hack suplimentar in dhcpd.conf sa nu-l lase in pool, chiar daca nu mai are vendor "d-i")

Ramane sa vad cat de mult imi va simplifica sau complica viata ulterior ;) , deocamdata sunt convins ca pot genera partile din configurile dhcpd-ului si bind-ului direct din ceva baza de date cu ip-urile alocate. Includ mai jos partea practica.

### make-play.sh
#!/bin/bash
# scriptul pe care il folosesc deocamdata sa buildez masina virtuala numita play, in viitor numele masinii va fi un parametru
# folosesc libvirt pt. managementul masinilor virtuale asa ca e de fapt o singura comanda
# alta problema pe care o am deocamdata e ca trebuie sa-i fac eu in prealabil LV-ul, altfel nu prea vrea neinteractiv
# marea victorie e ca nu trebuie sa-i mai dau parametrul --mac, si-l genereaza singur, iar eu nu trebuie sa-l stiu ;)
virt-install \
   --name=play \
   --paravirt \
   --nographics \
   --os-type=linux \
   --ram=512 \
   --disk path=/dev/vg0/lv-play\
   --network bridge:xenbr0 \
   --location=http://ftp.nb.lug.ro/debian/dists/lenny/main/installer-i386 \
   --extra-args="auto=true priority=critical url=www netcfg/dhcp_hostname=play netcfg/dhcp_failed=true \
     netcfg/dhcp_options=\"Retry network autoconfiguration with a DHCP hostname\""

In DNS am declarat play.example.com direct si reverse la 172.30.0.99, nu mai includ si zonele

### dhcpd.conf
ddns-update-style none;
option domain-name "example.com";
option domain-name-servers ns.example.com;
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;
subnet 172.30.0.0 netmask 255.255.255.0 {
    option routers 172.30.0.1;
    option domain-name "example.com";
    option domain-name-servers 172.30.0.1;
    pool {
        deny members of "d-i";
        deny members of "has-hostname";
        range 172.30.0.101 172.30.0.120;
    }
    class "d-i" {
        match if substring (option vendor-class-identifier, 0, 3) = "d-i";
    }
    class "has-hostname" {
        match if option host-name != "";
    }
    # this will be machine generated
    class "id-play" {
        match if option host-name = "play";
    }
    pool {
        allow members of "id-play";
        range 172.30.0.99;
    }
    # ... until here
}
host other {
    hardware ethernet 00:16:3E:C0:FF:EE;
    fixed-address other.example.com;
}

Nota: inca nu-mi plac foarte tare scamatoriile facute cu clasele, dar pare sa functioneze corect.

### fisierul de preseed
# dat fiind ca am dat "url=www" in parametrii de boot, va fi cautat la adresa http://www/d-i/lenny/preseed.cfg,
# mai multe detalii in manualul installerului
# am cenzurat cateva chestii dar las in principiu si partile irelevante, poate sunt de ajutor
d-i debian-installer/locale string en_US
d-i console-keymaps-at/keymap select us
d-i netcfg/choose_interface select auto
d-i netcfg/disable_dhcp boolean false
d-i mirror/protocol string http
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.nb.lug.ro
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Bucharest
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string ro.pool.ntp.org
d-i partman-auto/method string regular
# urmatoarele 2 linii cred ca-s mostenite din alta parte, dar mi-e lene sa testez din nou sa vad daca fac ce cred eu
# si ca merge si fara, oricum partman e subiect de alt articol
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i passwd/make-user boolean false
#mereu ma chinui sa redescopar cum se cripteaza parola pt. aici, raspunsul e echo parola | mkpasswd -s -H MD5
d-i passwd/root-password-crypted password $1$tmw5No0e$WB458uiJB11YoEtfK0UkS1
tasksel tasksel/first multiselect standard
d-i pkgsel/include string openssh-server vim
popularity-contest popularity-contest/participate boolean true
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean false
d-i finish-install/reboot_in_progress note
#aici downloadez si rulez un script in mediul instalat inainte de reboot
d-i preseed/late_command string \
cd /target; \
wget http://www/d-i/post-install; \
chmod +x ./post-install; \
chroot ./ ./post-install; \
rm -f ./post-install


### post-install
# ca sa fie in concordanta cu ce scrie mai sus, trebuie publicat la url-ul dat lui wget in late_command
# o sa fac eu mai multe chestii aici, deocamdata doar:
sed -i '/send host-name/s/^.*$/send host-name "'$(hostname -s)'";/' /etc/dhcp3/dhclient.conf


Succes si astept intrebari suplimentare (daca nu sunt active commenturile, pe email la rpetre AT gmail.com)

playlist

Pentru ca nu tin minte sa fi bagat vreodata flashuri pe aici, pentru ca e un inceput pt. orice si pentru ca ascult (iar) albumul "Wish You Were Here" pe auto-repeat, uite prima piesa de pe album, care mie unul imi atinge o gramada de corzi sensibile (asta si cea care da titlul albumului). Enjoy.

administrarea de sisteme si mecanica constructiilor

Nota: Din varii motive nu am finalizat inca questul cu dhcp mentionat mai devreme, asa ca ma voi abera artistic pe alta tema :)

Poate stiti, poate nu stiti, dar foarte de mult (la scara internetului) am urmat o facultate de constructii (pe care pana la urma n-am mai terminat-o, dar asta e o poveste pt. alt loc). In decursul primilor ani in care am fost bursier etc, am capatat o pasiune deosebita pentru materiile catedrei de Mecanica Constructiilor, suficient cat sa si iau niste premii nationale pe tema asta.

Cum nu ma indoiesc ca marea majoritate a celor cativa cititori nu sunt familiari cu materiile in cauza, incerc sa fac un scurt rezumat cat sa-mi sustina argumentatia (cei care stiu sunt rugati sa treaca cu vederea daca mai calc pe langa, dat fiind ca-s amintiri lasate in paragina de ~10 ani, si sa-mi dea mail cu corecturi daca e cazul):

  • Mai intai a fost Mecanica unde am invatat cinematica, adica despre cum se misca solidul rigid, adica un corp ideal complet nedeformabil (si cateva alte chestii, gen notiuni de statica si dinamica, dar nu la ele ma refer deocamdata).
  • Dupa aceea a venit Rezistenta Materialelor unde se renunta la ipoteza materialului complet nedeformabil si se zice ca e perfect elastic (are deformatii, dar sunt direct proportionale cu deplasarile, pentru orice valoare - materialele reale sunt suficient de aproape de asta la deformatii suficient de mici). In plus, ca sa fie mai usor de operat cu noul val de probleme, am operat pe bare, o abstractizare a corpurilor suficient de lungi spre deosebire de sectiunea lor si cu incarcari statice, adica totul era in echilibru indiferent. Spre sfarsitul cursului si mai departe la Teoria Elasticitatii, am inceput sa mai renuntam la cateva abstractizari: fie flambajul, fenomenul cand un corp comprimat devine instabil si incepe sa aiba deplasari laterale incontrolabile (comprimati suficient de tare un chibrit pe lungul lui si o sa intelegeti la ce ma refer), fie incarcarea sub soc, fie materiale care de la un anumit efort se comporta perfect plastic (deformari continue la efort constant - destul de similar cu otelul aproape de rupere), fie oboseala materialului (de ce ce e in regula o data risca sa nu fie in regula de 10.000 de ori), fie comportarea placilor plane sau curbe.
  • In paralel am inceput sa invatam despre structuri mai complexe la Statica, mai intai asa zis "static determinate", adica suficient de articulate incat deformatiile sa nu induca alte eforturi in cascada, mai tarziu "nedeterminate", adica cu mai putine articulatii (si cu mult mai multe calcule) si mai apropiate de realitate. Mai intai structuri plane si mai tarziu spatiale.
  • Si totul se incheie cumva glorios cu Ingineria Seismica, unde structura incepe sa aiba masa si sa fie supusa la diverse vibratii, stiind ca raman in continuare o gramada de simplificari ale modelului real: de exemplu la cursul de Beton am invatat o gramada de chestii despre comportamentul materialelor compozite ca betonul armat.
  • Ca cireasa de pe tort,prin anul IV am avut si un curs dedicat simularii pe calculator, unde prin puterea seriei paralele de matematici (analiza matematica + matematici speciale, combinat cu algebra + analiza numerica), putem face un model de calcul mai complex decat ce folosisem pe hartie pana atunci dar in continuare cu o serie de simplificari, abstractizari si presupuneri.

Asa, acum ca am insirat toata panoplia de sfinti (sau pentru diversi restantieri, diavoli) ai primilor 3 ani ai facultatii pe care cu mandrie am urmat-o, care e legatura cu administrarea de sisteme? E OK sa presupui diverse lucruri care sa-ti simplifice viata, atata timp cat ramai constient de acele presupuneri si stii sa le verifici validitatea sau marja de eroare.

Primul exemplu care imi vine in minte: monitorizezi incarcarea procesorului. Procesul de monitorizare consuma si el ceva cicli de CPU, ceea ce e acceptabil atata timp cat nu e semnificativ (de exemplu daca faci poll foarte des, sau daca masina e foarte idle). Hmm, nu stiu daca e cel mai elocvent exemplu, poate gandesc ceva mai bun (sau imi sugereaza cineva ceva).

dhcp mind-teaser

Tin sa anunt ca m-am scos sa fac rezervari de ip-uri cu ISC dhcpd fara sa folosesc adresa mac ci doar hostname, si mai si merge cu installerul de Debian. Acu mai ramane sa aranjez sa scriu si dhclient.conf in faza de instalare ca sa mearga si dupa reboot si sa vad cum fac sa am si pool pentru alti clienti dhcp.

Dupa ce lamuresc astea bag un post mai lung , poate mai ajuta si altor disperati si maaaybe il pun si pe wiki (.lug.ro).

Pe mai incolo.

debian upgrade tips

Dat fiind ca zilele astea s-a anuntat ca inceteaza suportul pentru Debian 4.0 "Etch", m-am apucat sa fac upgrade-uri la diverse servere lasate in urma si ma gandesc ca poate mai ajuta cuiva rutinele mele (si-asa imi trebuia motiv sa mai bloguiesc ceva), so here goes:

In primul rand, folosesc aptitude pentru managementul de pachete, pentru ca isi face curat (intr-o oarecare masura) la pachetele inutile. Pentru asta, fac o data pe server urmatoarea chestie: pornesc aptitude, rulez un update, ( pe masini suficient de ignorate e posibil sa planga de chei de arhiva lipsa, asa ca fortez upgrade-ul lui 'debian-archive-keyring' si dau update din nou), debifez optiunea cu "install recommended packages" din options/dependency handling (altfel insista sa traga mult mai multe pachete decat as dori), marchez toate pachetele instalate ca "auto" (cu M din UI sau cu ceva gen aptitude markauto --schedule-only '~i' ). Mare atentie ca in faza asta va incerca sa dea afara o gramada de chestii care n-ar trebui, asa ca don't apply yet! Dupa aia marchez ca "manual" (cu 'm' sau cu 'unmarkauto' ) toate pachetele care nu depind de nimic altceva, filtrul magic fiind ceva gen '~i!~RDepends:~i' (desi parca am mai zis incantatia asta si cu alta ocazie). Acum ar trebui sa fie relativ corect, cu unele exceptii asa ca ar trebui parsata la ochi lista de pachete care se vor dezinstala (personal tin la niste chestii gen whiptail, cron, logrotate si klogd care sunt candidate la eliminare in faza asta), daca se identifica ceva se marcheaza si ala ca manual, si iar update, etc. Eventual se consulta si lista de pachete marcate ca manual (cu '~i!~M' ) si se mai trec pe auto chestiile la care nu tii neaparat (sa ramana doar daca tine altcineva la ele). Eu unul prefer sa nu dau purge la pachete pentru ca mai am diverse configuri etc la care poate mai tin, dar banuiesc ca e chestie de gust.

Boon, acu ca aptitude e setat, in principiu ar trebui sa faca ce trebuie, asa ca putem trece la upgrade-ul propriu-zis. Mai intai trebuie facut update sa aiba lista proaspata de pachete, dupa care dist-upgrade sa aiba cele mai recente din distributia curenta, just in case (am mai vazut cazuri in care s-au reparat pachete cat sa ajute upgrade-ul la distributia urmatoare). Dupa ce e la zi pe distro-ul vechi, se updateaza sources.list (apropo, prefer sa tin "poreclele" release-urilor in loc de 'stable/oldstable' pentru ca nu te trezesti ca ti se schimba stable sub picioare in ziua release-ului) si se face update.

Acum ca avem pachete vechi, dar lista din distro-ul nou, prima chestie o fac sa upgradez aptitude (ceea ce trage dupa el alte chestii strict necesare gen libc6 si alte asemenea), pentru ca IMO e de ajutor ca la rezolvarea dependintelor dintr-un release sa ai aptitude din release-ul ala. Dupa ce vine aptitude-ul nou, iarasi aptitude update, dupa care se poate da dist-upgrade (daca am servicii multe, prefer sa fac cumva pe bucati ca sa nu le tina mult oprite, asta pentru ca sunt lame si nu anunt maintenance si fac upgrade-uri "pe sest").

Ar mai fi ceva de comentat la cazurile cand dpkg gaseste conflicte in fisiere de configurare, dar e cumva de la caz la caz. Eu prefer ca daca stiu ca am modificat eu cu un scop fisierul ala sa ma uit la diff si sa las cel vechi (implicit), altfel sa merg pe versiunea noua (mai activeaza diverse features pe care e pacat sa le scapi). Daca in diff am vazut ceva care merita mostenit, le iau dupa aia la manuta individual (dpkg salveaza copii cu fisier.dpkg-new sau fisier.dpkg-old asa ca pot face vimdiff pe ele) si dau restart la servicii cand e cazul.

Daca dupa toate aceste operatii (care fara download dureaza mai putin de 10 minute per server, oricat de complicat le-am facut eu sa sune), merg toate serviciile care trebuie sa mearga (ai nagios, nu?), se poate bifa serverul in cauza si trece la urmatorul.

La kernel-related things e cam la fel, da' prefer sa aman reboot pana e cineva pe langa serverul in cauza, just in case (am patit niste chestii nasoale la trecerea 2.4 -> 2.6+udev si de atunci sunt extra paranoic).

HTH, HAND.

reboot stuck in fsck

In ciuda titlului, e un post non-tehnic, asa ca cine a ajuns aici cu google raspunsul e probabil "e2fsck -fvyC / && reboot", da' nu-mi asum nici o responsabilitate :P

So, de cateva luni incoace am renuntat sau abandonat o gramada de lucruri in incercarea (deocamdata fara succes) de a-mi reorganiza un numar in crestere de probleme personale. Blogul asta e pe lista de ceva vreme, mai ales ca a fost pornit oarecum la misto si tinut doar sub forma de carnet de notite public (cel putin postul cu losetup cu offset mi-a fost de folos de cateva ori de cand l-am scris), iar in ultima vreme n-am mai prea dat de subiecte pe care sa ma simt suficient de stapan incat sa le abordez in public, asa ca am preferat sa adopt politica "decat sa spui o tampenie, mai bine taci din gura". Am cochetat o vreme cu ideea de a face un soi de wiki+blog dar ma simt nevoit sa admit ca necesita prea mult spirit organizatoric.

Fascinant e totusi ca sunt cateva zeci de oameni care au considerat ca merita sa se subscrie la rss-uri (inclusiv cineva care ma citeste pe ipv6 din roedu via google reader, hello :D ), asa ca nu ma mai simt complet indreptatit sa-mi bag picioarele sau sa o dau in posturi emo. Drept urmare, invit cetatenii care ma urmaresc sa ma lamureasca si pe mine ce zic asa inteligent sau ce va asteptati sa zic asa inteligent, poate reusesc sa simulez ceva. Nu in commenturi, pe e-mail catre rpetre at gmail.com. Asa cum am mai zis, daca efortul de a scrie mailul e prea mare, probabil ca nu era foarte important anyway (asa ma scuteste si de filtrat comment spam).

Si ca sa nu fiu complet egoist, mai fac o data reclama la activitatile pe care (inca) le sustin: wiki-ul lug.ro (saracut in content, dar ca orice wiki, necesita contribuitori mai multi ca sa aiba content de calitate) si intalnirile lunare RLUG, momentan doar in Bucuresti, dar poate cine stie... Va asigur ca sunt mai interesat de ce puteti voi contribui la astea decat de ce contribui eu la blogul asta.

Have fun.

urari de sarbatori

Tin sa urez oricui citeste asta sa reuseasca sa fie mai bun si intelegator cu oamenii din jur (si nu, definitia "ii mai dau timpul T1 de la mine inainte sa-i f*t una peste ochi asa cum simt ca ar merita" nu se incadreaza). Macar de Sarbatori daca nu in general.

Sarbatori fericite!

ce vreau de la Mosu’

Azi e Cyber Monday, ziua in care se fac cele mai multe cumparaturi online din an (desi a pornit ca un gimmick de marketing, rrd-urile nu mint) si intamplator, tot azi m-a intrebat cineva mai pe ocolite ce mi-as dori.

"Nimic care sa poata fi cumparat cu bani" cica nu se pune, asa ca, vorba cantecului, pentru toate celelalte exista Mastercard. Drept urmare miile de cititori care vor sa ma copleseasca cu cadouri pot sa foloseasca wishlistul meu de pe amazon :D

PS1: Sincer, nu ma astept la nimic, mai ales pe criza asta...

PS2: pt. cinevrea totusi carti pt.el, daca sunt de la O'Reilly sugerez sa comparati si pretul comenzii facuta direct de la ei, folosind cuponul oferit RLUG ca membra in programul O'Reilly UserĀ  Groups. Nu sunt diferente fenomenale fata de Amazon, dar cred ca depinde de la caz la caz. Detalii pe wiki-ul RLUG.

mesaj de eroare elegant

Daca o sa ma mai trezesc in situatia de a construi sau a intretine aplicatii web, sper sa retin mesajul asta pentru erori legate de DB:

"The database hates you right now. The entry might exist or it might not exist. We would clear this mystery up for you, if we could get to the database. We tried to look it up, but the database puked up an error."

(gasita pe un site care foloseste pmwiki, nu mi-e clar daca e din upstream sau nu)

un blog, un om, un vot

Pentru ca se pare ca daca ai blog trebuie sa-ti dai cu parerea despre campanie, tin sa anunt ca duminica o sa ma straduiesc sa vad cum gasesc o cabina de vot pentru nerezidenti, sa ma duc sa sustin paramentul bicameral la referendum si sa votez pe oricine in afara de Basescu.

Nu sunt de parere ca parlamentarii sunt niste sfinti, dar intr-o democratie normala asta se rezolva prin interesul societatii civile fata de activitatile alesilor in parlament si de selectarea unor oameni mai capabili, nu prin imputinarea parlamentarilor. Ma deranjeaza enorm ca arma electorala a d-lui Basescu este pictarea in culori pastelate a tabloului "Presedintele erou in lupta cu imbuibatii si lenesii din parlament", tablou care a fost folosit si in meciul anterior dintre Presedintie si Parlament.

Ma deranjeaza ca li se serveste in continuare romanilor reteta statului stalinist, in care e un Tatuc care are el grija de tot si care uneori trebuie ajutat sa se descotoroseasca de elementele care il impiedica. Vreau sa traiesc intr-un stat democratic in care institutiile care il conduc sa fie formate din oameni care se urmaresc unii pe altii, nu din putini care sa-si faca treburile nederanjati.

In mod normal mi se cam falfaie de politica romaneasca, fiind constient ca adevaratele directii de urmat se vor impune de la Bruxelles, Geneva, Washington, Moscova sau Beijing, dar de data asta ma deranjeaza si ma jigneste personal campania asta cu referendumul. La presedinti e o decizie imposibila, din cei 12 candidati fiind 4 cu ceva sanse si 8 fara. Cei 4 sunt un presedinte mitoman cu mania grandorii, un nene care abandoneaza o functie in care a fost ales pentru un potential ciolan mai mare si doua marionete fara personalitate proprie care or sa deserveasca grupari de interese pe care le putem doar banui. Asa ca in turul 1 probabil o sa votez "cu roacherul" (care n-are nici o sansa) doar ca sa nu anulez votul. Oricum daca nu era referendumul nu ma oboseam sa ies din casa.