Cygwin - Unix ve Windows

24. 1. 2005
Doba čtení: 9 minut

Sdílet

Ať si někteří lidé říkají co chtějí, je mezi námi mnoho lidí, kteří musejí, byť víceméně nedobrovolně, používat alespoň částečně operační systém MS Windows. Naštěstí existuje cesta, jak si unixové prostředí do značné míry přinést i do něj.

Ať si někteří lidé říkají co chtějí, je mezi námi mnoho lidí, kteří musejí, byť víceméně nedobrovolně, používat alespoň částečně operační systém MS Windows, já k nim patřím (ne všechen potřebný software lze provozovat v Linuxu). V prostředí windows pak musím klikat a klikat a přitom trpím jako zvíře, když si vzpomenu na nástroje Unixu, kde bych už dávno měl hotový nějaký shell script, který by opakované úkoly dělal sám. Naštěstí existuje cesta, jak si unixové prostředí do značné míry přinést i do windows.

Toto řešení se jmenuje Cygwin. Cygwin je dnes rozsáhlý balík, který obsahuje mnoho součástí, počínaje kompilátorem gcc až po docela komletní prostředí Gnome (ještě se o něm zmíním na konci). Nejedná se tedy, jak je vidět, o žádnou maličkost, ale o mocný nástroj umožňující provoz i složitých a komplexních aplikací. Svým rozsahem je srovnatelný i s menšími linuxovými distribucemi.

Základem, který umožňuje běh unixových programů v tak odlišném pprostředí, jako je MS Windows, je knihovna cygwin.dll. Ta zajišťuje překlad volání unixového API do volání API MS Windows nebo obsahuje rutiny potřebné funkce emulující. Jde tedy do značné míry o emulaci API, z čehož vylývá i první nevýhoda – běh programů je poněkud pomalejší než v plně nativním prostředí. Popravdě řečeno, zejména souborové operace jsou pomalejší o hodně, takový rsync, který pracuje se souborovým systémem dost intenzivně, asi 10× proti linuxové verzi na stejném stroji, ale to už je extrém, běžný rozdíl není tak velký. Druhou nevýhodou je, že programy jsou zvyklé používat unixové cesty obsahující jako oddělovač „/“ a při mixování programů využívající knihovnu cygwin a nativních programů pro Windows pak může vzniknout pěkný „guláš“. K tomuto problému se ještě vrátím později.

Kromě výše uvedeného runtime emulujícího API unixového systému je další základní součástí překladač gcc. Překladač je, jak je zřejmé, základním kamenem každého operačního systému, a přesně tak se ubíral i vývoj cygwinu. Nejprve bylo obsaženo jen několik základních knihoven a dnes mohu nostalgicky vzpomínat, jak jsem používání programu mutt zahajoval překladem knihovny ncurses, abych si jej pak mohl vůbec přeložit (a jakou jsem měl radost, když se mi to po několika zásazích do zdrojáku podařilo). Dnes už je ncurses (v několika verzích) stejně jako mutt k dispozici v balíčcích ve standardní distribuci. Ale ne vše je předpřipraveno v podobě binárních balíčků, a pokud potřebujete nějaký program, či knihovnu, která předkompilovaná není, stáhněte si zdrojové texty a vzhůru do toho. Jedná-li se o běžný program, zvláště pracující v textovém režimu, s velkou pravděpodobností jej bez větších problémů zkompilujete.

Instalace Cygwin probíhá v prostředí grafického programu. Ten lze stáhnout ze základních stránek projektu. Po spuštění se objeví průvodce, který se na začátku zeptá na vaše připojení a nabídne tři možné postupy. Stažení balíčků z Internetu stáhne vybrané balíčky do zvoleného adresáře, později je pak možné takto stažené balíčky zužitkovat volbou instalace z lokálního adresáře. Dále je možné instalovat přímo z Internetu, což ovšem v praxi znamená stažení a následné nainstalování balíčku, který potom není vymazán, takže se jedná o pouhou kombinaci stažení a následné instalace z lokálu. Následuje zobrazení seznamu balíčků. Lze zobrazit balíčky v několika pohledech. Poslední verze má již i roztahovatelné okénko. Instalace nebo upgrade je otázkou několika kliknutí. Škoda, že se ale nedá instalace nebo upgrade provádět i z příkazové řád­ky.

setup.exe

