Suspend2Net
Dobrodošli, Gost. Molim vas prijavite se ili se registrujte.

Prijavite se sa korisničkim imenom, lozinkom i dužinom sesije

Linuxo Forumi

Stranice: [1]   Idi dole
  Štampaj  
Autor Tema: Suspend2Net  (Pročitano 774 puta)
0 članova i 1 posetilac pregledaju ovu temu.
sysctl
Full Member
***
Van mreže Van mreže

Pol: Muškarac
Poruke: 168


spiderpig


« poslato: 09 Октобар 2007, 23:32:12 »

Dugo nisam postovao, znate kako je posao, posao Cheesy , kako bilo evo "sta sve moze na linuxu !!!" ili to bese neka druga tema  Cheesy

Suspend2NET, iliti suspend/hibernate na mrezu.
Pojavljivanjem Suspend2 projekta za kernel ovo je postalo moguce !!!
Suspend2 predstavlja skup modula za kernel i userspace alata u obliku kolekcije hibernate skriptova.

Evo "kratkog" tutorijala/objasnjenja kako to uraditi.

Moguce je izvrsiti suspend na vise mesta: u swap particiju, u swap fajl, ili obican fajl. Takodje je moguce izvrsiti powerdown pomocu vise ACPI metoda (u zavisnosti od hardvera): 3 za suspend2ram, 4 za ACPI S4 sleep, 5 za poweroff.

Suspend2 podrzava "on-the-fly" kompresiju prilikom upisa sadrzaja RAM-a u fajl ili swap, takodje swap moze biti kriptovan, itd, itd.

Motivacija/Scenario Smiley :

Prvo kernel mora biti patch-ovan da bi suspend2 mogao da radi. Pogledajte http://suspend2.net za vise detalja/

Posto sam trenutno uposljen kao sysadmin, na odrzavanju mreze sa velikim brojem klijenata i dedicated servera, prilikom svake sesije na svom laptopu imam pokrenute razne tunele ka serverima, veliki broj maintenance skriptpva, gomilu programa za pregled nekog stanja itd, itd.
Dakle svako jutro kada dodjem na posao, ukljucim laptop i moram sve to ponovo da startujem, da ukucam gomilu passworda, unesem gomilu komandi, sto mi oduzima prekopotrebno "dragoceno" vreme. Onda mi je palo na pamet da nekako "snimim sesiju" na mrezu i kad sledecegjutra 
dodjem na posao, samo utaknem kabal, povratim sesiju i nastavim da radim. E zato je tu Suspend2 Tongue.

U prvom pokusaju sam hteo da suspendujem u fajl koji je share-ovan putem NFS-a, a zatim pri ponovnom pokretanju mount-ujem share i prosledim fajl hibernate skript-u. Ovo nije bilo moguce iz vise razloga, prvo suspend2 nije vise puta mogao da odredi neku vrstu "magic cookie-a" za fajl pri boot-u, drugo suspend2 nije mogao da izvrsi lock fajla jedno pet puta prilikom upisa sadrzaja RAM-a, ali valjda je to ogranicenje NFS-a, ne znam.

Druga mogucnost je suspend u swap particiju, ali kako share-ovati swap partciju preko mreze ? Posle malo istrazivanja (citaj googlovanja) pronasao sam NBD ili network block device, takodje postoji i iSCSI, ali je dosta komplikovan za podesavanje, tako da sam se odlucio za nbd.
Vise informacija o nbd-u mozete pronaci na http://nbd.sf.net NBD se sastoji iz kernel modula i 2 userspace programa nbd-client i nbd-server. Kernel modul je odavno u 2.6 kernel tree-u i u kernel konfiguraciji se moze pronaci na Device drivers-->Block devices-->Network block device support. Ime modula je nbd.ko (ko bi rekao Smiley). Podesavanje je veoma jednostavno.

