DefineDosDevice()

DefineDosDevice()

  • Comments 11
  • Likes

Jedną z różnic, które "od zawsze" widać między systemami Windows a systemami Unix jest podejście do dysków. W Windows są literki a w Unix – jedno drzewo do którego montowane jest wszystko począwszy od dysku systemowego a skończywszy na urządzeniach. Tymczasem jest to wyłącznie kwestia przyzwyczajeń! Powiedzmy, że w Windows jeden dysk systemowy musi istnieć. Ale wszystkie inne to już wyłącznie kwestia umowna. Zamiast nadawać kolejnym dyskom litery, można je montować na przykład w folderze c:\mnt i na pewno to będzie działać.

Tak naprawdę, wewnątrz systemu wszystkie urządzenia zdefiniowane są w jednym drzewie. Są one zarządzane przez Menedżera Obiektów, gdzie zgrupowane zostały  w specjalnej gałęzi \Devices i gdzie występują wspólnie z kilkudziesięcioma innymi typami obiektów. Zajrzeć tam można na wiele sposobów, ale dla tak zwanych IT Pro, najprostsze wydaje się użycie narzędzia WinObj z nieocenionego zestawu Sysinternals.

Ponieważ wiele (ogromna większość) aplikacji wymaga jednak literki albo ścieżki UNC aby skorzystać z dysku – system Windows nadaje litery i dzięki temu użytkownik ma w co klikać.

Co ciekawe, nie tylko dyskom (czy ogólnie rzecz biorąc urządzenia blokowym) można przypisywać literki. Technicznie daje się to zrobić dla każdego urządzenia, włącznie z takimi jak \Device\null czy \Device\sysaudio. Literka pojawi się na liście dysków, ale skorzystać z niej oczywiście się nie da. W każdym razie, wszelkie urządzenia, które działają jak dyski można poprosić, żeby jako dyski były widziane. System robi to podczas startu i dlatego po kliknięciu na "mój komputer" widać jakie ma dyski.

Opisywane tu literki też tak naprawdę są specjalnymi urządzeniami w gałęzi \GLOBAL?? ale to już inna historia.

Po co taka wiedza w praktyce? Ano na przykład po to, żeby "pseudodyskowe" urządzenie móc zobaczyć tak, jakby było normalnym dyskiem. Szczególnym przypadkiem (wyjątkowo użytecznym) jest snapshot dysku. Zrobić snapshot jest prosto – służy do tego systemowe polecenie vssadmin. Snapshot ma swój obiekt w menedżerze obiektów. Teraz brakuje mu tylko litery dysku. Od strony systemu, literkę taką nadaje się przy pomocy tytułowej funkcji DefineDosDevice. Funkcja ta w prosty sposób łączy urządzenie z jego tradycyjną (DOSową) nazwą, jednak w systemie nie ma prostej metody wywołania jej. Z pomocą przychodzi Resource Kit, w którym istnieje narzędzie DosDev.exe ale jego wadą jest to, że jest odpłatne. Niby nie wypada nie mieć ResKita, ale...

W ramach zabawy, opakowałem DefineDosDevice w prosty programik exe uruchamiany z command line, więc jak ktoś potrzebuje – podzielę się, wystarczy w komentarzach poprosić.

Teraz można zrobić tak:

  • Snapshot
  • Podłączyć literkę
  • Skopiować pliki
  • Odłączyć literkę
  • Skasować snapshot

Czym to się różni od "normalnego" skopiowania plików? Dwoma detalami. Po pierwsze, wszystkie kopiowane pliki pochodzą z tej samej chwili a nie jeden z momentu rozpoczęcia kopiowania a inny – z momentu zakończenia. Czasem to jest cenne. Po drugie, snapshot nie ma specjalnych problemów z otwartymi plikami. Co więcej, zazwyczaj ich migawkę robi w chwili dokładnie uzgodnionej z otwierającą je aplikacją, obojętne czy jest to Exchange, SQL czy Active Directory. Dzięki temu migawka zostanie później przez aplikację zaakceptowana jako spójne dane.

W efekcie backup "żywych" danych jest łatwy, pewny i przyjemny.
Używając funkcji DefineDosDevice (obojętne z jakiego programu) dobrze jest wiedzieć, że działa ona, skutecznie zmieniając mapowanie urządzeń do literek, również dla dysków, które już mają jakieś przypisanie. W efekcie, jednym prostym poleceniem można sprawić, że wszystko, co zechce czytać z dysku C: sięgnie w zupełnie inne miejsce. Robiłem to kilka razy i bogatszy o to doświadczenie, mogę tylko zasugerować: nie na produkcyjnych maszynach i nie w sytuacji, kiedy macie jakieś niezapisane a ważne dane. System się nie daje zaskoczyć, ale większość aplikacji odmawia posłuszeństwa i w zasadzie jedynym rozwiązaniem jest restart, chyba że aplikację mapującą macie na dysku innym niż C: i przywrócicie poprawne mapowanie. Co ciekawe, modyfikacja istniejącego już przypisania nie niszczy starego, tylko tworzy kolejne o wyższym priorytecie. Jego skasowanie powoduje, że poprzednie przypisanie znowu jest aktywne.

Wspominałem powyżej o programach, które nie muszą mieć litery dysku, więc warto na koniec jakiś przykład przytoczyć. Aplikacją taką jest Hyper-V, które umie skorzystać z dysku bez litery. W większych klastrach jest to funkcjonalność, bez której trudno wyobrazić sobie pracę.  W końcu liter jest niewiele ponad 20. Innym zupełnie przypadkiem jest System Center Data Protection Manager, który również do dysków podchodzi w dość zaawansowany sposób.

A o snapshotach i VSS to ja jeszcze kiedyś napiszę, bo jest to mechanizm słabo znany a niezwykle użyteczny.

Autor: Grzegorz Tworek [MVP]

Comments
  • ja poproszę programik do testów :)

    Swoją drogą - jestem ciekaw jak taki snapshot VSS dysku z bazą Active Directory by zadziałał :D

  • 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.

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

  • 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?

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

  • Z góry dziękuję. Też mnie to martwi. :)

  • "(..) 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" ?

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

  • 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

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

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

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

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment