blob: b517c0826920b425da1b6b9a963080e4a680e2ac [file] [log] [blame] [view] [raw]
## Introduction
Unmodified versions of GRUB2 cannot be used to boot Solaris OS from a ZFS root, due to the kernel cannot parse the command line that the GRUB passed in. In order booting up a Solaris OS from ZFS, the boot-loader need to pass some parameters to tell the kernel where to find zpool, and which one is root file system in the zpool, as following syntax:
```
-B zfs-bootfs=<pool-name>/<fs-num>,bootpath="<device-physical-path>",diskdevid="<device-logic-path>"
```
for example:
```
-B zfs-bootfs=zr/96,bootpath="/pci@0,0/pci103c,30be@1f,2/disk@0,0:s",diskdevid="id1,sd@SATA_____Hitachi_HTS54321091222FBH206VCHTSM0C/s"
```
Note the double quotes in the command line, this is necessary to specify a value that contains commas so the kernel dosen't think such a comma indicates next parameter. The problem in GRUB2 is, the quotes are escaped by default multiboot module, the above command that passed the kernel will become:
```
-B zfs-bootfs=zr/96,bootpath=\"/pci@0,0/pci103c,30be@1f,2/disk@0,0:s\",diskdevid=\"id1,sd@SATA_____Hitachi_HTS54321091222FBH206VCHTSM0C/s\"
```
So the kernel being messed up, complains about unrecognized parameters and then panics due to failed to find a root file system.
This program is actully a small patch to the GRUB mutilboot module, that will not escape the command line; in fact it will not modify the command line in any way.
Starting with Solaris 11.1 release, the default boot-loader for x86 has switched to GRUB2, the modifications to that GRUB2 includes the same hack; so an alternate solution is using a version of GRUB2 that comes with Solaris 11.1 or later.
## Build and Installation
To build this module, configure and build a GRUB from source at first (Tested on GRUB 2.02 source code), copy files **inside** the `src/` directory into the `grub-core/` directory of the GRUB source tree, **enter that directory**, then run the build-multiboot_no_escape.sh script. A module named multiboot_no_escape.mod will appear if build successful; copy the file multiboot_no_escape.mod to your GRUB installation directory, typically `/boot/grub/i386-pc` if you are using legacy PC BIOS to boot up GRUB.
## Usage
Just issue a `insmod multiboot_no_escape` in GRUB commands before using any `multiboot` and `module` commands, then prepare ZFS bootfs parameters, load Solaris kernel and boot archive as normal. See also the `example-grub.cfg` in this repository.
## Warranty
There's absolutely **NO WARRANTY**. Use the program at your own risk.
## License
Since the code is copied from GRUB2, the original license (GPL-3+) terms applies.