DefineDosDevice()

Jedna z róznic, które "od zawsze" widac miedzy systemami Windows a systemami Unix jest podejscie do dysków. W Windows sa literki a w Unix – jedno drzewo do którego montowane jest wszystko poczawszy od dysku systemowego a skonczywszy na urzadzeniach. Tymczasem jest to wylacznie kwestia przyzwyczajen! Powiedzmy, ze w Windows jeden dysk systemowy musi istniec. Ale wszystkie inne to juz wylacznie kwestia umowna. Zamiast nadawac kolejnym dyskom litery, mozna je montowac na przyklad w folderze c:\mnt i na pewno to bedzie dzialac.

Tak naprawde, wewnatrz systemu wszystkie urzadzenia zdefiniowane sa w jednym drzewie. Sa one zarzadzane przez Menedzera Obiektów, gdzie zgrupowane zostaly  w specjalnej galezi \Devices i gdzie wystepuja wspólnie z kilkudziesiecioma innymi typami obiektów. Zajrzec tam mozna na wiele sposobów, ale dla tak zwanych IT Pro, najprostsze wydaje sie uzycie narzedzia WinObj z nieocenionego zestawu Sysinternals.

Poniewaz wiele (ogromna wiekszosc) aplikacji wymaga jednak literki albo sciezki UNC aby skorzystac z dysku – system Windows nadaje litery i dzieki temu uzytkownik ma w co klikac.

Co ciekawe, nie tylko dyskom (czy ogólnie rzecz biorac urzadzenia blokowym) mozna przypisywac literki. Technicznie daje sie to zrobic dla kazdego urzadzenia, wlacznie z takimi jak \Device\null czy \Device\sysaudio. Literka pojawi sie na liscie dysków, ale skorzystac z niej oczywiscie sie nie da. W kazdym razie, wszelkie urzadzenia, które dzialaja jak dyski mozna poprosic, zeby jako dyski byly widziane. System robi to podczas startu i dlatego po kliknieciu na "mój komputer" widac jakie ma dyski.

Opisywane tu literki tez tak naprawde sa specjalnymi urzadzeniami w galezi \GLOBAL?? ale to juz inna historia.

Po co taka wiedza w praktyce? Ano na przyklad po to, zeby "pseudodyskowe" urzadzenie móc zobaczyc tak, jakby bylo normalnym dyskiem. Szczególnym przypadkiem (wyjatkowo uzytecznym) jest snapshot dysku. Zrobic snapshot jest prosto – sluzy do tego systemowe polecenie vssadmin. Snapshot ma swój obiekt w menedzerze obiektów. Teraz brakuje mu tylko litery dysku. Od strony systemu, literke taka nadaje sie przy pomocy tytulowej funkcji DefineDosDevice. Funkcja ta w prosty sposób laczy urzadzenie z jego tradycyjna (DOSowa) nazwa, jednak w systemie nie ma prostej metody wywolania jej. Z pomoca przychodzi Resource Kit, w którym istnieje narzedzie DosDev.exe ale jego wada jest to, ze jest odplatne. Niby nie wypada nie miec ResKita, ale...

W ramach zabawy, opakowalem DefineDosDevice w prosty programik exe uruchamiany z command line, wiec jak ktos potrzebuje – podziele sie, wystarczy w komentarzach poprosic.

Teraz mozna zrobic tak:

  • Snapshot
  • Podlaczyc literke
  • Skopiowac pliki
  • Odlaczyc literke
  • Skasowac snapshot

Czym to sie rózni od "normalnego" skopiowania plików? Dwoma detalami. Po pierwsze, wszystkie kopiowane pliki pochodza z tej samej chwili a nie jeden z momentu rozpoczecia kopiowania a inny – z momentu zakonczenia. Czasem to jest cenne. Po drugie, snapshot nie ma specjalnych problemów z otwartymi plikami. Co wiecej, zazwyczaj ich migawke robi w chwili dokladnie uzgodnionej z otwierajaca je aplikacja, obojetne czy jest to Exchange, SQL czy Active Directory. Dzieki temu migawka zostanie pózniej przez aplikacje zaakceptowana jako spójne dane.

W efekcie backup "zywych" danych jest latwy, pewny i przyjemny.
Uzywajac funkcji DefineDosDevice (obojetne z jakiego programu) dobrze jest wiedziec, ze dziala ona, skutecznie zmieniajac mapowanie urzadzen do literek, równiez dla dysków, które juz maja jakies przypisanie. W efekcie, jednym prostym poleceniem mozna sprawic, ze wszystko, co zechce czytac z dysku C: siegnie w zupelnie inne miejsce. Robilem to kilka razy i bogatszy o to doswiadczenie, moge tylko zasugerowac: nie na produkcyjnych maszynach i nie w sytuacji, kiedy macie jakies niezapisane a wazne dane. System sie nie daje zaskoczyc, ale wiekszosc aplikacji odmawia posluszenstwa i w zasadzie jedynym rozwiazaniem jest restart, chyba ze aplikacje mapujaca macie na dysku innym niz C: i przywrócicie poprawne mapowanie. Co ciekawe, modyfikacja istniejacego juz przypisania nie niszczy starego, tylko tworzy kolejne o wyzszym priorytecie. Jego skasowanie powoduje, ze poprzednie przypisanie znowu jest aktywne.

Wspominalem powyzej o programach, które nie musza miec litery dysku, wiec warto na koniec jakis przyklad przytoczyc. Aplikacja taka jest Hyper-V, które umie skorzystac z dysku bez litery. W wiekszych klastrach jest to funkcjonalnosc, bez której trudno wyobrazic sobie prace.  W koncu liter jest niewiele ponad 20. Innym zupelnie przypadkiem jest System Center Data Protection Manager, który równiez do dysków podchodzi w dosc zaawansowany sposób.

A o snapshotach i VSS to ja jeszcze kiedys napisze, bo jest to mechanizm slabo znany a niezwykle uzyteczny.

Autor: Grzegorz Tworek [MVP]