Nakousl jsem téma balíčků. Přítomnost balíčkovacího systému je jistě příjemná, musím však zchladit příliš optimistická očekávání. Lze jej nejlépe přirovnat k balíčkům ve slackware. Jedná se o klasické tar.bz2 archivy, které obsahují přeložené soubory i s cestou, dále mohou obsahovat i scripty pro spuštění po nainstalování, typicky vytvoření základních konfiguračních souborů. Pokud v instalátoru žádáme nainstalování balíčku, který závisí na jiném, program automaticky označí i tyto podmiňující balíčky, nejsou-li již nainstalovány v požadované verzi. Ovšem jedná se jen o formu doporučení, uživatel může klidně podmiňující balíčky odznačit a program mu v této akci nijak nebrání ani neupozorní na porušené závislosti (právě toto ve mně evokuje podobnost se Slackwarem, který také závislosti nekontroluje). Příjemnou vlastností je, že instalátor lze pohodlně využít i k upgrade, kdy si program zjistí nové verze nainstalovaných programů v úložišti, například na ftp serveru, a rovnou nabídne jejich upgrade. Navíc si instalátor pamatuje své poslední nastavení, a uživatel může tedy upgradovat pouhým spuštěním instalátoru a několika klepnutími na tlačítko next.

Klasickým problémem, se kterým se potýkám (nejen v cygwin), je čeština. Cygwin dnes již podporuje locale, takže samotné aplikace s uživatelem hovoří česky, jenže to je kámen úrazu. To, co považuje za češtinu cygwin, není shodné s tím, co za češtinu považují Windows. Jak již jistě mnozí tuší, cygwin pracuje v iso-8859–2, což mně vyhovuje, ale Windows tvrdošíjně pracují v cp1250, a tudíž se neshodují v šesti znacích (šžťŠŽŤ), zobrazují je špatně a stejně tak je špatně přijímají z klávesnice. Přiznám bez mučení, že jsem po mnoha pokusech zobrazení češtiny vzdal a na těch šest inkriminovaných znaků jsem si zbaběle zvykl. Pokud je na tom někdo lépe, rád si nechám poradit. Na zobrazení si člověk ještě zvykne, ale vstup je třeba nějak vyřešit, takže alespoň několik obezliček, jak na to. Používám LaTeX, a ten podporuje kódování libovolné, které je nadeklarováno na začátku souboru, takže to není problém. Links podporuje cp1250 (nepoužívá lokales), takže ten také pracuje dobře. Trochu tvrdším oříškem je vim, zobrazení je prostě špatně :-(, ale vstup funguje s vlastním kódováním, takže jsem si do .vimrc umístil přemapovávací makra a do .gvimrc, které naopak používám v nativní Windows verzi, pak jejich zrušení. S ostatními programy pak nemám problém kromě výše zmíněného zobrazení. Ve skrytu duše teď doufám, že se ozve někdo, že češtinu vyřešil lépe. Jistým řešením je používat cygPutty (ToDo-link), ale tam je nějaký problém s terminálem a nefuguje mi dobře elinks. Jiným řešením je používat xterm, který je možno spouštět pod xfree nebo nověji pod X.org (ano, i grafické prostředí X je součástí cygwinu) a běží samozřejmě v kódování iso-8859–2. Jenže zvyk je zvyk, takže uvedené možnosti nevyužívám a zůstal jsem u rxvt.

Už jsem se zmínil o přítomnosti programu mutt. Takže se zmíním ještě o několika dalších, nejedná se o kompletní výčet, jedná se o ty, které jsou mými favority. Předpokládám, že člověk instalující si prostředí emulující Unix, bude obeznámen s programy, které hodlá používat. Rozdíly proti linuxovým verzím nejsou velké a podle ohlasů, které jsem zatím měl možnost vidět, jsou v podobném rozsahu jako při použití jiných unixových systémů. Takže mezi mé favority patří Mutt, tin, (e)links (obsažena je textová verze, ale lze si zkompilovat i grafickou), zsh, perl (ten kombinuji s nativním perlem od ActiveState), tetex vč. xdvi, gv, python, tcl/tk, mc, vfu, gnuppg, vim… zkrátka solidní obsah běžné linuxové distribuce, jak jsem již psal v úvodu.

Kromě těchto klientských aplikací je součástí cygwinu i mnoho serverových aplikací. Jejich použitelnost je různá, ale většinou minimálně pro vyzkoušení dostačující. Osobně na MS Windows XP použitých jako produkční(!) server provozuji openssh a cron z cygwinu.

Pro nastavení samotného cygwin je nejdůležitější správně nastavit proměnnou prostředí CYGWIN. Ta může obsahovat několik hodnot oddělených čárkou. Moje nastavení obsahuje volby „ntsec ntea smbntsec“, čímž si zajišťuji kompatibilitu chování s unixovými filesystémy. Neexistuje nic jako správné nastavení – záleží na individuálních požadavcích, a pokud chcete cygwin použít k vážnější práci, vřele doporučuji projít si dokumentaci.

Další věcí, která musí každého napadnout, je práce se svazky a se souborovým stromem. Cygwin samozřejmě používá unixovou notaci zápisu cest s obyčejnými lomítky a vše v jednom adresářovém stromu. K jeho uspořádání slouží podle očekávání příkaz mount, který se snaží chovat obdobně jako na Unixech, ale má mírně odlišné volby a chování v detailech. Zapisuje montované svazky místo do /etc/fstab do registru a svazky zůstávají automaticky namontované i po restartu. Může sloužit i k připojení svazků ze síťě. Strom je dost propletený a k jednomu souboru se lze dostat i několika cestami: /cygdrive/c/tmp/soubor.txt, c:/tmp/soubor.txt a /tmp/soubor.txt označují v mém počítači stejný soubor… Pro síťové cesty lze používat //počítač/sdílení/soubor nebo již zmíněný mount, pokud je připojen síťový disk, pak i /cygdrive/písmeno/soubor  atd.

Nedílnou součástí unixových souborových systémů jsou odjakživa linky, pevné a symbolické. Nevím jak nad FAT, ale nad NTFS se jedná o bezproblémovou záležitost. NTFS linky umí a ln jen tuto možnost zpřístupňuje. Symbolické linky jsou pak v posledních verzích fyzicky uloženy jako normální zástupci, tj. standardní .lnk soubory, které si cygwin vnitřně rozvine jako odkaz na úrovni souborového systému.

Asi nejdůležitější a nejpoužívanější utilitkou, kterou v Unixu nenajdete, je cygpath. Jedná se o program, který umožňuje převádět cesty v unixové notaci na notaci kompatibilní s Windows. Jeho použití umožňuje donutit ke spolupráci cygwin programy s programy čistě windowsovskými, ačkoliv každý očekává jinou cestu ke stejnému souboru.

Wraper na gvim, Windows nativní verzi, pak může vypadat takto:

!#/bin/bash
for i in $*; do
   FILE=`cygpath -aw $i`
   FILES="$FILES $FILE"
done
'/cygdrive/c/Programs/vim/vim62/gvim.exe' $FILES &

Z cygwin je možné volat veškeré binárky spustitelné ve Windows, a to bez přípony .exe nebo s ní, jak je libo. Je možné volat ln nebo ln.exe – binárky jsou např. v bash doplňovány bez přípony, ačkoliv jsou na disku všechny programy uloženy s příponou. Kompilátor generuje a.exe a další programy, jako je install nebo strip, požadují zadání přípony. Pro knihovny se používá přípona dll. Scripty, které obsahují na prvním řádku !#/bin/...., je možné volat rovnou, cygwin tento řádek respektuje stejně jako Unix, na příponě nezáleží.

V cygwinu najdete ukrytý i adresář /dev. Nenajdete jej v souborovém systému, ale odkazy do něj fungují. Je tedy možné normálně spamy posílat do /dev/null, jak jste zvyklí :-). Dále fungují

