Linux: Automatický restart kernel panic a notifikace

Linux jako každý komplexní operační systém se může dostat do stavu kdy přestane dělat co je po něm požadováno, v lepším připadě zhavaruje (kernel panic) v horším se dostane do nepredikovaného stavu, kdy něco dělá nevím bohužel co nebo to není možné zjistit, např. vysoký load (zátěž) systému znemožňuje navázení ssh, systém laguje apod.

Vetšina moderních serverů je dnes vybavena systémem KVM(klavesnice-video-myš) pro přístup přes IP síť (bez ohledu na stav operačního systému, umožňuje to tak řešit havarijní stavy), v případě virtualizace je naopak často možné připojit se ke konsoli systému bez ohledu na jeho stav či poslat povel reboot přímo z hypervisoru.

Co dělat v případě, že Váš fyzický server má problém a k dispozici nemáte žadné uvedené možnosti?

Lenivý admin nechodí do serverovny :-).

Pokud máte štěstí a funguje SSH lze leco řešit, může se ovšem stát, že SSH poslouchá, ale už není schoné vytvořit celý proces shellu (např. proto, že jiný proces sežral celou pamět a server divoce swapuje), mužete zkusit tento trik a poslat příkazy k rebootu stroje přímo, pokud to klapne máte stěstí a po rebootu budete zkoumat co se dělo.

ssh root@mojeservery.cz \
'echo 1 > /proc/sys/kernel/sysrq; echo b > /proc/sysrq-trigger'

V druhém terminálu si nejlépe spusťte ping na problémový server, v případě rebootu dojte k výpadku ICMP echo reply odpovědí, počkejte, je možné, že se bude např. provádět kontrola filesystému (fsck), buďte trpělivý.

Druhá variace je odpovědí na havarijní stav, jádro systému zastavilo svůj běh po neopravitelné chybě a skončilo pádem v unix světe pojmenovaném příznačně “kernel panic”, takže server prostě stojí, nic nedělá a čeká, až ho někdo (admin) rebootuje, z tohoto stavu lze ovšem také “vybruslit” a vynutit automatický reboot po kernel panic.

# echo 30 >/proc/sys/kernel/panic

Toto nastavení na běžícím systému způsobí reboot po 30 vteřinách pokud nastane kernel panic (hodnota 0 je vypnutí rebootu, výchozí), nastavení je vhodné uložit do systému pokud je chcete mít implicitně zapnuté.

Vložte řádek kernel.panic = 30 do souboru /etc/sysctl.conf a zavolejte příkaz pro aktualizaci parametrů běžícího jádra.

# sysctl -p

Patrametry ze sysctl.conf budou načteny, i po rebootu bude vše dle nastavení.

Notifikace po rebootu? Byla by více než vhodná, malá třešnička na dortu, démon cron na to má speciální flag @reboot, přidejte do svého crontabu tento řádek (upravte dle svého SMTP serveru a emailu).

@reboot date | mailx -S smtp=smtp://smtp.mojeservery.cz -s "hostname Rebootovan server!" -r server@mojeservery.cz admin@mojeservery.cz

Přejeme hodně vysoký uptime a co nejméně podobných problémů.

František Havel, MOJEservery.cz

Provedli jsme opravu wifi free-HOTSPOT řešení Rezidence Golf Mariánské Lázně

Realizováno,

po odstoupení původního dodavatele od smlouvy přelomu roku 2014/15 a cca 5 měsících nefunkčního hotspot systému, tedy kompletního blackoutu jsem během 48hodin od obdržení přístupových údajů obnovili původní provoz celého systému.

Provozujete nebo přemýšlíte o realizace WiFi HOTSPOT přístupového systému do sítě? Chcete nabídnout zdarma intenet zákazníku, nebo žákum škol, veřejnosti, chcete reklamu na takové wifi síti? Chcete ověřovat jménem a heslem své uživatele? Chcete pomoci nebo se jen zeptat? → Kontaktujte nás.

Děkujeme za příležitost, za důvěru, velmi si toho vážíme.

František Havel, MOJEservery.cz

wifi-hotspot-golf-ml-article1

wifi-hotspot-golf-ml-article2

Nebojte se SQLite!

SQLite je transakční databázových systém, s nulovou konfigurací, bez serverové části, jednoduchý, kompaktní, lehký design, postavený nad souborovým systémem respektive souborem.

SQLiteLogo3

SQLite je velmi populární, né vždy je totiž nutné a hlavně možné nasadit plnohodnotný klient-server SQL server (Mariandb, Postgres) ale mít po ruce možnost a výhody sql nad souborem se často hodí (např. i v systému Android).

Ve své podstatě jde o implementaci relačního databázového systému a standardu SQL-92 realizovaného v jazyce C (mimochodem zajímavě napsaná knihovna s implementací objektů pomocí struktur, pointerů).

Architektura SQLite z francouzské wikipedie
Architektura SQLite z francouzské wikipedie

Velmi často se používá SQLite v jazyce Perl přes knihovnu DBI, ukažme si základní snippet ve kterém bude vše co je potřeba pro práci s touto databází.

  • připojení /connect
  • vytvoření tabulky /create
  • vložení záznamu / insert
  • vyhledání záznamu / search
  • úprava záznamu / update
  • smazání záznamu / delete

Instalace:

Debian, Ubuntu

root@havel-machine:~# apt-get install sqlite3 libdbd-sqlite3-perl

CentOS, Fedora or RHEL

root@havel-machine:~# yum install sqlite perl-DBD-SQLite

 

#!/usr/bin/perl
 
use DBI;
use strict;
 
my $driver   = "SQLite";
my $db_name = "sqlite.db";
my $dbd = "DBI:$driver:dbname=$db_name";
 
# sqlite nepoužívý jméno a heslo
my $username = "";
my $password = "";
 
# vytvoříme a připojíme se db
# zároveň dojte k vytvoření souboru databáze sqlite.db
my $dbh = DBI->connect($dbd, $username, $password, { RaiseError => 1 }) or die $DBI::errstr;
 
# vytvoříme tabulku
my $stmt = qq(CREATE TABLE IF NOT EXISTS NETWORK
             (ID INTEGER PRIMARY KEY     AUTOINCREMENT,
              HOSTNAME       TEXT    NOT NULL,
              OS             CHAR(50),
              CPULOAD        REAL););

# provedeme dotaz
my $ret = $dbh->do($stmt);

if($ret < 0) { print STDERR $DBI::errstr; }
else { print STDERR "Tabulka vytvořena\n"; }

# vložíme řádky do tabulky
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD) 
           VALUES ('linux-01', 'Debian 8', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD)
           VALUES ('linux-02', 'CentOS 7', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,OS,CPULOAD)
           VALUES ('windows-01', 'Windows Server 2012', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
# získání dat z tabulky a výpis
$stmt = qq(SELECT id, hostname, os, cpuload from NETWORK;);

my $obj = $dbh->prepare($stmt);
$ret = $obj->execute() or die $DBI::errstr;
 
if($ret < 0) { print STDERR $DBI::errstr; } while(my @row = $obj->fetchrow_array()) {
      print "ID: ". $row[0] . "\n";
      print "HOSTNAME: ". $row[1] ."\n";
      print "OS: ". $row[2] ."\n";
      print "CPULOAD: ". $row[3] ."\n\n";
}
 
# změna záznamu
$stmt = qq(UPDATE NETWORK set CPULOAD = 50 where OS='CentOS 7';);

$ret = $dbh->do($stmt) or die $DBI::errstr;
 
if( $ret < 0 ) { print STDERR $DBI::errstr; }
else { print STDERR "Aktualizováno $ret řádků\n"; }

# smazání
$stmt = qq(DELETE from NETWORK where ID=2;);
$ret = $dbh->do($stmt) or die $DBI::errstr;
 
if($ret < 0) { print STDERR $DBI::errstr; }
else { print STDERR "Smazáno $ret řádků\n"; }

# Odpojení databáze
$dbh->disconnect();

 

Jak je vidět z příkladu použití je skutečně jednoduché a přímočaré, nebojte se ho vyzkoušet ve svých projektech, mnoho lidí do startu špatně odhadne požadavky a SQLite je tím pádem neprávem ignorováno jako něco podřadného, přejít na “vyšší” databáze z SQLite je triviální.

Knihovny (binding) existuje pro celou řadu programovacích jazyků kromě  uvedeného Perl, např. C/C++, Python, Lua, PHP, ale např. i Delphi a další.

SQLite není okrajový zapadlý projekt, je integrován přímo do systému Android pro uložení persistentních dat, používá ho iPhone nebo společnost Airbus ve svém software či firma Adobe, Bosh, Dropbox. (https://www.sqlite.org/famous.html)

SQLite používám rád, přemýšlejte o něm.

https://www.sqlite.org

František Havel

Linux: Redhat tahák pro příkaz ip

Nemůžete si stále zapamatovat syntax “nového” nástroje ip pro práci se sítí v Linuxu? (proč “” nástroj ip, byl představen již pro linux jádro 2.2, ale zvyk v podobě ifconfig je železná košile).

Přirozeně můžete dokumentaci najít v manuálových stráchkách, ale při hledání jednoduché referenční příručky jsem narazil na RedHat tahák (cheat sheet), chtěl jsem něco co lze vytisknout, pověsit a mít to stále na očích až se to člověku vryje paměti a našl jsem, tak posílám dále.

PDF pro tisk rh_ip_command_cheatsheet_1214_jcs_print.

Tak trénujte. Díky František Havel

rh_ip_command_cheatsheet_1214_jcs_print-page-001

rh_ip_command_cheatsheet_1214_jcs_print-page-002