Booting Macmini3,1 from ISC/DHCPD

Posted by Pepijn Oomen Thu, 09 Jul 2009 17:15:37 GMT

After my recent upgrade of machines on my home-network, I discovered that the Mac mini showed Remote Disc in the Finder, suggesting it uses the same EFI boot as the Macbook Air.

Sure enough, booting it with ⌥ pressed, shows the boot-menu as mentioned in the Apple documents describing booting the Macbook Air off of the network, i.e. showing an Airport network pop-up list, but it failed to show my NetBoot server.

Using Remote Install Mac OS X.app did work, so I reverse engineered the communication involved.

An initial capture of the network traffic showed it was using a very similar workflow as the 'original' NetBoot, using a combo of DHCP, TFTP and HTTP (instead of NFS).

  1. The machine running Remote Install Mac OS X.app informs the client using bsdp_msgtype_list (by using an unsollicited DHCP Ack package), containing the name of the boot image, which is shown in the menu on the client.

  2. The client sends a bsdp_msgtype_select message, and from there on forward the process is identical to the old way of doing things, even NFS just works as is.

To extend the configuration to also allow for netbooting it is thus necessary to implement the bsdp_msgtype_list answer. The structure of the BSDP packets (encapsulated in the vendor-encapsulated-options of the DHCP packets) has previously been described by Mike Bombich. Pay attention to the encoding of the name presented to the client in BSDP option 0x09.

[...]
} elsif (option dhcp-message-type = 8) {
  option vendor-class-identifier "AAPLBSDPC";
  if (substring(option vendor-encapsulated-options, 0, 3) = 01:01:01) {
    log(debug, "bsdp_msgtype_list");
    option vendor-encapsulated-options
      01:01:01:               # bsdp_msgtype_list
      09:0c:81:00:00:01:07:6e:65:74:62:6f:6f:74; # netboot
  } else {
    log(debug, "bsdp_msgtype_select");
    option vendor-encapsulated-options
      01:01:02:               # bsdp_msgtype_select
      08:04:81:00:00:01;      # bsdptag_selected_boot_image
  }
}
[...]