/dev/zero, /dev/tty, /dev/ttyX… Zařízení souborových systémů, mechanik a disků jsou mapována na /dev/sda, /dev/sda1, /dev/fd0, /dev/st0… Je možné si dokonce pomocí ln dotvořit /dev podle svého vkusu, např: ln -s /dev/scd0 /dev/cdrom. Pro další informace opět odkáži na dokumentaci. Podobně lze nalézt i adresář /proc, který se na rozdíl od

/dev dá normálně vypsat pomocí stdandardních příkazů, jako je ls a find.

Standarní soubory /etc/passwd a /etc/group cygwin též obsahuje na očekávaných místech, ale pokud čekáte nějakou dynamickou vychytávku, pak vás zklamu. Jsou to bohapusté textové soubory, které se musí ručně udržovat ve stavu synchronním s Windows. Trochu tomu pomáhají utilitky mkpasswd a mkgroup, které vypisují Windows uživatele a skupiny v příslušném formátu.

To, že je součástí cygwin X.org (dříve to byly Xfree86), dává možnost použít cygwin jako X terminál. Je možno spouštět X lokálně ve vlastním okně-desktopu, nebo si spustit xserver s vestavěným window managerem v režimu „multiwindow“. V tomto režimu je možné na MS Windows desktopu míchat okna nativních aplikací, lokálních X aplikací a nakonec i vzdálených aplikací zobrazujících na lokální display. České fonty jsou k dispozici v kódování iso8859–2, česká klávesnice se nastavuje nezávisle na Windows jako v každém jiném xserveru pomocí xmodmap. Pro ty, kdo pochybují o možnostech tohoto windowsowského X.org, odkazuji na cygnome2.source­forge.net, kde je snad přesvědčí o tom, že to umí všechno jako „normální“ unixová X.

Gvim 3× jinak: nativní, lokální X, vzdálený X:

bitcoin školení listopad 24

Gvim 3x jinak

Sám cygwin používám již mnoho let. Závěrem tedy zbývá říci, že cygwin je prostředí, která vyzrálo od pouhého kompilátoru až k všestranně použitelné distribuci zdařile emulující prostředí Unixu, a stalo se tak záchranou nejednoho unixového uživatele ztraceného v klikacím světě MS Windows.

Autor článku