Na serveru se napravi user i grupa pod kojom ce nbd-server "delovati", napravi se fajl koji ce se share-ovati kao block uredjaj, npr dd if=/dev/zero of=/mnt/swpshare/swap1 bs=1M count=1024 ,
fajl se chown-uje na grupu nbd-a i promeni se nekoliko parametara u /etc/nbd-server/config, a koji odredjuju koji host-ovi se mogu povezivati, maksimalna velicina fajla, copy-on-write, itd... zatim se nbd-server startuje sa nbd-server [port] [fajl], npr., nbd-server 7070 mnt/swpshare/swap1 i to je sve sto se tice servera.

Na klijentu je podesavanje sledece, prvo se ucita nbd-modul modprobe nbd, koji kreira /dev/nbd* nodove, zatim se na server povezemo komandom nbd-client [host] [port] [device], npr., nbd-client 172.16.29.2 7070 /dev/nbd0,
potom napravimo swap particiju mkswap /dev/nbd0 i aktiviramo je swapon /dev/nbd0.
I to je sve !!! Imamo "mrezni" swap.

Sada je potrebno podesiti suspend2. Podesavanje "povratka/snimanja" RAM-a iz/u swap(a) je
veoma jednostavno, sve sto je potrebno je da se doda resume=/dev/nbd0 u komandnu liniju kernela i suspend2 ce pokusati da povrati sadrzaj RAM-a iz swap particije ili da snimi sadrzaj u istu. Finije podesavanje se vrsi u /etc/hibernate/hibrenate.conf.

Dalje je potrebno podesiti initrd. Da bi citava stvar funkcionisala initrd mora da ucita nbd i modul za mreznu karticu, da odredi ip adresu mrezne putem dhcp-a i dodeli je interfeju, kao i da podesi "mrezni" swap. On sve ovo mora da uradi pre nego sto se montiraju lokalne particije i pre suspend2 skripta.

Podesavanje initrd-a varira od distribucije do distribucije. Gentoo genkernel skript koristi dosta komplikovane skriptove za kreiranje initrd-a, tako da sam se odlucio za tradicionalni nacin (citaj rucno). initrd je ustvari samo cpio gzip-ovana arhiva koja po pravilu sadrzi potrebne kernel module, programe i skriptove za potrebno podesavanje sistema pre nego sto se monitira root particija, znaci early userspace. Initrd po obicaju sadrzi busybox koju nudi dosta alata u jednom staticki linkovanom fajlu, a, sto je od posebnog znacaja, sadrzi i dhcp client. Prvo raspakujemo postojeci initrd u neki dir, cd /tmp/initrd && zcat /boot/initrd.img-`uname -r` | cpio -idv, zatim pronadjemo initrd.scripts u etc subdiru (/tmp/initrd/etc/initrd.scripts) i u njega dodamo sledece shll funkcije

Kod:

NUMSVRS="0"
ONENODE="1"

#parsuje netsuspend kernel cmdline opciju,
#vraca broj pronadjenih servera
#pokusava da uspostavi konekciju i
#monitira swap patricije sa kojih
#ce se resume-ovati
setup_netsuspend()
{
local OPTS="$1"
local IFS=","

#opcije moraju biti u formi server1:port1,server2:port2
#OPTS="${OPTS#*:}"
local i=0
local pri=2
for opt in ${OPTS}; do
#da li smo dobili server:port vrednost
if [ "${opt}" != "${opt#*:}" ]; then

#ako imamo bar 1 server/port par
#podesavamo mrezu
if [ "$i" == "0" ]; then
#moprobe
modprobe -q e100 #driver za eth0
modprobe -q nbd 

#iface mora biti up za udhcpc
busybox ifconfig eth0 up || return 0
sleep 1

# setup adrese putem udhcpc klijenta
busybox udhcpc -i eth0 -t 3 -s /sbin/udhcpc.scripts 2>&1 || return 0
sleep 3
fi

#server je ${opt%:*}
#port je  ${opt#*:}

if [ "$ONENODE" != "1" ]; then
node="/dev/nbd$i"
else
node="/dev/nbd0"
fi
priority="$pri"

/sbin/nbd-client "${opt%:*}" "${opt#*:}" ${node} 2>&1 >/dev/null && \
busybox swapon $node -p "$priority" 2>&1 >/dev/null && \
let i=$i+1 && let pri=$pri+1
fi
done

echo -n $i #vracamo br uspesnih montiranja
}

