Bootable El-Torito CD with GRUB Legacy: Difference between revisions

m
Bot: Replace deprecated source tag with syntaxhighlight
[unchecked revision][unchecked revision]
(adding section about solving problems)
m (Bot: Replace deprecated source tag with syntaxhighlight)
 
(15 intermediate revisions by 9 users not shown)
Line 6:
You will need the following:
* [[mkisofs]], which is in fact superseeded by [[genisoimage]].
* A (Multiboot compliant) kernel that [[GRUB Legacy]] can boot.
* The El-Torito GRUB Legacy stage2 file, called <tt>stage2_eltorito</tt>.
 
=== Ubuntu/Debian ===
 
In Ubuntu or Debian you can install the required software like this:
 
<syntaxhighlight lang="bash">
$ sudo aptitude install genisoimage grub
sudo apt-get install genisoimage grub
</syntaxhighlight>
 
We need a place to store the files on the CD image:
 
<syntaxhighlight lang="bash">
$ cd # Go to your home directory.
cd # Go to your home directory.
$ mkdir -p isofiles/boot/grub
mkdir -p isofiles/boot/grub
</syntaxhighlight>
 
You now created an <tt>isofiles</tt> directory in your home folder and a <tt>boot/grub</tt> sub-folder inside that. We need the stage2 file. It is installed from the grub package. Just copy it:
 
<syntaxhighlight lang="bash">
$ cp /usr/lib/grub/i386-pc/stage2_eltorito ~/isofiles/boot/grub/
cp /usr/lib/grub/i386-pc/stage2_eltorito ~/isofiles/boot/grub/
</syntaxhighlight>
 
=== Windows ===
 
