Hálózati blokkoló eszköz

A Network blokkeszköz ( Engl. A hálózati blokk eszköz , rövidítve NBD ) egyfajta virtuális merevlemez , amelyre a számítógép segítségével az Internet Protocol elérheti. Az NBD-t egy NBD szerver biztosítja . Erre a célra saját merevlemezt, merevlemez-partíciót vagy fájlt kínál NBD-ként bizonyos más számítógépekhez ( kliensekhez ). Egy másik számítógép (vagy ugyanaz a számítógép) TCP kapcsolaton keresztül csatlakozhat az NBD szerverhez, majd a saját helyi merevlemezéhez hasonlóan használhatja az NBD-t.

Jelenleg egy teljes NBD implementáció van csak a Linux számára . A Linux az összes tárolóeszközt úgynevezett blokkeszközként címzi . Ha egy Linux számítógépnek hálózati blokkolóeszközt kell használni, akkor az NBD támogatást aktiválni kell a Linux kernel konfigurációjában, vagy be kell tölteni az nbd.ko kernelmodult . Az nbd-client nevű felhasználói hely - segédprogram most biztosítja a TCP kapcsolatot az NBD szerverrel, a meglévő kapcsolat jelzi a kernelt , majd kilép. Ennek az az előnye, hogy a kernelnek nem kell foglalkoznia a kapcsolat létrehozásával (és bármilyen hitelesítéssel stb.).

Az NBD szerver független az operációs rendszertől. Futtatható nem Linux rendszeren is, mivel nincs szükség Linux-specifikus funkciókra. Van egy nbd-server nevű program, amely nem mást csinál, mint egy adott fájlt (vagy partíciót stb.) Átadni egy adott TCP portnak .

Elvileg lehetséges egy számítógép merevlemez nélküli működtetése az NBD-n keresztül, amelynek egyetlen tárolóeszköze az NBD. Mivel azonban a kapcsolat létrehozásához külső programra ( nbd-client ) van szükség, ez csak olyan fogalmakkal valósítható meg, mint például az init-ramdisk , egy virtuális fájlrendszer, amelyet RAM-ban tartanak és magában a kernel tárolja, hogy a hajók számára rendelkezésre álló után használható.

Mivel az NBD eredeti verziójának vannak gyengeségei (például az NBD-nként 4 gigabájtra korlátozódik ), különféle kiterjesztések vannak, amelyek közül néhányat továbbfejlesztett NBD-nek neveznek. Ezek azonban nem kompatibilisek az eredeti NBD-vel.

NBD protokoll (a 2.6 verziótól)

A protokoll bináris protokoll. Az összes többbájtos értéket hálózati bájtsorrendben küldi el .

Kézfogás

Először van egy inicializálási szakasz, amelyben az adatokat kicserélik az NBD szerver és az NBD kliens program között. Ez a protokoll független a Linux kernel NBD illesztőprogramjától, és a különböző NBD implementációktól függ.

Verzió ≤2.9.16

A régi kézfogási protokoll portonként pontosan egy blokkoló eszközt támogat. Amint egy ügyfél csatlakozott az NBD szerverhez, a kiszolgáló a következő adatszerkezetet küldi:

NBD inicializáló csomag (szerver → kliens)
Eltolás Adattípus Vezetéknév leírás
0 char [8] INIT_PASSWD Azonosító karakterlánc {'N', 'B', 'D', 'M', 'A', 'G', 'I', 'C'}
8. uint64_t cliserv_magic Varázsszám 0x00420281861253
16. uint64_t export_méret Az exportált blokkeszköz mérete (bájtban)
24. uint32_t zászlók Zászlók:
  • 0. bit: Vannak zászlók
  • 1. bit: az eszköz csak olvasható
  • 2. bit: Az eszköz támogatja a "FLUSH" parancsot az írási gyorsítótárak kiürítésére
  • 3. és 4. bit: fel nem használt
  • 5. bit: Az eszköz támogatja a TRIM parancsot, amellyel a fájlrendszer tájékoztathatja a felszabadított blokkréteget
28. char [124] fenntartott Foglalva (jelenleg nulla bájttal töltve)

Ha az ügyfél nem fogadja el az azonosító karakterláncot vagy a mágikus számot, akkor bezárja a kapcsolatot. Ellenkező esetben a kapcsolat sikeresnek tekinthető.

≥ 2.9.17 verzió

Az új kézfogási protokoll az IANA által regisztrált 10809 portot és egy másik üzenetformátumot használ, amely lehetővé teszi a szervernek, hogy több blokkoló eszközt kínáljon egy TCP porton keresztül, amelyek közül az ügyfél név szerint kiválaszthat egyet. Ezenkívül a 32 bites zászlókat 2 16 bites részre osztották, amelyek lehetővé teszik a szerver-globális és az eszközfüggő zászlók elkülönítését.

Server Init csomag (kiszolgáló → kliens)
Eltolás Adattípus Vezetéknév leírás
0 char [8] INIT_PASSWD Azonosító karakterlánc {'N', 'B', 'D', 'M', 'A', 'G', 'I', 'C'}
8. uint64_t cliserv_magic Varázsszám 0x49484156454F5054 (= "IHAVEOPT")
16. uint16_t server_flags A teljes kiszolgálóra vonatkozó jelölések. A zászlók értéke általában 0003 hex . A bitek részletesen jelentik:
0. bit
NBD_FLAG_FIXED_NEW_STILE: A Set bit azt jelzi, hogy egy bizonyos kézfogási hibát kijavítottak a szerveren
1. bit
NBD_FLAG_NO_ZEROES: A Set bit azt jelzi, hogy a fejlécüzenet nincs kitöltve 124 nulla bájttal

Az ügyfél jelzőivel válaszol. Mivel eddig nem definiáltak zászlókat, csak 32 nulla bitből állnak:

Client Init csomag (kiszolgáló → kliens)
Eltolás Adattípus Vezetéknév leírás
0 uint32_t client_flags Korábban ugyanaz volt a jelentése, mint a server_flags, általában 0000'0003 hex .

Ezután az ügyfél különféle opciókat küld, amelyeket a szerver elfogad vagy elutasít:

Opciós csomag (kliens → szerver)
Eltolás Adattípus Vezetéknév leírás
0 uint64_t cliserv_magic Varázsszám 0x49484156454F5054 (= "IHAVEOPT")
8. uint32_t opció_szám Azonosító szám / opció típusa
12. uint32_t opció_hossz Az opció hossza (bájtban)
16. változó opció_adatok Opciós adatok (az opció típusától függően)

Eddig 3 lehetőséget határoztak meg:

NBD opciók
Vezetéknév érték fontosságát
NBD_OPT_EXPORT_NAME 1 Az ügyfél kiválasztja a blokkoló eszköz nevét: a név a option_datamezőben következik. Ez az opció automatikusan kilép az opciók listájából. A szerver elküldi az inicializálás eszközfüggő részét (lásd alább).
NBD_OPT_ABORT 2 Az ügyfél meg akarja szakítani a kapcsolatot
NBD_OPT_LIST 3 Az ügyfél kér egy listát az exportált blokkeszközök nevéről

A kiszolgáló válaszcsomaggal válaszol egy válaszcsomaggal:

Válasz csomag (kiszolgáló → kliens)
Eltolás Adattípus Vezetéknév leírás
0 uint64_t válasz_mágikus Varázsszám 0x0003e889045565a9
8. uint32_t opció_szám Azonosító szám / választható opció típusa
12. uint32_t válasz_típus A válasz típusa
16. uint32_t válasz_hossz A válaszadatok hossza
20 változó válasz_adatok Válaszadatok, ha a válasz_hossz> 0

A következő választípusokat határozták meg eddig:

Válasz típusok
Vezetéknév érték fontosságát
NBD_REP_ACK 1 A szerver elfogadja az opciót, vagy nincs további válaszadata (az NBD_OPT_LIST használatával)
NBD_REP_SERVER 2 A blokkoló eszköz leírása. Ezt követi a név hossza 32 bites számként, a név és - ha van még hely a válaszcsomagban - további leíró részletek egyszerű szövegben.
NBD_REP_ERR_UNSUP 8000 0001 hex Az ügyfél ismeretlen lehetőséget küldött
NBD_REP_ERR_POLICY 8000 0002 hex A szerver megértette az opciót, de a szerver nem fogadhatja el az opciót (pl. Az NBD_OPT_LIST engedélyezhető vagy tiltható a konfigurációs fájlban)
NBD_REP_ERR_INVALID 8000 0003 hex A szerver megértette az opciót, de szintaktikailag érvénytelen volt
NBD_REP_ERR_PLATFORM 8000 0004 hex Az opciót nem támogatja az a platform, amelyen a kiszolgáló fut. (jelenleg nem használt)
Image
Az adatforgalom hexdumpja az inicializálási szakaszban az NBD kliens és a szerver között. Az ügyfél kéri a felajánlott eszközök listáját, a szerver pedig két eszközt sorol fel ("alfa" és "bravo" néven).

A tárgyalási szakasz befejeződik, amint a szerver pozitívan nyugtázta az NBD_OPT_EXPORT_NAME opciót. Ezután elküldi az exportált blokkeszköz azonosító adatait az ügyfélnek:

Device Init csomag (szerver → kliens)
Eltolás Adattípus Vezetéknév leírás
0 uint64_t eszköz_méret Az exportált blokkeszköz mérete (bájtban)
8. uint16_t device_flags Az exportált eszközre vonatkozó jelölések:
  • 0. bit: Vannak zászlók
  • 1. bit: az eszköz csak olvasható
  • 2. bit: A kiszolgáló és az eszköz támogatja az NBD_CMD_FLUSH parancsot
  • 3. bit: A szerver és az eszköz támogatja az NBD_CMD_FLAG_FUA jelzőt
  • 4. bit: NBD_FLAG_ROTATIONAL: az exportált adatok egy forgó adathordozón vannak (klasszikus merevlemez), amelyet az ügyfél figyelembe vehet a blokkokhoz való hozzáférési mintában
  • 5. bit: A szerver és az eszköz támogatja az NBD_FLAG_SEND_TRIM parancsot
10. uint8_t [124] párnázás nem használt, mind a 0

Adatfázis

Az NBD kliens speciális rendszerhívásokon keresztül továbbítja a blokkeszköz méretére, az esetleges zászlókra és a nyitott aljzatra vonatkozó információkat a kernelnek, és megszünteti önmagát. A kernel ekkor átveszi a további kommunikációt ezen a foglalaton keresztül.

Az ügyféloldali kernel most olvasási és írási kéréseket küld a szervernek. Ezek a következő csomagszerkezettel rendelkeznek:

NBD kérés (kliens → szerver)
Eltolás Adattípus Vezetéknév leírás
0 uint32_t varázslat Varázsszám 0x25609513
4 uint32_t típus 0: olvasási hozzáférés; 1: írási hozzáférés; 2: a csatlakozás vezérelt vége; 3: öblítő gyorsítótár; 4: TRIM parancs
8. char [8] törvény 8 bájt, amelyek azonos módon kerülnek elküldésre a válaszban, így hozzárendelhetők egy kéréshez
16. uint64_t tól től Eltolás (bájtban), ahonnan olvasni / írni lehet
24. uint32_t len Az adatblokk hossza

Írásbeli hozzáférés esetén az írandó adatok azonnal következnek. A szerver minden kérésre válaszol. Ennek a következő szerkezete van:

NBD válasz (kiszolgáló → kliens)
Eltolás Adattípus Vezetéknév leírás
0 uint32_t varázslat Varázsszám 0x67446698
4 uint32_t hiba 0 = OK (nem történt hiba)
8. char [8] törvény A fogantyú másolata a kapcsolódó kérésben

Olvasási kérésekre adott válaszok esetén a kért adatok azonnal következnek.

Lásd még

web Linkek

Egyéni bizonyíték

  1. Az nbd-2.9.13 / cliserv.h forráskódjából
  2. Az nbd-3.2 / proto.txt forráskódjából
  3. A protokoll leírásával ellentétben, a gazdabájt sorrendben küldi el. Az ügyfél figyelmen kívül hagyja az értéket, amikor beolvassa.
  4. a b A /usr/include/linux/nbd.h fejlécből