Oracle 11g 64 bit telepítése ubuntu 12.04 64 bit alá

Az Oracle céget és piacvezető alkalmazásukat elég jól jellemzi, hogy az ubuntu és minden más normális linux disztribúció támogatása kimerül abban, hogy tedd redhat-ra mert az a supportált. Oracle adatbázis miatt redhat-et telepíteni pedig több mint nevetséges.

Az ubuntura történő telepítés nem is olyan bonyolult, csak rá kell jönni a telepítő (és a borzasztó oracle telepítést végző script halom) működésére.

A telepítő két dolgot csinál valójában:

  1. kimásolja az oracle fájlokat
  2. sok make fájlal, és elképzelhetetlenül sok (és értelmetlen) változó segítségével lefordítja a bináris dolgokat

Az első lépésen viszonylag könnyen felül lehet emelkedni, a neten megvan hozzá minden, én csak kigyűjtöttem egy helyre.

Kell egy kevés dependencia, hogy egyáltalán elinduljon a telepítés:

sudo apt-get install ksh less lesstif2 lesstif2-dev lib32z1 libaio1 libaio-dev \
libc6-dev libc6-dev-i386 libc6-i386 libelf-dev libltdl-dev libmotif4 \
libodbcinstq4-1 libodbcinstq4-1:i386 libpth-dev libpthread-stubs0 \
libpthread-stubs0-dev lsb-cxx make openssh-server pdksh rlwrap rpm \
sysstat unixodbc unixodbc-dev unzip x11-utils zlibc gcc-multilib \
ia32-libs libstdc++5 libstdc++5:i386

Egy két extra link, hogy minden ott legyen, ahol a telepítő keresi:

sudo ln -s /usr/bin/basename /bin/basename
sudo ln -sf /bin/bash /bin/sh
sudo ln -s /usr/bin/rpm /bin/rpm
sudo ln -s /usr/bin/awk /bin/awk
sudo mkdir /usr/lib64
sudo ln -s /usr/lib/x86_64-linux-gnu/libc_nonshared.a /usr/lib64/
sudo ln -s /usr/lib/x86_64-linux-gnu/libpthread_nonshared.a /usr/lib64/
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib64/
sudo ln -s /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib64
sudo ln -s /usr/lib/i386-linux-gnu/libpthread_nonshared.a /usr/lib/libpthread_nonshared.a
sudo ln -s /bin/lib/libgcc_s.so.1 /lib/libgcc_s.so
sudo ln -s /usr/lib/libstdc++.so.6.0.13 /usr/lib/libstdc++.so.5

Egy user, és pár group a telepítőnek, és az oracle példánynak:

 sudo groupadd oinstall
sudo groupadd dba
sudo groupadd nobody
sudo useradd -m oracle -g oinstall -G dba
sudo passwd oracle

Kell még egy pár kernel paraméter:

sudo nano /etc/sysctl.conf

Ide az alábbi dolgokat kell felvenni:

kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

Ha a módosításokkal megvagyunk, olvastassuk fel újra a kernelparamétereket:

sudo /sbin/sysctl -p

A limits-eket is érdemes módosítani:

sudo nano /etc/security/limits.conf

ide fel kell még venni az alábbi sorokat:

* soft nproc 2047
* hard nproc 16384
* soft nofile 1024
* hard nofile 65536

És kell még egy ál-redhat release is, hogy a telepítő megnyugodjon:

sudo nano /etc/redhat-release

A fájl tartalma pedig:

Red Hat Enterprise Linux AS release 3 (Taroon)

Ha mindent default módon telepítünk, akkor érdemes még felvenni, az alábbi környezeti változókat, hogy az életünk könnyebb legyen már a telepítés alatt is:

#oracle exports
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=orcl11
export PATH=$PATH:$ORACLE_HOME/bin

Ha ezzel megvagyunk, akkor jöhet a telepítő kitömörítése, és indítása (oracle userként).

xhost +
sudo su oracle
~/oracle_install/runInstaller

A fájlok másolása ha nem rontottunk el semmit, akkor hiba nélkül megtörténik, az érdekes rész ezután jön. Amikor elkezd fordítani az oracle, jó eséllyel látunk majd egy két hibát. Gondolom meg kell indokolni Oracle-nál, hogy mire kell azt a nagyon sok support költséget fizetni (hogy nem normális telepítő írására, az biztos). A hibák az alábbi főbb problémákra vezethetőek vissza:

  1. Ubuntu alatt a gcc picit szigorúbban fordít, és meg kell enyhíteni a lelkét, amin a „-Wl,–no-as-needed” paraéterpáros általában szokott segíteni.
  2. Hiányoznak a fordításhoz referenciák, amit a gcc általában –l(lib) formában kap meg.

Itt fontos megjegyezni, hogy a –lagtsh az valójában libagtsh.so-t jelent, azt érdemes keresni. Másik hasznos utasítás az nm parancs, aminek a segítségével megnézhetjük, hogy egy adott függvény, amit épp a make nem talál, milyen so fájlokban van benne. Pl:

nm -A $ORACLE_HOME/lib/*.so | grep procr_get_ctx

Ahol U van, ott az so fájl használja a szolgáltatást, ahol T ott implementálva van.

A neten sok problémára van megoldás, de nem mindre (én kettőre nem találtam). A tapasztalatom szerint ilyen esetekben érdemesebb picit beleásni a dolgokba, és megérteni, mit és miért csinálunk, mert az az esetek nagy részében célravezetőbb mint mindenféle misztikus sed-et, és egyéb utasításokat kiadni, hátha valami működik.

Az részletes fordítás alatt jelentkező (make) hibákat az alábbi módon érdemes nézni:

tail -f $ORACLE_HOME/install/make.log

Vegyük sorra, hogy nálam milyen problémák adódtak, és mi volt a megoldásuk:

– libagtsh.so: undefined reference to `nnfyboot’ in make: rdbms/lib/dg4odbc]

Ez egy elég ravasz hiba, a probléma az, hogy nincs még meg az a fájl, ami a fordításhoz szükséges. A megoldást az internet szállítja: fordítsunk magunknak egyet:

ln -s $ORACLE_HOME/lib/libclient11.a $ORACLE_HOME/lib/libagtsh.a
$ORACLE_HOME/bin/genagtsh $ORACLE_HOME/lib/libagtsh.so 1.0

 

– libnnz11.so: could not read symbols: Invalid operation /sysman/lib/ins_emagent.mk

Kis keresgetés után lehet látni, hogy a hívás a $ORACLE_HOME/sysman/lib/ins_emagent.mk fájlból indul, és egy olyan szolgáltatásra hivatkozik, ami a libnnz11.so-ben van benne. Ezt pótoljuk oly módon, hogy a dependenciát is kapja meg meg a gcc:

$ORACLE_HOME/sysman/lib/ins_emagent.mk

régi:

$(MK_EMAGENT_NMECTL)

új:

$(MK_EMAGENT_NMECTL) -lnnz11

– genorasdksh: Failed to link liborasdk.so.11.1

Szintén egy dependencia probléma, amikor a teljes oracle sdk-t próbálja lefordítani, akkor nagyon sok dolgot nem talál hirtelen. A megoldás hasonló az előző esethez, a megnézzük a szolgáltatásokat, azonnal feltűnik, hogy a libagtsh.so és a  liborasdkbase.so hiányzik neki nagyon. Értessük meg vele:

$ORACLE_HOME/bin/genorasdksh

Régi:

OLIBS="$LCLIENT $LSQL $LVSN $LNETWORK $LCLIENT \
$LCOMMON $LGENERIC $LMM $XAONDY $LNETWORK $LCLIENT $LCOMMON \
$LGENERIC $LTRACE $LNNET_ON $LSKGXP"

Új:

OLIBS="$LCLIENT $LSQL $LVSN $LNETWORK $LCLIENT \
$LCOMMON $LGENERIC $LMM $XAONDY $LNETWORK $LCLIENT $LCOMMON \
$LGENERIC $LTRACE $LNNET_ON $LSKGXP -lagtsh -lorasdkbase"

– getcrshome – libhashgen11 missing reference

Itt ha megnézzük, akkor az a szolgáltatás amit keres, megtalálható az .so fájlban, ami meg is van adva. Itt a hiányzó extra paraméter a gond. Kis keresgetés után erre is rá lehet találni. A megoldás:

$ORACLE_HOME/srvm/lib/env_srvm.mk

Régi:

LDOBJSZ=-m64

Új:

LDOBJSZ=-m64 -Wl,--no-as-needed

És láss csodát, hiba nélkül működik az oracle ubuntun. Szerencsére csak az oracle build script-jeit láttam, a forrását nem, de ha azt is olyanok írták, mint ezeket a scripteket, akkor jobb is ez így…

Wifi optimalizálás, avagy harc az erőért

Pesten a népsűrűségnek, és a wifi hálózatok terjedésének megvannak a maga jótékony hatásai. Soha se volt jó a jel a pesti lakásban, de azért amikor minden 5 csomag request timeoutra futott, elkezdtem komolyabban venni a problémát. Gondoltam leírom milyen út vezetett a megoldáshoz, később még jól jöhet.

Nulladik lépésként ellenőrizzük, hogy az internet kapcsolattal, vagy a wlannal van probléma. Elég kellemetlen, ha órákat töltünk a wlan kapcsolat állítgatásával, közben az internettel van probléma. Ezt úgy tudjuk megtenni, hogy elfelejtjük a wlant, nézünk egy ping -t google.com-ot, esetleg speedtest.net-et, és ha minden rendben, megismételjük ezt vezeték nélküli hálózatról is.

Ha csak a wlan része a problémás a dolognak, akkor jöhet az érdemi munka. Első körben mindig próbáljuk meg frissíteni a router szoftverét, mert lehet azt próbáljuk megoldani épp, amit a router készítői már megoldottak (mondjuk 2 éve).

Ha ez megvan, és a helyzet nem javult, akkor a “mi mindent megtettünk” felkiáltás mellett végre széttúrhatjuk a gyári beállításokat.

A hullámformából következik egy csomó dolog (például, hogy nem kell vezeték…), de ami minket most a legjobban zavar az a hullámok között fellépő interferencia. Ha sok wlan van egy helyen, akkor azok hajlamosak összeveszni a csatornákon, ami elég rossz hatással van hálózatunk működésére. Azt, hogy pontosan mi is történik körülöttünk a Wifi Analyzer nevű programmal meg tudjuk nézni, akár a telefonunkon is. Itt kell választani egy olyan tartományt, ami viszonylag kevésbé belakott. Nálam ez a 12 csatorna volt (a routerek általában az alacsonyabb csatornákat lakják be, és ott harcolnak egymással).

Első beállításunk tehát:

Channel: 12

Ha nagyon terhelt a hálózat, akkor érdemes még a csomagméretet kisebbre venni, mert kisebb csomagokba kevésbé tud belerondítani bárki. Ha ezt az értéket túl kicsire vesszük, akkor járhat sávszélesség vesztéssel, de:  inkább legyen egy lassú de állandóan működő hálózatom,  mint egy gyors, de néha nem működő változtat.

Fragmentation Threshold: 1024

Ilyen helyzetben alap, hogy minden sok sok crc-vel fogunk ellátni, hogy minél nagyobb hibákat is tudjanak javítani az eszközeink, tehát:

Preamble Type: Long preamble

Ha az életben maradásért (na jó nem, csak stabil internet kapcsolatért) küzdünk, akkor mindenféle optimalizációt (mint a rövid gurad intervallt, csomag összefűzést kapcsoljunk ki):

Short GI: Off

Aggregation: Off

És lőn nagy öröm, boldogság, éjszakákat átívelő stream-ek.

A végén megjegyezném, hogy -1 lépés az, hogy ne vegyük meg a legolcsóbb és legrosszabb minőségű routert. Törekedjünk az ismert, bevált márkákra (asus, cisco, linksys, stb), és ezekből se a kategória alját vegyük, hanem a kb. 2-3000 huf-al drágább középmezőnyből válogassunk. Olcsó noname routereknél nem ritka jelenség, hogy nagy mennyiségű adattól túlmelegednek/belassulnak, vagy egyszerűen sok élő kapcsolattól meghalnak, és ezekre a problémákra rendszerint csak egy drágább router vásárlása jelenti a megoldást.

Ubuntu – utf8 hu locale

Ha szeretnénk ékezetes karaktereket látni (beleértve a nagyon bonyolult ő betűt is) akkor az alábbiakat kell tenni:

1. felvenni a locale beállításokat a támogatott locale beállítások közé:

echo ‘hu_HU.UTF-8 UTF-8’ | sudo tee -a /var/lib/locales/supported.d/hu

2. újra generálni a locale fájlokat

sudo dpkg-reconfigure locales

3. beállítani ezt defaultnak:

sudo nano /etc/default/locale

Ebbe kell beírni az alábbi két sort:

LANG=hu_HU.UTF-8
LC_ALL=hu_HU.UTF-8

4. puty-al is megértetni, hogy itt bizony utf-8 lesz

Window – Translation – Recieved data ssumed to -> UTF-8

Tadamm…

Ubuntu költöztetése új merevlemezre

Vége a kampánynak, lassan újraéled a blog is. Most, hogy az éjjel nappal tartó munkának vége, és  szerverbe tökéletes lesz a 32gb-os ssd, de tévedtem, így pont amire minden összeállt, túrhatom szét a meglévő telepítést. Pontosabban ez lenne a helyzet ha windows szerverem lenne (már vagy 12x telepítettem volna újra), de mivel ez linux, viszonylag egyszerű a dolog.

1. Első körben hozzunk létre partíciókat az új lemezen (ajánlott a GParted erre a célra). Arra kell csak figyelni, hogy azonos típusúak legyenek. Nálam így nézett ki:

  • Primary – ext4
  • Extended – swap

Az új primary partíciót tegyük bootable-vá (Manage Flags – boot legyen kipipálva). Érdemes adni labelt is az új partíciónak (pl.: diskname), így könnyebb lesz megtalálni

2. Mountoljuk fel az új partíciónkat, pl. ide:  /media/diskname (szégyen gyalázat, én rá szoktam nyomni a lemez nevére, a grafikus felületen, és az mountolja jól)

3. Ha ezzel megvagyunk, akkor root-ként másoljuk át az összes fájlt:

cp -ax / /media/diskname

4. A fájlok a helyükön, javítanunk kell az fstab bejegyzéseket, itt a régi disk uuid-et ki kell cserélni az újra (a diskuuid-eket a blkid parancs segítségével tudjuk kilistázni). Az fstab értelemszerűen a /media/diskname/etc/fstab helyen van…

5. kell telepítenünk egy grub-ot, hogy legyen valami a boot sectorba (itt az sdb az új lemez).

sudo grub-install --root-directory=/media/diskname /dev/sdb

Elviekben kész vagyunk. Az új boot után a dropbox-ot újra hozzá kell rendelni az account-unkhoz, mert ő a merevlemezlemez paramétereit veszi figyelembe a kulcsképzés során, így az új lemezzel új dropbox session kulcsunk is lesz.

Ha valaki a meglévő gépe mellé szeretné az újat, akkor érdemes még pár dolgot átírni:

A rendszer neve:

nano /media/diskname/etc/hostname

Régi ssh kulcs:

rm /media/diskname/etc/ssh/ssh_host_*_key*

(az új bootolás során újra kell generálni az ssh kulcsot: dpkg-reconfigure openssh-server)

Hálózati beállítások (ha valaki stat ip-t használ)

nano /media/diskname/etc/network/interfaces

Hangerő állítás billentyűzetről

Elég sokat hallgatok zenét, és nem minden fülhallgatón van tekergetős hangerő állító (a jobbakon nincs). Mivel a sok helyről sok minőségben, sok minden szól, az ember elég gyakran állítgatja a hangerőt, és ha valaki nem “media” billentyűzettel rendelkezik, akkor egy idő után komoly stressz faktor emelkedéshez vezethet a hangerő ikon folyamatos nyomkodása, és a windows 3.1-ből fennmaradó felület használata.

A megoldást az AutoHotkey jelentheti, amiben tetszőleges billentyűkombinációkhoz scripteket rendelhetünk.

A hangerőállításhoz az alábbit kell tenni (ezúton is köszönet a post-ért dan hersam-nak):

http://dan.hersam.com/2010/05/06/mute-and-adjust-volume-with-keyboard-hotkeys/

Ubuntu disk UUID

Ha fstab-ban szeretnénk mountolni, ajánlott használni az uuid-et. Ebben az esetben, ha átdugják a merevlemezt egy másik vezérlőbe (vagy csak az új kernel összekeveri a vezérlőket), akkor is fel tudja mountolni a rendszer a meghajtót, és mondjuk el is indul, ami nem egy hátrány egy szerver esetén.

Egy lemez uuid-jét a legegyszerűbben az alábbi módon tudhatjuk meg:


root@nas:~# blkid /dev/md1
/dev/md1: UUID="9bf2c0f8-9190-4db0-943e-e747e306a4b1" TYPE="ext4"

Gmail read unreaded

Nagy forgalmú levelező listákon előfordulhat, hogy csak a még nem olvasott leveleinket szeretnénk látni… Erre a Gmailban is van lehetőség, csak felület nincs hozzá 🙂

label:offtopic is:unread

Ez az offtopic-al jelölt levelekből gyűjti le az összes még el nem olvasott levelet. Hasznos lehet még a dátum szűrés is:

label:offtopic is:unread after:2011/8/20 before:2011/8/27

Ilyen paramétereket nem kell kitalálni, szépen mutatja őket a Gmail is egy sikeres advanced search után (lásd a lenti képet).

Napi szoftver: Vnc Address Book

Vnc kliensből sokat próbáltam, a legjobb ingyenes amit találtam az UltraVnc volt. A legnagyobb bajom az, hogy valamiért kihagyták a mentett kapcsolatok listába foglalását. El lehet menteni fájlokba, de hát az nem az igazi…

Ezt a kis hiányosságot orvosolja a VNC Address Book, aminek a segítségével menthetőek, és csoportba foglalhatóak a VNC kapcsolatok.

Google account problémák

Hát ez a google acc. migráció nem egy sima dolog.

Egy ideig @gtempaccount.com címem volt, a picasaweb albumjaimat buktam, ettől eltekintve már csak kisebb problémák vannak (a google friend connecten vagyok 2x pl.)

Egyszer csak jó lesz 🙂

Excel file merge

Néha jól jönne, ha sok külön excel fájlt, egy nagy excel fájlban lehetne látni. Erre vannak mindenféle fizetős eszközök (mind lehúzás), az excel is csinál valamit, de egyik sem az igazi.

Ha programozni akarunk írhatunk rá pár nap alatt egy java programot, ha nem akarunk, akkor a lenti script segíthet…

#!/bin/sh

#environment setup: http://software.krimnet.com/xls2csv/guide-converting-xls-files-csv-with-xls2csv-ubuntu.htm

rm result.csv

cat files.txt | tr -d "\015" | while read XLS_FILE
do
if [ $XLS_FILE == "--EOF--" ]
then
break
fi

echo Processing xls $XLS_FILE
XLS_FILE_SNAME=`basename $XLS_FILE`
cat sheets.txt | tr -d "\015" | while read SHEETS
do
if [ $SHEETS == "--EOF--" ]
then
break
fi

xls2csv -x $XLS_FILE -w $SHEETS -b UTF-8 -c tempsheet.csv
cat tempsheet.csv | grep -v "Projekt azonosító" | LANG=hu_HU.UTF-8 sed "s/^.*\$/${XLS_FILE_SNAME};${SHEETS};&/" | LANG=hu_HU.UTF-8 sed "s/\./,/g" >> result.csv
rm tempsheet.csv
done
done

A files.txt fájlból olvassa a konvertálni kívánt fájlok neveit, –EOF– -ig. Pl: :
a.xls
b.xls
–EOF–