ROMMON – wszystko co musisz wiedzieć

Każdy kto na co dzień pracuje z urządzeniami Cisco choć raz musiał trafić na ROMMON. Mogło się to stać intencjonalnie, w wyniku błędu, a być może nawet… przez przypadek. Do czego służy ROMMON? Jakie ma zastosowania? W czym może Ci pomóc? Na te i na inne pytania odpowiadam w tym artykule. Materiał jest dość obszerny i (mam nadzieję) kompleksowy. Jeśli czegoś brakuje – daj znać w komentarzu.

Czym jest ROMMON?

ROMMON to skrót od ROM (and. Read Only Memory) Monitor – czyli dosłownie tryb monitorowania pamięci stałej. Jest to dedykowane oprogramowanie odpowiedzialne za zainicjowanie pracy sprzętu sieciowego oraz załadowanie (ang. boot) obrazu systemu IOS.

Można się spotkać z innymi terminami opisującymi ROMMON, takimi jak: boot software, boot image lub boot helper.

ROMMON uruchamia się po interwencji administratora lub po wykryciu problemu z systemem operacyjnym IOS. Jest to byt odrębny od IOS i można go niezależnie aktualizować. W codziennej pracy jeżeli wszystko w sieci działa jak należy to ROMMON raczej się nie przyda. Natomiast warto wiedzieć jak sobie z nim radzić w przypadku awarii urządzenia bądź podczas wykonywania aktualizacji IOS do nowszej wersji.

Różnica między ROMMON a IOS

Należy pamiętać, że podstawowe zadania systemu IOS oraz ROMMON są zasadniczo różne.

IOS dostarcza pełnego zestawu narzędzi, aby skonfigurować i zarządzać urządzeniem sieciowym.

Z kolei ROMMON dostarcza tylko podstawowych narzędzi, aby umożliwić wykonywanie pewnych prostych zadań diagnostycznych i konfiguracyjnych, które pozwalają na przywrócenie urządzenia do poprawnej pracy w przypadku awarii IOS lub innych problemów.

Zastanawiasz się być może, czy możesz skonfigurować przełącznik lub router z poziomu ROMMON. Tak – jest to możliwe, aczkolwiek w BARDZO ograniczonym stopniu (co pokażą kolejne akapity).

Jakie są zastosowania ROMMON?

Do podstawowych zastosowań ROMMON należą:

  1. Sprawdzanie i aktualizacja obrazu IOS – ROMMON pozwala na sprawdzenie, czy na urządzeniu znajduje się właściwy obraz IOS oraz na załadowanie lub aktualizację obrazu IOS z pamięci flash – zwłaszcza po awarii systemu IOS (co pozwala na przywrócenie urządzenia do normalnej pracy),
  1. Odzyskiwanie hasła – ROMMON umożliwia odzyskanie hasła enable w przypadku jego utraty lub zapomnienia, co pozwala na uzyskanie dostępu do urządzenia i przywrócenie pełnej kontroli nad jego konfiguracją,
  2. Konfiguracja adresu IP i transfer oprogramowania – ROMMON umożliwia konfigurację adresu IP na interfejsie urządzenia, co pozwala na komunikację na przykład z serwerem TFTP w celu pobrania obrazu IOS,
  3. Formatowanie pamięci flash – ROMMON pozwala na formatowanie pamięci flash urządzenia, co może być przydatne w przypadku potrzeby usunięcia starych plików lub przygotowania pamięci flash do instalacji nowego obrazu IOS,
  4. Przywracanie ustawień fabrycznych – ROMMON umożliwia przywrócenie ustawień fabrycznych urządzenia, co pozwala na usunięcie wszelkich zmian w konfiguracji urządzenia i powrót do stanu pierwotnego,
  5. Testowanie pamięci i interfejsów – ROMMON pozwala na przeprowadzenie testów pamięci urządzenia oraz jego interfejsów, co pomaga zidentyfikować problemy z nimi.

W dalszej części artykułu omawiamy pierwsze 5 punktów. Testowanie pamięci i interfejsów pomijamy bo jest to zaawansowane i bardzo rzadko używane przez inżynierów zagadnienie.

Cykl artykułów o podstawach korzystania z IOS

Artykuły publikowane w ramach cyklu o IOS można czytać niezależnie, ale najlepsze efekty osiągniesz, jeśli zapoznasz się z nimi po kolei. Cały cykl składa się z następujących artykułów:

  1. 1. Rodziny systemu Cisco IOS
  2. 2. Wersjonowanie IOS oraz IOS XE
  3. 3. Podstawy korzystania z IOS
  4. 4. ROMMON – wszystko co musisz wiedzieć
  5. 5. Jak sprawnie poruszać się po IOS
  6. 6. Podstawowa konfiguracja RADIUS w IOS PREMIUM
  7. 7. Konfiguracja banerów w IOS

