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
Anonymous
January 01, 2003
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?Anonymous
January 01, 2003
Pomyślę nad tym "wcześniej". Ale doba codziennie ma tylko 24h ;)Anonymous
January 01, 2003
Dziękuję za artykuł. Jeśli mogę prosić programik będę wdzięczny :)Anonymous
January 01, 2003
Z góry dziękuję. Też mnie to martwi. :)Anonymous
January 01, 2003
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.Anonymous
January 01, 2003
Oglądałem sesję na virtualstudy.pl i jeśli można prosić o programik to będę zobowiązany ... dzięki z góryAnonymous
July 22, 2009
ja poproszę programik do testów :) Swoją drogą - jestem ciekaw jak taki snapshot VSS dysku z bazą Active Directory by zadziałał :DAnonymous
July 22, 2009
bardziej mi chodziło o snapshot dysku z bazą NTDS i potem odtwarzanie takiego backupu :DAnonymous
September 17, 2009
"(..) 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" ?Anonymous
August 08, 2011
ja również poproszę o przesłanie DefineDosDeviceAnonymous
March 21, 2013
Cześć, czy mógłbym dostać tego toola? ori-jackass(takie a w kółeczku)tlen.pl