Početak›Forumi›Linuks›Linuks fore & fazoni›Suspend2Net
- This topic has 0 odgovora, 1 glas, and was last updated 16 years, 6 months ranije by sysctl.
-
AutorČlanci
-
9. oktobar 2007. u 9:32 pm #9370sysctlUčesnik
Dugo nisam postovao, znate kako je posao, posao 😀 , kako bilo evo “sta sve moze na linuxu !!!” ili to bese neka druga tema 😀
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 🙂 :
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 :P.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 [tt]Device drivers–>Block devices–>Network block device support[/tt]. Ime modula je nbd.ko (ko bi rekao :)). 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 [tt]dd if=/dev/zero of=/mnt/swpshare/swap1 bs=1M count=1024[/tt],
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 [tt]nbd-server [port] [fajl], npr., nbd-server 7070 mnt/swpshare/swap1[/tt] 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 [tt]nbd-client [host] [port] [device][/tt], npr., [tt]nbd-client 172.16.29.2 7070 /dev/nbd0[/tt],
potom napravimo swap particiju [tt]mkswap /dev/nbd0[/tt] i aktiviramo je [tt]swapon /dev/nbd0[/tt].
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 [tt]resume=/dev/nbd0[/tt] 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 [tt]/etc/hibernate/hibrenate.conf[/tt].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, [tt]cd /tmp/initrd && zcat /boot/initrd.img-`uname -r` | cpio -idv[/tt], zatim pronadjemo [tt]initrd.scripts[/tt] u etc subdiru (/tmp/initrd/etc/initrd.scripts) i u njega dodamo sledece shll funkcije
[code]
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
doneecho -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 } [/code] Sada je potrebno pronaci init skript (/tmp/initrd/init) i u njemu ispred [tt]suspend2_resume[/tt] linije upisati [tt]netsuspend[/tt], a ispod [tt]umount_suspendswp[/tt] 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 [tt]cd /tmp/initrd && find . -print -depth | cpio -ov | gzip -c9 > /boot/initrd.img-`uname -r`[/tt]Sada krece magija 😀 :D).
Samo je potrebno izmeniti boot opciju i dodati [tt]netsuspend=[server]:[port] i resume=[dev][/tt]
npr., za grub, opcija moze da izgleda ovako
[tt]kernel /boot/vmlinuz26 root=/dev/sdb7 netsuspend=10.0.7.3:7070 resume=/dev/nbd0[/tt]
a moze se navesti i vise server:port parova
[tt]kernel /boot/vmlinuz26 root=/dev/sdb7 netsuspend=10.0.7.3:7070,172.16.99.2:9090[/tt] 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 [tt]hibernate[/tt] u cli, a vrlo korisna je komanda [tt]hibernate -r[/tt], 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 … 🙂
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 :biggrin:
-
AutorČlanci
Moraš biti prijavljen da bi postavio komentar u ovoj temi.