poniedziałek, 20 grudnia 2010

sprawdzanie tranferu czyli tzw. bandwidth

Często zdarza się mi, że ktoś kwestionuje wskazania dotyczące wykorzystanego transferu i twierdzi, że to nie możliwe aby aż tyle wykorzystał.
Bardzo często mam ochotę uruchomić skrypt, który wykorzysta pozostały transfer z nawiązką w ciągu jednej nocy ... ale tego niestety nie robię :).
Więc jeżeli ktoś będzie kwestionował wykorzystany transfer można poradzić mu:
- zainstaluj iptraf, co prawda nie obrazuje on dokładnie sumarycznego ruchu ale można się rozeznać czy więcej pobieramy czy wysyłamy,
- kolejnym bardzo interesującym narzędziem jest bmon, wystarczy go zainstalować, uruchomić najechać na interfejs, który chcemy monitorować, wcisnąć b,g (i patrzeć jak transfer rośnie).

W wielu sytuacjach te narzędzia ułatwiają życie, zalecam zapoznanie się z nimi i korzystanie z nich jak najczęściej.

sobota, 4 grudnia 2010

Pozycjonowanie stron opartych o Drupal'a

W podstawowych modułach dostarczanych w raz z Drupal'em niestety nie ma narzędzi służących do skutecznego pozycjonowania strony (nie da się nigdzie wpisać meta tags, keywords, description itp.).

W celu dodania słów kluczowych, opisu strony, meta tagów niezbędne jest doinstalowanie następującego modułu:
- nodewords w wersji odpowiedniej dla wykorzystywanego przez nas Drupal'a.

Wskazany moduł można pobrać ze strony drupal.org.
Instalacja przebiega tak samo jak w poprzedni poście.

Po instalacji należy moduł odpowiednio skonfigurować, i rozpocząć edycję stron już utworzonych, oraz dodawać opisy podczas dodawania nowych stron.

Im trafniejsze będą opisy, słowa kluczowe, meta tagi, tym wyższą pozycję uzyskamy w wyszukiwarkach internetowych - co wymiernie wpłynie na ilość odwiedzin naszej strony.

drupal i przyjazne linki

Jestem w trakcie tworzenie strony internetowej w oparciu o popularny system CMS Drupal.

Jedną z podstawowych rzeczy, którą należy zrobić przed stworzeniem strony jest włączenie przyjaznych linków.
Przyjazne linki polegają na podmianie adresów np.: jakaś-strona.pl/?blogID=93985607 niezrozumiałych dla człowieka, na adresy zrozumiałe dla człowieka oraz robotów sieciowych np.: jakaś-strona.pl/o_mnie.

Zaletami przyjaznych linków jest to, że można łatwo się połapać gdzie znajdujemy się obecnie na stronie oraz jesteśmy lepiej indeksowani za pomocą robotów siecowych (każdy chce pojawiać się przecież na pierwszej stronie w wyszukiwarce Google).

W celu włączenia przyjaznych linków w drupalu, należy pobrać i zainstalować na serwerze następujące moduły:
- Pathauto
- Token
- Token actions
- TokenSTARTER

Wszystkie wskazane moduły można pobrać ze strony drupal.org.
Po pobraniu wgrywamy je na serwer albo za pomocą scp albo za pomocą ftp (lub sftp) do lokalizacji:
sites/all/modules
Jeżeli katalogu modules nie ma na serwerze to go tworzymy.
rozpakowujemy zawartość modułów do katalogu modules za pomocą polecenia tar -xvzf nazwa_archiwim.tar.gz.
Zmieniamy jeszcze uprawnienia na właściwe dla katalogów i plików.
Następnie logujemy się do panelu administracyjnego Drupal'a przechodzimy do Administer >> modules i włączamy wskazane powyżej moduły.

Istnieją dwie możliwości dodawania przyjaznych linków:
- przy tworzeniu nowej strony automatycznie,
- przez tworzeniu aliasów do stron istniejących.

Druga metoda wymaga szerszego opisania:
- najpierw wchodzimy na wybraną stronę i sprawdzamy jaki adres jest podawany w pasku adresów, kopiujemy ten adres,
- wchodzimy w Drupal'u na zakładkę Site building >> URL aliases,
- klikamy na add alias,
- wprowadzamy fragment wcześniej skopiowanego linku,
- w drugim polu wpisujemy pod jakim przyjaznym adresem ma się dana strona wyświetlać,
- klikamy na create new alias.

W ten sposób zostały włączone przyjazne linki w Drupal'u.
Spotkałem się też z taką sytuacją, że na domowym komputerze z apache 2.2 przyjazne linki działały bez problemu, natomiast na serwerze z zainstalowanym Apache 1.3 były to linki pseudo przyjazne (dalej wyświetlało się ?q=content/o_mnie).

piątek, 3 grudnia 2010

zautomatyzowane kopiowanie z wykorzystaniem xargs oraz cp w Linux'ie

Gdy chcemy skopiować pliki z jednego miejsca w drugie i mają one spełniać określone warunki można napisać pętle for, pytanie tylko czy jest sens bawić się z tym aż tak gdy można użyć poleceń ls, awk, xargs (mi się to przynajmniej łatwiejsze wydaje).

Mam tendencję do nie czyszczenia karty pamięci w aparacie więc gdy chce skopiować jakieś świeżo zrobione zdjęcia z aparatu w inną lokalizację wyświetla się naprawdę długa lista.
Zamiast zrobić ls -laht, grepować po dacie, i klikać albo wpisywać dla każdego pliku cp wolę wykonać następujące polecenie:
ls -lah | grep 2010-12-04 | awk '{print $8}' | xargs -i cp {} /home/pawel/Pulpit/mieszkanie/aranzacja/


Teraz po polsku:
ls -lah - wyświetlenie wszystkich plików z bieżącego katalogu wraz z atrybutami,
grep 2010-12-04 - wyświetlenie plików które zostały stworzone w dniu dzisiejszym,
awk '{print $8}' - wyświetla zawartość ósmej kolumny, czyli nazwę pliku,
| - przekazanie wyników jednego polecenia do następnego polecenia tzw. pipe (nie wiem jak to się nazywa po polsku - jeżeli ktoś wie to proszę o komentarz z informacją),
xargs -i cp {} /home/pawel/Pulpit/mieszkanie/aranzacja/ - przekazanie wyników do programu xargs, który dla każdej danej wejściowej wykonuje określoną czynność, w man'ie dla xargs przy opcji -i jest napisane "-i[replace-str] This option is a synonym for -Ireplace-str if replace-str is
specified, and for -I{} otherwise. This option is deprecated; use -I instead." więc wnioskuję, że przy jej włączeniu wykonuje cp i podaje wartości plików które ma kopiować jako to co zostało uzyskane z poprzedniego polecenia. Inaczej można to określić jako wstawienie wyniku polecenia poprzedniego do nawiasu {} i wykonanie dla każdego pliku polecenia zdefiniowanego zaraz po słowie xargs.
Chyba się trochę zapętliłem - ale w końcu kto normalny pisze o 2 w nocy posta na blogu w piątek :).
Na samym końcu polecenia dodajemy ścieżkę, do której pliki należy skopiować.

Wykorzystanie xargs do usuwania plików jest znacznie łatwiejsze, ponieważ nie trzeba korzystać z -i, np.:

ls -lah | grep 2010-12-04 | awk '{print $8}' | xargs -rf

r - usuwanie rekurencyjne (jeżeli chcemy usunąć same pliki to proponuję korzystać z samej opcji -f bo jak się nam coś omsknie to można "trochę" za dużo usunąć),
f - nie pytaj czy chce usunąć plik/katalog, po prostu go usuń (od ang. force).

sobota, 27 listopada 2010

Sprawdzanie struktury tabeli oraz kluczy głównych i obcych MySql, tworzennie index'ów

Często zdarza się, że strony wczytują się nad wyraz wolno.
Serwer na, którym jest umieszczona baza danych nie jest mocno obciążony (ani CPU ani pamięć), ale i tak strony wczytują się przez wieczność.
W takim przypadku możemy zainwestować w jeszcze mocniejszą maszynę z szybszymi dyskami twardymi, bez gwarancji, że to rozwiąże nasz problem lub zabrać się za optymalizację baz danych.

Zaczynamy od połączenia się z bazą danych:
mysql -u root -p

Po połączeniu sprawdzamy jakie bazy danych są dostępne:
show databases;


Wybieramy jedną z nich:
use nazwa_bazy;


Sprawdzamy jakie są w niej utworzone tabele:
show tables ;

Sprawdzamy jaka jest struktura tabeli:
describe nazwa_tabeli ;
mysql> describe role ;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| rid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | UNI | | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0,00 sec)


Sprawdzamy jakie są klucze główne, klucze obce i index'y:
show index from nazwa_tabeli;
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| system | 0 | PRIMARY | 1 | filename | A | 50 | NULL | NULL | | BTREE | |
| system | 1 | modules | 1 | type | A | NULL | 12 | NULL | | BTREE | |
| system | 1 | modules | 2 | status | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | modules | 3 | weight | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | modules | 4 | filename | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | bootstrap | 1 | type | A | NULL | 12 | NULL | | BTREE | |
| system | 1 | bootstrap | 2 | status | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | bootstrap | 3 | bootstrap | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | bootstrap | 4 | weight | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | bootstrap | 5 | filename | A | NULL | NULL | NULL | | BTREE | |
| system | 1 | type_name | 1 | type | A | NULL | 12 | NULL | | BTREE | |
| system | 1 | type_name | 2 | name | A | NULL | NULL | NULL | | BTREE | |
+--------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
12 rows in set (0,00 sec)

