sobota, 9 stycznia 2010

Solaris jako domowy serwer

Robiąc kopie laptopa za pomocą 'rsync' na domowy komputer, zaciekawił mnie w pewnym momencie postęp kopiowania plików jaki pokazuje rsync, a w zasadzie, to jego brak..

Komputer pełniący rolę serwera pracuje pod kontrolą systemu OpenSolaris.
Logując się na serwer zauważyłem, że bardzo mało danych jest wysyłanych przez sieć, natomiast dysk jest używany w 100%:

Widać, że dysk 'cmdk1' ma sporo operacji odczytu.
Za pomocą skryptu DTrace 'rwbytype', znajdującego się w pakiecie DTrace Toolkit (DTT) sprawdziłem jakie procesy używają I/O:Widać, że najwięcej danych odczytuje rsync z PIDem 5981.

Kolejny skrypt z DTT 'pfilestat' pokaże statystyki otwartych plików danego procesu:
# /opt/DTT/Proc/pfilestat 5981

Widać, że proces odczytuje sporo z deskryptora pliku nr 0.
Aby dowiedzieć się więcej o tym pliku wystarczy użyć komendy 'pfiles' z numerem PID:
# pfiles 5981


Teraz już wiadomo dlaczego rsync 'zatrzymał' się na chwilę z kopiowaniem danych.
W tym przypadku porównuje sumy kontrolne źródłowego i docelowego pliku, ponieważ plik został zmodyfikowany od ostatniego kopiowania.
Porównywany plik jest obrazem dysku wirtualnej maszyny VirtualBox'a i zajmuje 13GB, dlatego też ta operacja zatrzymała 'progress' jaki pokazuje rsync.

Aby przyśpieszyć kopiowanie plików usunąłem ten plik z docelowego miejsca, jednocześnie mając jego kopię w snapshotach ZFS.

piątek, 8 stycznia 2010

Własny profil RBAC - mini howto

Czasami pojawia się problem, gdzie użycie profilu RBAC wydaje się idealnym rozwiązaniem.
W Solarisie mamy kilkaset gotowych profili. Bardzo łatwo jednak utworzyć nowy profil, pod specyficzne rozwiązanie.

Podam bardzo prosty przykład jak to uczynić:

Dodajemy linijkę definiującą nazwę profilu w pliku /etc/security/prof_attr:

echo "My Profile::::" >> /etc/security/prof_attr


Dodajemy linijkę definiującą jaką aplikację z jakim UIDem możemy uruchamiać w pliku /etc/security/exec_attr:

echo "My Profile:solaris:cmd:::/usr/local/sbin/my_app:uid=345" >> /etc/security/exec_attr

W tym przykładzie użytkownik posiadający profil 'My Profile' będzie mógł uruchomić aplikację '/usr/local/sbin/my_app' jako UID=345.

Nadajemy profil 'My Profile' użytkownikowi 'user123':

usermod -P "My Profile" user123

UWAGA, 'usermod -P' zmienia uprawnienia profili, warto zauważyć jakie profile ma dany user, aby nie odebrać sobie przypadkowo uprawnień.


Oto przykład, jak działa nowy profil:



poniedziałek, 2 listopada 2009

ZFS Deduplication w snv128

Deduplikacja ZFS najprawdopodobniej pojawi się w snv128.
Już teraz jest włączona do źródeł:

$ hg log | head
changeset: 10923:df470fd79c3c
tag: tip
user: Evan Yan
date: Mon Nov 02 15:58:28 2009 +0800
summary: PSARC/2008/181 Solaris Hotplug Framework

changeset: 10922:e2081f502306
user: Jeff Bonwick
date: Sun Nov 01 14:14:46 2009 -0800
summary: PSARC 2009/571 ZFS Deduplication Properties


Update: Deduplikacja pojawi się w buildzie 128, zamiast 127 ;)

piątek, 2 października 2009

opensolaris tlen plugin

Dla tych, co potrzebują plugin komunikatora Tlen.pl na OpenSolaris'owym Pidginie ;)

