Archive for category Linux

Utworzenie zależności między załadowanymi modułami jądra Linuksa

Polecenie, które pozwala na wygenerowanie zależności między załadowanymi modułami jądara Linuksa:

lsmod | perl -e 'print "digraph \"lsmod\" {";<>;while(<>){@_=split/\s+/; print "\"$_[0]\" -> \"$_\"\n" for split/,/,$_[3]}print "}"' | dot -Tpng | display -

Przykładowy fragment diagramu:

Źródła

Tags: ,

Kolejność przeszukiwania sekcji polecenia man

Jak chyba każdy korzystający ze stron podręcznika MAN wie, posiada on kilka rożnych sekcji. W każdej sekcji znajdują się opisy odpowiednich poleceń, plików konfiguracyjnych, wywołań systemowych i tak dalej (dokładną listę można poznać po wydaniu polecenia man man).

Czasami zdarza się tak, że wpis o takiej samej nazwie istnieje w kilku sekcjach – na przykład strona podręcznika dla passwd, istnieją wpisy odnoszące się zarówno do pliku binarnego jak i do pliku konfiguracyjnego o takiej nazwie. Wywołanie polecenia:

man passwd

powinno wyświetlić jedną stronę. I tutaj zaczyna się niespodzianka, która mnie dzisiaj spotkała: wydawało mi się, że zostanie zawsze wyświetlona strona, która znajduje się w sekcji o najmniejszym numerze.

Jednak tak naprawdę wygląda to inaczej, o czym można przekonać się przeglądając stronę podręcznika man:

Domyślnie wyszukuje we wszystkich dostępnych sekcjach, używając predefiniowanego porządku i pokazuje tylko pierwszą znalezioną stronę, nawet jeśli podana strona jest dostępna w kilku sekcjach.

Nie ma jednak żadnych informacji o faktycznej kolejności przeszukiwanych sekcji. Warto więc teraz odwołać się do pliku konfiguracyjnego /etc/manpath.config, a tam można zaleźć taką linijkę:

# Section names. Manual sections will be searched in the order listed here;
# the default is 1, n, l, 8, 3, 0, 2, 5, 4, 9, 6, 7. Multiple SECTION
# directives may be given for clarity, and will be concatenated together in
# the expected way.
# If a particular extension is not in this list (say, 1mh), it will be
# displayed with the rest of the section it belongs to. The effect of this
# is that you only need to explicitly list extensions if you want to force a
# particular order. Sections with extensions should usually be adjacent to
# their main section (e.g. "1 1mh 8 ...").
#
SECTION         1 n l 8 3 2 3posix 3pm 3perl 5 4 9 6 7

I wszystko robi się jasne.

Tags:

Suma rozmiaru wybranych plików w drzewie katalogów

Mały wpis ku pamięci: jak policzyć, ile miejsca zajmują w danym drzewie katalogów pliki z wybranymi rozszerzeniami.

W moim przypadku chciałem się dowiedzieć, ile miejsca zajmują filmy rodzinne. Pierwszym krokiem będzie odszukanie wszystkich filmów:

find ~/ZDJECIA -iregex ".*\.\(mp4\|mpeg\|avi\|3gp\|mov\)"

Zamiast używać standardowej konstrukcji -name użyłem wyrażenia regularnego. Pozwoliło ona na dużo bardziej zwarte umieszczenie wszystkich rozszerzeń, które mnie interesują.

Teraz wypada wyświetlić informację, ile miejsca zajmuje każdy z plików. Można to tego użyć opcji -exec w połączeniu z wywołaniem polecenia ls, ale dużo lepszy efekt da użycie przełącznika -ls. Efekt będzie podobny, a całość będzie funkcjonować dużo szybciej.

find ~/ZDJECIA -iregex ".*\.\(mp4\|mpeg\|avi\|3gp\|mov\)" -ls

Ostatnim elementem będzie wyciągnięcie kolumny z wielkością pliku i jej zsumowanie, można to zrobić przy użyciu polecenia awk:

find -iregex ".*\.\(mp4\|mpeg\|avi\|3gp\|mov\)" -ls | awk '{suma += $7} END {print suma}'

I to w sumie rozwiązuje problem.

Ja jeszcze tylko chciałem mieć wielkość plików wyświetlaną w megabajtach. Można sobie do przeliczyć używając nawet zwykłego polecenia echo, chociaż spada drastycznie czytelność kodu i tworzy się taki potworek:

echo $(($(find -iregex ".*\.\(mp4\|mpeg\|avi\|3gp\|mov\)" -ls | awk '{suma += $7} END {print suma}')/1024/1024)) MB

Tags: , ,

