6. 运行克隆脚本

克隆脚本,如附录 B所示,不是必需的。你可以使用init=/bin/bash作为内核参数,最终得到一个 shell,你可以从中运行可用的命令和程序。

这里展示该脚本是为了以正式的方式展示命令,并提出一种减少因错误输入而造成损坏可能性的方法。 你必须更改变量tftp_server, nic_module, major_a, family_aimage_a以适应你的环境和应用。

请注意,数组major_afamily_a是对应的。给定族名称的错误主设备号会误导用户。 你可以通过列出/dev目录来找到感兴趣设备(整个磁盘和分区)的主设备号和次设备号。 主设备号和次设备号位于常规文件大小所在的位置,在命令 ls -l 的输出中,用逗号分隔。

# ls -l /dev/fd0 /dev/hda /dev/hda1 /dev/hdc
brw-rw----    1 root     disk       2,   0 Apr 11 11:25 /dev/fd0
brw-rw----    1 root     disk       3,   0 Apr 11 11:25 /dev/hda
brw-rw----    1 root     disk       3,   1 Apr 11 11:25 /dev/hda1
brw-rw----    1 root     disk      22,   0 Apr 11 11:25 /dev/hdc
			

命令 set -e 指示 shell 在任何命令返回非零代码时中止脚本。 消息"Kernel panic: Attempted to kill init!" 将会跟随,就像正常结束一样。 不要惊慌! 在这种情况下这是正常的。 只需关闭计算机。 按下 Ctrl-Alt-Del 在退出脚本之前平稳重启,以避免出现这个难看的消息。

命令 insmod 将加载网络接口模块,命令 dhcpcd 将启动 DHCP 客户端。 请注意,Grub 在其启动期间使用 DHCP 与 Linux 执行相同的操作无关。

该脚本进行一个大循环,并且在每次迭代中,它会询问三个操作之一:从网络复制到设备从设备复制到网络运行 fdisk。 然后脚本询问要使用哪个块设备。 数组major_a保存允许使用的块设备的主设备号,数组family_a保存设备族的相应名称。 接下来,脚本询问要使用的块设备的次设备号。

6.1. 保存和恢复磁盘镜像

如果选择了复制操作之一,脚本会询问要保存或恢复的镜像的名称。 镜像名称被限制为数组的元素image_a。 如果同名命名管道不存在,则会创建它。 最后,同时调用 ddtftp 来传输镜像。 与常规 ftp 不同,tftp 像常规文件一样放置和获取命名管道。

6.2. 使用 fdisk

如果选择了 fdisk 命令,则会针对块设备调用它。 fdisk 通常针对整个磁盘运行,而不是一个分区。 请注意,通常被称为/dev/hda将被克隆脚本称为/dev/hda0fdisk 的输入可以放在脚本中,以便在需要时自动创建分区。