Archiv rubriky: linux

Jak rozdělit a spojit velký soubor v linuxu

Výchozí situace:
Mám velký soubor, který chci archivovat například na FTP, ale pohodlnější je nahrávat menší soubory, než řešit jeden velký…

Rozdělení tedy provedeme následovně:

admin@NAS:~$ split -b 1G zaloha.zip zaloha_part_ --verbose
admin@NAS:~$

Příkaz split zajistí samotné rozdělení.
Parametr -b 1G určuje, jak velké soubory vytvářím.
Dále je uvedena cesta OD a kam, kde na konci zaloha_part_ říkám, jak se mají jmenovat výsledné soubory.
A konečně parametrem – -verbose sděluji, že má být ukecaný výstup, abych věděl že se něco děje.

Výstup příkazu:

admin@NAS:~$ split -b 1G zaloha.zip zaloha_part_ --verbose
creating file ‘zaloha_part_aa’
creating file ‘zaloha_part_ab’
creating file ‘zaloha_part_ac’
creating file ‘zaloha_part_ad’
creating file ‘zaloha_part_ae’
admin@NAS:~$

Výpis adresáře:

admin@NAS:$ ls -lah
total 5.1G
drwxr-xr-x 2 admin users 4.0K Aug 15 16:19 .
drwxrwxrwx 6 admin users 4.0K Aug 15 16:16 ..
-rw-r--r-- 1 admin users 1.0G Aug 15 16:17 zaloha_part_aa
-rw-r--r-- 1 admin users 1.0G Aug 15 16:18 zaloha_part_ab
-rw-r--r-- 1 admin users 1.0G Aug 15 16:18 zaloha_part_ac
-rw-r--r-- 1 admin users 1.0G Aug 15 16:19 zaloha_part_ad
-rw-r--r-- 1 admin users 1.0G Aug 15 16:20 zaloha_part_ae
admin@NAS:~$

Komu by vadily písmena u rozdělených souborů, může zvolit přepínač -d (- -numeric-suffixes) a mít tak číselné přílohy.

admin@NAS:~$ split -b 1G -d zaloha.zip zaloha_part_ --verbose
creating file ‘zaloha_part_00’
creating file ‘zaloha_part_01’
creating file ‘zaloha_part_02’
creating file ‘zaloha_part_03’
creating file ‘zaloha_part_04’
admin@NAS:~$

Výpis adresáře, pak vypadá:

admin@NAS:$ ls -lah
total 5.1G
drwxr-xr-x 2 admin users 4.0K Aug 15 16:19 .
drwxrwxrwx 6 admin users 4.0K Aug 15 16:16 ..
-rw-r--r-- 1 admin users 1.0G Aug 15 16:17 zaloha_part_00
-rw-r--r-- 1 admin users 1.0G Aug 15 16:18 zaloha_part_01
-rw-r--r-- 1 admin users 1.0G Aug 15 16:18 zaloha_part_02
-rw-r--r-- 1 admin users 1.0G Aug 15 16:19 zaloha_part_03
-rw-r--r-- 1 admin users 1.0G Aug 15 16:20 zaloha_part_04
admin@NAS:~$

Spojení je pak už jednoduché…

admin@NAS:$ cat zaloha_part_* > zaloha_new.zip
admin@NAS:$

Jak vidno bez jakéhokoliv výpisu…

Pro kontrolu, že výchozí a konečný soubor je stejný provedeme kontrolu spočtením MD5 HASHe obou souborů.

admin@NAS:$ md5sum zaloha_new.zip
ac8a22b805cd2078b40222f72b218e87  zaloha_new.zip
admin@NAS:~$
admin@NAS:$ md5sum zaloha.zip
ac8a22b805cd2078b40222f72b218e87  zaloha.zip
admin@NAS:~$

Jak prosté, milý Watsone! :)

Poznámka: Je to celkem přímá cesta k řešení. Pokud byste potřebovali jen trochu něco jiného nebo jinak, tak je třeba si tu svoji cestičku prošlapat či prozkoumat co jsem přesně kde použil a proč.

Zapomenuté přihlašovací heslo k Windows 7

Tato peripetie mi sebrala 3 hodiny života a kdyby mi to někdo vyprávěl asi bych mu nevěřil.

Prolog – výchozí stav:
Windows mám nastaven tak, aby se mi automaticky přihlašoval bez nutnosti zadat heslo. Pokud vím, tak tam žádné heslo zadané nemám, ale to nakonec nehraje roli…

Akt 1 – pád Windows a nastartování
Trochu jsem koulel očima, když jsem viděl nastartovanou obrazovku a na ní přihlašovací dialog. Samozřejmě žádné z možných (mnou požívaných) hesel nefungovalo. Restart také nepomohl. Koukal tam na mě odkaz „Reset password“ ale po kliknutí to chtělo removable medium, které po připojení zjistilo, že tam není nainstalován nějaký SW a tím jsem tady skončil a dále nepokračoval.

Akt 2 – našel jsem si návod jak „hacknout“ přihlašovací obrazovku
Jedná se o způsob, kdy si na počítači spustím live CD s linuxem a vyměním program „Utilman“ za „cmd“ a pak z přihlašovací obrazovky si změním heslo. Ale jak to udělat, když zrovna nemám po ruce druhý počítač, kde bych si vytvořil live CD/USB. Ale…

Akt 3 – …ale provozuji Windows na MAC mini přes BOOTCAMP, takže se připojím na MAC OSx a bude to…
Než jsem si vzpomněl jak přebootovat což šlo až po výměně klávesnice DELL za Apple a následně jsem se v MAC OSx zorientoval, tak uplynulo pár desítek minut času. Následně jsem si stáhl ISO soubor Ubuntu a dle návodu na stránkách (ubuntu.com) jsem si vytvořil boot USB disk. Samozřejmě, aby to nebylo tak jednoduché, jsem i zde vlastní vinou ztratil pár minut (špatně jsem si přečetl hlášku).

Akt 4 – nabootování Ubuntu
Boot proběhl v pořádku, přejmenování souborů taky (až jsem se divil, že v tomto kroku žádný zádrhel).

Akt 5
Tak nabootuji do Windows a spadne mi úsměv ve chvíli, kdy se přihlašovací dialog nezobrazí a Windows nastartují jako by se celý incident nestal. Ach jo :(

Epilog
Nevím co napsat… …udělejte si obrázek sami.

Automatické dotahování údajů o podnikatelích z databáze ARES

Někde na internetu jsem viděl jak po zadání IČ se zbytek údajů o živnostníkovi/firmě dotáhl sám. A jelikož jsem si chtěl o tuto možnost rozšířit i své personální účetnictví, tak jsem pátral jak na to.

O databázi ARES jsem se dozvěděl již dříve, ale nikdy jsem se nedostal k samotné implementaci. Až dneska jsem narazil na článek Radka Hulána, řešící přesně toto a tak jsem si řekl, že se na to podívám.

Zdroj dat: Databáze ARES
Script: MyEGO blog

Script po úpravě na straně serveru (jedná se o NETTE akci):

public function handleLoadInfo($IC) {
	$this->payload->firma = array();
    	// dá se vybrat hned z několika zdrojů dle potřeby http://wwwinfo.mfcr.cz/ares/ares_xml.html.cz#k3
	define('ARES','http://wwwinfo.mfcr.cz/cgi-bin/ares/darv_bas.cgi?ico=');
	$ico = intval($IC);
	// nemohl jsem použít kvůli omezení na serveru, nahradil jsem pomocí CURL
	//$file = @file_get_contents(ARES.$ico);
	if ($curl = curl_init(ARES.$ico)) {
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		$content = curl_exec($curl);
		//$info = curl_getinfo($curl);
		curl_close($curl);
		$xml = @simplexml_load_string($content);
	}
	$a = array();
	if (isset($xml)) {
		$ns = $xml->getDocNamespaces();
		$data = $xml->children($ns['are']);
		$el = $data->children($ns['D'])->VBAS;
		if (strval($el->ICO) == $ico) {
			$a['ico'] 	= strval($el->ICO);
			$a['dic'] 	= strval($el->DIC);
			$a['firma'] = strval($el->OF);
			$a['ulice']	= strval($el->AA->NU).' '.strval($el->AA->CD).'/'.strval($el->AA->CO);
			$a['mesto']	= strval($el->AA->N).'-'.strval($el->AA->NCO);
			$a['psc']	= strval($el->AA->PSC);
			$a['stav'] 	= 'ok';
		} else {
			$a['stav'] 	= 'IČ firmy nebylo nalezeno';
		}
	} else {
		$a['stav'] 	= 'Databáze ARES není dostupná';
	}
	$this->payload->firma = $a;
	$this->sendPayload();
}

Script po úpravě na straně uživatele:

<script type="text/javascript">
    <!--
	$('#frmkontakt-IC').change(function(event) {
		$.getJSON({link loadInfo!}, {'IC': $('#frmkontakt-IC').val()}, function(payload) {
			if (payload.firma.stav == 'ok') {
				$('input[name=DIC]').val(payload.firma.dic);
				$('input[name=prijmeni]').val(payload.firma.firma);
				$('input[name=ulice]').val(payload.firma.ulice);
				$('input[name=mesto]').val(payload.firma.mesto);
				$('input[name=psc]').val(payload.firma.psc);
			} else {
				alert(payload.firma.stav);
			}
		});
	});
	-->
</script>

Chtělo by to ještě doladit o podmínky kdy co a jak vypisovat, spojovat (číslo orientační a popisné, město a čtvrť, atd.), ale jako referenční implementace to je dobrý základ.

Zálohování databáze mysql a souborů na linuxu

Po delší době jsem se díky velikonocům dostal ke správě linuxového stroje. Již delší dobu jsem věděl, že by to chtělo nějak lépe vyřešit zálohování. Ne že by nefungovalo, ale řešení bylo poplatné době kdy vznikalo a také lidem, kteří ho implementovali.

A nakonec to nebylo ani tak těžké…

Záloha MySQL databází

Požadavky

  • denní zálohu držet 7 dní
  • týdenní zálohu držet 4 týdny
  • měsíční zálohu držet 3 měsíce
  • zálohovat každý web zvlášť
  • komprimovat zálohy

Použité prostředky

  • mysqldump
  • cron
  • scriptovací jazyk perl

Implementace

Script backup_day_mysql.pl

#!/usr/bin/perl -w
# vytáhneme si seznam jednotlivých databází, krom systémových
my @seznam = `echo "show databases" | mysql -uUSER_NAME -pPASSWORD | egrep -v '^(Database|information_schema|mysql)\$'`;
# připravíme si proměnou obsahující datum, pro pozdější název souboru
my $datum = `date +\%Y-\%m-\%d_\%H-\%M`;
$datum =~ s/\n//;
# každou databázi zkomprimujeme, pojmenujeme a uložíme do adresáře záloh
foreach my $radek (@seznam) {
  $radek =~ s/\n//;
  my $out = `mysqldump -uUSER_NAME -pPASSWORD $radek | bzip2 -c9 > /var/backups/day/mysql/$datum-$radek.bz2`;
}

Automatické spouštění
Toto zajistíme CRONem. CRON upravujeme po zadání příkazu crontab -e. Více v manuálu.

5 3 * * *  /home/backup_day_mysql.pl

Záloha souborů s weby

Požadavky

  • denní zálohu držet 7 dní
  • týdenní zálohu držet 4 týdny
  • měsíční zálohu držet 3 měsíce
  • zálohovat každý web zvlášť
  • komprimovat zálohy

Použité prostředky

  • cron
  • scriptovací jazyk perl

Implementace

Script backup_day.pl

#!/usr/bin/perl -w
my @seznam = `ls -1 /var/www`;
my $datum = `date +\%Y-\%m-\%d_\%H-\%M`;
$datum =~ s/\n//;
foreach my $radek (@seznam) {
  $radek =~ s/\n//;
  my $out = `tar -cvzf /var/backups/day/www/$datum-$radek.tgz /var/www/$radek`;
}

Automatické spouštění
Toto zajistíme opět CRONem.

10 3 * * * /home/backup_day.pl

Automatický úklid

Pokud bychom jen spouštěli tyto scripty, tak by velikost zabraného místa stále jen stoupala. A pokud provozujeme třeba web s 1GB daty, tak to máme každý den pěkný přírůstek.
Takže musíme po sobě i uklízet. To zajistíme pro denní zálohy dle požadavku příkazem:

# najdi všechny soubory starší než 7 dní a ty smaž
find /var/backups/day/www/ -type f -mtime +7 -delete

Opět spouštěným pravidelně v CRONu.

Pro denní, týdenní a měsíční zálohy to pak celé vypadá takto

CRON

# m h  dom mon dow   command
5 3 * * *  /home/backup_day_mysql.pl
10 3 * * * /home/backup_day.pl
15 3 * * * find /var/backups/day/www/ -type f -mtime +7 -delete
15 3 * * * find /var/backups/day/mysql/ -type f -mtime +7 -delete
20 3 * * 7 /home/bacup_mysql.pl
25 3 * * 7 /home/backup_week.pl
30 3 * * 7 find /var/backups/week/www/ -type f -mtime +28 -delete
30 3 * * 7 find /var/backups/week/mysql/ -type f -mtime +28 -delete
35 3 1 * * /home/backup_month_mysql.pl
40 3 1 * * /home/backup_month.pl
45 3 1 * * find /var/backups/month/www/ -type f -mtime +90 -delete
45 3 1 * * find /var/backups/month/mysql/ -type f -mtime +90 -delete

Know-how, které jsem v článku pro zjednodušení zamlčel

  • Soubory ukládám do /var/backups/{DRUH_ZALOHY}/{CO_ZALOHUJI}/ (DRUH_ZALOHY – day, week, month; CO_ZALOHUJI – www, mysql). Netvrdím, že to je jedniné možné a správné řešení, ale umožňuje se mi celkem snadno ve struktuře orientovat
  • /var/backups mám namapované na samostatný oddíl (/dev/sda6) což brání, aby díky zálohování došlo místo na primárním disku a tím to shodilo systém (zálohy ale v tuto dobu nepoběží). Na toto narazilo i mnoho profesionálních hostingů.
  • Scriptům je třeba dát právo na spuštění (např. chmod +x /home/backup_day.pl)
  • CRON je třeba nastavit tak, aby se nejlépe jednotlivé probíhající zálohy neovlivňovaly a zbytečně se nesnižoval výkon systému.
  • I přes tento sytém je třeba občas kontrolovat, zda zálohy probíhají korektně.
  • Je dobré zálohy občas stáhnout a vypálit či uložit geograficky dále od serveru.

Co se dá ještě vylepšit?

  • Mailová notifikace o (ne)provedení zálohy.
  • Automatický upload záloh mimo server (FTP, SCP).
  • Tvorba jen inkrementálních záloh.
  • Test správného vytvoření souborů.
  • Optimalizace příkazu mysqldump o doprovodné atributy.

Chyba „e100/d101m_ucode.bin“ při instalaci linuxové distribuce Debian Squezze

Jedná se o chybu, kdy nějaký hardware vyžaduje nesvobodný firmware. Smůla je, když je tímto HW síťová karta a tudíž si instalátor sám není schopen potřebný (firmware-linux-nonfree) balíček stáhnout.

Ani google moc nepomohl v otázce, kde si ho stáhnout a stahovat 52 instalačních CD se mi fakt nechtělo…

Řešením je stáhnout instalační CD, které právě tento firmware-linux-nonfree balíček obsahuje. To se dá provést přímým linkem na který jsem se dostal odtud.

Po stažení a nabootování z tohoto CD mě již nic nestálo v cestě a instalace proběhla bez problému.

Instalace virtuálního web serveru – VMWare, Apache, PHP, MySQL

Download čistého předpřipraveného systému (debian)

http://www.thoughtpolice.co.uk/vmware/

Instalace doplňků

Před spuštěním samotné instalace provedeme update seznamu zdrojů příkazem:
apt-get update
A následně upgrade systému příkazem:
apt-get upgrade
Dále již instalujeme následující potřebné aplikace.

Midnight commander

apt-get install mc

Apache + PHP + MySQL

apt-get install php
apt-get install mysql-server (vyzve pro zadání hesla pro root účet k mysql a vyžádá si potvrzení automatické konfigurace webserveru pro práci s MySQL (vybral jsem apache2))
apt-get install phpmyadmin

Postfix – mail server

u
apt-get instal postfix (vyžádá si volbu typu serveru (vybral jsem local-only))

Instalace SSH – vzdálený přístup

apt-get install ssh

Konfigurace serveru

Změna hesla

passwd

Změna hostname

echo jmenoServeru > /etc/hostname

Změna prostředí – volba klávesnice

Vyberte v /etc/locale.gen požadovanou lokalizaci.

Zapnutí rewrite mode

a2enmod rewrite

Nastavení sítě

Pro nastavení síťové karty editujte obsah souboru /etc/network/interfaces

V mém případě vypadá soubor následovně:
auto eth0
iface eth0 inet static
address 10.10.17.246
netmask 255.255.254.0
network 10.10.17.0
broadcast 10.10.17.255
gateway 10.10.17.1
dns-nameservers 10.10.17.254

A dále obsah souboru /etc/resolv.conf slouží pro nastavení komunikace v doméně (v mém případě doména windows)
search domena
nameserver 10.10.17.254
nameserver 10.10.17.253

V této chvíli je webserver nachystán k použití.