Jak uzyskać dostęp do ROMMON?

Możliwości uzyskania dostępu do ROMMON są co najmniej 3. Przyjrzyjmy im się po kolei.

1. Brak prawidłowego obrazu systemu IOS

Obraz znajdujący się w systemie plików może być niekompatybilny lub uszkodzony. Zdarzają się też sytuacje, w których urządzenie posiada zbyt mało pamięci by rozpakować i załadować IOS. W takich sytuacjach urządzenie sieciowe po uruchomieniu automatycznie wejdzie w tryb ROMMON:

System Bootstrap, Version 12.4(13r)T, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 2006 by cisco Systems, Inc.
PLD version 0x10
GIO ASIC version 0x127
c1841 platform with 393216 Kbytes of main memory
Main memory is configured to 64 bit mode with parity disabled

Readonly ROMMON initialized

Boot process failed...

The system is unable to boot automatically. The BOOT
environment variable needs to be set to a bootable
image.
rommon 1 >
Code language: plaintext (plaintext)

2. Confreg ustawiony na 0x0

Można z poziomu IOS ustawić tzw. rejestr konfiguracyjny (ang. configuration register, w skrócie confreg) na wartość 0x0, a następnie zrestartować urządzenie. Spowoduje to automatyczne wejście w ROMMON po każdym restarcie – do czasu aż confreg nie zostanie przekonfigurowany na inną wartość:

Router>enable
Router#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#config-reg 0x0
Router(config)#end
Router#write
Building configuration...
[OK]
Router#reload
Proceed with reload? [confirm]

*May  8 18:34:59.171: %SYS-5-RELOAD: Reload requested  by console. Reload Reason: Reload Command.
System Bootstrap, Version 12.4(13r)T, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 2006 by cisco Systems, Inc.
PLD version 0x10
GIO ASIC version 0x127
c1841 platform with 393216 Kbytes of main memory
Main memory is configured to 64 bit mode with parity disabled


Readonly ROMMON initialized
rommon 1 >
Code language: plaintext (plaintext)

Jeżeli urządzenie za każdym razem wchodzi po restarcie w ROMMON to jedną z przyczyn może być właśnie confreg ustawiony na 0x0. W przypadku gdy jest to niepożądane zachowanie, wystarczy zmienić wartość confreg na domyślną 0x2102 z poziomu ROMMON:

rommon 1 > confreg 0x2102

You must reset or power cycle for new config to take effect
rommon 2 > reset
Code language: plaintext (plaintext)

O rejestrze konfiguracyjnym wspomnimy jeszcze przy okazji omawiania procedury obejścia hasła dostępu do urządzenia.

3. Przerwanie sekwencji startowej urządzenia

Metoda ta może się delikatnie różnić w zależności od konkretnej platformy sprzętowej (warto sprawdzić configuration guide), ale co do zasady mamy dwie opcje.

Escape sequence z poziomu terminala

Pierwszą opcją jest wydanie tzw. escape sequence podczas uruchamiania urządzenia. Najczęściej jest to kombinacja klawiszowa CTRL+Break lub samo Break. Na Twojej klawiaturze może akurat brakować przycisku Break, ale nie martw się – większość terminali posiada tę funkcję wbudowaną w oprogramowanie.

W przypadku PuTTY wystarczy podczas startu urządzenia kliknąć na sesji prawym przyciskiem i wybrać Special character > Break z menu.

Przytrzymanie przycisku MODE

Niektóre urządzenia sieciowe od Cisco (w większości przełączniki) mają na froncie przycisk MODE. Jest on głównie używany do przełączania stanów diod statusowych w celu sprawdzenia prędkości portów, ich stanu, ustawień duplex itp.

Można jednak użyć przycisk MODE również do wejścia w tryb ROMMON. W tym celu należy:

  1. podłączyć się do urządzenia po konsoli,
  2. odłączyć urządzenie od zasilania,
  3. przytrzymać przycisk MODE,
  4. trzymając cały czas wciśnięty MODE włączyć urządzenie i obserwować konsolę,
  5. urządzenie powinno po chwili wejść w tryb ROMMON – można wtedy puścić przycisk MODE.

Jak nawigować po ROMMON?

Po uzyskaniu dostępu do ROMMON naszym oczom ukazuje się prompt. Może się on różnić w zależności od platformy. W przypadku starszych switchy Catalyst będzie on wyglądał następująco:

switch:Code language: plaintext (plaintext)

W pozostałych przypadkach będzie on wyglądał standardowo:

rommon 1 >Code language: plaintext (plaintext)

Niektóre urządzenia (zwłaszcza starsze przełączniki Catalyst) mogą od nas wymagać wydania poniższych komend zaraz po wejściu w ROMMON:

  • flash_init – komenda ta służy do zainicjowania pamięci flash. Jest to wymagane jeśli chcemy uzyskiwać do niej dostęp w celu przeglądania plików lub załadowania systemu IOS z tej pamięci,
  • load_helper – komenda ta służy do zainicjowania systemu pomocy kontekstowej.

Zazwyczaj komendy te są sygnalizowane zaraz po zainicjowaniu ROMMON. Przykład z Catalyst 2960:

The system has been interrupted prior to initializing the
flash filesystem.  The following commands will initialize
the flash filesystem, and finish loading the operating
system software:

    flash_init
    boot

switch:
Code language: plaintext (plaintext)

A skoro o pomocy kontekstowej już mowa, to tradycyjnie można wcisnąć znak zapytania (?) lub wydać komendę help, aby uzyskać listę dostępnych poleceń (lista może się różnić w zależności od platformy). Przykład z routera 1841:

rommon 1 > ?
alias               set and display aliases command
boot                boot up an external process
break               set/show/clear the breakpoint
confreg             configuration register utility
cont                continue executing a downloaded image
context             display the context of a loaded image
cookie              display contents of motherboard cookie PROM in hex
dev                 list the device table
dir                 list files in file system
dis                 disassemble instruction stream
dnld                serial download a program module
frame               print out a selected stack frame
gioshow             show the gio version
help                monitor builtin command help
history             monitor command history
iomemset            set IO memory percent
meminfo             main memory information
repeat              repeat a monitor command
reset               system reset
rommon-pref         Select ROMMON
set                 display the monitor variables
showmon             display currently selected ROM monitor
stack               produce a stack trace
sync                write monitor environment to NVRAM
sysret              print out info from last system return
tftpdnld            tftp image download
unalias             unset an alias
unset               unset a monitor variable
xmodem              x/ymodem image download
Code language: plaintext (plaintext)

Zasady nawigacji po ROMMON

Poruszając się po ROMMON pamiętaj najważniejsze zasady:

  • wszystkie komendy są case-sensitive – pisz uważnie,
  • wykonywanie większości komend możesz przerwać wciskając CTRL+Break lub samo Break
  • w ROMMON nie działa autouzupełnianie znane z IOS – nie wciskaj przycisku Tab
  • nie działa również historia poleceń – używanie strzałek góra/dół nic nie da

Jak wgrać IOS z poziomu ROMMON?

Transfer z serwera TFTP

Aby pobrać obraz IOS z serwera TFTP musimy wpierw ustawić szereg zmiennych, które ROMMON wykorzysta do operacji. Dobrą praktyką jest sprawdzenie bieżących wartości zmiennych za pomocą komendy set:

rommon 1 > set
PS1=rommon ! >
?=0
WARM_REBOOT=FALSE
BSI=0
RANDOM_NUM=726608415
RET_2_RTS=18:34:58 UTC Mon May 8 2023
RET_2_RCALTS=1683570902
Code language: plaintext (plaintext)

Jeżeli output nie zawiera interesujących nas wartości to oznacza po prostu, że nie zostały one ustawione. Na potrzeby transferu TFTP musimy ustawić następujące zmienne:

  • IP_ADDRESS – adres IP najniższego numerycznie interfejsu Ethernet routera (na przykład F0/0),
  • IP_SUBNET_MASK – maska tego interfejsu,
  • DEFAULT_GATEWAY – brama domyślna dla tego interfejsu,
  • TFTP_SERVER – adres IP serwera TFTP,
  • TFTP_FILE – ścieżka do pliku, który chcemy pobrać.

Dla przykładu może to wyglądać następująco:

rommon 1 > IP_ADDRESS=172.18.16.76
rommon 2 > IP_SUBNET_MASK=255.255.255.192
rommon 3 > DEFAULT_GATEWAY=172.18.16.65
rommon 4 > TFTP_SERVER=172.18.16.2
rommon 5 > TFTP_FILE=images/c1841-ipbasek9-mz_151-4_m12a.bin
rommon 6 > set
PS1=rommon ! >
WARM_REBOOT=FALSE
BSI=0
RANDOM_NUM=726608415
RET_2_RTS=18:34:58 UTC Mon May 8 2023
RET_2_RCALTS=1683570902
?=0
IP_ADDRESS=172.18.16.76
IP_SUBNET_MASK=255.255.255.192
DEFAULT_GATEWAY=172.18.16.65
TFTP_SERVER=172.18.16.2
TFTP_FILE=images/c1841-ipbasek9-mz_151-4_m12a.bin
Code language: plaintext (plaintext)

Oczywiście serwerem TFTP może być zarówno faktyczny serwer w zdalnej sieci, jak i lokalnie podłączony do urządzenia sieciowego laptop z odpowiednim oprogramowaniem. Najpopularniejszy software to Tftpd64. Zalecamy zachowanie ostrożności przy pobieraniu programów do hostowania serwera TFTP – łatwo naciąć się na malware.

Po ustawieniu zmiennych możemy już przejść do ściągania obrazu przy użyciu komendy tftpdnld.

🚨 UWAGA – komenda ta spowoduje usunięcie wszystkich istniejących danych z pamięci flash po pobraniu pliku. Proces pobierania można przerwać standardowymi Ctrl+C lub Break.

rommon 8 > tftpdnld

          IP_ADDRESS: 172.18.16.76
      IP_SUBNET_MASK: 255.255.255.192
     DEFAULT_GATEWAY: 172.18.16.65
         TFTP_SERVER: 172.18.16.2
           TFTP_FILE: images/c1841-ipbasek9-mz_151-4_m12a.bin
        TFTP_MACADDR: 00:25:84:6c:2e:b6
        TFTP_VERBOSE: Progress
    TFTP_RETRY_COUNT: 18
        TFTP_TIMEOUT: 7200
       TFTP_CHECKSUM: Yes
             FE_PORT: 0
       FE_SPEED_MODE: Auto Detect

Invoke this command for disaster recovery only.
WARNING: all existing data in all partitions on flash: will be lost!
Do you wish to continue? y/n:  [n]:  y

Receiving c1841-ipbasek9-mz_151-4_m12a.bin from 171.69.1.129 !!!!!.!!!!!!!!!!!!!!!!!!!.!!
File reception completed.
Copying file c1841-ipbasek9-mz_151-4_m12a.bin to flash.
Erasing flash at 0x607c0000
program flash location 0x60440000
rommon 9 >
Code language: plaintext (plaintext)

Istnieje jeszcze jedna opcja, która pozwala na pobranie obrazu IOS bez zapisywania go w pamięci flash. Po pobraniu obrazu urządzenie od razu podejmie próbę jego bootowania. W tej sytuacji pamięć flash nie ulegnie sformatowaniu (zostaną zachowane na niej nasze wcześniejsze pliki).

Aby skorzystać z takiej możliwości należy wydać komendę tftpdnld z parametrem -r:

rommon 8 > tftpdnld -rCode language: plaintext (plaintext)

Transfer z pendrive’a

Większość urządzeń sieciowych posiada port USB, który pozwala na wgranie pliku z IOS z pendrive’a. Po podłączeniu podłączonego pendrive’a możemy przeglądać jego zawartość komendą dir:

rommon 1 > dir usbflash0:
program load complete, entry point: 0x8000f000, size: 0x3d240
Directory of usbflash0:
20530    34839352  -rw-     c1841-ipbasek9-mz_151-4_m12a.bin
Code language: plaintext (plaintext)

Może się zdarzyć sytuacja, w której Twój pendrive nie zostanie rozpoznany:

rommon 1 > dir usbflash0:
program load complete, entry point: 0x8000f000, size: 0x3d180

usbflash0: contains unexpected values in partition table or boot sector.
Device needs formatting before use!
open(): Open Error = -66
Code language: plaintext (plaintext)

Pierwszym rozwiązaniem jest próba sformatowania systemu plików z poziomu ROMMON za pomocą komendy format:

rommon 2 > format usbflash0:Code language: plaintext (plaintext)

Komenda ta niestety często nie działa. W niektórych wersjach ROMMON nie jest czasem nawet dostępna.

Drugim rozwiązaniem jest odpowiednie przygotowanie pendrive’a na komputerze z Windows. Jakiś czas temu opisaliśmy na Twitterze konkretne kroki. Zapraszamy do lektury wątku:

Jeżeli i to zawiedzie to pozostaje trzecia opcja – żonglerka różnymi pendrive’ami. Teraz już wiesz dlaczego niektórym inżynierom z kieszeni wysypują się pendrive’y 😉 Tajemnicą poliszynela jest aby unikać pamięci od Sandisk. Znacznie większe szanse powodzenia masz z Kingstonem lub GoodRAM. Daj znać w komentarzu jakie są Twoje doświadczenia z pendrive’ami.

Bootowanie IOS z pendrive’a

Aby uruchomić IOS bezpośrednio z pendrive’a wydajemy komendę boot:

rommon 1 > boot usbflash0:c1841-ipbasek9-mz_151-4_m12a.bin
program load complete, entry point: 0x8000f000, size: 0xcb80
program load complete, entry point: 0x8000f000, size: 0xcb80
Self decompressing the image : ####################################################################################################################################################################################################### [OK]
Code language: plaintext (plaintext)

Kopiowanie IOS z pendrive’a na pamięć flash

W większości wypadków dobrym pomysłem jest skopiowanie wpierw obrazu IOS z pendrive’a do pamięci flash:

rommon 1 > copy usbflash0:c1841-ipbasek9-mz_151-4_m12a.bin flash:c1841-ipbasek9-mz_151-4_m12a.binCode language: plaintext (plaintext)

Jak uruchomić IOS z ROMMON?

Odpalenie IOS z ROMMON jest banalne – pod warunkiem, że został przez Ciebie wcześniej przygotowany odpowiedni obraz IOS. We wcześniejszym paragrafie omówiliśmy jak możesz skopiować właściwy plik z serwera TFTP lub z pendrive’a i umieścić go w pamięci flash.

Gdy plik znajduje się w pamięci flash wystarczy użyć komendy boot:

rommon 1 > boot flash:c1841-ipbasek9-mz_151-4_m12a.bin
program load complete, entry point: 0x8000f000, size: 0xcb80
program load complete, entry point: 0x8000f000, size: 0xcb80
Self decompressing the image : ####################################################################################################################################################################################################### [OK]
Code language: plaintext (plaintext)

Jak odzyskać hasło urządzenia?

Nie jest tajemnicą, że ROMMON bardzo często jest wykorzystywany do obejścia zapomnianego hasła do trybu enable na urządzeniu. Oto cała procedura krok po kroku:

  1. Zderzasz się ze ścianą 😉
Router>enable
Password:
Password:Code language: plaintext (plaintext)
  1. Fizycznie restartujesz urządzenie ponieważ komenda reload nie zadziała. Następnie wprowadzasz je ręcznie w tryb ROMMON używając jednej z opisanych wcześniej metod.
  2. Będąc w ROMMON ustawiasz rejestr konfiguracyjny na wartość 0x2142. Spowoduje to pominięcie pliku startup-config przy bootowaniu urządzenia. Uruchomi się ono dzięki temu z czystą konfiguracją:
rommon 1 > confreg 0x2142


You must reset or power cycle for new config to take effect
rommon 2 > resetCode language: plaintext (plaintext)
  1. Korzystając z tego, że masz czystą konfigurację wchodzisz w tryb enable bez użycia hasła, a następnie kopiujesz zawartość pliku startup-config do pliku running-config:
         --- System Configuration Dialog ---

Would you like to enter the initial configuration dialog? [yes/no]: no

Press RETURN to get started!

Router>enable
Router#copy startup-config running-config
Destination filename [running-config]?

976 bytes copied in 0.600 secs (1627 bytes/sec)
Code language: plaintext (plaintext)
  1. Teraz możesz wykorzystać to, że jesteś w trybie uprzywilejowanym i zmienić hasło na takie jakie chcesz:
Router#
Router#configure terminal
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#enable secret NSSrulez2016!
Code language: plaintext (plaintext)
  1. Na zakończenie przywracasz domyślną wartość rejestru konfiguracyjnego 0x2102 (aby plik startup-config nie był pomijany podczas bootowania) i zapisujesz zmiany:
Router(config)#config-reg 0x2102
Router(config)#end
Router#write
*May  1 04:20:00.000: %SYS-5-CONFIG_I: Configured from console by console
Building configuration...
[OK]
Router#
Code language: plaintext (plaintext)

Zastosowanie rejestru konfiguracyjnego

Wymienione wcześniej wartości confreg to nie wszystko. Rejestr konfiguracyjny oferuje znacznie więcej możliwości. Przeczytasz o tym w naszym darmowym NSSletterze – mailingu dla sieciowców głodnych wiedzy.

Dołączając uzyskasz dostęp również do archiwum – tematykę tego artykułu rozszerzyliśmy w NSSletterze 31. Rozwiń swoją wiedzę już teraz i zapisz się używając formularza poniżej.

Zostaw komentarz
Otrzymuj powiadomienia z tej dyskusji
Powiadom mnie o
guest

0 - Ilość komentarzy
Inline Feedbacks
View all comments