Teraz możemy przystąpić do analizy jakie zapytania generują największe obciążenie i stworzyć index na wybranych kolumnach w tabeli.
Index może składać się z jednej kolumny lub wielu kolumn.

Tworzymy przykładowy index:
create index nazwa_index'u on nazwa_tabeli (nazwa_kolumny);

sobota, 20 listopada 2010

Jak usunąć z banera "jeszcze jeden blog wordpress"

Poniżej przedstawiam wersję hardcore, ponieważ łatwej opcji usuwania tego opisu nie udało mi się znaleźć (z wszelkiego rodzaju CMS'ami jestem trochę na bakier).

Pierwszą czynnością którą wykonałem było wykonanie zrzutu (przez niektórych nazywanego eksportem) bazy danych z WordPress'em do pliku, w celu sprawdzenia gdzie znajduje się wpis "Jeszcze jeden blog WordPress".

Udało mi się odnaleźć wpis:
LOCK TABLES `wp_options` WRITE;
/*!40000 ALTER TABLE `wp_options` DISABLE KEYS */;
INSERT INTO `wp_options` VALUES (1,0,'_transient_random_seed','f47233eb1b9cc4921b1748acbd120bd6','yes'),(2,0,'siteurl','http://klejnotyart.pl','yes'),(3,0,'blogname','klejnotyart.pl','yes'),(4,0,'blogdescription','Jeszcze jeden blog WordPress','yes'),(5,0,'users_can_register','0','yes')

Połączyłem się więc z moją bazą danych:
mysql -u root -p
wpisałem hasło i zatwierdziłem enterem.

Jeżeli baza danych znajduje się na zdalnym serwerze należy dodać jeszcze parametr -h i wpisać adres serwera.

Następnie wyświetliłem dostępne bazy danych:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| drupal |
| joomla |
| mysql |
| portal |
| wordpress |
+--------------------+
6 rows in set (0,00 sec)


Dane dotyczące wordpressa znajdują się oczywiście w bazie zatytułowanej wordpress więc się z nią połączyłem:
mysql> use wordpress ;
Database changed

Kolejnym krokiem było sprawdzenie tabel w bazie danych wordpress oraz sprawdzenie struktury tych tabel:


mysql> show tables;
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
10 rows in set (0,00 sec)

mysql> describe wp_options;
+--------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+----------------+
| option_id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| blog_id | int(11) | NO | PRI | 0 | |
| option_name | varchar(64) | NO | PRI | | |
| option_value | longtext | NO | | NULL | |
| autoload | varchar(20) | NO | | yes | |
+--------------+---------------------+------+-----+---------+----------------+
5 rows in set (0,00 sec)


Wiedziałem ze zrzutu bazy, że interesujące mnie dane są umieszczone w tabeli wp_options.

Pozostało tylko wykonać zapytanie, które wyświetli wpis "jeszcze jeden blog wordpress":
mysql> select * from wp_options where option_id=4;
+-----------+---------+-----------------+------------------------------+----------+
| option_id | blog_id | option_name | option_value | autoload |
+-----------+---------+-----------------+------------------------------+----------+
| 4 | 0 | blogdescription | Jeszcze jeden blog WordPress | yes |
+-----------+---------+-----------------+------------------------------+----------+
1 row in set (0,00 sec)


Alternatywną metodą wykonania tego zapytania jest:
mysql> select * from wp_options where option_value="Jeszcze jeden blog WordPress";
+-----------+---------+-----------------+------------------------------+----------+
| option_id | blog_id | option_name | option_value | autoload |
+-----------+---------+-----------------+------------------------------+----------+
| 4 | 0 | blogdescription | Jeszcze jeden blog WordPress | yes |
+-----------+---------+-----------------+------------------------------+----------+
1 row in set (0,00 sec)


Co jest dość interesujące można zmienić wielkość liter w zwrocie "Jeszcze ..." i dalej zostanie ono wykonane poprawnie:
mysql> select * from wp_options where option_value="jeszcze jeden blog wordpress";
+-----------+---------+-----------------+------------------------------+----------+
| option_id | blog_id | option_name | option_value | autoload |
+-----------+---------+-----------------+------------------------------+----------+
| 4 | 0 | blogdescription | Jeszcze jeden blog WordPress | yes |
+-----------+---------+-----------------+------------------------------+----------+
1 row in set (0,00 sec)


Ostatnim etapem jest zmiana wartości kolumny option_value dla wpisu, którego option_id jest równe 4:
mysql> update wp_options set option_value="" where option_id=4;
Query OK, 1 row affected (0,00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

Pozostaje wejść teraz na stronę ponowie i okaże się, że wpis "Jeszcze jeden blog WordPress" zniknął.

W celu dodatkowego potwierdzenia można też wykonać zapytanie:

mysql> select * from wp_options where option_id=4 ;
+-----------+---------+-----------------+--------------+----------+
| option_id | blog_id | option_name | option_value | autoload |
+-----------+---------+-----------------+--------------+----------+
| 4 | 0 | blogdescription | | yes |
+-----------+---------+-----------------+--------------+----------+
1 row in set (0,00 sec)


Oczywiście w większości przypadków nie chcemy całkowicie usuwać tego wpisu, tylko zmienić jego zawartość np.:
mysql> update wp_options set option_value="blog ninja" where option_id=4 ;
Query OK, 1 row affected (0,00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

W ten "prosty" sposób staliśmy się właśnie szczęśliwymi posiadaczami blogu o ninja :) .

Podejrzewam, że istnieje możliwość wyklikania tej zmiany ale jeżeli w ciągu kilku minut nie mogę znaleźć tej opcji w panelu administracyjnym, ani google nie podaje mi gotowych rozwiązań to wole to zrobić ręcznie i się czegoś przy okazji nauczyć.

niedziela, 14 listopada 2010

Linux jest wszędzie

Na pewno zdarzyło się Wam rozmawiać ze znajomymi i napomknąć o Linux'ie, w odpowiedzi prawdopodobnie usłyszeliście "ale co Ty marudzisz o tym Linux'ie i tak nikt z tego nie korzysta".

Oczywiście w takiej sytuacji można zrobić wywód: większość stron internetowych działa na serwerach Linux'owych lub Unix'owych, większość urządzeń sieciowych działa w oparciu o jakąś wersję tychże systemów.

No i wreszcie najważniejsze, zawsze możecie wskazać na mojego bloga i powiedzieć:
Linux jest nawet na przystankach w Gdańsku :]



Więc następnym razem gdy będziecie w Gdańsku i zadrzecie głowy do góry na przystanku ...
... to oczom waszym ukaże się rozkład elektroniczny działający na systemie operacyjnym Linux.

wtorek, 19 października 2010

Dodanie nowego dysku do macierzy RAID 1, po awarii jednego z dysków

Co zrobić gdy wypadnie nam jeden dysk z RAID'u.

Mam skonfigurowany na maszynie wirtualnej RAID z następującym układem partycji:
/dev/md2 6,3G 1,1G 5,0G 18% /
/dev/md0 992M 40M 902M 5% /boot
tmpfs 292M 0 292M 0% /dev/shm


Miałem skonfigurowany RAID 1 (odbicie lustrzane pierwszego dysku na dysku drugim).
Usunąłem drugi dysk twardy z maszyny wirtualnej i dodałem trzeci dysk (konfiguracja tak, jakby była awaria drugiego dysku i dołożyłbym po prostu inny dysk).

Wynik wykonania polecenia cat /proc/mdstat:
Personalities : [raid1]
md0 : active raid1 hda1[0]
1048704 blocks [2/1] [U_]

md1 : active raid1 hda2[0]
524096 blocks [2/1] [U_]

md2 : active raid1 hda3[0]
6815488 blocks [2/1] [U_]



Jak widać każda partycja jest dodana do RAID'u (/, /boot, tmpfs).
Informacje widoczne w nawiasie [U_] oznaczają awarię dysku drugiego a w szczególności znak "_" przez niektórych nazywany podkreślnikiem .

Sprawdzam za pomocą fdisk -l czy nowo dodany dysk jest widoczny i jakie ma przypisane oznaczenia.
w moim przypadku jest to hdd
kopiuje układ partycji z hda na hdd:
sfdisk -d /dev/hda | sfdisk /dev/hdd
Checking that no-one is using this disk right now ...
OK

Disk /dev/hdd: 16644 cylinders, 16 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/hdd: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0

Device Boot Start End #sectors Id System
/dev/hdd1 * 63 2097647 2097585 fd Linux raid autodetect
/dev/hdd2 2097648 3145967 1048320 fd Linux raid autodetect
/dev/hdd3 3145968 16777151 13631184 fd Linux raid autodetect
/dev/hdd4 0 - 0 0 Empty
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

Przystępuję do odbudowania macierzy:
mdadm /dev/md0 -a /dev/hdd1
mdadm: added /dev/hdd1

Sprawdzam czy wszystkiego nie popsułem:
cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 hdd1[2] hda1[0]
1048704 blocks [2/1] [U_]
[===============>.....] recovery = 76.7% (806528/1048704) finish=0.1min speed=36660K/sec

md1 : active raid1 hda2[0]
524096 blocks [2/1] [U_]

md2 : active raid1 hda3[0]
6815488 blocks [2/1] [U_]

Jak widać, wszystko wydaje się przebiegać pomyślnie.
Po chwili jeszcze raz sprawdzam czy wszystko ok:
cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 hdd1[1] hda1[0]
1048704 blocks [2/2] [UU]

md1 : active raid1 hda2[0]
524096 blocks [2/1] [U_]

md2 : active raid1 hda3[0]
6815488 blocks [2/1] [U_]

unused devices:



Teraz dodaję root'a czyli "/":
mdadm /dev/md2 -a /dev/hdd3
mdadm: added /dev/hdd3

Sprawdzam postęp odbudowy macierzy:
md0 : active raid1 hdd1[1] hda1[0]
1048704 blocks [2/2] [UU]

md1 : active raid1 hda2[0]
524096 blocks [2/1] [U_]

md2 : active raid1 hdd3[2] hda3[0]
6815488 blocks [2/1] [U_]
[==>..................] recovery = 13.5% (924736/6815488) finish=3.4min speed=28689K/sec


Po zakończeniu cat /proc/mdstat pokazuje następujące informacje:
Personalities : [raid1]
md0 : active raid1 hdd1[1] hda1[0]
1048704 blocks [2/2] [UU]

md1 : active raid1 hda2[0]
524096 blocks [2/1] [U_]

md2 : active raid1 hdd3[1] hda3[0]
6815488 blocks [2/2] [UU]

unused devices:

Pozostaje jeszcze dodać md1 czyli tmpfs do RAID'a:
mdadm /dev/md1 -a /dev/hdd2
mdadm: added /dev/hdd2


Pozostaje jeszcze sprawdzenie czy wszystko jest teoretycznie ok:
md0 : active raid1 hdd1[1] hda1[0]
1048704 blocks [2/2] [UU]

md1 : active raid1 hdd2[1] hda2[0]
524096 blocks [2/2] [UU]

md2 : active raid1 hdd3[1] hda3[0]
6815488 blocks [2/2] [UU]

unused devices:

Wygląda na to że się udało. Coś za łatwo poszło :/.
No to przeprowadzę jeszcze crash test, uruchomienie systemu z /dev/hdd, hda będzie odłączony całkowicie.

Lol wiedziałem, że coś za łatwo poszło, przy uruchomieniu z hdd pojawił się komunikat FATAL: No bootable medium found! System halted.

Najprawdopodobniej trzeba jeszcze zainstalować gruba (uruchamiam system z dwoma podłączonymi dyskami twardymi).
Zastosowałem do tego celu metodę delikatną (metoda mniej delikatna jest wykonywana za pomocą dd):
grub
root (hd1,0)
setup (hd1)

Pojawiło się kilka komunikatów, na końcu było succeeded więc, więc odłączam hda zostawiam hdd i sprawdzam co się będzie działo.

Tadam działa, system uruchomił się normalnie.

Sprawdzam czy faktycznie wykaże, że system został uruchomiony z drugiego dysku:
cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 hda1[1]
1048704 blocks [2/1] [_U]

md1 : active raid1 hda2[1]
524096 blocks [2/1] [_U]

md2 : active raid1 hda3[1]
6815488 blocks [2/1] [_U]

Jak widać wykazuje, że wszystko jest ok brakuje pierwszego dysku.

Jeżeli będziecie kiedykolwiek komuś konfigurować RAID'a najlepiej jest od razu zainstalować grub'a na drugim dysku, oszczędzicie sobie sporo czasu w przyszłości gdy padnie dysk pierwszy.

sobota, 2 października 2010

uruchomienie raid 1 na CentOS'ie podczas instalacji systemu

Do niedawna nie miałem okazji zainstalować RAID'a na żadnym z moich komputerów.
Na szczęście praca wymusza przyśpieszenie nauki wielu interesujących zagadnień w najmniej odpowiednich momentach.

Poniżej opiszę proces uruchomienia RAID 1 na Linux'ie CentOS podczas instalacji systemu.

Podstawowe założenia dotyczące układu partycji (jest to podstawowy układ przeznaczony tylko do testów):

/boot 512MB
/swap 1GB
/ reszta (w moim przypadku było to 6 GB)

Większość osób pisze w różnego rodzaju manualach, że partycja boot nie powinna mieć rozmiaru większego niż 100 MB. Ogólnie rzecz biorąc to mógłbym się z tym zgodzić ... , ale tak do końca nie jest, ponieważ jeżeli jesteście osobą, która nie porządkuje systemu regularnie i nie usuwa starych kerneli to przestrzeń na tej partycji może się skończyć.
W domu nie usuwam nic z boot'a bo mam wystarczającą ilość miejsca, ale gdybym ustawił 100 MB to już bym się z jakimiś problemami musiał borykać:
du -hs /boot
116M /boot

Dyski są obecnie coraz tańsze, więc jak chcecie mieć święty spokój na partycję boot można przeznaczyć więcej miejsca np. 512 MB.

Wracając do instalacji systemu to:
- na pierwszym oknie klikam po prostu enter (w linux text pobawię się później),
- wybór języka - wedle uznania, pojawia się informacja dotycząca inicjacji dysków twardych, klikamy na ok dla obu dysków wirtualnych,
- pojawia się komunikat wyszukiwanie, instalacji systemu CentOS, czekam, czekam i jeszcze trochę czekam.
- wybieram raid, następnie wybieram utwórz urządzenie raid.
- punkt montowania /boot, system plików ext3, Urządzenia raid: md0, poziom raid: tu do wyboru ja na początek zapodałem raid 1 (tzw. mirroring - to samo na obu dyskach, jeden padnie z drugiego uruchamiam), w składniki raid zaznaczam hda1 i hdb1
- to samo robię dla hda2 i hdb2 z tym, że typ systemu plików zmieniam na swap i brak punktu montowania + zaznaczam drugą partycję na obu dyskach (oczywiście zaznaczam raid1),
- to samo dla hda3 i hdb3 punkt montowania /, raid 1 i zaznaczam na obu dyskach trzecią partycję.
- klikam dalej, wybieram Program startowy GRUB zostanie zainstalowany na /dev/md0 i klikam dalej,
- na konfiguracji sieci klikam dalej, w domu mam wszystko po dhcp (na serwerze oczywiście należy ustawić statyczny adres IP),
- wpisuje hasło root'a. potwierdzam,
- wybieram składniki systemu,
- wybieram podstawową instalację, bez żadnych dodatkowych składników.

Pojawia się ekran z zwartością CentOS Community ENTerprise Operating System i czekam (a miałem się dzisiaj wcześniej spać położyć).


Później pozostaje tylko uruchomienie ponowne i oglądanie jak się macierz buduje przez watch "cat /proc/mdstat" dla partycji 6GB zajmuje to około 10-20 minut.


Kilka uwag dotyczących instalacji macierzy softwarowej:
- w powyższych punktach mogłem coś namieszać ponieważ testowałem to około tydzień temu, ale cały proces jest bardzo intuicyjny,
- wcześniej próbowałem być cwaniakiem i nie bawić się w tworzenie po kolei partycji na obu dyskach tylko uruchomiłem CentOS'a w trybie linux rescue stworzyłem układ partycji na jednym dysku i skopiowałem go na drugi dysk (sfdisk -d /dev/sda/ | sfdisk /dev/sdb) - oczywiście bycie cwaniakiem się nie opłaciło - graficzny instalator odmówił wykorzystania wcześniej utworzonych partycji jako raid'a (prawdopodobnie jakoś się to da zrobić ale późno już było i literki zaczynały być nieostre),
- powyższa instalacja była przeprowadzona na maszynie wirtualnej Virtualbox, która na moim komputerze spisuje się rewelacyjnie - wystarczy do jednej maszyny wirtualnej podłączyć dwa dyski.

Ogólnie rzecz biorąc instalacja raid 1 programowego nie jest taka straszna i na domowym komputerze/serwerze można go z powodzeniem stosować.
Prawdopodobieństwo, że umrą nam dwa dyski jednocześnie jest niskie, ale takie przypadki u mnie w pracy już miały miejsce.
W takich sytuacjach dysk A mówi do dysku B "mi się już nie chce", a drugi mu na to "mi też" i oba jednocześnie padają :) - albo prawie jednocześnie (zostajemy wówczas ze stertą bezużytecznych danych, których nie da się odczytać no chyba że mamy raid 6)
Więc jeżeli jeden dysk Wam wypadnie to ... pamiętajcie zawsze o tym, żeby dołożyć od razu drugi i odbudować macierz.

wtorek, 21 września 2010

skopiowanie układu partycji na drugi dysk za pomocą sfdisk

Gdzieś usłyszałem, że ludzie dzielą się na dwie kategorie: tych którzy robią kopie bezpieczeństwa i tych którzy zaczną robić kopie bezpieczeństwa.

Można w tym celu tworzyć macierze lub podłączać drugi dysk pod serwer i wykonywać w nocy rsync.
W jednym i w drugim przypadku niezbędne jest utworzenie partycji o takich samym rozmiarze i typie jak na dysku głównym.
Oczywiście można skorzystać z polecenia fdisk na pierwszym dysku i dokładnie taki sam układ partycji zrobić za pomocą również fdisk'a, ale nie ma to większego sensu, ponieważ jest program sfdisk.
W celu skopiowania układu partycji z sda na sdb należy wykonać polecenie:
sfdisk -d /dev/sda | sfdisk /dev/sdb

Przetestowałem to już na dwóch serwerach i w obu przypadkach zadziałało prawie ok, za pierwszym razem musiałem użyć parametru --force, za drugim razem musiałem dodatkowo formatować partycje (dla pierwszej partycji takiej konieczności nie było, ale dla trzeciej większej format był niezbędny).

grub, jak ręcznie uruchomić Linux'a

Czasami zdarza się, że nadpiszemy MBR'a, albo coś namieszamy w ustawieniach programu rozruchowego GRUB, niezbędne jest wtedy samodzielne ręczne uruchomienie systemu.

W takich sytuacjach przydaje się płyta instalacyjna np. z CentOS'em, na pierwszym ekranie zamiast wpisać linux text wpisujemy linux rescue. Klikamy ok, ok i jeszcze kilka razy ok.
Wpisujemy chroot /mnt/sysimage i przystępujemy do instalacji grub'a za pomocą polecenia grub-install --root-directory=/boot /dev/hda

Staram się zawsze mieć założoną pierwszą partycję /boot o wielkości 521MB (większość osób może dawać mniejszą, ale ja mam tendencję do nie usuwania starych krerneli).
Obecnie katalog boot zajmuje u mnie 116 MB i jak na razie jeszcze mi do głowy nie przyszło aby go wyczyścić jeżeli macie inny układ partycji na dysku to "--root-directory=/boot" należy sobie darować.


Po zainstalowaniu należy wpisać reboot i usunąć w międzyczasie płytę z CentOS'em.

Czekamy, czekamy, czekamy i zamiast uruchomionego systemu pojawia się:
grub>
Możemy wpisać help i patrzeć na opis podstawowych poleceń, gdy ich oglądanie się już nam znudzi wpisujemy:
root (hd0,0)
i pojawia się Filesystem type is ext*fs, partition type 0x83
teraz pozostaje już tylko wybrać kernel przez polecenie:
kernel /vmlinuz-2.6.18-8.el5 ro root=/dev/hda4

Słów kilka w celu wyjaśnienia, nikt na pamięć nie zna aktualnego kernela, z którego system się uruchamia (nikt normalny), wiec wpisujemy kernel /vmlinu i dopełniamy klawiszem tab (działa dokładnie tak samo jak w bash'u), wybieramy partycję, na której jest główny system plików czyli "/" w domu mam hda4 w pracy hda3 - można się pogubić. Wciskamy enter.

Pozostaje jeszcze wpisać initrd /initrd-2.6.18-8.el5.img
tak jak to zwykle w Linux'ie bywa dopełnienie polecenia klawiszem tab działa i nie trzeba uczyć się na pamięć poszczególnych nazw.

Mamy wybranego kernela mamy initrd pozostaje jeszcze wpisać boot.

Jak już jestem przy grub'ie i chcemy uruchomić system w jakimś innym trybie np. fastboot to na ekranie wyboru kernela wciskamy c najeżdżamy na wybrany kernel, wciskamy e dopisujemy na końcu wiersza fastboot i wciskamy enter. W ten sprytny sposób uruchamiamy system bez wykonania fsck.

czwartek, 16 września 2010

/etc/init.d/named restart ... fail

Wszystko ładnie pięknie, subdomena dodana w cPanel'u, odpowiednie rekordy zmodyfikowane rndc reload i ... nic.
No to jak gdyby nigdy nic podbijam seriala i /etc/init.d/named restart i mym oczom ukazuje się FAIL.
no to cd /var/named/data i sprawdzam log od końca. Znajduję kto jako ostatni robił modyfikacje i przy jakiej domenie zanim bind się wyłożył. Przeglądam /var/named/lamer.pl.db znajduje nieprawidłowy wpis i /etc/init.d/named start i wszystko działa.
Niektórzy tak bardzo chcieliby mieć możliwość samodzielnej modyfikacji rekordów, ale nikt rozsądny takiej możliwości nie udostępni - przecież jeden błędny wpis potrafi wyłożyć bind'a, a Ty człowieku dochodź co jest nie tak.

exim czyszczenie maili z kolejki ciąg dalszy

Byłem całkiem zadowolony z siebie bo myślałem, że potrafię usuwać maile z kolejki - taki stan trwał do dzisiejszego wieczoru.
Nagios zgłosił 14 000 maili w kolejce, loguje się sprawdzam i ... okazało się, że klient wysyła mailing z innego serwera a zwrotki przychodzą na nasz serwer współdzielony.
No to zapodaje exim -bp i okazuje się, że jest tego multum i że po adresie nie przegrepuje - id wiadomości i adres odbiorczy są w dwóch wierszach.
Jakoś nie miałem koncepcji jak to wszystko wyciąć, nie wycinając przy okazji maili pozostałych klientów.
Google przyszło mi z pomocą.
Wystarczyło przejść do /var/spool/exim/input i wydać polecenie:

grep spamer@debil.com * -r | awk '{print $1}' | cut -d: -f1 | xargs rm -f -v

oczywiście na początku sprawdzacie czy poprawnie zadziała więc:
- grep spamer@debil.com * -r (sprawdzacie czy wyłapuje wiadomości przychodzące),
- grep spamer@debil.com * -r | awk '{print $1}' (sprawdzacie czy wyłapuje nazwę wiadomości + zbędne rzeczy);
- grep spamer@debil.com * -r | awk '{print $1}' | cut -d: -f1 (ustawiacie separator na dwu kropek i wyświetlacie pierwsze pole z nazwą pliku),
- grep spamer@debil.com * -r | awk '{print $1}' | cut -d: -f1 | xargs rm -f -v (finał - czyli to co lubię najbardziej exterminacja wszystkich wiadomości od spamera -v żebym widział co się dzieje).

Ogólnie rzecz biorąc powyższa metoda pomogła mi usunąć 14 000 z kolejki i 'chyba' nie usunąłem żadnej ważnej wiadomości.

poniedziałek, 13 września 2010

Bootowalny pendrive z różnymi dystrybucjami ciąg dalszy

No i okazało się, że ze stworzeniem bootowalnego pendriva z różnymi dystrybucjami nie jest wcale tak różowo.
Narzędzie dostępne na stronie http://www.pendrivelinux.com/boot-multiple-iso-from-usb-multiboot-usb/ działa poprawnie, ale ma jedną zasadniczą wadę - jest dostępne dla określonej liczby dystrybucji. Więc jeśli chcecie mieć tak jak ja bootowalnego pendriv'a z:
- CentOS netinstall i386 i amd64;
- Debian netinstall i386 i amd64;
- ubuntu server i386 i amd64
plus kilka innych dystrybucji np. HBCD, Gparded, Cdlinux, to niestety pozostaje samodzielna instalacja na pendriva i zabawa z grubem.

czwartek, 9 września 2010

Jak uruchomić Linux'a z ominięciem fsck czyli tak zwany fastboot

Zadać możecie pytanie, czemu chce uruchomić system bez fsck odpowiedzi może być kilka:
- mam wielki dysk twardy i śpieszy mi się;
- system nie chce się uruchomić po wykonaniu fsck, chce tylko skopiować dane na inny dysk.

Jest kilka dostępnych opcji uruchamiania systemu za pomocą fastboot'a ja preferuję opcję z edycją pliku grub.conf (najpierw należy uruchomić system z pendrive'a lub płyty live).
Następnie rozpocząć edycję pliku /boot/grub/grub.conf, znaleźć coś w stylu title CentOS (2.6.18-194.8.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-194.8.1.el5 ro root=/dev/VolGroup00/LogVol00 rhgb
initrd /initrd-2.6.18-194.8.1.el5.img

i po rhgb (czasami za rhgb jest jeszcze quiet) dodać wpis fastboot. Całość powinna wyglądać w ten sposó:

title CentOS (2.6.18-194.8.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-194.8.1.el5 ro root=/dev/VolGroup00/LogVol00 rhgb fastboot
initrd /initrd-2.6.18-194.8.1.el5.img

Po wprowadzeniu fastboot należy zapisać zmiany i wykonać reboot.
Po restarcie system uruchomi się bez wykonywania fsck.


Przydatnym poleceniem jest również tune2fs /dev/hdx.
Gdy wywołamy je z opcją -l uzyskamy wiele przydatnych informacji np. ile razy była podmontowana partycja i po którym razie zostanie wykonane automatycznie fsck.
Można zmienić ilość montowań po których zostanie wykonane fsck np. po 30 za pomocą polecenia tune2fs /dev/hda3 -c 30.

poniedziałek, 6 września 2010

Tworzenie bootowalnego pendriva z wieloma dystrybucjami Linux'a

Niestety jeszcze nie miałem okazji przetestować działania procedury tworzenie pendrive'a z wieloma dystrybucjami Linux'a ale opis na stronie http://www.pendrivelinux.com/boot-multiple-iso-from-usb-multiboot-usb/ zapowiada się obiecująco.
W najbliższej przyszłości postaram się go przetestować.

niedziela, 5 września 2010

Tworzenie bootowalnego pendrive'a z linux'em

Okazało się, że w związku ze zmianami w pracy bootowalny pendrive będzie niezbędny. Najczęściej wykorzystywaną dystrybucją na serwerach firmowych jest centOS, więc właśnie na tą dystrybucję padło.
Doszedłem do wniosku, że najlepiej będzie zainstalować wersję live centOS'a, ponieważ wszystkie opcję są dla mnie wówczas dostępne (linux text, rescue, tryb graficzny).
CentOS został zainstalowany na pendrive'ie corsair 8GB i muszę przyznać, że zostałem pozytywnie zaskoczony szybkością z jaką działał centOS w trybie graficznym.

Przejdźmy jednak do rzeczy bo z rana trzeba wstać :/ :
- do instalacji na pendrive'ie był potrzebny obraz live iso centOS'a i program liveusb-creator-3.9.1-setup.exe pobrany ze strony https://fedorahosted.org/releases/l/i/liveusb-creator/ (tak wiem skorzystałem z łyndowsa - nawet mi się czasami zdarza).

Cała procedura była banalnie prosta, instalacja programu liveusb-creator-3.9.1 (najnowsza wersja nie chciała współpracować z moim łynodwsem), podłączenie pendriva, umieszczenie obrazu centOS'a gdzieś na dysku, uruchomienie liveusb-creator wskazanie pliku z obrazem, wskazanie dysku, na którym obraz ma zostać zainstalowany, odczekanie około 1 minuty i 30 sekund.

Ta dam, mam bootowalnego pendriva z centOS'em.

Teraz trzeba będzie tylko rozkminić jak stworzyć bootowalnego pendriv'a z wieloma dystrybucjami ale za to zabiorę się gdy będzie więcej wolnego czasu.

sobota, 21 sierpnia 2010

Zabijanie procesów MySQL wybranego użytkownika

Kilka razy zdarzyło mi się, że klient miał jakiś błąd w skrypcie, który powodował otwieranie mnóstwa procesów w bazie danych MySQL, które nie chciały się zakończyć.

Wyjściem z sytuacji może być restart MySQL'a ale nie zawsze możemy sobie na takie rozwiązanie pozwolić (właściciele, blogów, portali, wortali, sklepów internetowych mogą nas zlinczować).

Pozostaje nam wyłapać procesy określonego użytkownika i je zabić.
Poniżej umieszczam ciąg poleceń, które nam to umożliwią (wiem, że można to zrobić o wiele prościej ale akurat tych poleceń nie mam pod ręką). Wersja hardcore:
mysqladmin processlist -p > dupa.txt && cat dupa.txt | grep root > dupa2.txt && cat dupa2.txt | tr '|' ' ' > dupa3.txt && cat dupa3.txt | awk '{print $1}' > dupa4.txt && for adresss in $(cat dupa4.txt); do mysqladmin kill $adresss -p ; done

Jeżeli chcecie powyższe polecenie stosować na serwerach produkcyjnych to można je znacznie skrócić.
Mysqladmin processlist wyświetla listę wszystkich procesów MySQL'a, przełącznik -p zaznacza, że ma pytać o hasło (w pracy z konta roota mogę zalogować się bez podania hasła - jak ktoś się włamie na root'a to i tak może wszystko), robię zrzut listy procesów do pliku dupa.txt i wyświetlam plik dupa.txt, znajduję wszystkie procesy uruchomione przez użytkownika root (można zmienić na dowolnego) i robię zrzut do pliku dupa2.txt. Wyświetlam zawartość dupa2.txt i za pomocą polecenia tr (od transform) przekształcam wszystkie znaki "|" na "nic" robię zrzut do pliku dupa3.txt. Ponownie wyświetlam zawartość pliku i wynik przekierowuje do programu awk aby wyświetlić tylko pierwszą kolumnę, w której są zawarte numery ID procesów użytkownika root i zrzucam do pliku dupa4.txt. Dla każdego adresu z pliku dupa4.txt wykonuje polecenie mysqladmin kill numer_id_procesu i oczywiście ma spytać o hasło.
Pozostaje tylko wpisać hasło tyle razy, ile mam procesów do ubicia.

I w ten oto niesprytny sposób, ubiliśmy wszystkie procesy MySQL użytkownika root.

Procesy przed wykonaniem polecenia:
+-----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------+----+---------+------+-------+------------------+
| 236 | root | localhost | | Sleep | 500 | | |
| 237 | root | localhost | | Sleep | 428 | | |
| 247 | root | localhost | | Query | 0 | | show processlist |
+-----+------+-----------+----+---------+------+-------+------------------+

Procesy po wykonaniu polecenia:
+-----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------+----+---------+------+-------+------------------+
| 254 | root | localhost | | Query | 0 | | show processlist |
+-----+------+-----------+----+---------+------+-------+------------------+


Wiem, że można znacznie łatwiej, za pomocą xargs, ale jest późno, komary atakują i oczy tracą ostrość.

W planach mam opisanie w niekoniecznie najbliższej przyszłości: bind ciąg dalszy, postfix czyszczenie kolejki, no i może psychole FTP atakują - czyli jak wyczerpać ilość dostępnych sesji FTP i siać zamęt i zgorszenie.

Czyszczenie kolejki wiadomości w exim'ie

Dość często zdarza się, iż w kolejce mamy setki, a nawet tysiące wiadomości do wysłania. Zdarzyć się tak może z wielu powodów np.:
- jakiś spamer uruchomił skrypt spamerski na naszym serwerze i wysyła na potęgę reklamy viagry lub reklamuje strony z pornografią, lub nawiedzony przedsiębiorca wysyła do wszystkich znanych (i nieznanych) adresatów reklamę swoich produktów / usług,
- ktoś spamuje serwer, bo lubi, bo zarabia na tym pieniądze lub nie lubi kogoś kto ma na naszym serwerze konto pocztowe (jakiś czas temu chciałem zaspamować promotora - straszny burak z niego był),
- ktoś ustawił sobie przekierowanie wiadomości przychodzących na niedziałający adres i do tego włączył autoresponder (wiadomości jest wysyłana na zewnętrzny serwer, zewnętrzny serwer odpowiada nie ma takiego użytkownika wtedy my wysyłamy potwierdzenie że wiadomość otrzymaliśmy i tak w kółko).


Poniżej przedstawiam polecenie, które usunie wszystkie zamrożone wiadomości z kolejki:
exim -bp | grep frozen | awk '{print $3}' | xargs exim -Mrm

Pierwsza część polecenia wyświetla listę wiadomości w kolejce, druga wyłapuje z tej listy wiadomości ze statusem zamrożona, trzecia (awk) wyświetla tylko trzecią kolumnę, w której znajduje się ID wiadomości, czwarta za pomocą xargs usuwa wszystkie wiadomości o podanym ID.

Czasami czyszczenie zamrożonych wiadomości nie wystarczy, wtedy wyszukuję wiadomości, które wiszą w kolejce przez określony czas np.:
exim -bp | grep [234567890][d]| less
exim -bp | grep [234567890][h]| less
exim -bp | grep [234567890][m]| less

Pierwsze polecenie wyłapuje dni, drugi godziny, a trzecie minuty. Do tego wszystkiego dołożyłem less bo czasami dobrze sprawdzić czy ważnych wiadomości nie usuwamy. Jeżeli po sprawdzeniu okaże się, że kolejce wiszą same śmieci można less zastąpić awk '{print $3}' | xargs exim -Mrm.
Powyższa metoda nie jest niestety doskonała, ponieważ czasami w id wiadomości znajduje się cyfra i litera d,h,m - wówczas możemy usunąć wiadomość z kolejki, która nie koniecznie miała być usunięta. Dlatego zawsze, ale to zawsze trzeba być czujnym jak ważka :).

Dobra, wszystko ładnie i pięknie ale możecie powiedzieć skąd mam wiedzieć czy to jest spam, czy normalna wiadomości.
Najpierw znajdujemy wiadomość, która wisi, exim -bp | grep frozen.
Gdy już mamy jej id możemy przejrzeć jej:
body (czyli całą treść wiadomości) exim -Mvb id_wiadomości
headers (czyli nagłówki) exim -Mvh id_wiadomości
logi (skąd dokąd i kiedy) exim -Mvl id_wiadomości

Gdy się okaże że wiadomość zawiera spam możemy od razu ją usunąć np. exim -Mrm id_wiadomości

Jak już wspomniałem o spamerach, to mogą oni wysyłać spam na dwa główne sposoby za pomocą apacha i sendmaila, za pomocą exima (czyli połączenie za pomocą klienta poczty).
Gdy spamują za pomocą WWW, wystarczy sprawdzić access_logs Apacha np.: grep post -i access_logs.
Gdy spamują za pomocą skrzynki pocztowej możemy przejrzeć logi exima na żywo: tail -f /var/log/exim_mainlog, następnie przegrepować po loginie: exigrep adres@email_spamera.pl /var/log/exim_mainlog.
Exigrep jest o tyle wygodny, że pokazuje cały log dotyczący wybranej wiadomości, samo polecenie grep pokaże nam tylko fragment logów.
Można też grepować logi po sendmailu.
Czasami spamerzy są sprytni, tzn. umieszczają skrypt spamerski, robią wysyłkę, usuwają skrypt spamerski, czyszczą access_logs (jeżeli mają do nich dostęp). W takich sytuacjach dobrze jest przeszukać logi serwera FTP i sprawdzić czy przypadkiem jakieś pliki o podejrzanych nazwach nie były wgrywane na serwer.

Oczywiście gdy już złapiemy spamera i zablokujemy możliwość wysyłania spamu, należy pamiętać o wyczyszczeniu wiadomości znajdujących się w kolejce.

poniedziałek, 2 sierpnia 2010

Jak mieć wszystkie komunikatory w poważaniu.

Wystarczy zainstalować Linux'a założyć, koledze/koleżance konto i umożliwić im logowanie za pomocą SSH.

Zakładam, że ja mam login root, a znajomy ma login pawel.

Obaj jesteśmy zalogowani przez ssh. Najpierw wysyłam komunikat do wszystkich:
wall [wciskam enter]
wprowadzam jakikolwiek komunikat [wciskam enter]
zatwierdzam wysłanie wiadomości [wciskam ctrl + d]


W ten oto prosty sposób wysłałem komunikat do wszystkich:

zbiorowy komunikat od użytkownika pawel@pawel-laptop
(/dev/pts/3) at 22:23 ...

alo



Istnieje możliwość zablokowania otrzymywania komunikatów, oraz odblokowania mesg y [włączenie], mesg n [wyłączenie].


Kolejną interesującą opcją jest pisanie do wybranego użytkownika za pomocą write login.
Najpierw sprawdzamy, na którym terminalu się znajdujemy
root@pawel-laptop:~# tty
/dev/pts/2

pawel@pawel-laptop:~$ tty
/dev/pts/3


Teraz jako root wpisujemy write pawel pts/3 i możemy wpisać dowolny tekst - no prawie, bez polskich znaków oczywiście.

Gdy Paweł będzie chciał odpisać do root'a najpierw sprawdza, na którym terminalu jest on zalogowany:
pawel@pawel-laptop:~$ finger
Login Name Tty Idle Login Time Office Office Phone
pawel pawel tty7 Aug 2 21:29 (:0)
pawel pawel pts/0 4 Aug 2 21:32 (:0.0)
pawel pawel pts/3 Aug 2 22:01 (:0.0)
root root pts/2 4 Aug 2 21:59 (localhost)

następnie wpisuje write root pst/2 lub po prostu write root (root jest tylko zalogowany na jednym terminalu). Istnieje również program talk, ale stwierdzam, że program write w zupełności wystarcza do rozmowy.

niedziela, 25 lipca 2010

Bind ciąg dalszy

W ostatnim artykule dotyczącym bind'a opisałem podstawową instalację oraz konfigurację, teraz przyszła pora na umożliwienie odpytania naszego serwera DNS przez inne hosty.

Pierwszą i podstawową czynnością (sprawdzone empirycznie) jest umożliwienie połączeń z określonych numerów IP na numer portu 53, czyli ten, na którym działa DNS (zakładam, że serwer DNS ma być udostępniony tylko dla sieci lokalnej).

Więc przechodzimy do /etc/sysconfig i robimy kopię bezpieczeństwa iptables
cp iptables iptables.backup , następnie edytujemy zawartość pliku iptables.
Ja dodałem tylko dwie reguły umożliwiające dwóm hostom odpytywanie serwera DNS:
-A RH-Firewall-1-INPUT -p udp -s 192.168.1.3 --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -s 192.168.1.2 --dport 53 -j ACCEPT

obie reguły muszą być dodane przed wierszem:
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited


Zapisujemy zmiany i restartujemy iptables (/etc/init.d/iptables restart) jak wyrzuci errory jakieś to trzeba znaleźć błędy w pliku i je poprawić.

Wcześniej tych reguł nie dodałem i niestety nie byłem w stanie odpytać serwera dns, wireshark i iptraf pokazywał komunikat:
icmp-host-prohibited
więc jeżeli zobaczycie taki komunikat, to pierwszą rzeczą, którą należy sprawdzić jest iptables.

Wcześniej próbowałem dodać przez wpisanie iptables -A INPUT -s i tak dalej, ale niestety nie przynosiło to żadnego efektu, pewnie w tych Red Hatowych iptables inaczej dodaje się reguły, ja wolałem po prostu edytować plik.


Teraz należy przystąpić do edycji pliku /etc/named.conf jego fragment wygląda następująco:

// Red Hat BIND Configuration Tool
//
// Default initial "Caching Only" name server configuration
//
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
allow-query { 192.168.1.3; 192.168.1.2 ;};
listen-on port 53 { 127.0.0.1; 192.168.1.4;};
//forwarders { 192.168.7.1; 192.168.2.1; };
};

zone "." IN {
type hint;
file "named.root";
};

zone "localdomain." IN {
type master;
file "localdomain.zone";
allow-update { none; };
allow-query {0.0.0.0/0;};
};

zone "localhost." IN {
type master;
file "localhost.zone";
allow-update { none; };
};




Przez wiersz allow-query { 192.168.1.3; 192.168.1.2 ;}; definiujemy kto może odpytywać nasz serwer DNS, ja zdefiniowałem dwa adresy ale można wszystkim umożliwić odpytywanie serwera DNS przez wprowadzenie wpisu allow-query { "any";};.

Kolejnym ważnym wierszem jest listen-on port 53 { 127.0.0.1; 192.168.1.4;};
, w którym definiujemy na którym porcie ma nasłuchiwać serwer (53) oraz na których numerach IP (to też jest jakaś metoda ochrony, ponieważ jeżeli damy tylko lokalny adres IP, a nie zewnętrzny nikt nie z zewnątrz nie będzie w stanie odpytać naszego serwera DNS).


Dla każdej domeny obsługiwanej przez serwer można jeszcze zdefiniować następujące opcje:
allow-update { none; }; // czyli kto może aktualizować informacje o wybranej strefie,
allow-query {0.0.0.0/0;}; // kto może odpytywać nasz serwer DNS,
allow-transfer // przydatne gdy nasz serwer chce wysyłać informacje o wybranej strefie do serwera master (popularne rozwiązanie w firmach hostingowych, mamy własny serwer VPS i trzeba wysłać informacje o podpiętych domenach do serwera nadrzędnego),
//forwarders { 192.168.7.1; 192.168.2.1; }; ta opcja się czasami przydaje, gdy chcemy zdefiniować do jakich serwerów mają być przekierowywane pytania o domeny, jeżeli nasz serwer DNS ich nie obsługuje. W moim przypadku pozostawiłem je zakomentowane i serwer i tak działał poprawie.

W większości przypadków allow-update powinno być ustawione na none, lub powinny tam zostać wypisane numery IP serwerów, które mogą aktualizować informacje o strefie.
Allow-query albo wszyscy albo tylko komputery z sieci lokalnej.
Allow-transfer gdy mamy jakiś serwer nadrzędny.
Jeżeli się popełni błąd w plikach wymienionych powyżej, to można np. komuś z zewnątrz umożliwić modyfikacje strefy obsługiwanej przez nasz serwer DNS, a tego byśmy raczej nie chcieli.

No tak, jeszcze na komputerze, który ma korzystać z naszego serwera DNS należy zmodyfikować zawartość /etc/resolv.conf i wprowadzić np.:
nameserver 192.168.1.4

sobota, 24 lipca 2010

Rewrite, rewrite i jeszcze raz rewrite

Sytuacja przedstawia się w sposób następujący, mamy zainstalowany serwer Apache, bazę danych MySQL no i oczywiście PHP.

Traf chciał, że zachciało się nam pouczyć rewrite'ów trzeba tylko włączyć mod_rewrite w Apachu wpisujemy więc:
sudo a2enmod rewrite


Testujemy czy rewrity działają i nic, kompletnie nic się nie dzieje, dalej nie działają.

Więc przechodzimy do /etc/apache2 i ls mods-available | grep rewrite
rewrite.load

Czyli teoretycznie powinno działać, ale niebędne jest jeszcze wprowadzenie zmian w /etc/apache2/sites-available/default

W związku z tym, że to nie jest serwer produkcyjny i bezpieczeństwem się nie przejmujemy, można po prostu zmodyfikować wpis dotyczący katalogu /var/www aby przybrał postać:

Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all


Następnie zrestartować Apacha i cieszyć się z działających rewritów.

Podstawowe informacje dotyczącego tego do czego służą rewrity, przyjazne linki można znaleźć na stronie:
http://northpole.pl/przyjazne-linki/

Nagrywanie czynności wykonywanych na pulpicie

Na pewno zdarzyło się Wam tłumaczyć komuś bardzo proste zagadnienie np. konfiguracja klienta pocztowego. Problem w tym, że osoba której tłumaczycie, musi mieć coś opisanego krok po kroku i z prostego opisu robi się wówczas pół strony albo i więcej.

Rozwiązaniem jest nagranie filmiku przedstawiającego wszystkie czynności i przesłanie takiemu osobnikowi.

Gdy pracujemy na Linux'ie do tego celu może nam posłużyć program gtk-recordmydesktop, który jest nakładką graficzną na recordmydesktop, gdy pracujemy na łyndowsie to możemy posłużyć się programem ... nie mam pojęcia jakim i jest mi z tym dobrze :).

Po zainstalowaniu programu, wybieramy które okno ma być nagrywane i rozpoczynamy (program też nagrywa dźwięk więc możemy zrobić profesjonalny filmik instruktarzowy).

Po nagraniu przesyłamy filmik osobie zainteresowanej i wszystko powinno być już załatwione ..., ale nie jest. Po kilku minutach dostajemy telefon, że go nie mogą uruchomić bo to jest format ogv (to jest przykład z życia wzięty).

Więc nie pozostaje nam nic innego jak odpowiedzieć goń się :) lub konwertować filmik z ogv na avi za pomocą polecenia:

mencoder input.ogm -ovc xvid -oac mp3lame -xvidencopts pass=1 -o output.avi

Tak z innej beczki jeżeli chcemy sprawdzić jaki pakiet jest odpowiedzialny za record na systemach Debian'owych można wpisać:
apt-cache search record

W pracy niestety z opisanego powyżej rozwiązania nie korzystam, ale mam wrażenie że czami by się przydało (niektórzy mają problemy z przyswajaniem tekstu pisanego, z obrazkami idzie im o wiele lepiej).

sobota, 17 lipca 2010

Screen, czyli jak połączyć się zdalnie z serwerem, uruchomić skrypt, którego wykonanie zajmuje kilka godzin, rozłączyć się i pójść spać.

W celu uruchomienia screen'a w terminalu wpisujemy:
- screen

Jeżeli chcemy aby screen miał określoną nazwę (często na serwerze mamy uruchomionych kilka screenów i wygodniej jest wiedzieć, który jest od czego):
screen -S przykladowa_nazwa

Gdy chcemy się połączyć ze screen'em który w dalszym ciągu jest podłączon (Attached):
screen -x nazwa_screena

Gdy chcemy połączyć się ze screenem, który jest odłączony (Detached):
screen -r nazwa_screena

Usuwanie screen'a:
screen -wipe nazwa screena

Odłączanie się od screen'a bez zamykania sesji:
ctrl + a, ctrl + d


Wyłączanie screen'a:
ctrl + a, ctrl + k

Wyświetlanie uruchomionych screenów:
screen -ls

Teraz chyba będzie najfajniejszy trick w ramach jednej sesji screen'a można mieć uruchomionych kilka okien. Tworzenie nowego okna:
ctrl + a, ctrl +c

Przełączanie się pomiędzy poszczególnymi oknami:
ctrl + a, ctrl + n
ctrl + a, ctrl + p

Instalacja bind'a na centOS'ie

Załóżmy, że chcesz zainstalować bind'a na CentOS'ie ale nie wiesz jakie wpisy powinny być w poszczególnych plikach konfiguracyjnych.

Istnieje możliwość oszukania wszystkich tych, którzy twierdzą, że trzeba do tego przeczytać przynajmniej jedną książkę i mnóstwo how to w Internecie. Założenia są następujące:
- jest jeden serwer na którym będzie działał serwer DNS, bez środowiska graficznego,
- mamy drugi komputer lub uruchomioną maszynę wirtualną z centOS'em ze środowiskiem graficznym.

Pomysł polega na tym aby na maszynie ze środowiskiem graficznym zainstalować bind'a za pomocą narzędzia system-config-bind i następnie zainstalować binda na serwerze bez środowiska graficznego i przekopiować odpowiednie pliki.

Rozpoczynamy od instalacji narzędzia graficznego do konfiguracji bind'a na komputerze ze środowiskiem graficznym (a pani z polskiego mówiła, żeby takie same wyrazy się nie powtarzały w jednym zdaniu ):
- yum install system-config-bind

Uruchamiamy narzędzie graficzne przez wprowadzenie w konsoli system-config-bind.
Tak w ogóle to właśnie instaluje tego centOS'a ze środowiskiem graficznym i traf chciał, że zapodałem yum update i jak by to powiedzieć it is taking forever.
Jest na etapie cleanup więc chyba nie będzie tak źle.

No i poszło wreszcie zaczynamy:
yum install system-config-bind

No i się po drodze okazało, że nie ustawiłem aby była komunikacja pomiędzy komputerem matką, a maszyną wirtualną.
Czyli jak zwykle bridge-adapter, trzeba było jeszcze usunąć podmonotowywanie pliku iso, bo mi się chciał centOS jeszcze raz instalować, a tego bym raczej nie przeżył.
Po domyślnej instalacji ze środowiskiem graficznym system wstaje w trybie tekstowym.
Polecenie znane wszystkim użytkownikom linuxa startx uruchamia system w trybie graficznym, alternatywnym wyjściem jest wpisanie init 5.

W celu sprawdzenia czy serwer działa poprawnie jako cache DNS (nie ma ustawionej żadnej strefy, tylko odpytujemy inne serwery) należy wprowadzić zmiany w /etc/resolv.conf.

Należy za komentować wszystkie tzw. nameservery i dodać nameserver 127.0.0.1 (czyli będziemy odpytywać siebie sami) i oczywiście wystartować bind'a /etc/init.d/named start
jak się pojawi ok, to wszystko działa (jeszcze działa).

Pingujemy lub korzystamy z polecania host -a lub dig nazwa_domeny, nie mamy takich informacji w konfiguracji serwera DNS więc serwer musi odezwać się do innych serwerów DNS - co mu się z powodzeniem udaje.

No to sprawdzamy czy faktycznie odpytuje mój i tylko mój działający serwer DNS, czy też korzysta z jakiegoś innego:

host -a wp.pl
Trying "wp.pl"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63008
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 3, ADDITIONAL: 2

;; QUESTION SECTION:
;wp.pl. IN ANY

;; ANSWER SECTION:
wp.pl. 3600 IN TXT "v=spf1 ip4:212.77.96.0/19 ip4:195.205.40.200/29 mx -all"
wp.pl. 3600 IN MX 5 mx5.wp.pl.
wp.pl. 3600 IN MX 0 mx.wp.pl.
wp.pl. 3600 IN SOA ns2.wp.pl. dnsmaster.wp-sa.pl. 2010070802 900 600 86400 3600
wp.pl. 3379 IN A 212.77.100.101
wp.pl. 3600 IN NS ns1.task.gda.pl.
wp.pl. 3600 IN NS ns2.wp.pl.
wp.pl. 3600 IN NS ns1.wp.pl.

;; AUTHORITY SECTION:
wp.pl. 3600 IN NS ns1.task.gda.pl.
wp.pl. 3600 IN NS ns2.wp.pl.
wp.pl. 3600 IN NS ns1.wp.pl.

;; ADDITIONAL SECTION:
mx.wp.pl. 3600 IN A 212.77.101.4
mx5.wp.pl. 3600 IN A 212.77.101.9

Received 335 bytes from 127.0.0.1#53 in 53 ms


Tak, wiem czytacie i czytacie, a tak naprawdę ważna jest tylko ostatni wiersz:
Received 335 bytes from 127.0.0.1#53 in 53 ms


uruchamianie nameda przy starcie systemu:
/sbin/chkconfig named on

Wąłczanie uruchamiania nameda przy starcie systemu:
/sbin/chkconfig named of


Po przekopiowaniu plików na maszynę bez środowiska graficznego niestety nie chciała się ona normalnie uruchomić, w /var/log/messages znalazłem następujące informacje:
- nieprawidłowe uprawnienia do pliku /etc/named.conf oraz /etc/rndc.key
Sprawdziłem więc jakie uprawnienia mają wskazane pliki na serwerze ze środowiskiem graficznym:
-rw-r--r-- 1 root root 1,3K kwi 28 2005 named.conf
-rw-r----- 1 root named 108 lip 12 23:57 rndc.key

Zmieniłem więc uprawnienia wskazanych plików, ale dalej named nie działał poprawnie.
Poprawiłem uprawnienia w katalogu /var/named na:
drwxrwx--- 2 named named 4,0K sty 20 17:33 data
-rw-r--r-- 1 root named 208 kwi 28 2005 localdomain.zone
-rw-r--r-- 1 root named 195 kwi 28 2005 localhost.zone
-rw-r--r-- 1 root named 427 kwi 28 2005 named.broadcast
-rw-r--r-- 1 root named 424 kwi 28 2005 named.ip6.local
-rw-r--r-- 1 root named 426 kwi 28 2005 named.local
-rw-r--r-- 1 root root 1,3K lip 12 23:57 named.root
-rw-r--r-- 1 root named 427 kwi 28 2005 named.zero
drwxr-xr-x 2 named named 4,0K lip 12 23:57 slave
drwxrwx--- 2 root named 4,0K sty 20 17:33 slaves


coś nie chciało pójść więc przeinstalowałem system (jak coś nie działa to albo debugujemy albo reinstall w wielu przypadkach reinstall jest rozwiązaniem szybszym):

Po reinstalacji centOS'a bez środowiska graficznego skopiowałem pliki przez tarowaniez zachowaniem uprawnień "tar -pcvf named.tar.gz named"
i rozpakowałem z zachowaniem uprawnień "tar -pxvf named.tar.gz"

Oprócz skopiowania na serwer katalogu /var/named trzeba również skopiować następujące pliki:
- /etc/named.conf
- /etc/rndc.key
- /etc/request-key.conf

Uruchomiłe serwer bind i przetestowałem działanie jeszcze raz i wszystko działa poprawnie nawet bez środowiska graficznego.
Więc jak chcecie zainstalować serwer DNS, to powyżej macie najłatwiejszą opcję jego konfiguracji.

W planach na przyszłość mam zainstalowanie serwera bind z wykorzystaniem chroot (większe bezpieczeństwo, nawet jak ktoś przejmie kontrolę nad bind'em to będzie uwięziony w jego katalogu).

tar z zachowaniem uprawnień

Często zdarza się przenoszenie plików i katalogów na inny serwer i chcemy aby po przeniesieniu miały one takie same uprawnienia jak na poprzednim serwerze.

Rozwiązaniem jest spakowanie plików i/lub katalogów za pomocą polecenia tar z wykorzystaniem przełącznika -p (ang. preserve czy jakoś tak :]).

tar -pcvf named.tar.gz named

Powyższe polecenie pakuje zawartość katalogu named do archiwum named.tar.gz z zachowaniem uprawnień.
Gdy już przeniesiemy plik na inny serwer to można go rozpakować również z zachowaniem uprawnień.

tar -pxvf named.tar.gz

Powyższe polecenia rozpakowuje archiwum w katalogu bieżącym i z zachowaniem uprawnień.

Przełącznik -p działa również dla innych poleceń takich jak scp oraz rsync.

wtorek, 6 lipca 2010

konfiguracja interfejsów sieciowych centOS

Często zdarza się tak, że chcemy aby po restarcie serwera uzyskał on określone adresy IP, lub żeby po restarcie networka podniosły się wszystkie niezbędne numery IP.

W tym celu należy przeprowadzić edycję plików /etc/sysconfig/network-scripts/ifcfg-ethX lub stworzyć taki plik z następującą zawartością:

DEVICE=eth0 # nazwa pod którą dana karta będzie rozpoznawana
BOOTPROTO=static # tu istnieją dwie możliwości albo dynamicznie przydzielany adres - dhcp, albo statycznie
ONBOOT=yes # czy podczas uruchamiania systemu ma być dany IP'ik podnoszony,
IPADDR=192.168.1.4 # z jakim adresem ma podnieść się interfejs
NETMASK=255.255.255.0 # maska
GATEWAY=192.168.1.1 # brama domyślna dla danego interfejsu

Czasami chcemy żeby na jednej karcie sieciowej były obsługiwane dwa lub więcej numerów IP, wówczas tworzymy plik ifcfg-ethX:1 z następującą treścią:
DEVICE=eth0:1
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.5
NETMASK=255.255.255.0
GATEWAY=192.168.1.1

Po wprowadzaniu zmian w plikach konfiguracyjnych restartujemy networka:
/etc/init.d/network restart
i sprawdzamy czy są dany interfejs podniósł się z właściwymi numerami IP:

[root@komp-1-4 network-scripts]# ip a
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:a0:76:a4 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.4/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.5/24 brd 192.168.1.255 scope global secondary eth0:1
inet6 fe80::a00:27ff:fea0:76a4/64 scope link
valid_lft forever preferred_lft forever


lub:
eth0 Link encap:Ethernet HWaddr 08:00:27:A0:76:A4
inet addr:192.168.1.4 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fea0:76a4/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:588 errors:0 dropped:0 overruns:0 frame:0
TX packets:542 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:55487 (54.1 KiB) TX bytes:63769 (62.2 KiB)
Interrupt:11 Base address:0xd020

eth0:1 Link encap:Ethernet HWaddr 08:00:27:A0:76:A4
inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:11 Base address:0xd020


Czasami zdarza się też, że nie chcemy edytować żadnych plików tylko podnieść wybrany interfejs z określonym numerem ip wtedy wpisujemy np.:
ifconfig eth0:2 192.168.1.6 netmask 255.255.255.0

I sprawdzamy czy zadziałało poprawnie:
[root@komp-1-4 network-scripts]# ip a
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 08:00:27:a0:76:a4 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.4/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.5/24 brd 192.168.1.255 scope global secondary eth0:1
inet 192.168.1.6/24 brd 192.168.1.255 scope global secondary eth0:2
inet6 fe80::a00:27ff:fea0:76a4/64 scope link

Adresy IP podniesione za pomocą polecenia ifconfig po restarcie nie zostaną automatycznie uruchomione.


Z ciekawszy rzeczy można też wyświetlić tablicę routingu przez polecenie route.
Co jest ciekawe przeważnie w listingu tego polecenia nie ma podanej bramy domyślnej:
route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 1 0 0 eth0
link-local * 255.255.0.0 U 1000 0 0 eth0
default NOT-AVIABLE-ERR 0.0.0.0 UG 0 0 0 eth0

Bramę domyślną można dodać za pomocą następującego polecenia (to polecenie wykonuję gdy nie mam już pomysłów jak sprawić aby dana sieciówka pingowała poprawnie):
route add -net default gw 192.168.1.1 dev eth0

Można też dodać za pomocą polecenia route trasę do wybranego hosta lub sieci:
route add -host 212.77.100.101 dev eth0
route add -net 212.77.100.101 netmask 255.255.255.0 gw 10.0.10.2 dev eth0

Przydatne mogą się również okazać polecenia ip np.:
ip addr add 212.77.100.101/24 dev eth0
czyli uruchomienie eth0 z numerem ip 212.77.100.101 z maską 24

ip addr add 212.77.100.102/24 dev eth0
czyli dodanie aliasu do już skonfigurowanie eth0

ip ro add 212.77.100.200/32 dev eth2
dodanie trasy do komputera o numerze ip 212.77.100.200 przez interfejs eth2

ip ro add 172.16.0.0/16 via 10.0.10.2 dev eth1
dodanie trasy do sieci 172.16.0.0 przez bramę 10.0.10.2 i interfejs eth1.

ip ro add default via 10.0.10.1 dev eth0
dodanie trasy domyślnej przez numer ip 10.0.10.1 i eth0


Często zdarza się, że przenosimy serwis internetowy na inny serwer i chcemy sprawdzić czy wszystko działa poprawnie ale nie możemy, ponieważ domena w dalszym ciągu wskazuje na stary serwer.
Wówczas należy przeprowadzić edycję pliku /etc/hosts.

W celu zademonstrowania jak to działa pingujemy wp.pl:
ping wp.pl
PING wp.pl (212.77.100.101) 56(84) bytes of data.
64 bytes from www.wp.pl (212.77.100.101): icmp_seq=1 ttl=250 time=26.2 ms

Edytujemy /etc/hosts i wstawiamy:
100.100.100.100 wp.pl

Pingujemy wp.pl ponownie:
ping wp.pl
PING wp.pl (100.100.100.100) 56(84) bytes of data.

Na łyndowsie też znajduje się plik hosts (lub host) ale jego dokładnej lokalizacji niestety w tej chwili nie jestem w stanie przytoczyć.

Z przydatnych rzeczy to można czasami zmienić mac adres karty sieciowej (gdy administrator sieci jest lammerem to można się pod kogoś podszyć i korzystać z netu za free - przynajmniej dopóki nas nie złapią):
ifconfig eth0 down
ifconfig eth0 hw ether 00:80:48:BA:d1:30
ifconfig eth0 up

Przydatne też może okazać się znajomość programów typu wireshark, tcpdump, iptraf oraz netstat ale to pewnie po opiszę w najbliższej przyszłości.


Acha jeżeli jesteśmy niedobrzy to możemy wprowadzić kartę w tryb nasłuchu (zasysamy wszystkie pakiety, nie tylko te kierowane do nas):
ifconfig eth0 promisc


A jeżeli chcemy się dowiedzieć jak mieć darmowy internet w sieciach z dhcp (nie polecam, bo to przecież kradzież jest - ale w celach edukacyjnych zawsze można poczytać):
http://newbie.linux.pl/wydruk.php?wydruk=187&show=artykul

piątek, 2 lipca 2010

Skopiowałem dane na pendriva, czemu ich na nim nie ma?

Niektóre osoby mają tendencję do wyciągania pendriva z portu usb, bez jego wcześniejszego odmontowania i później dziwią się dlaczego nie ma na nim danych albo dlaczego nagle przestał działać.

W linux'ie czasami dane zamiast być skopiowane bezpośrednio na dysk są jeszcze przez jakiś czas przetrzymywane w buforze, więc jeśli nie odmontujesz urządzenia to mogą one nie zostać zapisane.
Odmontować pendriva można przez polecenie umount /dev/nazwa_urządzenia

Inną metodą na upewnienie się, że na pendrive są już zapisane dane jest wykonanie polecenia sync.

Osoby którym bardzo zależy na danych mogą wykonywać najpierw sync i później umount.

Z ciekawostek: żeby uruchomić polecnie sync nie trzeba mieć uprawnień administratora, ale dla polecenia umount i mount te uprawnienia są niezbędne.

Jak zmienić runlevel w linux'ie, jak zmienić hasło root'a

Czasami chcemy zmienić hasło root'a, bo gdzieś nam przepadło w zakamarkach pamięci (runlevel 1, inaczej zwany single user), czasami chcemy odpalić jakiś zasobożerny skrypt więc nie chcemy aby uruchomione środowisko graficzne wszystko spowalniało (runlevel 3), czasami chcemy pracować w środowisku graficznym (runlevel 5), innym razem kogoś nie lubimy i chcemy żeby mu się restartował komputer non stop (runlevel 6).

Zmienić runlevel w centOS'ie można w następujący sposób:
1. Edycja pliku /etc/inittab, odnajdujemy wiersz id:3:initdefault i zmieniamy na dowolny numer (1-5).
2. Edycja pliku /etc/grub.conf, odnajdujemy np. wiersz:
title CentOS (2.6.18-194.3.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-194.3.1.el5 ro root=LABEL=/
i zmieniamy na root=LABEL=/ single
(system uruchomi się w runlevel 1 i będzie można zmienić hasło root'a),
3. Podczas uruchamiania systemu wciskamy dowolny klawisz aby pojawiło się okno z możliwością wyboru kernel'a, najeżdzamy na wybrany i wciskamy e (od edit), wpisujemy single wciskamy enter i wciskamy b (od boot). Gdy system uruchomi się w trybie jedno-użytkownikowym (chyba nowe słowo wynalazłem), wpisujemy passwd, wpisujemy dwa razy hasło, wciskamy enter i zmieniliśmy właśnie hasło root'a (gdy w systemie są zaszyfrowane partycje ta procedura nie zadziała).

Podane informacje działają w systemach Red Hat'o pochodnych takich jak centOS, Fedora itp.



W celu wyświetlania, w którym trybie działamy należy wpisać: runlevel w konsoli.

Runlevels

Słów kilka o trybach pracy maszyn z Linux'em na pokładzie:
0 — Halt (zatrzymanie systemu, jeżeli chcemy zatrzymać system wystarczy wpisać init 0),
1 — Single-user mode (system nie pyta o hasło root'a, nie działa sieć, może zalogować się tylko jeden użytkownik),
2 — Not used (user-definable),(można samemu ustawić, jeszcze się nie spotkałem żeby ktoś z tego korzystał),
3 — Full multi-user mode (może zalogować się wielu użytkowników, sieć działa, w tej opcji system jest uruchomiony bez środowiska graficznego),
4 — Not used (user-definable), (też można zdefiniować),
5 — Full multi-user mode (with an X-based login screen), (to samo co wersja 3 tylko z uruchomionym środowiskiem graficznym),
6 — Reboot (gdy chcemy zrestartować system wystarczy wpisać init 6, dobre do robienia kawałów znajomym :)).

środa, 30 czerwca 2010

Witam


Blog powstał z myślą o opisaniu przygotowań do egzaminu RHCE.
Postaram się po kolei opisać poszczególne zagadnienia, które przerabiam w celu zaliczenia tego egzaminu. Nie mam jeszcze koncepcji w jakim stopniu będę pokrywał kolejne tematy, na pewno zagadnienia w których mam braki zostaną opisane znacznie szerzej niż pozostałe.


Do nauki wykorzystuję centOS'a 5.5 uruchomionego w ramach maszyny wirtualnej VirtualBox.
CentOS został wybrany ze względu na duże podobieństwo do Red Hat'a.

Od razu po zainstalowaniu centOS'a uruchomiłem aktualizację yum update.
Niezbędne było również zmienienie ustawień maszyny wirtualnej aby mogła się komunikować z komputerem bazowym:
- wyłączenie centOS'a: init 0,
- następnie w VirtualBox'ie: ustawienia >> sieć >> Bridge Adapter, zapisanie i uruchomienie ponowne centOS'a i wszystko działa.

Znacznie wygodniej jest połączyć się przez SSH z maszyną wirtualną i wklejać poszczególne polecenia niż wpisywać je ręcznie bezpośrednio w oknie maszyny wirtualnej.