双启动 openSUSE USB 启动盘安装器
在最近一轮 openSUSE 的升级和新安装中,我决定采取不同的方法,使用网络安装并从 USB 启动盘安装,而不是 DVD。同时,我决定尝试制作一个双启动安装器,允许我从同一个 USB 启动盘安装最新 openSUSE(版本 11.3)的 32 位或 64 位版本。
首先,我们需要下载 openSUSE 网络安装器镜像
$ mkdir opensuse
$ cd opensuse
$ wget http://download.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso
$ wget http://download.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-x86_64.iso
这些指的是 32 位 NET 安装器 和 64 位 NET 安装器。
上面两个 openSUSE 安装器都是可启动的,但这里的想法是能够运行其中任何一个,所以我们希望独立于任何安装器启动 USB 启动盘,并显示一个菜单,允许我们选择要运行的安装器。为此,我们将使用 syslinux,您可能需要安装它。假设您正在使用 openSUSE 构建安装器,请使用以下命令安装 syslinux
$ zypper in syslinux
如果您尚未插入 USB 启动盘,请插入并找出其设备文件,您可以通过查看 /var/log/messages 末尾的消息或挂载启动盘并键入 mount 命令来查看已挂载的内容和位置来完成此操作。设备文件应具有 /dev/sdX 的形式,其中 X 将因您的系统拥有的驱动器数量而异。一旦您知道设备文件,如果已挂载驱动器,则应卸载它。
第一步是在驱动器上创建多个分区。我为此使用 fdisk,但任何分区工具都应该有效。创建以下分区
- 分区 1:大小:20MB,类型:FAT16(类型代码:4)
- 分区 2:大小:200MB,类型:FAT32(类型代码:c)
- 分区 3:大小:200MB,类型:FAT32(类型代码:c)
第一个分区用于保存我们的菜单,用于选择要启动的安装器。第二个和第三个分区用于保存单独的 openSUSE 安装器。
现在格式化分区
$ mkfs.msdos /dev/sdX1
$ mkfs.vfat /dev/sdX2
$ mkfs.vfat /dev/sdX3
现在我们需要挂载每个 openSUSE 安装器镜像,并使用mkbootdisk安装器附带的脚本创建可启动磁盘。
首先是 64 位安装器
$ mount openSUSE-11.3-NET-x86_64.iso /mnt -o loop
$ /mnt/boot/x86_64/mkbootdisk --64 --partition /dev/sdX2 /mnt
$ umount /mnt
然后是 32 位安装器
$ mount openSUSE-11.3-NET-i586.iso /mnt -o loop
$ /mnt/boot/i386/mkbootdisk --32 --partition /dev/sdX3 /mnt
$ umount /mnt
mkbootdisk 命令需要一个--32或--64选项来指定位数,--partition选项来告知可启动镜像将要创建的位置,以及要复制到可启动镜像的文件的源目录(在我们的例子中是 /mnt)。
现在我们已经在 USB 启动盘上安装了 openSUSE 安装器,我们通过在第一个分区上安装 syslinux 来安装我们的菜单。然后我们必须挂载分区并将 syslinux 菜单程序、链式加载程序和我们的配置文件复制到其中(请参见下文和附件)。
$ syslinux /dev/sdX1
$ mount /dev/sdX1 /mnt
$ cp /usr/share/syslinux/chain.c32 /mnt
$ cp /usr/share/syslinux/menu.c32 /mnt
$ cp syslinux.cfg /mnt
$ cp menu.cfg /mnt
现在使用 fdisk 或其他分区工具,确保只有第一个分区是活动和可启动的。
当 syslinux 启动一个分区时,它会查找一个配置文件来告诉它做什么,这就是我们上面复制的 syslinux.cfg。我们的 syslinux.cfg 包含
default opensuse
prompt 0
label opensuse
com32 menu.c32
append /menu.cfg
上面告诉 syslinux 默认(也是唯一)的启动选项是 “opensuse”,并且我们不希望 syslinux 显示它的boot提示符。opensuse 选项启动了 “com32” 程序 “menu.c32”,这是我们上面复制到 USB 启动盘的。因此,在这里,我们不是启动 Linux,而是启动 syslinux 附带的辅助程序。正如您可能已经猜到的,这个辅助程序名为 menu,它显示一个菜单。append /menu.cfg选项在这里将菜单配置文件的名称添加到执行菜单程序的命令行末尾。菜单配置文件包含我们的菜单
default harddisk
prompt 1
timeout 600
MENU TITLE openSUSE Installers
label harddisk
MENU DEFAULT
MENU LABEL Boot from Hard Disk
localboot 0x80
label start64
MENU LABEL Start 64 bit openSUSE installer
com32 chain.c32
append boot 2
label start32
MENU LABEL Start 32 bit openSUSE installer
com32 chain.c32
append boot 3
在这里我们可以看到我们的启动选项,一个是Harddisk启动,这是默认选项,并在 60.0 秒超时后发生。其他选项是启动 32 位 openSUSE 安装器和启动 64 位 openSUSE 安装器。
当启动其中一个 openSUSE 安装器时,启动是通过执行另一个 syslinux 辅助程序完成的:chain.c32(这也是我们上面复制到 USB 启动盘的)。这个辅助程序通过加载另一个磁盘或分区的 MBR 来启动另一个引导加载程序。append每个链式加载的安装程序的选项指定要启动哪个分区append boot 2启动分区 2 上的 64 位安装器,以及append boot 3启动分区 3 上的 32 位安装器。
此时,您的新双启动 openSUSE 安装器应该可以运行了,但有一个可能的注意事项:如果您的 USB 启动盘上的 MBR 无效,您需要安装一个新的 MBR。测试一下,如果无法启动,则尝试使用以下命令将新的 MBR 复制到 USB 启动盘
$ dd if=usr/share/syslinux/mbr.bin of=/dev/sdX bs=440 count=1
如果一切顺利,当您启动 USB 启动盘时,您应该看到以下内容

如果您有足够大的 USB 启动盘,您还可以通过使用 DVD 安装器而不是 NET 安装器来创建完整安装器。
请注意,上述大多数命令都需要以 root 身份运行,因此请小心。另请注意,如果您未使用 openSUSE 创建安装器,则 syslinux 文件的路径可能会有所不同。
附注:openSUSE NET 安装器工作正常,没有问题。