Pobieramy kompilator i odpowiednie zależności z repozytorium OpenSolaris:
# pkg install -v SUNWgnome-common-devel SUNWxwinc SUNWgnome-base-libs gcc-dev SUNWgtar

Potrzebne są również źródła samego plugina:
$ wget -c http://nic.com.pl/~alek/pidgin-tlen/pidgin-tlen-20090811.tar.gz

Po rozpakowaniu paczki, należy delikatnie wyedytować plik Makefile:
$ gtar xvzf pidgin-tlen-20090811.tar.gz
pidgin-tlen-20090811
pidgin-tlen-20090811/README
pidgin-tlen-20090811/Makefile
pidgin-tlen-20090811/tlen_48.png
pidgin-tlen-20090811/tlen_22.png
pidgin-tlen-20090811/tlen_16.png
pidgin-tlen-20090811/tlen.h
pidgin-tlen-20090811/tlen.c
pidgin-tlen-20090811/auth.c
pidgin-tlen-20090811/wb.h
pidgin-tlen-20090811/wb.c
pidgin-tlen-20090811/chat.h
pidgin-tlen-20090811/chat.c
pidgin-tlen-20090811/avatar.h
pidgin-tlen-20090811/avatar.c
pidgin-tlen-20090811/Makefile.mingw



$ diff -u Makefile ../../pidgin-tlen-20090811/Makefile
--- Makefile 2009-08-24 13:23:53.000000000 +0200
+++ ../../pidgin-tlen-20090811/Makefile 2009-10-02 00:35:39.145438858 +0200
@@ -1,5 +1,5 @@
CC?= gcc
-LOCALBASE?= /usr/local
+LOCALBASE?= /usr
DESTDIR?=

CFLAGS+=`PKG_CONFIG_PATH=${LOCALBASE}/lib/pkgconfig pkg-config pidgin --cflags` \
@@ -25,11 +25,11 @@
ectags -Ra /usr/obj/ports/pidgin-2.5.5/pidgin-2.5.5/

install:
- install -d -o root -g wheel ${DESTDIR}${LOCALBASE}/lib/purple-2/
- install -o root -g wheel libtlen.so ${DESTDIR}${LOCALBASE}/lib/purple-2/
+ ginstall -d -o root -g sys ${DESTDIR}${LOCALBASE}/lib/purple-2/
+ ginstall -o root -g sys libtlen.so ${DESTDIR}${LOCALBASE}/lib/purple-2/
for i in 16 22 48; do \
- install -d -o root -g wheel ${DESTDIR}${LOCALBASE}/share/pixmaps/pidgin/protocols/$$i/; \
- install -o root -g wheel tlen_$$i.png \
+ ginstall -d -o root -g sys ${DESTDIR}${LOCALBASE}/share/pixmaps/pidgin/protocols/$$i/; \
+ ginstall -o root -g sys tlen_$$i.png \
${DESTDIR}${LOCALBASE}/share/pixmaps/pidgin/protocols/$$i/tlen.png; \
done



Dla ułatwienia, tak powinien wyglądać plik Makefile po zmianach:
$ cat Makefile
CC?= gcc
LOCALBASE?= /usr
DESTDIR?=

CFLAGS+=`PKG_CONFIG_PATH=${LOCALBASE}/lib/pkgconfig pkg-config pidgin --cflags` \
-I${LOCALBASE}/include \
-fPIC \
-Wall
DATE= `grep TLEN_VERSION tlen.h | awk '{print $$3}' | sed -e 's/"//g'`

.c.o:
$(CC) -c $< $(CFLAGS) OBJS= tlen.o auth.o chat.o wb.o avatar.o all: ${OBJS} $(CC) -shared -fPIC -o libtlen.so ${OBJS} clean: rm -f ${OBJS} libtlen.so *.core tags: *.c *.h rm -f tags ectags . ectags -Ra /usr/obj/ports/pidgin-2.5.5/pidgin-2.5.5/ install: ginstall -d -o root -g sys ${DESTDIR}${LOCALBASE}/lib/purple-2/ ginstall -o root -g sys libtlen.so ${DESTDIR}${LOCALBASE}/lib/purple-2/ for i in 16 22 48; do \ ginstall -d -o root -g sys ${DESTDIR}${LOCALBASE}/share/pixmaps/pidgin/protocols/$$i/; \ ginstall -o root -g sys tlen_$$i.png \ ${DESTDIR}${LOCALBASE}/share/pixmaps/pidgin/protocols/$$i/tlen.png; \ done dist: clean rm -f pidgin-tlen-${DATE}.tar.gz rm -rf pidgin-tlen-${DATE} mkdir pidgin-tlen-${DATE} cp README* avatar.[ch] chat.[ch] wb.[ch] auth.c tlen.[ch] tlen_*.png Makefile* pidgin-tlen-${DATE} tar zcvf pidgin-tlen-${DATE}.tar.gz pidgin-tlen-${DATE} rm -rf pidgin-tlen-${DATE} .PHONY: tags




Przed kompilacją pluginu należy zmodyfikować zmienną PATH, aby narzędzia GNU były wyszukiwane jako pierwsze:

# export PATH=/usr/gnu/bin:${PATH}

Czyścimy pliki z poprzednich kompilacji:
# gmake clean
rm -f tlen.o auth.o chat.o wb.o avatar.o libtlen.so *.core


Plugin jest mały, tak więc kompilacja trwa moment:
# gmake
cc -c tlen.c `PKG_CONFIG_PATH=/usr/local/lib/pkgconfig pkg-config pidgin --cflags` -I/usr/local/include -fPIC -Wall
cc -c auth.c `PKG_CONFIG_PATH=/usr/local/lib/pkgconfig pkg-config pidgin --cflags` -I/usr/local/include -fPIC -Wall
cc -c chat.c `PKG_CONFIG_PATH=/usr/local/lib/pkgconfig pkg-config pidgin --cflags` -I/usr/local/include -fPIC -Wall
cc -c wb.c `PKG_CONFIG_PATH=/usr/local/lib/pkgconfig pkg-config pidgin --cflags` -I/usr/local/include -fPIC -Wall
cc -c avatar.c `PKG_CONFIG_PATH=/usr/local/lib/pkgconfig pkg-config pidgin --cflags` -I/usr/local/include -fPIC -Wall
cc -shared -fPIC -o libtlen.so tlen.o auth.o chat.o wb.o avatar.o



Po kompilacji instalujemy plugin w systemie:
# gmake install
ginstall -d -o root -g sys /usr/lib/purple-2/
ginstall -o root -g sys libtlen.so /usr/lib/purple-2/
for i in 16 22 48; do \
ginstall -d -o root -g sys /usr/share/pixmaps/pidgin/protocols/$i/; \
ginstall -o root -g sys tlen_$i.png \
/usr/share/pixmaps/pidgin/protocols/$i/tlen.png; \
done

niedziela, 23 sierpnia 2009

OpenSolaris: encrypt i decrypt

Solaris oferuje bardzo proste w użyciu narzędzie do szyfrowania plików: 'encrypt'. Poniżej przykład.

Tworzymy plik z tekstem:

> echo "To jest tajny tekst" > plik.txt

Tworzymy zaszyfrowany plik:

> encrypt -v -a aes -i plik.txt -o plik-zaszyfrowany
Enter passphrase:
Re-enter passphrase:
[..................|...................|...................|..................]
Done.


> file plik.txt plik-zaszyfrowany
plik.txt: ascii text
plik-zaszyfrowany: data

Usuwamy oryginalny plik:

> rm plik.txt

Pozostaje nam tylko zaszyfrowana wersja pliku.

Aby odczytać zawartość zaszyfrowanego pliku wpisujemy:

> decrypt -v -a aes -i plik-zaszyfrowany
Enter passphrase:
[..................|...................|...................|..................]
Done.
To jest tajny tekst

