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]

Comments (11)

  1. Anonymous says:

    A propo VSS. Czy nie można by zamienić tego ‘kiedyś’ na ‘wcześniej’? 😉

    P.s. I można prosić programik + kod źródłowy jeśli jest to możliwe?

  2. Anonymous says:

    Pomyślę nad tym "wcześniej". Ale doba codziennie ma tylko 24h 😉

  3. Anonymous says:

    Dziękuję za artykuł. Jeśli mogę prosić programik będę wdzięczny 🙂

  4. Anonymous says:

    Z góry dziękuję. Też mnie to martwi. 🙂

  5. Anonymous says:

    Poszło mailem. A snapshot AD działa świetnie. Zwłaszcza na 2008 można się bawić i uruchomić dwa AD na jednym serwerze na różnych portach TCP.

  6. Anonymous says:

    Oglądałem sesję na virtualstudy.pl i jeśli można prosić o programik to będę zobowiązany …

    dzięki z góry

  7. domel says:

    ja poproszę programik do testów 🙂

    Swoją drogą – jestem ciekaw jak taki snapshot VSS dysku z bazą Active Directory by zadziałał 😀

  8. domel says:

    bardziej mi chodziło o snapshot dysku z bazą NTDS i potem odtwarzanie takiego backupu 😀

  9. hamer says:

    "(..) wszelkie urządzenia, które działają jak dyski można poprosić, żeby jako dyski były widziane."

    Jak stwierdzić które urządzania "działają jak dyski" ?

    czy gdzieś można znaleźć taką informację lub można to stwierdzić przy pomocy jakiegoś narzędzia ?

    Swoją drogą czy czy DefineDosDevice() wpłynie także

    na listę woluminów widzianych przy pomocy komendy "mountvol" ?

  10. Konrad Lipiński says:

    ja również poproszę o przesłanie DefineDosDevice

  11. Oskar Rymowski says:

    Cześć, czy mógłbym dostać tego toola?

    ori-jackass(takie a w kółeczku)tlen.pl

Skip to main content