netsuspend()
{
for x in $(cat /proc/cmdline); do
case ${x} in
netsuspend=*)
#secemo netsuspend=
y="${x#*=}"
NUMSRVS="$(setup_netsuspend "${y}")"
if [ "$NUMSRVS" != "0" ]; then
good_msg "Uspesno monitirano $NUMSRVS netswap particija"
fi
;;
esac
done
}

umount_suspendswp()
{
if [ "$NUMSVRS" != "0" ];
while read i; do
line="$(echo $i | busybox grep nbd)"
if [ "x$line" != "$x" ]; then
swp="$(echo $line | busybox awk -F' ' '{ print $1 }')"
busybox swapoff "${swp}" 2>&1 && \
good_msg "Demontiram netswap ${swp}"
fi
done < /proc/swaps
fi
}


Sada je potrebno pronaci init skript (/tmp/initrd/init) i u njemu ispred suspend2_resume linije
upisati netsuspend, a ispod umount_suspendswp sto su imena nasih funkcija. Dalje je potrebno kompajlirati nbd-client iz source-a i staticki ga linkovati, pa ga kopirati u sbin direktorijum (/tmp/initrd/sbin), takodje je potrebno kopirati nbd.ko i e100.ko (ili drugi modul za mreznu) u /tmp/initrd/lib/modules/`uname -r`/kernel/drivers. Sada samo ponovo zapakujemo initrd i vratimo ga u boot
cd /tmp/initrd && find . -print -depth | cpio -ov | gzip -c9 > /boot/initrd.img-`uname -r`

Sada krece magija Cheesy Cheesy).
Samo je potrebno izmeniti boot opciju i dodati netsuspend=[server]:[port] i resume=[dev]
npr., za grub, opcija moze da izgleda ovako
kernel /boot/vmlinuz26 root=/dev/sdb7 netsuspend=10.0.7.3:7070 resume=/dev/nbd0
a moze se navesti i vise server:port parova
kernel /boot/vmlinuz26 root=/dev/sdb7 netsuspend=10.0.7.3:7070,172.16.99.2:9090 resume=/dev/nbd1
u drugom slucaju ce se pokusati kreirranje 2 mrezna swap-a, a resume ce se pokusati sa drugog.

Proces hibernacije se zapocinje jednostavno unosenjem hibernate u cli, a vrlo korisna je komanda hibernate -r, koja snimi sadrzaj RAM-a a zatim restartuje sistem, umesto da ga suspenduje. Takodje je moguce zapoceti proces hibernacije i sklapanjem laptop-a ili pritiskom na taster u zavisnosti od hardvera koji imate.

Mogucnosti su mnogobrojne. Ja sam snimio jedno 7 sesija na 3 razlicita servera, sa specificnim podesavanjima za sve moguce alate koji su mi potrebni.

Brzina pokretanja sistema na ovaj nacin u mnogome se ne razlikuje od pokretanja na klasican nacin, ali zavisi od opterecenosti mreze i velicine suspend fajla. Moj sistem ima 1GB RAM-a, ali mi suspend fajl nikada nije prelazio 600MB, cak i kod "heavy" sesija, a potrebno mu je oko minut/dva vise da bi se pokrenuo.

Jos jedna korisna stvar citave price je dobijanje nove swap particije, naime kada se sesija ucita, netswap se demontira, ali je moguce je remount-ovati ga i koristiti ga kao normalnu swap particiju, sto ce obrisati prethodno snimljenu sesiju, ali ... Smiley

Da, da ne zaboravim, ako se pri startovanju ne zeli pokretanje suspendovane sesije, iz boot opcija se izostavi nestuspend i obavezno napise samo resume=

Uh, dosta je za veceras, odo' ja  grin
Prijavi uredniku   Sačuvana

Kod:
    fprintf(stderr,"iza svakog %d ugla vreba Dragan Kojic Keba\n",i++);
Stranice: [1]   Idi gore
  Štampaj  
 
Prebaci se na: