De Linux IPMI-driver — De Linux Kernel-documentatie (2023)

Auteur

Corey Minyard <minyard@mvista.com> / <minyard@acm.org>

De Intelligent Platform Management Interface, of IPMI, is een standaard voor het besturen van intelligente apparaten die een systeem bewaken. Het zorgt voor dynamische ontdekking van sensoren in het systeem en de mogelijkheid om de sensoren te bewaken en geïnformeerd te worden wanneer de waarden van de sensor veranderen of bepaalde grenzen overschrijden . Het heeft ook een gestandaardiseerde database voor in het veld vervangbare eenheden (FRU's) en een watchdogtimer.

Om dit te gebruiken, hebt u een interface nodig naar een IPMI-controller in uw systeem (Baseboard Management Controller of BMC genoemd) en beheersoftware die het IPMI-systeem kan gebruiken.

In dit document wordt beschreven hoe u de IPMI-driver voor Linux gebruikt. Als u niet bekend bent met IPMI zelf, raadpleeg dan de website ophttps://www.intel.com/design/servers/ipmi/index.htm. IPMI is een groot onderwerp en ik kan het hier niet allemaal behandelen!

Configuratie

Het Linux IPMI-stuurprogramma is modulair, wat betekent dat u verschillende dingen moet kiezen om het goed te laten werken, afhankelijk van uw hardware. De meeste hiervan zijn beschikbaar in het menu 'Character Devices' en vervolgens in het IPMI-menu.

Wat er ook gebeurt, u moet 'IPMI-berichtafhandelaar op het hoogste niveau' kiezen om IPMI te gebruiken. Wat u verder doet, hangt af van uw behoeften en hardware.

De berichtenbehandelaar biedt geen interfaces op gebruikersniveau. Kernelcode (zoals de watchdog) kan deze nog steeds gebruiken. Als u toegang nodig heeft vanuit gebruikersland, moet u 'Apparaatinterface voor IPMI' selecteren als u toegang wilt via een apparaatstuurprogramma.

De stuurprogramma-interface is afhankelijk van uw hardware. Als uw systeem de SMBIOS-info voor IPMI correct levert, zal het stuurprogramma dit detecteren en gewoon werken. Als je een board hebt met een standaard interface (deze zullen over het algemeen ofwel "KCS", "SMIC" of "BT" zijn, raadpleeg je hardwarehandleiding), kies dan de optie 'IPMI SI handler'. Er bestaat ook een stuurprogramma voor directe I2C-toegang tot de IPMI-beheercontroller. Sommige boards ondersteunen dit, maar het is niet bekend of het op elk board zal werken. Kies hiervoor 'IPMI SMBus-handler', maar wees bereid om wat uit te zoeken om te zien of het op uw systeem zal werken als de SMBIOS/APCI-informatie onjuist is of niet aanwezig is. Het is redelijk veilig om beide ingeschakeld te hebben en de stuurprogramma's automatisch te laten detecteren wat er aanwezig is.

Over het algemeen moet u ACPI op uw systeem inschakelen, aangezien systemen met IPMI ACPI-tabellen kunnen hebben die ze beschrijven.

Als je een standaardinterface hebt en de fabrikant van het bord zijn werk correct heeft gedaan, zou de IPMI-controller automatisch moeten worden gedetecteerd (via ACPI- of SMBIOS-tabellen) en zou hij gewoon moeten werken. Helaas hebben veel boards deze informatie niet. Het stuurprogramma probeert de standaardinstellingen, maar deze werken mogelijk niet. Als u zich in deze situatie bevindt, moet u het gedeelte hieronder met de naam 'Het SI-stuurprogramma' of 'Het SMBus-stuurprogramma' lezen over hoe u uw systeem handmatig kunt configureren.

IPMI definieert een standaard watchdog-timer. U kunt dit inschakelen met de configuratieoptie 'IPMI Watchdog Timer'. Als u het stuurprogramma in de kernel compileert, kunt u via een kernelopdrachtregeloptie de watchdog-timer laten starten zodra deze wordt geïnitialiseerd. Het heeft ook veel andere opties, zie de 'Watchdog'-sectie hieronder voor meer details. Merk op dat je de watchdog ook kunt laten draaien als hij gesloten is (standaard is hij uitgeschakeld bij sluiten). Ga naar het menu 'WatchdogCards', schakel 'Watchdog Timer Support' in en schakel de optie 'Watchdog shutdown bij sluiten uitschakelen' in.

IPMI-systemen kunnen vaak worden uitgeschakeld met behulp van IPMI-opdrachten. Selecteer 'IPMI Poweroff' om dit te doen. De driver detecteert automatisch of het systeem kan worden uitgeschakeld door IPMI. Het is veilig om dit in te schakelen, zelfs als uw systeem deze optie niet ondersteunt. Dit werkt op ATCA-systemen, de Radisys CPI1-kaart en elk IPMI-systeem dat standaard chassisbeheeropdrachten ondersteunt.

Als u wilt dat de bestuurder bij paniek een gebeurtenis in het gebeurtenislogboek plaatst, schakelt u de optie 'Genereer een paniekgebeurtenis naar alle BMC's bij paniek' in. Als u de hele paniekstring in het gebeurtenislogboek wilt plaatsen met behulp van OEMevents, activeert u de optie 'Genereer OEM-gebeurtenissen die de paniekstring bevatten'. U kunt deze ook dynamisch inschakelen door de moduleparameter met de naam "panic_op" in de ipmi_msghandler-module in te stellen op "event" of "string". Als u die parameter op "none" zet, wordt deze functie uitgeschakeld.

Basis ontwerp

De Linux IPMI-driver is ontworpen om zeer modulair en flexibel te zijn, je hoeft alleen de stukjes te nemen die je nodig hebt en je kunt hem op veel verschillende manieren gebruiken. Daarom is het opgedeeld in vele stukjes code. Deze brokken (op modulenaam) zijn:

ipmi_msghandler - Dit is het centrale stuk software voor het IPMI-systeem. Het behandelt alle berichten, berichttiming en reacties. De IPMI-gebruikers sluiten hierop aan, en ook de fysieke IPMI-interfaces (genaamd System Management Interfaces of SMI's) sluiten hier op aan. Dit biedt de kernel- en interface voor IPMI, maar biedt geen interface voor gebruik door toepassingsprocessen.

ipmi_devintf - Dit biedt een userland IOCTL-interface voor de IPMIdriver, elk geopend bestand voor dit apparaat sluit aan bij de berichtafhandelaar als een IPMI-gebruiker.

ipmi_si - Een stuurprogramma voor verschillende systeeminterfaces. Dit ondersteunt KCS-, SMIC- en BT-interfaces. Tenzij u een SMBus-interface of uw eigen aangepaste interface hebt, moet u deze waarschijnlijk gebruiken.

ipmi_ssif - Een stuurprogramma voor toegang tot BMC's op de SMBus. Het gebruikt de SMBus-interfaces van de I2C-kerneldriver om IPMI-berichten via de SMBus te verzenden en te ontvangen.

ipmi_powernv - Een stuurprogramma voor toegang tot BMC's op POWERNV-systemen.

ipmi_watchdog - IPMI vereist dat systemen een zeer capabele watchdogtimer hebben. Deze driver implementeert de standaard Linux watchdog-timerinterface bovenop de IPMI-berichtenverwerker.

ipmi_poweroff - Sommige systemen ondersteunen de mogelijkheid om via IPMI-opdrachten te worden uitgeschakeld.

bt-bmc - Dit is geen onderdeel van de hoofddriver, maar een driver voor toegang tot een BMC-zijde-interface van een BT-interface. Het wordt gebruikt op BMC's met Linux om een ​​interface naar de host te bieden.

Deze zijn allemaal afzonderlijk selecteerbaar via configuratieopties.

Veel documentatie voor de interface bevindt zich in de include-bestanden. De IPMI include-bestanden zijn:

linux/ipmi.h - Bevat de gebruikersinterface en IOCTL-interface voor IPMI.

linux/ipmi_smi.h - Bevat de interface voor systeembeheerinterfaces (dingen die interfacen met IPMI-controllers) om te gebruiken.

linux/ipmi_msgdefs.h - Algemene definities voor basis IPMI-berichten.

Adressering

De IPMI-adressering werkt ongeveer zoals IP-adressen, u hebt een overlay om de verschillende adrestypen te verwerken. De overlay is:

struct ipmi_addr{ int addr_type; kort kanaal; tekengegevens[IPMI_MAX_ADDR_SIZE];};

Het addr_type bepaalt wat het adres werkelijk is. De bestuurder begrijpt momenteel twee verschillende soorten adressen.

"Systeeminterface"-adressen worden gedefinieerd als:

struct ipmi_system_interface_addr{ int addr_type; kort kanaal;};
(Video) How Do Linux Kernel Drivers Work? - Learning Resource

en het type is IPMI_SYSTEM_INTERFACE_ADDR_TYPE. Dit wordt gebruikt om rechtstreeks met de BMC op de huidige kaart te praten. Het kanaal moet IPMI_BMC_CHANNEL zijn.

Berichten die bestemd zijn om uit te gaan op de IPMB-bus die door de BMC gaan, gebruiken het adrestype IPMI_IPMB_ADDR_TYPE. Het formaat is:

struct ipmi_ipmb_addr{ int addr_type; kort kanaal; unsigned char slave_addr; unsigned char lun;};

Het "kanaal" is hier over het algemeen nul, maar sommige apparaten ondersteunen meer dan één kanaal, het komt overeen met het kanaal zoals gedefinieerd in de IPMIspec.

Er is ook een direct IPMB-adres voor een situatie waarin de afzender zich rechtstreeks op een IPMB-bus bevindt en niet via de BMC hoeft te gaan. U kunt berichten naar een specifieke beheercontroller (MC) op de IPMB sturen met behulp van het IPMI_IPMB_DIRECT_ADDR_TYPE met het volgende formaat :

Het kanaal is altijd nul. U kunt ook opdrachten ontvangen van andere MC's die u hebt geregistreerd om ze te behandelen en erop te reageren, zodat u dit kunt gebruiken om een ​​beheercontroller op een bus te implementeren.

Berichten

Berichten worden gedefinieerd als:

struct ipmi_msg{ niet-ondertekende char netfn; ongetekende char lun; niet-ondertekende char cmd; unsigned char *data; int gegevens_len;};

De bestuurder zorgt voor het toevoegen/verwijderen van de header-informatie. Het gegevensgedeelte is alleen de te verzenden gegevens (plaats hier GEEN adresgegevens) of het antwoord. Merk op dat de voltooiingscode van een antwoord het eerste item in "data" is, het wordt niet weggelaten omdat dat is hoe alle berichten in de specificatie worden gedefinieerd (en maakt het tellen van de offsets dus een beetje eenvoudiger :-).

Wanneer u de IOCTL-interface van userland gebruikt, moet u een gegevensblok voor "data" opgeven, dit invullen en data_len instellen op de lengte van het gegevensblok, zelfs wanneer u berichten ontvangt. Anders heeft de chauffeur geen plek om het bericht neer te zetten.

Berichten die afkomstig zijn van de berichtenbehandelaar in kernelland komen binnen als:

struct ipmi_recv_msg{ struct list_head link; /* Het type bericht zoals gedefinieerd in "Ontvangsttypes" hierboven. */ int recv_type; ipmi_user_t *gebruiker; struct ipmi_addr addr; lang bericht; struct ipmi_msg bericht; /* Roep dit aan als u klaar bent met het bericht. Het zal vermoedelijk het bericht bevrijden en alle andere noodzakelijke opschoning uitvoeren. */ ongeldig (*klaar)(struct ipmi_recv_msg *msg); /* Tijdelijke aanduiding voor de gegevens, maak geen aannames over de grootte of het bestaan ​​hiervan, aangezien deze kan veranderen. */ unsigned char msg_data[IPMI_MAX_MSG_LENGTH];};

U moet naar het ontvangsttype kijken en het bericht op de juiste manier afhandelen.

De interface van de bovenste laag (berichtverwerker)

De bovenste laag van de interface biedt de gebruikers een consistent beeld van de IPMI-interfaces. Het maakt het mogelijk om meerdere SMI-interfaces te adresseren (omdat sommige boards eigenlijk meerdere BMC's hebben) en het zou de gebruiker niet moeten schelen welk type SMI eronder zit.

Kijken naar interfaces

Wanneer uw code verschijnt, heeft het IPMI-stuurprogramma al dan niet gedetecteerd of er IPMI-apparaten bestaan. Het kan dus zijn dat u uw installatie moet uitstellen totdat het apparaat is gedetecteerd, of dat u het misschien meteen kunt doen. Om dit af te handelen en ontdekking mogelijk te maken, registreert u een SMIwatcher met ipmi_smi_watcher_register() om interfaces te herhalen en u te vertellen wanneer ze komen en gaan.

De gebruiker maken

Om de berichtenhandler te gebruiken, moet u eerst een gebruiker aanmaken met behulp vanipmi_create_user. Het interfacenummer geeft aan met welke SMI u verbinding wilt maken en u moet callback-functies opgeven die moeten worden aangeroepen wanneer gegevens binnenkomen. De callback-functie kan op interruptniveau worden uitgevoerd, dus wees voorzichtig met het gebruik van callbacks. Hierdoor kunt u ook een stuk gegevens doorgeven, de handler_data, die bij alle oproepen aan u worden teruggestuurd.

Als u klaar bent, roept u ipmi_destroy_user() aan om van de gebruiker af te komen.

Vanuit gebruikersland maakt het openen van het apparaat automatisch een gebruiker aan en het sluiten van het apparaat vernietigt automatisch de gebruiker.

Berichten

Om een ​​bericht vanuit kernelland te verzenden, doet de aanroep ipmi_request_settime() vrijwel alle berichtafhandeling. De meeste parameters spreken voor zich. Er is echter een parameter "msgid" voor nodig. Dit is NIET het volgnummer van berichten. Het is gewoon een lange waarde die wordt teruggestuurd wanneer het antwoord voor het bericht wordt geretourneerd. Je mag het gebruiken voor alles wat je maar wilt.

Reacties komen terug in de functie waarnaar wordt verwezen door het veld ipmi_recv_hndl van de "handler" die u hebt doorgegeven aan ipmi_create_user(). Onthoud nogmaals dat deze mogelijk op interruptniveau worden uitgevoerd. Vergeet niet om ook naar het ontvangsttype te kijken.

Vanuit userland vult u een ipmi_req_t-structuur in en gebruikt u de IPMICTL_SEND_COMMAND ioctl. Voor inkomende dingen kun je select() of poll() gebruiken om te wachten op berichten die binnenkomen. Je kunt read() echter niet gebruiken om ze op te halen, je moet de IPMICTL_RECEIVE_MSG aanroepen met de ipmi_recv_t-structuur om het bericht daadwerkelijk te krijgen. Onthoud dat je een pointer moet geven naar een gegevensblok in het msg.data-veld, en dat je het msg.data_len-veld moet invullen met de grootte van de gegevens. Dit geeft de ontvanger een plek om het bericht daadwerkelijk te plaatsen.

Als het bericht niet past in de gegevens die u verstrekt, krijgt u een EMSGSIZE-foutmelding en laat de chauffeur de gegevens in de ontvangstwachtrij staan. Als u het wilt ophalen en het bericht wilt laten afkappen, gebruikt u de IPMICTL_RECEIVE_MSG_TRUNC ioctl.

Wanneer u een opdracht verzendt (die wordt gedefinieerd door de laagste orde bit van het netfn volgens de IPMI-specificatie) op de IPMB-bus, wijst het stuurprogramma automatisch het volgnummer toe aan de opdracht en slaat de opdracht op. Als het antwoord niet binnen de IPMI-gespecificeerde 5 seconden wordt ontvangen, zal het automatisch een antwoord genereren met de opdracht timed out. Als er een ongevraagde reactie binnenkomt (bijvoorbeeld na 5 seconden), wordt die reactie genegeerd.

In kernelland MOET je, nadat je een bericht hebt ontvangen en er klaar mee bent, ipmi_free_recv_msg() erop aanroepen, anders lek je berichten. Merk op dat je NOOIT mag knoeien met het "gereed" veld van een bericht, dat is vereist om het bericht correct op te schonen.

Merk op dat er bij het verzenden een ipmi_request_supply_msgs()-oproep is waarmee u de smi kunt leveren en het bericht kunt ontvangen. Dit is handig voor stukjes code die moeten werken, zelfs als het systeem geen buffers meer heeft (de watchdog-timer gebruikt dit bijvoorbeeld). U levert uw eigen buffer en eigen gratis routines. Dit wordt echter niet aanbevolen voor normaal gebruik, aangezien het lastig is om uw eigen buffers te beheren.

Gebeurtenissen en inkomende opdrachten

De driver zorgt voor polling voor IPMI-gebeurtenissen en het ontvangen van commando's (commando's zijn berichten die geen reacties zijn, het zijn commando's die andere dingen op de IPMB-bus u hebben gestuurd). Om deze te ontvangen, moet u zich hiervoor registreren, ze worden niet automatisch naar u verzonden.

Om gebeurtenissen te ontvangen, moet u ipmi_set_gets_events() aanroepen en de "val" instellen op niet-nul. Alle gebeurtenissen die door de stuurprogramma's zijn ontvangen sinds het opstarten, worden onmiddellijk afgeleverd bij de eerste gebruiker die zich registreert voor gebeurtenissen. Als daarna meerdere gebruikers zijn geregistreerd voor evenementen, ontvangen ze allemaal alle evenementen die binnenkomen.

Om commando's te ontvangen, moet u de commando's die u wilt ontvangen afzonderlijk registreren. Roep ipmi_register_for_cmd() aan en geef de netfnand-opdrachtnaam op voor elke opdracht die u wilt ontvangen. Je specificeert ook een bitmasker van de kanalen waarvan je de opdracht wilt ontvangen (of gebruik IPMI_CHAN_ALL voor alle kanalen als het je niet uitmaakt). Er mag slechts één gebruiker worden geregistreerd voor elk netfn/cmd/kanaal, maar verschillende gebruikers kunnen zich registreren voor verschillende commando's, of hetzelfde commando als de kanaalbitmaskers elkaar niet overlappen.

Om te reageren op een ontvangen opdracht, stelt u de responsbit in de geretourneerde netfn in, gebruikt u het adres van het ontvangen bericht en gebruikt u dezelfde msgid die u in het ontvangstbericht hebt gekregen.

(Video) Introduction to Linux Device Drivers Part 1 The Basics

Vanuit userland worden equivalente IOCTL's geleverd om deze functies uit te voeren.

De onderlaag (SMI)-interface

Zoals eerder vermeld, kunnen er meerdere SMI-interfaces worden geregistreerd bij de berichtbehandelaar, aan elk van deze wordt een interfacenummer toegewezen wanneer ze zich registreren bij de berichtenbehandelaar. Ze worden over het algemeen toegewezen in de volgorde waarin ze zijn geregistreerd, maar als een SMI zich uitschrijft en een andere zich registreert, zijn alle weddenschappen uitgeschakeld.

De ipmi_smi.h definieert de interface voor beheerinterfaces, zie dat voor meer details.

De SI-driver

Met de SI-driver kunnen KCS-, BT- en SMIC-interfaces in het systeem worden geconfigureerd. Het ontdekt interfaces via een groot aantal verschillende methoden, afhankelijk van het systeem.

U kunt maximaal vier interfaces specificeren op de laadregel van de module en enkele moduleparameters regelen:

modprobe ipmi_si.o type=,.... ports=,... addrs=,... irqs=, ... regspacings=,,... regsizes=,,... regshifts=,,... slave_addrs=,,... force_kipmid=,,... kipmid_max_busy_us=,,... unload_when_empty=[0|1] trydmi=[0|1] tryacpi=[0| 1] probeerplatform=[0|1] probeerpci=[0|1]

Elk van deze items behalve try... is een lijst, het eerste item voor de eerste interface, het tweede item voor de tweede interface, enz.

Het si_type kan "kcs", "smic" of "bt" zijn. Als u het leeg laat, is het standaard "kcs".

Als u addrs opgeeft als niet nul voor een interface, gebruikt de driver het opgegeven geheugenadres als het adres van het apparaat. Dit heft si_ports op.

Als u poorten opgeeft als niet-nul voor een interface, gebruikt het stuurprogramma de I/O-poort die is opgegeven als het apparaatadres.

Als u irqs specificeert als niet-nul voor een interface, zal het stuurprogramma proberen de gegeven interrupt voor het apparaat te gebruiken.

De andere try...-items maken ontdekking door hun corresponderende namen onmogelijk. Deze zijn allemaal standaard ingeschakeld, stel ze in op nul om ze uit te schakelen. Het tryplatform schakelt openfirmware uit.

De volgende drie parameters hebben te maken met registerlay-out. De registers die door de interfaces worden gebruikt, verschijnen mogelijk niet op opeenvolgende locaties en ze mogen niet in 8-bits registers staan. Met deze parameters kan de lay-out van de gegevens in de registers nauwkeuriger worden gespecificeerd.

De parameter regspacings geeft het aantal bytes tussen opeenvolgende registerstartadressen. Als de regspacing bijvoorbeeld is ingesteld op 4 en het startadres 0xca2 is, dan zou het adres voor het tweede register 0xca6 zijn. Deze staat standaard op 1.

De parameter regsizes geeft de grootte van een register in bytes. De gegevens die door IPMI worden gebruikt, zijn 8 bits breed, maar kunnen zich in een groter register bevinden. Met deze parameter kan het lees- en schrijftype worden opgegeven. Dit kan 1, 2, 4 of 8 zijn. De standaardwaarde is 1.

Aangezien de registergrootte groter kan zijn dan 32 bits, bevinden de IPMI-gegevens zich mogelijk niet in de onderste 8 bits. De parameter regshifts geeft de hoeveelheid gegevens aan die moet worden verschoven om tot de daadwerkelijke IPMI-gegevens te komen.

De slave_addrs specificeert het IPMI-adres van de lokale BMC. Dit is meestal 0x20 en het stuurprogramma is daar standaard op ingesteld, maar als dit niet het geval is, kan dit worden opgegeven wanneer het stuurprogramma opstart.

De parameter force_ipmid activeert (indien ingesteld op 1) of deactiveert (indien ingesteld op 0) de kernel IPMI-daemon. Normaal gesproken wordt dit automatisch gedetecteerd door het stuurprogramma, maar systemen met onderbroken interrupts hebben mogelijk een activering nodig, of gebruikers die de daemon niet willen (hebben de prestaties niet nodig, willen de CPU-hit niet) kunnen deze uitschakelen.

Als unload_when_empty is ingesteld op 1, wordt het stuurprogramma verwijderd als het geen interfaces vindt of als alle interfaces niet werken. De standaardwaarde is één. Op 0 zetten is handig bij de hotmod, maar is uiteraard alleen handig voor modules.

Wanneer ze in de kernel zijn gecompileerd, kunnen de parameters op de kernel-opdrachtregel worden opgegeven als:

ipmi_si.type=,... ipmi_si.ports=,... ipmi_si.addrs=,... ipmi_si.irqs=, ... ipmi_si.regspacings=,,... ipmi_si.regsizes=,,... ipmi_si.regshifts=,,.. ipmi_si.slave_addrs=,,... ipmi_si.force_kipmid=,,... ipmi_si.kipmid_max_busy_us=,,...

Het werkt hetzelfde als de moduleparameters met dezelfde naam.

Als uw IPMI-interface geen interrupts ondersteunt en een KCS- of SMIC-interface is, start het IPMI-stuurprogramma een kernel-thread voor de interface om de zaken te versnellen. Dit is een kernelthread met lage prioriteit die constant het IPMI-stuurprogramma peilt terwijl een IPMI-bewerking bezig is. De moduleparameter force_kipmid zorgt ervoor dat de gebruiker deze thread aan of uit kan zetten. Als je het geforceerd uitschakelt en geen onderbrekingen hebt, zal de bestuurder HEEL langzaam rijden. Geef mij niet de schuld, deze interfaces zijn waardeloos.

Helaas kan deze thread veel CPU gebruiken, afhankelijk van de prestaties van de interface. Dit kan veel CPU verspillen en verschillende problemen veroorzaken met het detecteren van inactieve CPU en het gebruik van extra stroom. Om dit te voorkomen, stelt de kipmid_max_busy_us de maximale tijd, in microseconden, in die kipmid zal draaien voordat hij gaat slapen voor een teek. Deze waarde vormt een balans tussen prestaties en CPU-verspilling en moet worden afgestemd op uw behoeften. Misschien wordt er ooit auto-tuning toegevoegd, maar dat is niet eenvoudig en zelfs de auto-tuning zou moeten worden afgestemd op de gewenste prestaties van de gebruiker.

De driver ondersteunt het toevoegen en verwijderen van interfaces. Op deze manier kunnen interfaces worden toegevoegd of verwijderd nadat de kernel actief is. Dit wordt gedaan met behulp van /sys/modules/ipmi_si/parameters/hotmod, wat een alleen-schrijven-parameter is. Je schrijft een string naar deze interface. De string heeft de indeling:

[:op2[:op3...]]

De "op"s zijn:

toevoegen|verwijderen,kcs|bt|smic,mem|i/o,[,[,[,...]]]

U kunt meer dan één interface op de lijn specificeren. De "opt"s zijn:

rsp=rsi=rsh=irq=ipmb=
(Video) Linux network device driver internals | Linux kernel | Linux network device driver | Youtube

en deze hebben dezelfde betekenis als hierboven besproken. Merk op dat je dit ook kunt gebruiken op de opdrachtregel van de kernel voor een compacter formaat voor het specificeren van een interface. Merk op dat bij het verwijderen van een interface alleen de eerste drie parameters (si-type, adrestype en adres) worden gebruikt voor de vergelijking. Alle opties voor het verwijderen worden genegeerd.

Het SMBus-stuurprogramma (SSIF)

Met het SMBus-stuurprogramma kunnen maximaal 4 SMBus-apparaten in het systeem worden geconfigureerd. Standaard registreert het stuurprogramma alleen iets dat het vindt in DMI- of ACPI-tabellen. U kunt dit wijzigen tijdens de laadtijd van een module (voor een module) met:

modprobe ipmi_ssif.o addr=[,[,...]] adapter=[,[...]] dbg=,... slave_addrs =,,... tryacpi=[0|1] trydmi=[0|1] [dbg_probe=1] alerts_broken

De adressen zijn normale I2C-adressen. De adapter is de tekenreeksnaam van de adapter, zoals weergegeven in /sys/class/i2c-adapter/i2c-/name.NIETi2c- zelf. Ook wordt de vergelijking gedaan door spaties te negeren, dus als de naam "Dit is een I2C-chip" is, kun je zeggenadapter_name=ThisisanI2cchip. Dit komt omdat het moeilijk is om spaties door te geven in kernelparameters.

De foutopsporingsvlaggen zijn bitvlaggen voor elke gevonden BMC, ze zijn: IPMI-berichten: 1, stuurprogrammastatus: 2, timing: 4, I2C-sonde: 8

De tryxxx-parameters kunnen worden gebruikt om het detecteren van interfaces van verschillende bronnen uit te schakelen.

Door dbg_probe in te stellen op 1, wordt foutopsporing van het sondeer- en detectieproces voor BMC's op de SMBussen mogelijk gemaakt.

De slave_addrs specificeert het IPMI-adres van de lokale BMC. Dit is meestal 0x20 en het stuurprogramma is daar standaard op ingesteld, maar als dit niet het geval is, kan dit worden opgegeven wanneer het stuurprogramma opstart.

alerts_broken schakelt SMBus-waarschuwing voor SSIF niet in. Anders wordt SMBusalert ingeschakeld op ondersteunde hardware.

Het ontdekken van de IPMI-compatibele BMC op de SMBus kan ertoe leiden dat apparaten op de I2C-bus defect raken. Het SMBus-stuurprogramma schrijft een "Get Device ID" IPMI-bericht als een blokschrijf naar de I2C-bus en wacht op een reactie. Deze actie kan schadelijk zijn voor sommige I2C-apparaten. Het wordt ten zeerste aanbevolen om het bekende I2C-adres aan de SMBus-driver te geven in de smb_addr-parameter, tenzij u DMI- of ACPI-gegevens hebt om de driver te vertellen wat hij moet gebruiken.

Wanneer ze in de kernel zijn gecompileerd, kunnen de adressen worden opgegeven op de opdrachtregel van de kernel als:

ipmb_ssif.addr=[,[...]] ipmi_ssif.adapter=[,[...]] ipmi_ssif.dbg=[,[. ..]] ipmi_ssif.dbg_probe=1 ipmi_ssif.slave_addrs=[,[...]] ipmi_ssif.tryacpi=[0|1] ipmi_ssif.trydmi=[0|1]

Dit zijn dezelfde opties als op de opdrachtregel van de module.

Het I2C-stuurprogramma ondersteunt geen niet-blokkerende toegang of polling, dus dit stuurprogramma kan naar IPMI-paniekgebeurtenissen knikken, de waakhond bij paniek uitbreiden of andere paniekgerelateerde IPMI-functies zonder speciale kernelpatches en stuurprogramma-aanpassingen. Je kunt die krijgen op de openipmiweb-pagina.

De driver ondersteunt het toevoegen en verwijderen van interfaces via de I2Csysfs-interface.

Het IPMI IPMB-stuurprogramma

Deze driver is bedoeld voor het ondersteunen van een systeem dat op een IPMB-bus zit; het zorgt ervoor dat de interface eruitziet als een normale IPMI-interface. Het verzenden van door de systeeminterface geadresseerde berichten zal ervoor zorgen dat het bericht naar de geregistreerde BMC op het systeem gaat (standaard op IPMI-adres 0x20).

Het stelt je ook in staat om rechtstreeks andere MC's op de bus aan te spreken met behulp van de ipmb directe adressering. Je kunt commando's ontvangen van andere MC's op de bus en ze zullen worden afgehandeld via het normale ontvangen commandomechanisme dat hierboven is beschreven.

Parameters zijn:

ipmi_ipmb.bmcaddr= ipmi_ipmb.retry_time_ms= ipmi_ipmb.max_retries=

Het laden van de module zal er niet toe leiden dat het stuurprogramma automatisch start, tenzij er apparaatboominformatie is om het in te stellen. Als u een van deze met de hand wilt instantiëren, doet u het volgende:

echo ipmi-ipmb  > /sys/class/i2c-dev/i2c-/device/new_device

Merk op dat het adres dat u hier opgeeft het I2C-adres is, niet het IPMI-adres. Dus als u wilt dat uw MC-adres 0x60 is, typt u hier 0x30. Zie de I2C driver info voor meer details.

Het overbruggen van opdrachten naar andere IPMB-bussen via deze interface werkt niet. De wachtrij voor het ontvangen van berichten is standaard niet geïmplementeerd. Er is slechts één wachtrij voor het ontvangen van berichten op een BMC, en dat is bedoeld voor de hoststuurprogramma's, niet iets op de IPMB-bus.

Een BMC kan meerdere IPMB-bussen hebben, op welke bus uw apparaat zit, hangt af van hoe het systeem is bedraad. U kunt de kanalen ophalen met "ipmitool channel info " waarbij het kanaal is, waarbij de kanalen 0-7 zijn en probeer de IPMB-kanalen.

Andere stukken

Ontvang de gedetailleerde informatie met betrekking tot het IPMI-apparaat

Sommige gebruikers hebben meer gedetailleerde informatie over een apparaat nodig, zoals waar het adres vandaan kwam of het onbewerkte basisapparaat voor de IPMI-interface. U kunt de IPMI smi_watcher gebruiken om de IPMI-interfaces te vangen wanneer ze komen of gaan, en om de informatie te pakken, kunt u gebruiken de functionipmi_get_smi_info(), die de volgende structuur retourneert:

struct ipmi_smi_info { enum ipmi_addr_src addr_src; struct-apparaat *dev; unie { struct { leegte *acpi_handle; } acpi_info; } addr_info;};

Momenteel wordt alleen speciale informatie voor SI_ACPI-adresbronnen geretourneerd. Andere kunnen indien nodig worden toegevoegd.

Merk op dat de dev-aanwijzer is opgenomen in de bovenstaande structuur, en ervan uitgaande dat ipmi_smi_get_info succes retourneert, moet u put_device aanroepen op de dev-aanwijzer.

Waakhond

Er wordt een watchdog-timer geleverd die de Linux-standaardwatchdog-timerinterface implementeert. Het heeft drie moduleparameters die kunnen worden gebruikt om het te besturen:

modprobe ipmi_watchdog timeout= pretimeout= action= preaction= preop= start_now=x nowayout=x ifnum_to_use=n panic_wdt_timeout=
(Video) Introduction to Linux Device Drivers Part 2 Platform and Character Drivers

ifnum_to_use specificeert welke interface de watchdog-timer moet gebruiken. De standaardwaarde is -1, wat betekent dat de eerst geregistreerde wordt gekozen.

De time-out is het aantal seconden tot de actie, en de pre-time-out is het aantal seconden vóór de reset dat de pre-time-out-paniek zal optreden (als pre-time-out nul is, wordt pre-time-out niet ingeschakeld). Merk op dat de pretime-out de tijd is vóór de laatste time-out. Dus als de time-out 50 seconden is en de pre-time-out 10 seconden, dan zal de pre-time-out plaatsvinden in 40 seconden (10 seconden voor de time-out). De panic_wdt_timeout is de waarde van de time-out die is ingesteld op kernel panic, om acties zoals kdump te laten plaatsvinden tijdens panic.

De actie kan "reset", "power_cycle" of "power_off" zijn, en specificeert wat er moet gebeuren als de timer afloopt, en is standaard "reset".

De preaction kan "pre_smi" zijn voor een indicatie via de SMI-interface, "pre_int" voor een indicatie via de SMI met onderbrekingen, en "pre_nmi" voor een NMI op een preaction. Zo wordt de chauffeur op de hoogte gebracht van de pretime-out.

De preop kan worden ingesteld op "preop_none" voor geen bewerking op een pretimeout, "preop_panic" om de preoperatie op paniek in te stellen, of "preop_give_data" om gegevens te leveren om te lezen van het watchdog-apparaat wanneer de pretimeout optreedt. Een "pre_nmi"-instelling KAN NIET worden gebruikt met "preop_give_data" omdat u geen gegevensbewerkingen kunt uitvoeren vanaf een NMI.

Wanneer preop is ingesteld op "preop_give_data", komt er één byte klaar om te lezen op het apparaat wanneer de pretimeout optreedt. Selecteren en fasync werken ook op het apparaat.

Als start_now is ingesteld op 1, begint de watchdog-timer te lopen zodra de driver is geladen.

Als nowayout is ingesteld op 1, stopt de watchdog-timer niet wanneer het watchdog-apparaat wordt gesloten. De standaardwaarde van nowayout is true als de optie CONFIG_WATCHDOG_NOWAYOUT is ingeschakeld, of false als dat niet het geval is.

Wanneer gecompileerd in de kernel, is de kernel-opdrachtregel beschikbaar voor het configureren van de watchdog:

ipmi_watchdog.timeout= ipmi_watchdog.pretimeout= ipmi_watchdog.action= ipmi_watchdog.preaction= ipmi_watchdog.preop= ipmi_watchdog.start_now=x ipmi_watchdog.nowayout=x ipmi_watchdog. panic_wdt_timeout=

De opties zijn hetzelfde als de parameteropties van de module.

De waakhond zal in paniek raken en een reset-time-out van 120 seconden starten als hij een pre-actie krijgt. Tijdens een paniek of een herstart zal de waakhond een 120 timer starten als deze actief is om ervoor te zorgen dat de herstart plaatsvindt.

Merk op dat als u de NMI-preactie voor de waakhond gebruikt, u de NMI-waakhond NIET MAG gebruiken. Er is geen redelijke manier om te bepalen of een NMI afkomstig is van de IPMI-controller, dus het moet ervan uitgaan dat als het op een andere manier onverwerkte NMI krijgt, het van IPMI moet zijn en onmiddellijk in paniek zal raken.

Zodra u de watchdog-timer opent, moet u een 'V'-teken naar het apparaat schrijven om het te sluiten, anders stopt de timer niet. Dit is een nieuwe semantiek voor het stuurprogramma, maar maakt het consistent met de rest van de watchdog-stuurprogramma's in Linux.

Paniektime-outs

Het OpenIPMI-stuurprogramma ondersteunt de mogelijkheid om semi-aangepaste en aangepaste gebeurtenissen in het systeemgebeurtenislogboek te plaatsen als er paniek optreedt. als u de optie 'Genereer een paniekgebeurtenis naar alle BMC's bij paniek' inschakelt, krijgt u één gebeurtenis bij paniek in een standaard IPMI-gebeurtenisformaat. Als u de optie 'Genereer OEM-gebeurtenissen met paniekreeks' inschakelt, krijgt u ook een aantal OEM-gebeurtenissen die de paniekreeks bevatten.

De veldinstellingen van de gebeurtenissen zijn:

  • Generator-ID: 0x21 (kernel)

  • EvM Rev: 0x03 (dit evenement wordt geformatteerd in IPMI 1.0-indeling)

  • Sensortype: 0x20 (OS kritische stopsensor)

  • Sensor #: De eerste byte van de panic string (0 als er geen panic string is)

  • Gebeurtenis Dir | Gebeurtenistype: 0x6f (bevestiging, sensorspecifieke gebeurtenisinfo)

  • Gebeurtenisgegevens 1: 0xa1 (Runtime-stop in OEM-bytes 2 en 3)

  • Gebeurtenisgegevens 2: tweede byte van panic string

  • Gebeurtenisgegevens 3: derde byte van panic string

Zie de IPMI-specificatie voor de details van de evenementlay-out. Deze gebeurtenis wordt altijd verzonden naar de lokale beheercontroller. Het zorgt ervoor dat het bericht naar de juiste plaats wordt geleid

Andere OEM-evenementen hebben het volgende formaat:

  • Record-ID (bytes 0-1): Ingesteld door de SEL.

  • Recordtype (byte 2): 0xf0 (OEM zonder tijdstempel)

  • byte 3: Het slave-adres van de kaart die de paniek opslaat

  • byte 4: Een volgnummer (beginnend bij nul) De rest van de bytes (11 bytes) is de panic string. Als de paniekreeks langer is dan 11 bytes, worden er meerdere berichten verzonden met oplopende volgnummers.

Omdat u geen OEM-gebeurtenissen kunt verzenden via de standaardinterface, probeert deze functie een SEL te vinden en de gebeurtenissen daar toe te voegen. Het zal eerst de mogelijkheden van de lokale beheercontroller opvragen. Als het een SEL heeft, worden deze opgeslagen in de SEL van de lokale beheercontroller. Als dit niet het geval is en de lokale beheercontroller een gebeurtenisgenerator is, wordt de gebeurtenisontvanger van de lokale beheercontroller opgevraagd en worden de gebeurtenissen naar de SEL op dat apparaat gestuurd. Anders gaan de gebeurtenissen nergens heen, omdat ze nergens heen kunnen.

Uitschakelen

Als de uitschakelfunctie is geselecteerd, installeert het IPMI-stuurprogramma een uitschakelfunctie in de standaard uitschakelfunctieaanwijzer. Dit zit in de ipmi_poweroff module. Wanneer het systeem een ​​powerdown aanvraagt, stuurt het de juiste IPMI-opdrachten om dit te doen. Dit wordt op verschillende platformen ondersteund.

Er is een moduleparameter met de naam "poweroff_powercycle" die nul kan zijn (uitschakelen) of niet nul (uitschakelen, systeem uitschakelen en binnen enkele seconden weer inschakelen). Settingipmi_poweroff.poweroff_control=x zal hetzelfde doen op de kernelcommandoregel. De parameter is ook beschikbaar via het proc-bestandssysteem in /proc/sys/dev/ipmi/poweroff_powercycle. Merk op dat als het systeem power cycling niet ondersteunt, het altijd de stroom zal uitschakelen.

(Video) x251 Linux Kernel Programming /sysfs Interface | sample read/write access file | Part 1

De parameter "ifnum_to_use" specificeert welke interface de poweroffcode moet gebruiken. De standaardwaarde is -1, wat betekent dat u de eerste geregistreerde kiest.

Merk op dat als u ACPI hebt ingeschakeld, het systeem de voorkeur geeft aan het gebruik van ACPI om uit te schakelen.

FAQs

What is ipmi in linux? ›

Intelligent Platform Management Interface (IPMI) is a standardized message-based hardware management interface. At the core of the IPMI is a hardware chip that is known as the Baseboard Management Controller (BMC), or Management Controller (MC).

What does IPMI do? ›

IPMI (Intelligent Platform Management Interface) is a set of standardized specifications for hardware-based platform management systems that makes it possible to control and monitor servers centrally.

How to install IPMI driver Linux? ›

Installing IPMItool on RedHat or CentOS with yum
  1. Step 1: Install IPMItool. Before you start, make sure to update system repositories with: yum update. ...
  2. Step 2: Enable the Service. Once you have completed the installation, enable ipmitool access by running the command: /sbin/chkconfig ipmi on.
Aug 27, 2020

What is an IPMI driver? ›

The IPMI driver is a WDM kernel mode driver that communicates with the BMC using KCS (Keyboard Controller Style). For more information about driver installation, see Installation and Configuration for Windows Remote Management.

Is IPMI a hardware or software? ›

IPMI is a hardware solution for controlling and managing your servers. It has significant differences and benefits compared to system diagnosis software.

How do I connect to IPMI? ›

Your server has an IPMI address ipmi.web-hosting.com so you can access it in the browser: https://ipmi.web-hosting.com (secure connection) http://ipmi.web-hosting.com (plain HTTP)

What port is IPMI? ›

IPMI/RCMP: 623 (UDP)

How to install Linux kernel driver? ›

Complete the following steps to install the kernel driver
  1. Navigate to ./software/kernel/linux under the example design generation directory.
  2. Change the permissions on the install, load, and unload files. ...
  3. Install the driver. ...
  4. Verify the driver installation. ...
  5. Verify that Linux recognizes the PCIe design example.

How to install Linux driver file? ›

To make it simple, this example will use apt-get, but the idea is similar for the other options.
  1. Delete the existing repository, if it exists. ...
  2. Add the repository to the repolist, which should be specified in the driver guide. ...
  3. Update the repository list. ...
  4. Install the package. ...
  5. Check the installation.
May 16, 2019

How to install all Linux drivers? ›

Steps to Uninstall:
  1. Open the command window in the driver folder.
  2. Input the following command in the command window: “sudo sh uninstall.sh”, and press the enter key on the keyboard to execute it.
  3. Enter your user password to complete the uninstallation.

Do I need IPMI? ›

Do you "need" IPMI? No, you don't--the server will run just fine without it.

Is IPMI still used? ›

Every decent server machine has remote access, which is called IPMI (Intelligent Platform Management Interface). A while ago (it is still being used), data centers had options for KVM over IP (that translates to Keyboard, Video, Mouse over IP address).

Where can I find IPMI? ›

Q: How can I check the IP address that IPMI is using? A: The motherboard will list the IP address in the BIOS, usually under IPMI > Set LAN Configuration. By default we leave DHCP turned off and set 0.0.

Is IPMI the same as iLO? ›

iDRAC (Dell) and iLO (HP) are proprietary Intelligent Platform Management Interface (IPMI) technologies that provide remote management options on a device, even when that device is offline.

What is IPMI module? ›

What is it? The IPMI (Intelligent Platform Management Interface) is a set of industry standard specifications for hardware-based subsystems that provide management and monitoring capabilities independently of the host system's CPU, firmware and operating system.

Can you add IPMI to motherboard? ›

In most cases, you can't just plug a IPMI card into a PCIe slot and have it work. The motherboard itself needs to be compatible. There are plenty of SuperMicro boards, for example, that you can upgrade with an IPMI add-in card.

What are IPMI devices? ›

The Intelligent Platform Management Interface (IPMI) is a set of computer interface specifications for an autonomous computer subsystem that provides management and monitoring capabilities independently of the host system's CPU, firmware (BIOS or UEFI) and operating system.

Does IPMI use SSH? ›

Once you are connected to the IPMI VPN you can directly SSH to your machine's serial. To do this use the following SSH command replacing YOUR_IPMI_USER with the user from above. It will then prompt you to enter your password which is your IPMI user password from above.

What is the default IP address of IPMI? ›

FAQ Entry | Online Support | Support - Super Micro Computer, Inc. If you are not able to ping the IPMI default IP 192.168. 1.99 even after you reset by pressing the reset button for more than 10 seconds.

What is IPMI configuration? ›

The Intelligent Platform Management Interface (IPMI) is a specification for remote server management. It is a way to manage a computer by using a network connection to the hardware rather than to an operating system or login shell.

How to set up IPMI server? ›

How to setup IPMI
  1. Plug in an Ethernet cable into a port on your motherboard and the other end to your network switch.
  2. Access the bios by pressing the delete key when presented with the Supermicro splash screen when booting the Storinator.
  3. Go to the IPMI tab, then to BMC Network Configuration.

What is the difference between KVM and IPMI? ›

IPMI is for bare metal servers and KVM is for virtual machines. The IPMI/KVM interfaces are deployed on the private network so you will need to connect to the SSL VPN before attempting to connect to the IPMI or KVM remotely.

How do I access IPMI from Linux? ›

Enable IPMI State Using the Web Interface
  1. Log in to the ILOM web interface.
  2. Select Configuration --> System Management Access --> IPMI. The IPMI Settings page appears.
  3. Click the check box to enable or disable the IPMI state.

What happens if you disable IPMI? ›

Disallowing IPMI network access will remove the ability to use the weakness present in the IPMI RAKP protocol to discover user account credentials.

What port is IPMI use? ›

HTTPS: 443 (TCP) IPMI/RCMP: 623 (UDP) *SMC Crash Dump Utility requires this port.

How to connect to server using IPMI? ›

Log In to the Remote Console

Input the IPMI IP in the browser address bar, and press Enter. Once you are connected to the remote server via IPMI Console Redirection, the following IPMI Login screen will display. Enter your username in the Username box. Enter your password in the Password box and click on Login.

What type of interface is IPMI? ›

IPMI is an open, industry-standard interface that was designed to manage server systems over a network. IPMI provides a way to manage a computer that may be powered off or otherwise unresponsive by using a network connection directly to the hardware (rather than to an operating system or login shell).

How to check IPMI port in Linux? ›

Here are some suggestions.
  1. FreeIPMI's ipmi-locate can be used to determine if IPMI can be found on your system. ...
  2. dmidecode may be similarly used to probe for devices that support IPMI on your system. ...
  3. FreeIPMI's ipmi-ping can be used to see if a machine has an IPMI service at a specific host/IP address.
Dec 14, 2011

Where is IPMI located? ›

IPMI runs on separate hardware attached to a motherboard or server. This separate hardware is the Baseboard Management Controller (BMC).

How do you configure IPMI? ›

Plug in an ethernet cable from the appliance to the switch. On reboot of the appliance, press the Delete key to pull up the BIOS. Go into the Advanced settings, then IPMI Configuration, then Set LAN Configuration. Enable IPMI, giving it a valid IP address.

Is IPMI a Security risk? ›

What Is the Risk? Attackers can use IPMI to essentially gain physical-level access to the server. An attacker can reboot the system, install a new operating system, or compromise data, bypassing any operating system controls.

What are the disadvantages of IPMI? ›

Limitations Of IPMI

Networking may fail after switching ports on the motherboard or after installing IPMI patches. These issues are usually easily solvable by rebooting; occasionally, reconfiguration is necessary. Some analysts claim that IPMI isn't as secure a system as it could be.

What is the default IP address for IPMI? ›

If you are not able to ping the IPMI default IP 192.168. 1.99 even after you reset by pressing the reset button for more than 10 seconds.

What is the default user for IPMI? ›

Q: What is the default username and password for IPMI? A: Both the default username and password are “ADMIN”, case-sensitive.

How do I access my IPMI IP? ›

Alternatively, you can press the DEL key during POST to enter the BIOS and then navigate to IPMI > BMC Network Configuration. Here you can see the IP address as well as configure the settings such as a static IP address and gateway.

Videos

1. Nvidia Open-Sourced their Linux GPU Kernel Driver!
(Jeff Geerling)
2. How to compile a custom Linux kernel
(DenshiVideo)
3. linux dma in device drivers
(Alok Prasad)
4. How To Compile The Linux Kernel From The Source Code? | Linux Kernel Compilation Procedure
(Nehra Classes)
5. Linux device driver lecture 14 : Intree Building
(Fastbit Embedded Brain Academy)
6. Nvidia Open Sources Linux Drivers!! But There's A Catch
(Brodie Robertson)

References

Top Articles
Latest Posts
Article information

Author: Tyson Zemlak

Last Updated: 08/16/2023

Views: 6231

Rating: 4.2 / 5 (63 voted)

Reviews: 86% of readers found this page helpful

Author information

Name: Tyson Zemlak

Birthday: 1992-03-17

Address: Apt. 662 96191 Quigley Dam, Kubview, MA 42013

Phone: +441678032891

Job: Community-Services Orchestrator

Hobby: Coffee roasting, Calligraphy, Metalworking, Fashion, Vehicle restoration, Shopping, Photography

Introduction: My name is Tyson Zemlak, I am a excited, light, sparkling, super, open, fair, magnificent person who loves writing and wants to share my knowledge and understanding with you.