Look at [[mkisofs#Under windows|this article about how to install and use mkisofs]]. We need a place to store the files on the CD image. Create a folder <tt>isofiles</tt>, which contains the sub-folder <tt>boot\grub</tt> needed by GRUB. We need the stage2 file. You can get it by [http://www.geocities.com/imulgrew/grub_files.tar.gz downloading a package] and unpack it using your favourite unpackunpacking application. Find the file <tt>stage2_eltorito</tt> and copy it to <tt>isofiles\boot\grub</tt>.
 
== Install a kernel ==
 
Get a kernel of your own choosing and copy it to wherever you like inside the <tt>isofiles</tt> folder. Preferably it should be placed in the <tt>boot</tt> sub-folder. Now create a <tt>menu.lst</tt> file. This file controls what menu entries GRUB should provide and how the kernels are booted. It must be placed in the GRUB folder <tt>boot/grub</tt> and contain something like this:
 
<!-- Not really Bash, it's Grub scripting, but lang="bash" makes nice syntax highlighting. -->
default 0
<syntaxhighlight lang="bash">
#timeout 30
default 0
#timeout 30
#title Boot from hard disk
 
#chainloader (hd0)+1
#title Boot from hard disk
#chainloader (hd0)+1
title My kernel
 
kernel /boot/kernel-file # Edit it to the filename of your kernel.
title My kernel
kernel /boot/kernel-file # Edit it to the filename of your kernel.
</syntaxhighlight>
 
In GRUB there's a concept called root. It's the disk drive or partition where you access the files, like the kernel image and modules. When booting from CD using <tt>stage2_eltorito</tt> you don't need to set the root as it is already set to "<tt>(cd)</tt>".
 
== Create the .iso image ==
Line 45 ⟶ 56:
In the following I use the command <tt>genisoimage</tt>, but you can change it to <tt>mkisofs</tt> if that is what its called on your system. Open a command prompt/terminal and go to where the <tt>isofiles</tt> folder is located. It is your home directory on Ubuntu. Issue the command:
 
<syntaxhighlight lang="bash">
genisoimage -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4
genisoimage -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4
-boot-info-table -o bootable.iso isofiles
-boot-info-table -o bootable.iso isofiles
</syntaxhighlight>
 
Now you have a file called <tt>bootable.iso</tt>. Test it using your favourite emulator or burn it to a CD and test on a real computer. I will just explain the command line arguments we used for genisoimage:
 
{| {{Wikitable}}
* '''-R''' is using the Rock Ridge protocol, which enables lower-case filenames on the CD.
|-
* '''-b''' option takes the filename of the El-Torito boot file (inside the created [[ISO 9660]] file system).
| -R
* '''-no-emul-boot''' enables no emulation El-Torito boot.
| Use the Rock Ridge protocol, which enables lower-case filenames on the CD. This is needed by GRUB.
* '''-boot-load-size''' option specifies the number of 512-bytes sectors to load. Four 512-byte sectors (2048 bytes) is one CD sector and is the number supported by most BIOS.
|-
* '''-boot-info-table''' patches the El-Torito boot file to contain info about the CD image.
| -b ''file''
* '''-o''' gives the output .iso image filename.
| The file to boot (the filename is in the created [[ISO 9660]] file system).
* Other arguments are the filenames/folders that should be included on the CD. In this case it's only '''isofiles'''.
|-
| -no-emul-boot
| Enables no emulation El-Torito boot.
|-
| -boot-load-size 4
| Specifies the number of 512-bytes sectors to load. Four 512-byte sectors (2048 bytes) is one CD sector and is the number supported by most BIOS.
|-
| -boot-info-table
| Patches the boot file to contain info about the CD image. It's needed by GRUB.
|-
| -o bootable.iso
| The filename of the resulting .iso image.
|-
| isofiles
| Other arguments are the files and folders that should be included on the CD. In this case it's only the content of ''isofiles''.
|}
 
== Advanced stuff ==
Line 62 ⟶ 91:
=== Give it a label ===
 
You want to label your CD image, so you can later recognize it when loading your CD. Just pass a '''-AV''' command line argument to genisoimage followed by the name you want.
 
=== Make it be quiet ===
Line 72 ⟶ 101:
=== Make the image from different files and folders ===
 
When you are building your kernel the parts on the .iso image could be located at different paths. HereImagine isyour anproject examplefiles are like this:
 
<!-- Fancy Unicode/ascii art tree. Created in Ubuntu command line: "tree -A -F --dirsfirst" -->
&middot; build/
<pre>
&middot; my-kernel.elf
project/
&middot; modules/
├── build/
...
│ ├── modules/
&middot; src/
│ │ ├── iso9660.mod
&middot; grub/
│ │ └── kbdrv.mod
&middot; menu.lst
│ └── my-kernel.elf
&middot; thirdparty/
├── src/
&middot; grub/
│ ├── grub/
&middot; stage2_eltorito
│ │ └── menu.lst
│ └── ...
├── thirdparty/
│ └── grub/
│ └── stage2_eltorito
└── Makefile
</pre>
 
You don't want to copy those files around in order to create the .iso image. Just use the '''-graft-points''' argument, like this:
 
<syntaxhighlight lang="bash">
genisoimage -graft-points ...other arguments...
genisoimage -graft-points # ...other arguments here...
boot/my-kernel.elf=build/my-kernel.elf
boot/grub/menumy-kernel.lstelf=src/grubbuild/menumy-kernel.lstelf
boot/grub/stage2_eltoritomenu.lst=thirdpartysrc/grub/stage2_eltoritomenu.lst
modulesboot/grub/stage2_eltorito=buildthirdparty/modulesgrub/stage2_eltorito
modules/=build/modules/
</syntaxhighlight>
 
You can use both files and folders together with the -graft-points argument.
Line 99 ⟶ 137:
If you don't find a solution to your problem below, please ask in [http://forum.osdev.org/ the forums].
 
=== mkisofs says Uh oh, I getcant afind permissionthe deniedboot errorimage ===
 
The output of mkisofs looks like this:
 
<pre>
mkisofs: Uh oh, I cant find the boot image 'isofiles/boot/grub/stage2_eltorito' !
</pre>
 
This problem arises because mkisofs/genisoimage looks for its boot image as a subdirectory of the filesystem on the CD; make sure that the path you specify starts with 'boot/' rather than the name of your ISO directory ('isofiles/' in this example).
 
Source: [[topic:20102|this thread]]
 
=== I get a permission denied error in Linux ===
 
The output of genisoimage looks like this:
 
<pre>
Size of boot image is 4 sectors -> No emulation
Size of boot image is 4 sectors -> No emulation
genisoimage: Permission denied. Error opening boot image file 'isofiles/boot/grub/stage2_eltorito' for update.
genisoimage: Permission denied. Error opening boot image file 'isofiles/boot/grub/stage2_eltorito' for update.
</pre>
 
The problem is that you use the -boot-info-table command line argument that patches the boot file to include information about the CD, but the boot file is not writable by genisoimage. GRUB needs the boot file to be patched in order to access the CD properly. The solution is to make it writable, like this:
 
<syntaxhighlight lang="bash">
$ chown myself isofiles/boot/grub/stage2_eltorito # Make sure you are the owner of the file. Replace "myself"
chown myself isofiles/boot/grub/stage2_eltorito # Make sure you are the owner of the file. Replace "myself"
# with your username. Maybe you need to use sudo.
# with your username. Maybe you need to use sudo.
$ chmod u+w isofiles/boot/grub/stage2_eltorito # Make the file writable for the owner of the file (you).
chmod u+w isofiles/boot/grub/stage2_eltorito # Make the file writable for the owner of the file (you).
</syntaxhighlight>
 
== See Also ==
Line 116 ⟶ 170:
* [[mkisofs]]
* [[Bootable CD]] - using floppy disk emulation
* [[GRUB]] - for info on using GRUB 2 to make a bootable CD with modern GRUB
 
=== Forum ===
* [[topic:19050|Thread about making your own .iso image from scratch without tools]]
=== External Links ===
 
* [http://www.geocities.com/imulgrew/grub_files.tar.gz Package containing the GRUB stages] (including <tt>stage2_eltorito</tt>)
* [ftp://alpha.gnu.org/gnu/grub/grub-0.97.tar.gz Source for GRUB Legacy] to build it yourself
Line 122 ⟶ 181:
[[Category:Tutorials]]
[[Category:Bootloaders]]
[[Category:GRUB]]