sobota, 22 sierpnia 2009

IPS tips

OpenSolaris podczas instalacji systemu tworzy tzw. obraz (pkg image-create) w katalogu głównym i przypisuje do niego publishera (pkg publisher), dlatego jak robimy update systemu używamy komendy 'pkg image-update'.

Mało znaną funkcjonalnością systemu pakietów OpenSolarisa IPS jest możliwość tworzenia wielu 'obrazów' w różnych katalogach. Dla przykładu, każdy użytkownik może sobie stworzyć takowy 'obraz' w swoim katalogu domowym i tam instalować paczki zamiast w katalogu głównym systemu jako root.

Ostatnio znalazłem dodatkowe repozytorium IPS z ciekawymi paczkami http://ips.homeunix.com:10906/ i zamiast dodawać kolejnego publishera do systemu i instalować jako root w globalnej strefie postanowiłem dodać nowe repozytorium jako zwykły użytkownik w katalogu domowym, dodatkowo w zonie TX..

> zonename
public

> plabel
PUBLIC

> prtdiag
prtdiag can only be run in the global zone

Będziemy instalować paczki w katalogu /home/estibi/media/

> mkdir -p /home/estibi/media/
> pkg image-create -p multimedia=http://ips.homeunix.com:10906/ /home/estibi/media/

Uwaga, musimy wejść do katalogu /home/estibi/media lub użyć parametru pkg -R, inaczej 'pkg' będzie używać publishera z katalogu "/".

> cd /
> pkg publisher
PUBLISHER TYPE STATUS URI
opensolaris.org (preferred) origin online http://pkg.opensolaris.org/dev/

> cd /home/estibi/media/
> pkg publisher
PUBLISHER TYPE STATUS URI
multimedia (preferred) origin online http://ips.homeunix.com:10906/

> pkg refresh --full

Instalujemy paczkę 'easytag':

> pkg install -v pkg:/MBLeasytag
Creating Plan - Before evaluation:
UNEVALUATED:
+pkg:/MBLeasytag@2.1,5.11:20090615T121154Z

After evaluation:
None -> pkg:/MBLeasytag@2.1,5.11:20090615T121154Z
None -> pkg:/MBLid3lib@3.8.3,5.11:20090615T121103Z
Actuators:

None
DOWNLOAD PKGS FILES XFER (MB)
Completed 2/2 44/44 1.82/1.82

PHASE ACTIONS
Install Phase 109/109
PHASE ITEMS
Reading Existing Index 8/8
Indexing Packages 2/2


Jeśli teraz uruchomimy zainstalowany program otrzymamy komunikat błędu, ponieważ program jest zlinkowany z bibliotekami, które powinny się znajdować w katalogu głównym:

> /home/estibi/media/usr/bin/easytag
ld.so.1: easytag: fatal: libid3-3.8.so.3: open failed: No such file or directory
Killed

Aby program się uruchomił, należy podać mu ścieżkę do bibliotek:

> LD_LIBRARY_PATH=/home/estibi/media/usr/lib /home/estibi/media/usr/bin/easytag

Można również wyeksportować zmienną:

> export LD_LIBRARY_PATH=/home/estibi/media/usr/lib:${LD_LIBRARY_PATH}
> /home/estibi/media/usr/bin/easytag

Paczka 'easytag' jest zainstalowana:

> pkg -R /home/estibi/media list
NAME (PUBLISHER) VERSION STATE UFIX
MBLeasytag 2.1 installed ----
MBLid3lib 3.8.3 installed ----

czwartek, 2 lipca 2009

snoop i bity pakietów

Solarisowy snoop ma podobną składnię co tcpdump, oto przykłady:

Aby wyłapać pakiety TCP z flagą SYN:
# snoop -V 'tcp and tcp[13]& 0x2 != 0'

Aby wyłapać pakiety TCP z flagą RST:
# snoop -V 'tcp and tcp[13]& 0x4 != 0'