W mgnieniu oka

Witaj na prywatnej stronie blinkkina. Zapoznaj się z informacjami na temat bloga i autora. Subskrybuj witrynę przez kanał atom lub zobacz ostatnie komentarze. W wolnej chwili odwiedź mojego mikrobloga na identi.ca.


Dragonfly BSD jest piękne

· artykuły · skomentuj

Przypadkowo natrafiłem na czysto-teoretyczny problem. Jak naprawić chmod bez połączenia internetowego po wydaniu polecenia:

chmod –x chmod

Polecenie chmod, cytując z Wikipedii pozwala na zmianę zezwoleń dostępu do plików w systemach uniksowych. Co robi flaga „-x”? Usuwa uprawnienia do wykonywania danego pliku. W tym przypadku jest to problem z kategorii: co było pierwsze, jajko czy kura?

Rozwiązań jest sporo, co pokazuje ta prezentacja. Najprostsze jest prawdopodobnie użycie ld.so, co w zależności od systemu może wyglądać następująco:

/lib/ld.so /bin/chmod +x /bin/chmod

Natychmiastowo pomyślałem o tym, co można zrobić w DragonFly BSD. System plików HAMMER jest unikatowy z wielu względów. Jednak najbardziej niezwykłe jest odwrotne podejście do migawek. Zamiast standardowego tworzenia kopii zapasowych za pomocą zadań w crontabie, HAMMER robi to automatycznie. Natomiast zadaniem w crontabie jest tzw. reblocker, które w nocy usuwa niechciane dane.

Co to oznacza? Usunięte dane można natychmiastowo odzyskać, co więcej można łatwo wygenerować diffy ze zmienionych plików przy wykorzystaniu samego HAMMERa. Służy do tego polecenie undo. Problem w tym, że undo działa tylko w przypadku zmiany zawartości pliku. Jak więc odzyskać plik z pierwotnymi atrybutami?

Otóż HAMMER zapamiętuje wszystkie synchronizacje między systemem plików, a samym dyskiem. Aby sprawdzić historię synchronizacji pliku, należy się posłużyć poleceniem „hammer history /bin/chmod”. Uzyskamy w ten sposób historię pliku wraz z konkretnymi numerami transakcyjnymi (transaction id). Jak uzyskać dostęp do historycznej wersji pliku?

W przypadku HAMMERa jest to dziecinnie proste. Wystarczy do nazwy pliku dodać „@@0xnumer_tranzakcyjny”. W praktyce wygląda to mniej więcej tak:

/bin/chmod@@0x00000001048080 +x /bin/chmod

Gratulacje, aplikacja chmod jest już w pełni sprawna. Być może do większości osób bardziej trafiają rzeczywiste przykłady zastosować, ale ten moim zdaniem najlepiej pokazuje elastyczność standardowego systemu plików DragonFly BSDHAMMER.

Co ciekawe na prezentację problemu „chmod –x chmod” natrafiłem na stronie Christiana Neukirchena, którą regularnie czytam od czasu poznania dzięki wpisowi na stronie Justina Sherrilla.