Gentoo nie lubi upstart

Dziś zapragnąłem mieć upstart na swoim Gentoo. Cóż, co Ubuntowskie nie koniecznie jest dobre dla innych dystrybucji. System oczywiście nie wstał, wkońcu Gentoo to nie Ubuntu. W chroocie usunąłem upstart z systemu, zrobiłem restart i system biednie zakomunikował mi:

The filesystem mounted /dev/sda7 does not appear to be a valid /
Could not find the root block device in.

Problem:
Najprawdopodobniej problem tkwi w sysvinit, którego część plików usunął upstart przy odinstalowywaniu.

Rozwiązanie:
Nie trzeba kompilować kernela, nie trzeba zmieniać plików konfiguracyjnych, wszystko jest OK.

  • Bierzemy jakieś w miare aktualne LiveCD z obsługą SATA jeżeli takową mamy i z obsługą ext4.
  • następnie otwieramy konsole i przechodzimy w tryb superużytkownka - root
  • tworzymy katalog do montowania: mkdir -p /mnt/gentoo
  • potem sprawdzamy naszą partycję do montowania: fdisk -l
  • montujemy: mount /dev/sda7 /mnt/gentoo
  • teraz chroot: chroot /mnt/gentoo /bin/bash
  • instalujemy sysvinit jeszcze raz: emerge sys-apps/sysvinit
  • wszystko powinno być w porządku, wchodzimy z chroot: exit
  • odmontowujemy dysk: umount /mnt/gentoo
  • i na końcu reboot: reboot

Wszystko już powinno być OK, wrazie problemów przy emergowaniu - choć nie powinno ich być - możemy zamontować jeszcze (przed wejściem w chroot) mount -t proc none /mnt/gentoo/proc && mount -o bind /dev /mnt/gentoo/dev

Java i multipart

Na wstępie chcę zaznaczyć, że nie znam się na PHP, dotyczy to formularza, który będzie nam potrzebny. Posłużyłem się formularzem z jakiegoś kursu PHP (nie pamiętam gdzie on się znajduje).

Co zrobić, jeżeli chcemy wysłać plik na jakiś portal, własną stronę itp. nie wchodząc na daną stronę przy pomocy przeglądarki? Pewnie znajdzie się kilka dobrych odpowiedzi. Moją odpowiedzią jest napisanie kawałka programu, który posłuży nam do zaprezentowania metody obsługi multipart w Javie.

Trochę opisówki. Trzeba zaznaczyć, że będziemy imitować przeglądarkę, więc musimy zaznajomić się z GET i POST. GET pobiera nam stronę, POST wysyła informacje. Ważniejszą dla nas funkcją jest POST. Oczywiście wszystkie parametry POST można odczytać przy pomocy analizy strony .html lub .php. Co nie dokońca jest dobrą praktyką bo zabiera ona więcej czasu. Dla FF są dwa fajne dodatki do wyłapywania POST i GET. Pierwszy to Live HTTP Headers, drugi to HttpFox. Przy ich pomocy, osobno lub w duecie, możemy ładnie wyłapać parametry POST. Tutaj udostępniłem mały plik PHP, który ma formularz do uploadu plików.

Używając HttpFox i korzystając z pliku upload.php, nasz POST zawiera dwa parametry: "plik" i "uploadpicture". Parametry te odpowiadają polu name w formularzu. Parametr "plik" ma wartość "filename="Google.gif" Content-Type: image/gif", czyli naszym uploadowanym plikiem jest Google.gif i jego MIME wskazuje na to, że faktycznie jest gifem ;). Drugi parametr odnosi się do przycisku, który jest zbędny w tym wszystkim. Trzeba zaznaczyć jedną rzecz, przy formularzu typu "multipart/form-data" (pole enctype pokazuje nam jakiego typu jest formularz), nie możemy tak poprostu spreparować linku w przeglądarce wpisując coś takiego "upload.php?plik=filename="Google.gif"". Takie rzeczy tylko w Erze :P. Na poważnie, takie rzeczy możemy robić przy formularzach np. do logowania się.

Wiemy już jak wygląda POST strony z uploadem to musimy znaleźć bibliotekę do obsługi imitacji przeglądarki. Żeby nie tracić czasu to podpowiem, że takową bibliotekę znajdziemy tu. Będziemy posługiwać się wersją 3.x.

Potrzebne importy:
import java.io.File;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;

