GNU/Linux >> Znalost Linux >  >> Linux

Těšíme se na konfiguraci sítě Linux v počátečním ramdisku (initrd)

initrd (počáteční ramdisk) je malý souborový systém načtený během zaváděcího procesu v systému Linux. Jedním z úkolů, za které může být initrd zodpovědný, je konfigurace sítě.

Tento článek vysvětluje případy, kdy je nezbytná konfigurace sítě na začátku procesu spouštění, jak je implementována a jaká vylepšení přináší Red Hat Enterprise Linux 8.3.

Potřeba initrd

Když stisknete tlačítko napájení počítače, proces spouštění se spustí mechanismem závislým na hardwaru, který načte bootloader . Software bootloaderu najde jádro na disku a spustí jej. Dále jádro připojí kořenový souborový systém a spustí init proces.

Tento proces zní jednoduše a může to být to, co se skutečně děje na některých systémech Linux. Moderní linuxové distribuce však musí podporovat rozsáhlou sadu případů použití, pro které tento postup nestačí.

Za prvé, kořenový souborový systém může být na zařízení, které vyžaduje specifický ovladač. Před pokusem o připojení souborového systému musí být do běžícího jádra vložen správný modul jádra. V některých případech je kořenový souborový systém na zašifrovaném oddílu, a proto potřebuje pomocníka v uživatelském prostoru, který požádá uživatele o přístupovou frázi a předá ji jádru. Nebo může být kořenový souborový systém sdílen po síti přes NFS nebo iSCSI a jeho připojení může nejprve vyžadovat nakonfigurované IP adresy a trasy na síťovém rozhraní.

[ Také by se vám mohlo líbit: Linuxové sítě:13 použití pro netstat ]

K překonání těchto problémů může bootloader předat jádru malý obraz souborového systému (initrd), který obsahuje skripty a nástroje pro nalezení a připojení skutečného kořenového souborového systému. Jakmile to uděláte, initrd se přepne do skutečného kořenového adresáře a zavádění pokračuje jako obvykle.

Infrastruktura dracut

Na Fedoře a RHEL je initrd vytvořen pomocí dracut . Na své domovské stránce je dracut "infrastruktura initramfs řízená událostmi. dracut (nástroj) se používá k vytvoření obrazu initramfs zkopírováním nástrojů a souborů z nainstalovaného systému a jejich kombinací s rámcem dracut, který se obvykle nachází v /usr/lib/dracut/modules.d ."

Poznámka k terminologii:Někdy jsou názvy initrd a initramfs se používají zaměnitelně. Ve skutečnosti odkazují na různé způsoby vytváření obrazu. Initrd je obraz obsahující skutečný souborový systém (například ext2), který je připojen jádrem. Initramfs je cpio archiv obsahující strom adresářů, který se rozbalí jako tmpfs. V dnešní době jsou obrázky initrd zastaralé ve prospěch schématu initramfs. Název initrd se však stále používá k označení zaváděcího procesu zahrnujícího dočasný souborový systém.

Příkazový řádek jádra

Vraťme se ke scénáři NFS root, který byl zmíněn dříve. Jedním z možných způsobů zavedení přes NFS je použití příkazového řádku jádra obsahujícího root=dhcp argument.

Příkazový řádek jádra je seznam možností předávaných jádru ze zavaděče, které jsou přístupné jádru a aplikacím. Pokud používáte GRUB, můžete jej změnit stisknutím e klíč na spouštěcí položce a upravte řádek začínající linux .

Kód dracut uvnitř initramfs analyzuje příkazový řádek jádra a spustí DHCP na všech rozhraních, pokud příkazový řádek obsahuje root=dhcp . Po získání zapůjčení DHCP nakonfiguruje dracut rozhraní s přijatými parametry (IP adresa a trasy); z pronájmu také extrahuje hodnotu volby DHCP kořenové cesty. Tato možnost nese adresu a cestu serveru NFS (což může být například 192.168.50.1:/nfs/client ). Dracut poté připojí sdílenou složku NFS na toto místo a pokračuje v bootování.

Pokud neexistuje žádný server DHCP poskytující adresu a kořenovou cestu NFS, lze hodnoty nakonfigurovat explicitně v příkazovém řádku:

root=nfs:192.168.50.1:/nfs/client ip=192.168.50.101:::24::ens2:none

Zde první argument určuje adresu serveru NFS a druhý konfiguruje ens2 rozhraní se statickou IP adresou.

Existují dvě syntaxe pro specifikaci síťové konfigurace pro rozhraní:

ip=<interface>:{dhcp|on|any|dhcp6|auto6}[:[<mtu>][:<macaddr>]]

ip=<client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>:<interface>:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[:[<mtu>][:<macaddr>]]

První lze použít pro automatickou konfiguraci (DHCP nebo IPv6 SLAAC) a druhou pro statickou konfiguraci nebo kombinaci automatické a statické konfigurace. Zde je několik příkladů:

ip=enp1s0:dhcp
ip=192.168.10.30::192.168.10.1:24::enp1s0:none
ip=[2001:0db8::02]::[2001:0db8::01]:64::enp1s0:none

Všimněte si, že pokud předáte ip= možnost, ale dracut nepotřebuje síť pro připojení kořenového souborového systému, možnost je ignorována. Chcete-li vynutit konfiguraci sítě bez kořenového adresáře sítě, přidejte rd.neednet=1 do příkazového řádku.

Pravděpodobně jste si všimli, že mezi metodami automatické konfigurace existuje také ibft . iBFT je zkratka pro iSCSI Boot Firmware Table a je to mechanismus pro předávání parametrů o zařízeních iSCSI z firmwaru do operačního systému. iSCSI (Internet Small Computer Systems Interface) je protokol pro přístup k síťovým úložným zařízením. Popis iBFT a iSCSI je mimo rozsah tohoto článku. Důležité je, že předáním ip=ibft do jádra, konfigurace sítě se získá z firmwaru.

Dracut také podporuje přidávání vlastních tras, specifikování názvu stroje a serverů DNS, vytváření vazeb, mostů, VLAN a mnoho dalšího. Další podrobnosti najdete na manuálové stránce dracut.cmdline.

Síťové moduly

Rámec dracut zahrnutý v initramfs má modulární architekturu. Skládá se z řady modulů, z nichž každý obsahuje skripty a binární soubory, které poskytují specifické funkce. Pomocí příkazu dracut --list-modules můžete zjistit, které moduly jsou k dispozici pro zahrnutí do initramfs .

V tuto chvíli existují dva moduly pro konfiguraci sítě:network-legacy a network-manager . Možná se divíte, proč různé moduly poskytují stejnou funkcionalitu.

network-legacy je starší a používá skripty shellu volající nástroje jako iproute2 , dhclient a arping pro konfiguraci rozhraní. Po přepnutí na skutečný kořenový adresář se spustí jiná služba konfigurace sítě. Tato služba si není vědoma toho, co network-legacy modul, který má dělat, a aktuální stav každého rozhraní. To může vést k problémům s udržováním stavu přes hranici kořenového přepínače.

Nápadným příkladem stavu, který je třeba zachovat, je pronájem DHCP. Pokud se adresa rozhraní během spouštění změní, připojení ke sdílené složce NFS se přeruší a způsobí selhání spouštění.

Pro zajištění bezproblémového přechodu je potřeba mechanismus pro předávání stavu mezi dvěma prostředími. Problémem však může být předávání stavu mezi službami s různými konfiguračními modely.

network-manager Pro zlepšení této situace byl vytvořen modul dracut. Modul spouští NetworkManager v initrd pro konfiguraci profilů připojení generovaných z příkazového řádku jádra. Po dokončení NetworkManager serializuje svůj stav, který je později načten instancí NetworkManager ve skutečném kořenovém adresáři.

Fedora 31 byla první distribucí, která přešla na network-manager ve výchozím nastavení initrd. Na RHEL 8.2, network-legacy je stále výchozí, ale network-manager je k dispozici. Na RHEL 8.3 bude dracut používat network-manager ve výchozím nastavení.

Povolení jiného síťového modulu

I když by oba moduly měly být do značné míry kompatibilní, existují určité rozdíly v chování. Některé z nich jsou zdokumentovány v nm-initrd-generator manuálová stránka. Obecně se doporučuje používat network-manager modul, když je povolen NetworkManager.

Chcete-li znovu sestavit initrd pomocí specifického síťového modulu, použijte jeden z následujících příkazů:

# dracut --add network-legacy  --force --verbose
# dracut --add network-manager --force --verbose

Vzhledem k tomu, že tato změna bude vrácena při příštím přestavění initrd, možná budete chtít změnu provést natrvalo následujícím způsobem:

# echo 'add_dracutmodules+=" network-manager "' > /etc/dracut.conf.d/network-module.conf
# dracut --regenerate-all --force --verbose

--regenerate-all volba také znovu sestaví všechny obrazy initramfs pro verze jádra nalezené v systému.

Modul dracut správce sítě

Stejně jako u všech modulů dracut, network-manager modul je rozdělen do fází, které jsou volány v různých časech během bootování (další podrobnosti viz manuálová stránka dracut.modules).

První fáze analyzuje příkazový řádek jádra voláním /usr/libexec/nm-initrd-generator vytvořit seznam profilů připojení v /run/NetworkManager/system-connections . Druhá část modulu běží poté, co se udev ustálí, tj. poté, co uživatelský prostor dokončí zpracování událostí jádra pro zařízení (včetně síťových rozhraní) nalezená v systému.

Když je NM spuštěn v reálném kořenovém prostředí, zaregistruje se na D-Bus, nakonfiguruje síť a zůstane aktivní, aby reagoval na události nebo požadavky D-Bus. V initrd se NetworkManager spouští v configure-and-quit=initrd režim, který se neregistruje na D-Bus (protože není dostupný v initrd, alespoň prozatím) a ukončí se po dosažení startup-complete událost.

Spuštění dokončeno událost se spustí poté, co se všechna zařízení s odpovídajícím profilem připojení pokusila aktivovat, ať už úspěšně nebo ne. Jakmile jsou všechna rozhraní nakonfigurována, NM opustí a zavolá dracut hooks, aby informoval ostatní moduly, že síť je dostupná.

Všimněte si, že /run/NetworkManager adresář obsahující vygenerované profily připojení a další stav za běhu je zkopírován do skutečného kořenového adresáře, aby tam běžící nový proces NetworkManager přesně věděl, co má dělat.

Odstraňování problémů

Máte-li v dracut problémy se sítí, tato část obsahuje několik návrhů, jak problém prošetřit.

První věc, kterou musíte udělat, je přidat rd.debug na příkazový řádek jádra, což umožňuje protokolování ladění v dracut. Protokoly se ukládají do /run/initramfs/rdsosreport.txt a jsou také k dispozici v časopise.

Pokud systém nenabootuje, je užitečné dostat do prostředí initrd shell, který ručně zkontroluje, proč věci nefungují. K tomu existuje rd.break argument příkazového řádku. Všimněte si, že argument spustí shell, když initrd dokončí svou práci a chystá se předat řízení procesu init ve skutečném kořenovém souborovém systému. Chcete-li zastavit v jiné fázi dracutu (například po analýze příkazového řádku), použijte následující argument:

rd.break={cmdline|pre-udev|pre-trigger|initqueue|pre-mount|mount|pre-pivot|cleanup}

Obraz initrd obsahuje minimální sadu binárních souborů; pokud potřebujete specifický nástroj na dracut shellu, můžete obrázek přestavět a přidat to, co chybí. Chcete-li například přidat ping a tcpdump binární soubory (včetně všech jejich závislých knihoven), spusťte:

# dracut -f  --install "ping tcpdump"

a poté volitelně ověřte, že byly úspěšně zahrnuty:

# lsinitrd | grep "ping\|tcpdump"
Arguments: -f --install 'ping tcpdump'
-rwxr-xr-x   1 root     root        82960 May 18 10:26 usr/bin/ping
lrwxrwxrwx   1 root     root           11 May 29 20:35 usr/sbin/ping -> ../bin/ping
-rwxr-xr-x   1 root     root      1065224 May 29 20:35 usr/sbin/tcpdump

Generátor

Pokud jste obeznámeni s konfigurací NetworkManageru, možná budete chtít vědět, jak je daný příkazový řádek jádra přeložen do profilů připojení NetworkManageru. To může být užitečné pro lepší pochopení konfiguračního mechanismu a nalezení syntaktických chyb v příkazovém řádku, aniž byste museli zavádět počítač.

Generátor je nainstalován v /usr/libexec/nm-initrd-generator a musí být volán se seznamem argumentů jádra za dvojitou pomlčkou. --stdout volba vytiskne vygenerovaná spojení na standardní výstup. Zkusme zavolat generátor pomocí ukázkového příkazového řádku:

$ /usr/libexec/nm-initrd-generator --stdout -- \
          ip=enp1s0:dhcp:00:99:88:77:66:55 rd.peerdns=0

802-3-ethernet.cloned-mac-address: '99:88:77:66:55' is not a valid MAC
address

V tomto příkladu generátor hlásí chybu, protože po enp1s0 chybí pole pro MTU . Jakmile je chyba opravena, analýza proběhne úspěšně a nástroj vytiskne vygenerovaný profil připojení:

$ /usr/libexec/nm-initrd-generator --stdout -- \
        ip=enp1s0:dhcp::00:99:88:77:66:55 rd.peerdns=0

*** Connection 'enp1s0' ***

[connection]
id=enp1s0
uuid=e1fac965-4319-4354-8ed2-39f7f6931966
type=ethernet
interface-name=enp1s0
multi-connect=1
permissions=

[ethernet]
cloned-mac-address=00:99:88:77:66:55
mac-address-blacklist=

[ipv4]
dns-search=
ignore-auto-dns=true
may-fail=false
method=auto

[ipv6]
addr-gen-mode=eui64
dns-search=
ignore-auto-dns=true
method=auto

[proxy]

Všimněte si, jak rd.peerdns=0 argument se překládá do ignore-auto-dns=true vlastnost, díky které NetworkManager ignoruje DNS servery přijaté přes DHCP. Vysvětlení vlastností NetworkManageru lze nalézt na manuálové stránce nm-settings.

[ Síť se vymkla kontrole? Podívejte se na Automatizaci sítě pro každého, bezplatnou knihu od Red Hat. ] 

Závěr

Modul NetworkManager dracut je ve Fedoře ve výchozím nastavení povolen a brzy bude také povolen na RHEL. Přináší lepší integraci mezi sítí v initrd a NetworkManagerem běžícím ve skutečném kořenovém souborovém systému.

Zatímco současná implementace funguje dobře, existují nápady na možná vylepšení. Jedním z nich je opustit configure-and-quit=initrd režimu a spusťte NetworkManager jako démona spuštěného službou systemd. Tímto způsobem bude NetworkManager spouštěn stejným způsobem, jako když je spuštěn ve skutečném kořenovém adresáři, čímž se sníží množství kódu, který je třeba udržovat a testovat.

Chcete-li úplně vypustit configure-and-quit=initrd NetworkManager by měl být také schopen zaregistrovat se na D-Bus v initrd. V současné době dracut nemá žádný modul poskytující D-Bus démona, protože obraz by měl být minimální. Nicméně již existují návrhy na jeho zahrnutí, protože je potřeba k implementaci některých nových funkcí.

S D-Bus běžícím v initrd bude výkonné API NetworkManageru dostupné dalším nástrojům pro dotazování a změnu stavu sítě, čímž se odemkne široká škála aplikací. Jedním z nich je spuštění nm-cloud-setup v initrd. Služba je dodávána v NetworkManager-cloud-setup Balíček Fedora načítá metadata z infrastruktury poskytovatelů cloudu (EC2, Azure, GCP) za účelem automatické konfigurace sítě.


Linux
  1. Linuxové jádro:5 nejlepších inovací

  2. Životní cyklus testování linuxového jádra

  3. The name game:Pojmenování síťových rozhraní v Linuxu

  1. Linux – podílíte se na e-mailové konferenci jádra?

  2. Linux – Jak přesměrovat provoz mezi linuxovými síťovými jmennými prostory?

  3. Změňte časovač linuxového jádra

  1. Analyzujte linuxové jádro pomocí ftrace

  2. Jak používat příkaz Linux mtr

  3. Linux – Proč nemůže jádro spustit inicializaci?