Instalacja Javy 7 w Ubuntu 11.04


W wersji 12.04 Ubuntu można Javę 7 zainstalować dużo prościej, korzystając z repozytoriów PPA. Wystarczy dodać odpowiednie repozytorium i zainstalować Javę:

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer

Java zostanie pobrana ze strony Oracle, zainstalowana i odpowiednie powiązania zostaną automatycznie ustawione.

Więcej można przeczytać tutaj: Install Oracle Java in Ubuntu via PPA repository.

Java w wersji 7 został wydana jakiś czas temu, ale ciągle nie ma odpowiednich pakietów do instalacji w Ubuntu. Pewnie pojawią się wraz z edycją 11.10, ale czekać tak długo nie mam ochoty :).

Instalacja nowej wersji Javy sprowadza się do wykonania kilku kroków, jedyną niedogodnością jest konieczność ręcznego pilnowania nowych wydań JDK.

  1. Pobranie pakietu z Java, najlepiej ze strony Oracle: Java SE Development Kit 7 Downloads. Mój plik z JDK nazywa się jdk-7-linux-x64.tar.gz.
  2. Rozpakować archiwum:
    tar xzvf jdk-7-linux-x64.tar.gz

    Zostanie utworzony katalog jdk1.7.0 a w nim Java w wersji 7.

  3. Przenieść rozpakowane archiwum do katalogu /usr/lib/jvm/ pod nazwą java-7-oracle, gdzie znajdują się dostępne wersje JVM w systemie.

    Ten i pozostałe kroki muszą być wykonane z uprawnieniami użytkownika root. Należy więc wcześnie zmienić konto lub używać polecenie sudo.

    mv jdk1.7.0 /usr/lib/jvm/java-7-oracle
  4. Ustawić odpowiedniego użytkownika oraz uprawnienia – właścicielem powinien być root a możliwość odczytu i wykonywania aplikacji powinni mieć wszyscy użytkownicy. Nie jest to krok być może konieczny, ale przy niektórych ustawianiach jego brak może uniemożliwić innym użytkownikom korzystania z Javy.
    chown -R root.root /usr/lib/jvm/jdk1.7.0/java-7-oracle

    Jeżeli jednak umask jest ustawiony na bardziej restrykcyjną wartość (w moim przypadku 007) to pojawi się problem: zwykły użytkownik nie będzie mógł ani uruchomić ani nawet odczytać katalogu z Javą. Można to poprawić przy użyciu prostej instrukcji:

    chmod -R a+rX /usr/lib/jvm/java-7-oracle
  5. W Ubuntu domyślne implementacja Javy (jak i wielu innych aplikacji) jest ustawiana przy pomocy polecenia update-alternatives. Mechanizm ten pozwala na zdefiniowania wielu rożnych aplikacji dostarczających daną funkcjonalność (np. wiele wersji Javy) oraz wybranie aplikacji, która będzie uruchamiana domyślnie.

    W przypadku polecenia java można sprawdzić jakie są jego różne implementacje:

    # update-alternatives --config java

    There are 3 choices for the alternative java (providing /usr/bin/java).

      Wybór       Ścieżka                                 Priorytet  Status
    ------------------------------------------------------------
      0            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      tryb auto
      1            /usr/lib/jvm/java-6-openjdk/jre/bin/java   1061      tryb ręczny
    * 2            /usr/lib/jvm/java-6-sun/jre/bin/java       63        tryb ręczny

    W moim przypadku mam zainstalowane dwa różne JDK, z czego domyślnie ustawiona jest wersja Suna (teraz już Oracla).

    Można teraz dodać implementację Java 7:

    update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/jre/bin/java 3

    Numer 3 oznacza kolejny numer po ostatniej dostępnej wersji JVM.

    Teraz pozostaje tylko wydanie polecenia:

    update-alternatives --config java

    A teraz mały test: wywołanie poleceń java oraz javac:

    # java -version
    java version "1.7.0"
    Java(TM) SE Runtime Environment (build 1.7.0-b147)
    Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode)

    # javac -version
    javac 1.6.0_26

    Jak widać domyślnie została wywołana wersja Javy 7, natomiast wywołanie kompilator ciągle odwołuje się do wersji 6. Poradzić sobie można z tym definiując kolejną alternatywę a następnie ją ustawiając. Natomiast ilość plików binarnych które trzeba ustawić oraz stron MAN, które należy zmienić jest znaczna. Można to sprawdzić przy pomocy polecenia:

    update-java-alternatives -v -l java-6-sun
  6. Najlepszym sposobem zmiany wersji JDK w przypadku Ubuntu będzie użycie polecenia update-java-alternatives. Pozwoli ona na zmianę domyślnej implementacji wszystkich plików wykonywalnych oraz powiązanych z nimi stron MAN. Niestety, trzeba je odpowiednio skonfigurować, zanim zacznie działać poprawnie.

    Pierwszym krokiem będzie dodanie odpowiednich alternatyw dla wszystkich plików binarnych. Można to zrobić przy pomocy prostego skryptu o nazwie update-alternatives-java-7. Powstał on na bazie odpowiednich skryptów po instalacyjnych wykonywanych podczas instalacji OpenJDK w systemie.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    #!/bin/bash

    # instalacja JRE-headless

    priority=100
    basedir=/usr/lib/jvm/java-7-oracle
    basediralias=/usr/lib/jvm/java-7-oracle
    jdiralias=java-7-oracle
    mandir=/usr/lib/jvm/jdk1.7.0/man
    srcext=1.gz
    dstext=1.gz

    jre_tools='java keytool pack200 rmid rmiregistry unpack200 orbd servertool tnameserv'
                                                                                                                                                                                                                               
        for i in $jre_tools; do                                                                                                                                                                                                
            unset slave1 slave2 || true                                                                                                                                                                                        
            if [ -e $mandir/man1/$i.$srcext ]; then                                                                                                                                                                            
                slave1="--slave \                                                                                                                                                                                              
                    /usr/share/man/man1/$i.$dstext \                                                                                                                                                                            
                    $i.$dstext \                                                                                                                                                                                                
                    $mandir/man1/$i.$srcext"
                                                                                                                                                                                       
            fi                                                                                                                                                                                                                  
            update-alternatives --verbose \                                                                                                                                                                                    
                --install \                                                                                                                                                                                                    
                /usr/bin/$i \                                                                                                                                                                                                  
                $i \                                                                                                                                                                                                            
                $basediralias/jre/bin/$i \                                                                                                                                                                                      
                $priority \                                                                                                                                                                                                    
                $slave1 $slave2                                                                                                                                                                                                
        done                                                                                                                                                                                                                    
        update-alternatives --verbose \                                                                                                                                                                                        
            --install /usr/bin/jexec jexec $basediralias/jre/lib/jexec $priority                                                                                                                                                
                                                                                                                                                                                                                               
                                                                                                                                                                                                                               
    # instalacja JRE

    jre_tools='policytool ControlPanel java_vm javaws jcontrol'

        for i in $jre_tools; do
            unset slave1 slave2 || true
            if [ -e $mandir/man1/$i.$srcext ]; then
                slave1="--slave \
                   /usr/share/man/man1/$i.$dstext \
                   $i.$dstext \
                   $mandir/man1/$i.$srcext"

            fi
            update-alternatives --verbose \
                --install \
                /usr/bin/$i \
                $i \
                $basediralias/jre/bin/$i \
                $priority \
                $slave1 $slave2
        done

    # instalacja JDK


    jdk_tools='appletviewer apt extcheck idlj jar jarsigner javac javadoc javah javap jconsole jdb jhat jinfo jmap jps jrunscript jsadebugd jstack jstat jstatd native2ascii rmic schemagen serialver wsgen wsimport xjc'


        for i in $jdk_tools; do
            unset slave1 slave2 || true
            if [ -e $mandir/man1/$i.$srcext ]; then
                slave1="--slave \
                   /usr/share/man/man1/$i.$dstext \
                   $i.$dstext \
                   $mandir/man1/$i.$srcext"

            fi
            update-alternatives --verbose \
                --install \
                /usr/bin/$i \
                $i \
                $basediralias/bin/$i \
                $priority \
                $slave1 $slave2
        done

    W skrypcie należy zwrócić szczególną uwagę na definicję odpowiednich ścieżek dostępu. Po jego wykonaniu zostaną zdefiniowanie odpowiednie alternatywy dla odpowiednich plików, ale nie zostaną one jeszcze uaktywnione.

    Konfiguracja update-java-alternatives sprowadza się do zdefiniowania odpowiedniego pliku konfiguracyjnego. Należy utworzyć (lokalizacja i nazwa pliku jest ważna) plik: /usr/lib/jvm/.java-7-oracle.jinfo o następującej zawartości:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    name=java-7-oracle
    alias=java-7-oracle
    priority=100
    section=non-free

    jre ControlPanel /usr/lib/jvm/java-7-oracle/jre/bin/ControlPanel
    jre java /usr/lib/jvm/java-7-oracle/jre/bin/java
    jre java_vm /usr/lib/jvm/java-7-oracle/jre/bin/java_vm
    jre javaws /usr/lib/jvm/java-7-oracle/jre/bin/javaws
    jre jcontrol /usr/lib/jvm/java-7-oracle/jre/bin/jcontrol
    jre keytool /usr/lib/jvm/java-7-oracle/jre/bin/keytool
    jre pack200 /usr/lib/jvm/java-7-oracle/jre/bin/pack200
    jre policytool /usr/lib/jvm/java-7-oracle/jre/bin/policytool
    jre rmid /usr/lib/jvm/java-7-oracle/jre/bin/rmid
    jre rmiregistry /usr/lib/jvm/java-7-oracle/jre/bin/rmiregistry
    jre unpack200 /usr/lib/jvm/java-7-oracle/jre/bin/unpack200
    jre orbd /usr/lib/jvm/java-7-oracle/jre/bin/orbd
    jre servertool /usr/lib/jvm/java-7-oracle/jre/bin/servertool
    jre tnameserv /usr/lib/jvm/java-7-oracle/jre/bin/tnameserv
    jre jexec /usr/lib/jvm/java-7-oracle/jre/lib/jexec
    jdk appletviewer /usr/lib/jvm/java-7-oracle/bin/appletviewer
    jdk apt /usr/lib/jvm/java-7-oracle/bin/apt
    jdk extcheck /usr/lib/jvm/java-7-oracle/bin/extcheck
    jdk idlj /usr/lib/jvm/java-7-oracle/bin/idlj
    jdk jar /usr/lib/jvm/java-7-oracle/bin/jar
    jdk jarsigner /usr/lib/jvm/java-7-oracle/bin/jarsigner
    jdk javac /usr/lib/jvm/java-7-oracle/bin/javac
    jdk javadoc /usr/lib/jvm/java-7-oracle/bin/javadoc
    jdk javah /usr/lib/jvm/java-7-oracle/bin/javah
    jdk javap /usr/lib/jvm/java-7-oracle/bin/javap
    jdk jconsole /usr/lib/jvm/java-7-oracle/bin/jconsole
    jdk jdb /usr/lib/jvm/java-7-oracle/bin/jdb
    jdk jhat /usr/lib/jvm/java-7-oracle/bin/jhat
    jdk jinfo /usr/lib/jvm/java-7-oracle/bin/jinfo
    jdk jmap /usr/lib/jvm/java-7-oracle/bin/jmap
    jdk jps /usr/lib/jvm/java-7-oracle/bin/jps
    jdk jrunscript /usr/lib/jvm/java-7-oracle/bin/jrunscript
    jdk jsadebugd /usr/lib/jvm/java-7-oracle/bin/jsadebugd
    jdk jstack /usr/lib/jvm/java-7-oracle/bin/jstack
    jdk jstat /usr/lib/jvm/java-7-oracle/bin/jstat
    jdk jstatd /usr/lib/jvm/java-7-oracle/bin/jstatd
    jdk native2ascii /usr/lib/jvm/java-7-oracle/bin/native2ascii
    jdk rmic /usr/lib/jvm/java-7-oracle/bin/rmic
    jdk schemagen /usr/lib/jvm/java-7-oracle/bin/schemagen
    jdk serialver /usr/lib/jvm/java-7-oracle/bin/serialver
    jdk wsgen /usr/lib/jvm/java-7-oracle/bin/wsgen
    jdk wsimport /usr/lib/jvm/java-7-oracle/bin/wsimport
    jdk xjc /usr/lib/jvm/java-7-oracle/bin/xjc

    Teraz jest już dostępna nowa wersja JVM w systmie:

    # update-java-alternatives -l
    java-6-openjdk 1061 /usr/lib/jvm/java-6-openjdk
    java-6-sun 63 /usr/lib/jvm/java-6-sun
    java-7-oracle 100 /usr/lib/jvm/java-7-oracle

    Pozostaje ustawić Jave 7 jako domyślną implementację JVM:

    update-java-alternatives -v -s java-7-oracle

Źródła

Tags: ,

Instalacja Oracle Javy w Ubuntu Natty (11.04)

Standardowo w Ubuntu Java w wersji od Oracla (czyli dawana Sunowska) jest dostępna w repozytorium partner. Jednak w przypadku Ubuntu Natty (w wersji alfa) niestety jej tam jeszcze nie ma, prawdopodobnie zostanie umieszczona już po premierze wersji stabilnej. Na szczęście, łatwo można ją zainstalować przy wykorzystaniu dodatkowych repozytoriów, wystarczy wydać polecenie:

sudo add-apt-repository ppa:ferramroberto/java
sudo apt-get update

I zainstalować Javę:

sudo apt-get install sun-java6-jdk

Tags: