NetBoot: Startujeme Mac ze sítě

NetBootPředstavte si následující situaci. Máte větší množství stolních Maců a potřebujete na všechny nainstalovat nějaký software. Po jednom? To by bylo na dlouhou. Co takhle připravit jednu výchozí podobu systému a tu snadno rozdistribuovat na všechny počítače. Apple-way je v tomto případě služba NetBoot (nyní přejmenovaná na NetInstall). V sérii několika blogpostů rozeberu jednotlivé části celého procesu – boot se ze sítě, příprava image, NetBoot server.

Co se děje když startuje Mac?

Ještě než se podíváme na samotný NetBoot, je dobré znát bootovací proces Macu.

  1. POST (Power-On Self-Test)
    Po stisknutí tlačítka power Mac provede několik testů hardware. Pokud nebyl před vypnutím zvuk ztlumen na nulu (hodnota je uložena v proměnné SystemAudioVolume uvnitř NVRAM), ozve se jabkařům dobře známý zvuk. Pro trochu nostalgie pěkné video s historickými zvuky úspěšného POSTu. V horším případě Mac začne pípat, což může znamenat mimo jiné špatnou RAMku. Více v apple support článku.
  2. Po úspěšné POSTu převezme kontrolu nad HW firmware (BootROM).
    V podstatě jde o malý operační systém, jenž má za úkol najít bootloader soubor a natáhnout ho do operační paměti.  

    Firmware se neprve podívá do NVRAM paměti.

    HungryHippo.local 20:14:19>> nvram -p | egrep "(efi-boot-device|efi-boot-device-data)"
    efi-boot-device	<array><dict><key>IOMatch</key><dict><key>IOProviderClass</key><string>IOMedia</string><key>IOPropertyMatch</key><dict><key>UUID</key><string>000064B1-7A58-0000-2D6E-0000C5400000</string></dict></dict><key>BLLastBSDName</key><string>disk0s2</string></dict></array>
    efi-boot-device-data	%02%01%0c%00%d0A%03%0a%00%00%00%00%01%01%06%00%02%1f%03%12%0a%00%00%00%00%00%00%00%04%01*%00%02%00%00%00(@%06%00%00%00%00%00(%b8%ca%1a%00%00%00%00%b1d%00%00Xz%00%00-n%00%00%c5@%00%00%02%02%7f%ff%04%00
    

    V proměnných efi-boot-device a efi-boot-device-data je uloženo defaultní zařízení, ze kterého má Mac bootovat. Pokud toto zařízení Mac při startu nenajde (odpojený disk, nedostupný NetBoot server), pokusí se najít bootloader jinde (lokální disk, externí disk, dvd). Defaultní zdroj pro bootvání se vybírá buď v předvolbách systému (Startup Disk) nebo pomocí příkazu bless.

    Při spuštění Macu lze startovací proces ovlivnit kombinacemi stisknutých kláves. Např. alt (⌥) dává na výběr seznam bootovatelných zařízení, písmeno C znamená boot z optického disku.

    Bootuje-li systém z HFS+ oddílu, najde si v jeho hlavičce bootblok (více informací o HFS+ v této tech note). Bootblok obsahuje odkaz na bootlader, který ve většině případů najdeme ve filesystému na cestě: /System/Library/CoreServices/boot.efi

  3. Bootloader startuje kernel.
    = /mach_kernel + několik životně důležitých .kext modulů. V praxi jsou tyto komponenty slinkované do jednoho souboru /System/Library/Caches/com.apple.kext.caches/Startup/kernelcache. Systém pak startuje rychleji, protože linkování nemusí pokaždé řešit. 
  4. Jádro systému spouští pána démonů – launchd
    Popis launchd, loginwindow a následného přihlášení uživatele zde není příliš relevantní.

Start ze sítě

U Macu připojeného ethernet kabelem (wi-fi není podporována), je možné iniciovat start ze sítě následujícími způsoby.

  1. Firmware najde v NVRAM IP adresu NetBoot serveru. 
    HungryHippo.local 20:15:06>> nvram -p | egrep "(efi-boot-device|efi-boot-device-data)"
    efi-boot-device	&lt;array&gt;&lt;dict&gt;&lt;key&gt;IOMatch&lt;/key&gt;&lt;dict&gt;&lt;key&gt;BSD Name&lt;/key&gt;&lt;string&gt;en0&lt;/string&gt;&lt;key&gt;IOProviderClass&lt;/key&gt;&lt;string&gt;IONetworkInterface&lt;/string&gt;&lt;/dict&gt;&lt;key&gt;BLMACAddress&lt;/key&gt;&lt;data&gt;cFaBwix7&lt;/data&gt;&lt;/dict&gt;&lt;dict&gt;&lt;key&gt;IOEFIDevicePathType&lt;/key&gt;&lt;string&gt;MessagingIPv4&lt;/string&gt;&lt;key&gt;RemoteIpAddress&lt;/key&gt;&lt;string&gt;192.168.0.211&lt;/string&gt;&lt;/dict&gt;&lt;/array&gt;
    efi-boot-device-data	%02%01%0c%00%d0A%03%0a%00%00%00%00%01%01%06%00%01%1c%01%01%06%00%00%00%03%0b%%00pV%81%c2,{%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%03%0c%13%00%00%00%00%00%c0%a8%00%d3%00%00%00%00%00%00%00%7f%ff%04%00

    Tuto informaci před vypnutím počítače někdo dodal pomocí Starup Disk panelu nebo příkazu bless.

    • Uživatel při startu podrží alt (⌥) a vybere jeden z nabízených image na objeveném NetBoot serveru.
    • Uživatel při startu podrží klávesu N nebo kombinaci command (⌘) + N pro start z NetBoot serveru.

Jak to funguje

  1. Klient si vyžádá IP adresu (DHCP, UDP port 67). Bez funkčního DHCP to nefunguje!
  2. Klient pošle požadavek na boot ze sítě pomocí BSPD protokolu (Boot Service Discovery Protocol, UDP port 67)
  3. NetBoot Server zašle klientovi protokolem TFTP (UDP port 69) bootloader a připravený kernel (kernelcache)
  4. Následující děj záleží na typu NetBoot image.

NetInstall

Po síti se nastartuje do instalátoru OS X. Instalace funguje naprosto identicky jako u lokálního instalačního média (flashka, dvd). NetInstall image může navíc obsahovat administrátorem přidané instalační balíčky a provádět některé další akce. O tom příště v postu zaměřeném na vytváření image v System Image Utility.

NetRestore

Velmi minimální podoba operačního systému, jejíž jediným úkolem je zkopírovat připravený image na lokální disk. Klonování obrazu disku provádí ASR = Apple Software Restore. Zdrojový image může být dodaný třemi způsoby.

  • Unicastem z NetBoot serveru (NFS nebo HTTP)
  • Unicastem z HTTP serveru
  • Multicast streamem, který posílá asr

NetRestore vydá na několik samotných blogpostů, proto si jej nechám na později.

NetBoot

Mac bootuje do read-only image připojeného po síti. Veškeré změny dat systém zapisuje do tzv. shadow souboru nacházjícího se buď na lokálním disku nebo na NetBoot serveru (diskless režim). Uživatel nemůže v systému provést žádné permanentní změny. Pokud mu mají nějaká data zůstat zachována, musí je uložit na lokální médium nebo síťový share.

Další čtení

Knížky 10.6 Deployment a 10.8 Server Essentials
Článek na Wikipedii
NetBoot Server na Linuxu