Kod programu, tłumaczenie w komentarzach:
public void uploadImage( ) throws Exception {
/**
* To jest nasza imitacja przeglądarki
*/
HttpClient client = new HttpClient();
/**
* tu powinna znaleźć się ścieżka do pliku
* mój plik znajduje się tam gdzie źródło programu
*/
String image = "Google.gif";

/**
* Tutaj mamy obsługę metody POST dla naszego formularza,
* jako parametr tej funkcji podajemy adres do pliku .php
* w którym mamy nasz formularz uploadu pliku.
* Jeżeli to jest jakiś serwis, bądź cokolwiek innego gdzie
* wymagana jest autoryzacja użytkownika, to musimy napisać
* sobie funkcję logującą i następnie imitować każdy krok
* dojścia do naszego formularza.
*/
PostMethod filePost = new PostMethod("http://localhost/upload.php");

/**
* Tutaj "tworzymy" instancję naszego pliku
*/
File targetFile = new File(image);

/**
* Teraz dzielimy nasz plik na części. Tutaj trzeba wspomnieć o
* najważniejszej rzeczy w całym tym pliku, która decyduje o tym
* czy nasz upload się powiedzieć.
* Pierwszym parametrem FilePart zawsze musi być pole name inputu.
* W naszym przypadku jest to pole "plik". Trugim parametrem
* jest nasz plik czyli targetFile.
*/
Part[] parts = { new FilePart("plik", targetFile)};

/**
* Tutaj nasza funkcja POST i ustawienie RequestEntity.
* MultipartRequestEntity przyjmuje za parametry nasz
* parts i parametry naszego POST czyli filePost.getParams()
*/
filePost.setRequestEntity (new MultipartRequestEntity(parts, filePost.getParams()));

/**
* w tym momencie mamy już wszystko by wysłać zapytanie POST.
* int status służy do odbioru statusu wykonania POST.
*/
int status = client.executeMethod(filePost);

System.out.println("Status = " + status);

/**
* Jeżeli status jest OK tzn. że nasz upload się
* powiódł.
*/
if (status == HttpStatus.SC_OK)
{
/**
* getResponseBodyAsString() pobieramy kod strony.
* Jeśli wszystko jest OK powinniśmy zobaczyć wypełnione pola
* Nazwa pliku, Rozmiar pliku, tymczasowo, typ przesłanego pliku
*/
System.out.println("Upload complete, response =" + filePost.getResponseBodyAsString());
}
else
{
System.out.println("Upload failed, response =" + HttpStatus.getStatusText(status));
}

/**
* zamykamy połączenie
*/
filePost.releaseConnection();
}

Ten krótki kawałek kodu wklejamy tam gdzie chcemy go używać. Używając biblioteki httpclient możemy dowoli bawić się w tak zwane webboty, możliwości są praktycznie nieograniczone.

Udev czepia się kernela

Dzisiaj ukazała się nowsza wersja udev, no i jak zawsze odpaliłem sobie aktualizację. Co się okazało, udev czepia się mojej konfiguracji kernela. Jest to drugi program, zaraz po nvidia-drivers, który ma problemy z konfiguracją kernela.

W sumie, od skompilowania kernela 2.6.30-gentoo-r6 przy starcie udev wypłuwał taki o to błąd konfiguracji kernela (kto by wogóle się przejmował błędami? ):

CONFIG_SYSFS_DEPRECATED

Jak sobie poradzić z takim problemem? Nic trudnego, otwieramy konfigurację naszego kernela w naszym ulubionym bądź znienawidzonym edytorze tekstu:

sudo gedit /etc/kernels/kernel-config-x86-2.6.30-gentoo-r6

Następnie wyszukujemy w tekście CONFIG_SYSFS_DEPRECATED i CONFIG_SYSFS_DEPRECATED_V2 i zmieniamy opcję "y" na "n". Potem wystarczy przekompilować kernel i zaktualizować Gentoo:

sudo genkernel all
sudo emerge --update world

i możemy cieszyć się rozwiązanym problemem ;)

Gentoo też ma notify-osd!

Masz Gentoo, a widziałeś takie cudo w Ubuntu, którego byś nie chciał. Masz dwa wyjścia! Przejść na Ubuntu lub doczytać wpis do końca, wykonać kilka poleceń, potem cieszyć się ładnym powiadamianiem.

Co nam będzie potrzebne? layman, koniecznie! nie wiesz co i jak z laymanem zajrzyj tu. Mamy laymana i co dalej? Podpowiem, dodajemy nowy overlay jeśli go jeszcze nie mamy:

$ sudo layman -a voyageur

Potem musimy wyrzucić notification-daemon:

$ sudo emerge --unmerge x11-misc/notification-daemon

teraz wystarczy zainstalować nowe powiadomienia:

$ sudo emerge x11-misc/notify-osd

Nie trzeba nic konfigurować, teraz możemy się cieszyć :)

Gentoo dla zwykłego użytkownika?

Chciałbym przedstawić wady, zalety, przemyślenia dotyczące Gentoo okiem użytkownika. Nie mogę zaprzeczyć, że Gentoo jest takim specyficznym tworem, który swoją złożonścią odpycha od siebie liczne rzesze chętnych użytkowników. Potem cała ta gromada zawiedzionych ludzi wybiera Ubuntu, Fedore itp. Dlaczego Gentoo nie walczy o takiego użytkownika? Ma ich tak dużo, że nie musi? No nie sądzę.

Sabayon to takie dopieszczone Gentoo, które można polecić osobą, które chcą mieć już gotowy, sprawny system. Inną jego zaletą jest to, że może nam ładnie posłużyć jako livecd dla budowania naszego systemu przez chroot'a.

Zalety Gentoo:
- duża liczba pakietów, dodatkowe repozytoria,
- ciągłość! tego mi zawsze brakuje w innych dystrybucjach. To jest jedna z największych (wg. mnie) zalet tego distro. Nie muszę czekać co 6 miesięcy na świeże oprogramowanie, na innowacje typu "szybszy start", "ładny splash", "nowy motyw GDM" itp. Wszystko mogę mieć od zaraz jak tylko ujrzy światło dzienne. Tyczy się to także bugów i ich łatania, wszystko jest szybciej niż w dystrybucjach cyklicznych.
- konfigurowalność, wszystko można sobie skonfigurować a nawet trzeba bo inaczej nie będzie działać :)
- bardzo stabilna dystrybucja, szczególnie przy wyborze stablinego oprogramowania. Gentoo bardzo restrykcyjnie podchodzi do kwestii stabilności i dlatego czasami długo się czeka na różne programy.
- szybkość? to zawsze będzie kwestia sporna, niby wszystko kompilowane pod procesor, ramy itd. a różnica rzędu 3 - 4 sekund na starcie, no ale to jest szybkość :)
- rewelacyjny Portage, revdep-rebuild ( do naprawiania tego co zepsuje portage ),
- można się całkowicie pozbyć Qt z systemu i vice versa
- niesamowita przygoda każdego dnia i nauka jednocześnie.

No to czas na wady:
- długi czas kompilowania programów, szczególnie OpenOffice ( mi zajmuje ok 1 h i 40 minut ), nie martwcie się bo istnieje binarna wersja OpenOffica :)
- brak wypuszczania nowszych livecd by nie trzeba było stawiać całego systemu od zera
- sam czas stawiania systemu + nauka trwa kilka dni ( do postawienia np. Gnome, u mnie cały proces trwa 2 dni z przerwą na spanie )
- łatwo zepsuć system flagami USE, dodanie jednej flagi wymaga przebudowania wszystkich programów, które mogą go używać.
- zależnie od dystrybutora programu, czasami trzeba ściągać coś manualnie i przerzucać do distfiles aby portage mógł nam skompilować nasz upragniony program. Systuacja taka ma miejsce np. przy instalacji Netbeans, Javy.

Jak można zauważyć nie jest to zwykła dystrybucja, trzeba się z nią identyfikować, trzeba ją pokochać i nie gniewać się, że myszka, klawiatura nie działają po kompilacji xorg-servera. Nie wątpliwie jest to wyższa szkoła jazdy dla linuksowych wyjadaczy, ale ładnie zbudowane Gentoo odpłaca się nam stabilną pracą, dumą, że ciągle chodzi i nigdy nie pozwoli o sobie zapomnieć lub nudzić się sobą!

Gentoo i make.conf

Make.conf jest najważniejszym plikiem konfiguracyjnym w całym systemie. Jego napisanie trzeba zacząć jeszcze przed instalacją samego Gentoo. Trzeba być świadomym swojej wiedzy na temat sprzętu, bibliotek ( szczególnie różnic między QT a GTK ), i innych rzeczy.

Ważną sprawą jest to by bez problemowo przejść przez instalację systemu bazowego i następnie instalację środowiska graficznego dlatego nasz make.conf jest podzielony na dwie części. Pierwsza tyczy się tylko niezbędnych rzeczy by postawić system bazowy. Druga część nawiązuje już do wyboru środowiska i związanych z tym flag USE

Do przykładu posłużę się swoim sprzętem i swoim make.conf. Sprzęt, tylko to co potrzeba przy instalacji i make.conf:

- procesor: Intel C2D E8400
- ram: 4gb
- Nvidia GF 9600gt

Teraz zabieramy się za plik make.conf
Jest to najbardziej istotna rzecz w całym pliku. Bardzo ważne jest dobranie odpowiednich flag kompilatora dla naszego systemu. Pod tym adresem znajdziemy flagi pod własny procesor. U mnei wygląda to tak:

CHOST="i686-pc-linux-gnu"
CFLAGS="-march=core2 -O2 -pipe -fomit-frame-pointer"
CXXFLAGS="${CFLAGS}"

Następna rzecz to ustawienia ilości równoległych kompilacji. Jeśli masz jeden rdzeń to ustawiasz -j2, jeśli więcej to ustawiasz wg. bardzo trudnego wzoru: ilość_rdzeni + 1 :)

MAKEOPTS="-j3"

Ustawiamy czy nasz system ma korzystać ze stabilnych ebuildów "x86" czy jednak chcemy pójść na żywioł i dać naszemu systemowi trochę świeżości "~x86" ;) Oczywiście wybór należy do Ciebie, ja lubię być świeży:

ACCEPT_KEYWORDS="~x86"

Nie wolno zapomnieć o sterownikach do klawiatury, myszy, karty graficznej ( nie wiem jak wygląda sytuacja z ATI i jak ją odpalić ). Poniżej "ładowanie" sterowników:

INPUT_DEVICES="evdev keyboard mouse void"
VIDEO_CARDS="fbdev vesa nvidia"

Nie możemy również zapomnieć o polonizacji systemu:

LINGUAS="pl"
LC_ALL="pl_PL"

Ustawiamy czyszczenie starszych pakietów przy instalacji nowszych ich wersji:

AUTOCLEAN="yes"

Żeby nie mieć kłopotu z szybkim ściąganiem programów trzeba ustawić tak zwane mirrors, jest program mirrorselect, ale przy instalacji ciężko go zbudować więc lepiej wkleić te GENTOO_MIRRORS do swojego make.conf i mieć spokój

GENTOO_MIRRORS="http://213.186.33.38/gentoo-distfiles/ http://gd.tuwien.ac.at/opsys/linux/gentoo/ ftp://213.186.33.38/gentoo-distfiles/ http://212.219.56.138/sites/www.ibiblio.org/gentoo/ http://linux.rz.ruhr-uni-bochum.de/download/gentoo-mirror/"
GENTOO_MIRRORS="ftp://mirror.icis.pcz.pl/gentoo/ ftp://ftp.vectranet.pl/gentoo/ http://ftp.vectranet.pl/gentoo/"

Tak zbudowany make.conf wystarczy by zbudować base system. Teraz zajmiemy się flagami USE, które potrafią zepsuć najlepiej zrobiony system Gentoo. Ja używam Gnome więc flagi są ułożone pod bibliotekę GTK. Aby móc zapoznać się ze wszystkimi flagami odsyłam pod ten adres.

Nie będę opisywał flag bo jest ich sporo, możecie mi uwierzyć na słowo, że system ciągle mi chodzi od ponad pół roku i nic się z nim nie dzieje ;) nadmiarowość flag USE jest grzechem dlatego nie polecam używać make.conf z Sabayona. Moje flagi są nie poukładane, były dopisywane w trakcie działania systemu i na potrzeby kolejnych kompilacji. Po prostu nie chciało mi się ich segregować :/

XUSE="truetype X new-login xorg xv xcomposite xinerama opengl aiglx pulseaudio"
IMAGEUSE="jpeg gif tiff png svg pdf truetype policykit"
MEDIAUSE="alsa mad vidix asf win32codecs dvd mp4 aac x264 xvid nsplugin mp3 real gstreamer"
GENERAL="bzip2 symlink sqlite spell xml nautilus"
SYSTEM="cups hal fam dbus aoss threads xulrunner startup-notification notify"
NOTUSE="-arts -qt4 -ipv6 fat ntfs"
KDEUSE="-kde -qt3"
GNOMEUSE="gtk cairo glitz gnome firefox cups xcb"
USE="${NOTUSE} ${SYSTEM} ${GENERAL} ${IMAGEUSE} ${XUSE} ${KDEUSE} ${MEDIAUSE} ${GNOMEUSE}"

Na tym można zakończyć konfigurację make.conf. Dobrze jest przeczytać cały handbook o instalacji. Przydatną stroną, takim skrótem myślowym handbooka jest gentoo-install.com, trzeba go używać rozważnie i najlepiej stosować go jako dopełnienie handbooka a nie na odwrót. Tutaj jest cały mój make.conf. Życzę powodzenia :)

Gentoo dla programistów?

Jestem obieżyświatem jeżeli chodzi o dystrybucje. Począwszy od Red Hat 9 po przez PLD Ac, Mandrake, Aurox, Mandriva, Frugalware, Fedora, Ubuntu, LFS, Sorcerer, Debian ( na studiach tylko ) no i Gentoo. Kilka słów co do niektórych dystrybucji:
- Ubuntu: fajnie, że jest :) wzrosła liczba osób, które chcę na nim pracować, ciągle coś próbują zrobić, opierają się na Debianie.
- Fedora: innowacje, innowacje, rzadko kiedy działa instalator w wersjach alpha tej dystrybucji, i zreguły mało co działa w betach.
- Mandriva: szkoda, że płatna ( Xtreme ), ale najlepsze distro dla początkujących! Nie ma drugiej takiej dystrybucji, która potrafi po padzie Xów w kilku krokach przeprowadzić użytkownika do ponownego ich działania, to jest wielki plus.
- PLD: czekam na Th, poza tym świetne distro do nauki i zgłębiania podstaw systemu.
- LFS: dużooo pracy nad systemem, ciężka to praca i dużo czasu trzeba poświęcić, na Gentoo potrzeba mniej :)

Wracajmy jednak do głównego wątku tego wpisu. Dlaczego twięrdzę, że Gentoo jest dla programistów? Ano dlatego, że dystrybucje paczkowane, szczególnie te młode nie zawierają takiej liczby gotowych bibliotek potrzebnych mi, innym. Nawet w Ubuntu nie ma wszystkiego mimo, że posiada taką dużą liczbę pakietów. Czym to się różni od Gentoo? W Gentoo zamiast pakietów są ebuildy, są to pliki tekstowe, w których opisana jest cała zależność pakietu od innych, sposób jego instalacji itd. Łatwiej napisać ebuild niż skompilować program, potem go spaczkować i czekać 6 miesięcy by trafił do nowego wydania Twojej ulubionej dystrybucji. Gentoo nie dość, że posiada mnóstwo ebuildów to do tego mamy kilkanaście innych repozytoriów z dodatkowym oprogramowaniem tzw. overlays. Do czego z mierzam. Kiedyś próbowałem uruchomić na Ubuntu, Fedorze WM o nazwie Amaterus. W czym problem, WM ten potrzebuje do życia gtk1.2, stare xml i coś tam jeszcze. Takich pakietów nie znajdziemy w Ubuntu i Fedorze i innych dystrybucjach także, no bo i po co miały by tam być? No tak, ale Gentoo posiada porty (odziedziczyli po BSD), ma możliwość egzystowania dwóch pakietów w systemie bez kolizji i wszystko pięknie, WM odpalony i działa. Teraz programuję w Javie, nie muszę szukać bibliotek w google, tylko odpalam zarządce pakietów i instaluje bibliotekę i nawet się nie zastanawiam czy jest czy jej nie ma bo wiem, że i tak będzie, jak nie w głównej gałęzi to na pewno w java overlay. Żeby nie było tak pięknie, wspomnę tylko, że trzeba dbać o system bo on nie jest nie zawodny. Jednak trud się opłaca :)

Hello World!

Witam wszystkich serdecznie. Blog będzie o Linuksie, Gentoo, programowaniu. Będzie bo nie wiem czy stanie się tym, czym chce by się stał :) Oczywiście skupiać się będę typowo na Gentoo, ponieważ mam już dość braku jakichkolwiek Polskich informacji o tej dystrybucji, pewnie jakieś są, ale nie chce mi się szukać :) To by było tyle tytułem wstępu.

P.S. Pierwszy raz prowadzę blog (proszę o wyrozumiałość), jak ogarnę różne te opcje to będę zadowolony :) jeśli znajdzie się jakaś osoba, która przybliży mi trochę funkcjonalność bloga od strony praktycznej to będę wdzięczny.