Logo
Shinguz Home
Google
 
/ch/open

TOC

Content

Shared Libraries and LD_LIBRARY_PATH

Unter UNIX: *.so, unter Windows: *.dll. Im Gegensatz dazu gibt es statischen Libraries: *.a. Details see Literature.

Wenn ein Programm gestartet wird lädt der Loader die Libraries in folgender Reihenfolge: $LD_LIBRARY_PATH, /etc/ld.so.conf (LINUX) oder /var/ld (Solaris)

$ cat /etc/ld.so.conf
/usr/X11R6/lib/Xaw95
/usr/X11R6/lib/Xaw3d
/usr/X11R6/lib
...

# echo $LD_LIBRARY_PATH
/tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server:/opt/CA/SharedComponents/lib

Sollten mal Probleme auftauchen kann man mit ldd <library> schauen, was genau das Problem sein könnte:

# ldd libjava.so
        linux-gate.so.1 =>  (0xffffe000)
        libjvm.so => /tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server/libjvm.so (0x40025000)
        libverify.so => not found
        libnsl.so.1 => /lib/libnsl.so.1 (0x40516000)
        libdl.so.2 => /lib/libdl.so.2 (0x4052b000)
        libc.so.6 => /lib/tls/libc.so.6 (0x4052e000)
        libpthread.so.0 => /lib/tls/libpthread.so.0 (0x40644000)
        libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x40654000)
        libm.so.6 => /lib/tls/libm.so.6 (0x4069c000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

Mit folgendem Befehl sieht man, was im Library Cache verzeichnet ist, resp, ob eine Library vorhanden ist:

# ldconfig -p | grep libstdc
        libstdc++.so.5 (libc6) => /usr/lib/libstdc++.so.5
        libstdc++.so.2.9 (libc6) => /usr/lib/libstdc++.so.2.9
        libstdc++.so.2.8 (libc6) => /usr/lib/libstdc++.so.2.8
        libstdc++.so.2.7.2 (libc6) => /usr/lib/libstdc++.so.2.7.2
        libstdc++.so (libc6) => /usr/lib/libstdc++.so
        libstdc++-libc6.2-2.so.3 (libc6) => /usr/lib/libstdc++-libc6.2-2.so.3
        libstdc++-libc6.1-2.so.3 (libc6) => /usr/lib/libstdc++-libc6.1-2.so.3
        libstdc++-libc6.1-1.so.2 (libc6) => /usr/lib/libstdc++-libc6.1-1.so.2

Und wenn man’s ganz genau wissen will, kann man der Sache so auf den Grund gehen:

# LD_DEBUG=libs grep -c oracle /etc/passwd
      9599:     find library=libc.so.6; searching
      9599:      search path=/tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server/tls/i686:/tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server/tls:/tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server/i686:/tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server:/opt/CA/SharedComponents/lib/tls/i686:/opt/CA/SharedComponents/lib/tls:/opt/CA/SharedComponents/lib/i686:/opt/CA/SharedComponents/lib         (LD_LIBRARY_PATH)
      9599:       trying file=/tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server/tls/i686/libc.so.6
      9599:       trying file=/tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server/tls/libc.so.6
      9599:       trying file=/tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server/i686/libc.so.6
      9599:       trying file=/tmp/OraInstall2005-12-22_09-36-10AM/jre/lib/i386/server/libc.so.6
      9599:       trying file=/opt/CA/SharedComponents/lib/tls/i686/libc.so.6
      9599:       trying file=/opt/CA/SharedComponents/lib/tls/libc.so.6
      9599:       trying file=/opt/CA/SharedComponents/lib/i686/libc.so.6
      9599:       trying file=/opt/CA/SharedComponents/lib/libc.so.6
      9599:      search cache=/etc/ld.so.cache
      9599:       trying file=/lib/tls/libc.so.6
      9599:     calling init: /lib/tls/libc.so.6
      9599:     initialize program: grep
      9599:     transferring control: grep
1
      9599:     calling fini: /lib/tls/libc.so.6

Parameter für LD_DEBUG sind: files, bindings, libs, details und statistics.

Literatur

Zombie processes

How you can find the number of zombie processes:

# top

last pid:  6803;  load averages:  0.44,  0.67,  0.91
386 processes: 320 sleeping, 64 zombie, 2 on cpu
CPU states:     % idle,     % user,     % kernel,     % iowait,     % swap
Memory: 3072M real, 138M free, 3231M swap in use, 1066M swap free

   PID USERNAME THR PRI NICE  SIZE   RES STATE    TIME    CPU COMMAND
  6799 oracle     1   0    0 2112K 1376K cpu/0    0:00  0.43% top
  7852 root      10  38    0   15M 4696K sleep  521:20  0.20% aws_sadmin
...

Finding zombie processes

# ps -el | grep 'Z'

 F S   UID   PID  PPID  C PRI NI     ADDR     SZ    WCHAN TTY      TIME CMD
 8 Z  8100 25048 24115  0   0                                      0:00
 8 Z  8100 25235 24115  0   0                                      0:00
 8 Z  8100 23416 24115  0   0                                      0:00
...

And kill them…

# kill -9

And test the result afterwards again…

Password creator/generator

This scripts generates the most possible secure passwords for:

But unfortunately it is not yet fully implemented :-( Also web GUI is not yet running…

Password generator Code (3.6 kByte)

Epoch - Local time translator/converter

Epoch Converter Code (1 kByte)

Loop-devices für CD-ROM Server

Ausgangslage

Da ich einige CD’s, welche ich gelegentlich brauche, und noch wesentlich mehr freien Diskplatz habe, welchen ich nicht brauche, liegt die Idee nahe, diesen zu Nutzen, und die CD’s dorthin zu kopieren um nicht Disk-Jockey spielen zu müssen. Ich baue mir also einen CD-Server. Bei ca. 80 GB freiem Diskplatz reicht das locker für ca. 100 (Daten-)CD’s.

Vorgehen

Erstellen eines ISO-Images:

# mkisofs -v -r -R -J -o test.iso /mnt/cdrom

Mounten des ISO-Images:

von Hand:

# mount -o ro,loop test.iso /mnt/cdrom-fake

oder

# mount -t iso9660 -o loop test.iso /mnt/cdrom-fake

Permanent: in /etc/fstab eintragen:

...
/media/linux_user_2002.iso     /media/linux_user_2002     auto  loop,ro,user,exec  0 0
/media/linux_magazin_2001.iso  /media/linux_magazin_2001  auto  loop,ro,user,exec  0 0
...

Problem

Leider ist die Anzahl der Loop-Devices bei meiner SuSE 9.3 auf 8 beschränkt. Dies äussert sich beim Starten des Systems wie folgt: “could not find any free loop device”.

Lösung

Schritt 1: Kernel vorbereiten

Es gibt zwei Ansätze:

  1. Für Hardcore-Techies:

In /usr/src/linux/drivers/block/loop.c folgende Zeile ändern:

static int max_loop = 8;

Danach den Kernel und die Module neu kompilieren.

  1. Für Warmduscher wie mich: von Hand:

Kernel mit option max_loop=12 booten.

Kontrolle:

# grep loop /var/log/boot.msg

<4>Kernel command line: root=/dev/hda3 vga=0x31a selinux=0 splash=silent resume=/dev/hda2 max_loop=12

oder

# cat cmdline
root=/dev/hda3 vga=0x31a selinux=0 splash=silent resume=/dev/hda2 max_loop=12

Permanent: In /boot/grub/menu.lst die option inzufügen:

max_loop=12

Schritt 2: Weitere Loop-Devices anlegen

mknod -m 660 /dev/loop8 b 7 8
chmod 660 /dev/loop8
chown root:disk /dev/loop8
mknod -m 660 /dev/loop9 b 7 9
chmod 660 /dev/loop9
chown root:disk /dev/loop9
...

Schritt 3: System rebooten und prüfen ob alles i.O. ist

  1. Loop-Devices sind grundsätzlich vorhanden?
# grep loop /proc/devices
7 loop
  1. Welche und wieviele Loop-Devices sind vorhanden:
# grep loop diskstats
7    0 loop0 0 0 0 0 0 0 0 0 0 0 0
7    1 loop1 0 0 0 0 0 0 0 0 0 0 0
...
7   10 loop10 0 0 0 0 0 0 0 0 0 0 0
7   11 loop11 0 0 0 0 0 0 0 0 0 0 0
  1. Sind die Loop-Devices logisch ebenfalls vorhanden:
# ls -la /dev/loop*
brw-rw----  1 root disk 7,  0 Mar 19  2005 loop0
brw-rw----  1 root disk 7,  1 Mar 19  2005 loop1
...
brw-rw----  1 root disk 7,  8 Mar 19  2005 loop8
brw-rw----  1 root disk 7,  9 Mar 19  2005 loop9
  1. Werden sie auch benutzt:
# grep loop partitions
7     0      71296 loop0
7     1     645152 loop1
7     2     676288 loop2
7     3     278176 loop3
7     4     165632 loop4
7     5     163488 loop5
7     6     455840 loop6
7     7     470336 loop7
7     8     480288 loop8
  1. Welches Device hängt wo dran?
# losetup -a
/dev/loop0: [0303]:333441 (/media/linux_user_2000.iso)
...
/dev/loop8: [0303]:333460 (/media/linux_user_2001.iso)
  1. Was wurde wo gemounted?
# grep loop /proc/mounts
/dev/loop0 /media/linux_user_2000 iso9660 ro,nosuid,nodev 0 0
...
/dev/loop8 /media/linux_user_2001 iso9660 ro,nosuid,nodev 0 0
  1. Was meint mein Filesystem dazu:
# df -k | grep iso
/media/ix_1999.iso      165632    165632         0 100% /media/ix_1999
/media/ix_2001.iso      163488    163488         0 100% /media/ix_2001
...

Achtung:

Nicht unnötig zuviele Loop-Devices aktivieren, da diese anscheinends Ressourcen brauchen sollen. Maximal möglich sollen 255 (256?) Loop-Devices sein.