Mac OS X: 如何实现子网间NetBoot

来源:互联网 发布:超市网络订货渠道 编辑:程序博客网 时间:2024/06/08 11:57
 

如何实现子网间NetBoot

 

:虽然这篇文章是针对Mac OS X 10.4 Tiger系统的,针对10.5Leopard的还没有更新,但是这并不影响我们细致了解NetBoot的详细过程,NetBoot和NetInstall的启动区别,以及绕过子网屏蔽直接从一个指定的启动镜象启动的思考方向.

简介:

    基于多数路由器的配置, NetBoot数据通常被限制在子网内,也就是说,如果希望在企业内部实现全局NetBoot,你可能只有下面的两个选择:

  1. 让网络管理员配置路由器允许BSDP数据通过到你的NetBoot服务器.
  2. 在每个子网内建立一个NetBoot服务器.


    当然,第一个选择是实现多子网间NetBoot的最好办法,但是这种方法很少有正式的文档而且有可能面临企业内部规定的限制,所以人们可能不愿意去试图改变它. 而第二种方法有点浪费特别是对于很少机会NetBoot电脑的情况.

    那么对于有时需要透过子网限制而实现NetBoot, 我们如何做呢?在开始解释之前,让我们来看看NetBoot的详细操作过程和在这个过程中到底发生了什么。

 

 

NETBOOT

10.4.5的更新:

    Mac OS X 10.4.5的更新使得下面的操作更加简便。简单地使用bless命令来设置固件:

sudo bless --netboot --server bsdp://server.apple.edu


    或者更加细致的调节(--options选项只适用于基于EFI的Mac机器,而对于基于OpenFirmware的机器请继续使用nvram)

sudo bless --netboot --booter tftp://server.apple.edu/NetBoot/NetBootSP0/NetInstall.nbi/i386/booter --kernel tftp://server.apple.edu/NetBoot/NetBootSP0/NetInstall.nbi/i386/mach.macosx --options "rp=nfs:server.apple.edu:/private/tftpboot/NetBoot/NetBootSP0:NetInstall.nbi/NetInstall-Restore.dmg"

    参考bless的man页以得到更多详细信息. 你也可以是用ARD的发送UNIX命令的方式发布这个命令给所有目标机器。

NetBoot的过程

BSDP和DHCP

一个网络启动就是客户端发起的对网络内任何一个响应BSDP(启动服务发现协议, Boot Service DiscoveryProtocol)电脑的广播. BSDP是一个和DHCP相类似的, 并被包括Mac OS 9, Mac OS X, FreeBSD和SunSolaris等操作系统支持的开放标准协议. 一般地,路由器被配置为阻止所有的广播协议的, 但是对于DHCP(有可能)特殊处理,这样可以允许客户端透过路由器而和另一个子网的DHCP服务器通讯.所以,如果路由器没有为BSDP特殊设置为允许通过,那么客户端只能看到本子网内的NetBoot服务器.

接通电源:获得网络配置

 当客户机第一次开机并且配置为NetBoot模式,你看到的是一个在方框中闪动的全球图标(右图).在这个阶段,客户机首先从DHCP服务器获得IP地址, 然后探测BSDP信息.当客户端得到从NetBoot服务器的BSDP响应,闪动的全球图标就变成了苹果图标了(左图).

TFTP: 启动一个微型系统

在客户端发现了NetBoot之后,立刻利用TFTP服务协议下载三个文件: 启动文件(booter), 内核(kernel),和内核扩展缓存(kernel externsion cache). 启动文件首先被装载, 然后是内核, 内核初始化mach_init过程,并由它装载内核扩展缓存, 并启动/etc/rc.boot和/etc/rc脚本. 这些都是标准的Unix启动脚本用来启动系统.

三岔路口: NetBoot:NetInstall

从现在开始, NetBoot和NetInstall的启动过程就完全不一样了. 对于NetInstall,在NetInstall系统镜象中的/System/Installation目录使得客户端认为自己是从一个CDROM启动的,这时它就运行/etc/rc.cdrom脚本, 而如果/System/Installation目录不存在,系统就继续运行并执行/etc/rc.netboot启动脚本. 这里不会深入到每个脚本内部如何运行,大体上是生成影子文件和虚拟内存空间,并把控制交给普通启动脚本/etc/rc, 并结束系统启动屏幕.

上面基本上就是需要了解的启动过程.

子网间的操作: BSDP替代版本

每个苹果电脑都由一个底层环境,叫做开放固件(Open Firmware, OF, 基于PPC的苹果机)或者扩展固件界面(ExtensibleFirmware Interface, EFI, 基于Intel的苹果机).这个固件环境存储在主版的BootROM里面,由它负责计算机的初始启动过程,它的设置参数储存在内存的特殊区域,并由主版电池保持供电,它叫做nvram(非易失随机存取存储器non-volatile RAM), 我们可以使用终端命令来操作这些参数.长话短说,我们可以改变nvram设置来让启动过程忽略寻找BSDP服务器的过程,而是直接找到一个存放在固定IP的NetBoot服务器的启动镜象,从而避免被路由器阻止广播造成找不到NetBoot服务器.

在我们进行下一步之前,你需要检查当前的nvran配置. Mac OS X提供了非常简单的方法, 运行终端, 然后输入: nvram -p | grep boot-[adf], 见下:

[macosx:~] nvram -p | grep boot-[adf]
boot-file
boot-args
boot-device mac-io/ata-4@1f000/@0:2,//:tbxi

正如看到的, 作为典型的情况, 只定义了"boot-device"的三个参数,如果在Startup Disk Preference设置了NetBoot启动, 那么nvram设置就变成:

[macosx:~] nvram -p | grep boot-[adf]
boot-file
boot-args
boot-device enet:bootp


以,boot-device被设置为通过以太网寻找bootp服务器,这完全以来于BSDP服务器的响应.
为了避免它, 可是设置参数如下:

[macosx:~] nvram -p | grep boot-[adf]
boot-file
boot-args
boot-device enet:10.0.1.2


其中10.0.1.2假设为你的NetBoot服务器的地址,更确切地说是, 配置NetBoot使用的你的服务器上的那个网卡的地址. 使用上面的配置, 你的客户机就会越过BSDP寻找过程,而立刻直接寻找被定义地址上的服务器的NetBoot镜象。

注:
我的Intel的MacBook Pro笔记本和Leopard 10.5.5系统显示参数如下:

[macosx:~] nvram -p | grep boot-[adf]
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%00%00|%07%00%00%00%008;%00%00wg%00%00g%0d%00%00%c5%07%00%00%02%02%7f%ff%04%00
boot-args    
efi-boot-device   <array><dict><key>IOMatch</key><dict><key>IOProviderClass</key><string>IOMedia</string><key>IOPropertyMatch</key><dict><key>UUID</key><string>00003B38-6777-0000-670D-0000C5070000</string></dict></dict><key>BLLastBSDName</key><string>disk0s2</string></dict></array>%00

每个参数都有%00作为结束字符.

不仅从默认镜象组启动

假设你有一个定制的用来全自动启动的NetInstall-恢复镜象组, 从而客户机从那个镜象启动并立刻格式化内置硬盘并放置镜象, 然而这不是你想要的镜象. 如何改变呢? 看看下面的nvram设置:

[macosx:~] nvram -p | grep boot-[adf]
boot-file enet:10.0.1.4,NetBoot/NetBootSP0/imagename.nbi/mach.macosx
boot-args rp=nfs:10.0.1.4:/private/tftpboot/NetBoot/NetBootSP0:imagename.nbi/imagename.dmg
boot-device enet:10.0.1.4,NetBoot/NetBootSP0/imagename.nbi/booter

先面把它分解开。首先看看那两个定义客户端如何从tftp下载文件的参数:

boot-file

boot-file enet:10.0.1.4,NetBoot/NetBootSP0/imagename.nbi/mach.macosx
语义:
boot-file [interface]:[server-ip-address], [path to mach.macosx relate to tftp root]

最后的说明可能有点领人疑惑. 你的Mac OS X服务器配置为提供tftp服务. 安全起见, tftp服务的根被设置成/private/tftproot. 如果看看这个目录,会发现里面有几个指向你的NetBoot共享点的连接:

[xserve:/private/tftpboot/NetBoot] admin% ls -l
lrwxr-xr-x root wheel Mar 6 20:44 NetBootSP0 -> /Library/NetBoot/NetBootSP0
lrwxr-xr-x root wheel Mar 6 20:44 NetBootSP1 -> /Volumes/Bay2/Library/NetBoot/NetBootSP1
lrwxr-xr-x root wheel Mar 6 20:44 NetBootSP2 -> /Volumes/Bay3/Library/NetBoot/NetBootSP2
lrwxr-xr-x root wheel Mar 6 20:44 NetBootSP3 -> /Volumes/Bay4/Library/NetBoot/NetBootSP3


这对于共享点不是存放在根/里面而是/Volumes里面的时候,方便操作. 注意boot-file参数里的是反斜杠符, 这一点很重要.

boot-device

boot-device enet:10.0.1.4,NetBoot/NetBootSP0/imagename.nbi/booter
语义:
boot-device [interface]:[server-ip-address], [path to booter relate to tftp root]
它和上面的基本一样,只不过是指向的文件是booter文件.

boot-args

boot-args rp=nfs:10.0.1.4:/private/tftpboot/NetBoot/NetBootSP0:imagename.nbi/imagename.dmg
语义:
boot-args rp=[nfs|http]:[server-ip]:[absolute path to netboot sharepoint]:[path to netboot image from netboot sharepoint]

这里, 协议可以是nfs或者http, 这里的路径指向NetBoot共享点(检查工作组管理者设置)和这个共享点的镜象文件. 这个参数不使用tftp,我们只使用tftproot目录作为一个取得NetBoot共享点的捷径。

其它参考:

  • Apple Kbase: Mac OS X Server: How to Use NetBoot Across Subnets
  • Apple Kbase: Mac OS X Server: NetBoot Clients Cannot Start Up From Server (NetBoot Troubleshooting)
  • Configuring routers to prevent Initial Connectivity Delay (which kills NetBoot)