-
Notifications
You must be signed in to change notification settings - Fork 0
wfeldt/bdr
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
BDR - Boot Drive Emulation
==========================
***
Note: this software is still in an early stage. Although there are currently
no open bugs, it is far from being well tested.
So, be careful.
***
Overview
--------
BDR is a small program loaded at system startup, typically from your hard
disk MBR, that makes a normal file available as disk drive in the BIOS.
So far so good. But what's the point?
The idea is that you can install your favorite bootloader (e.g. grub) into
an image file and use that instead of a separate boot partition.
Agreed, it sounds a bit weird at first; but there are several advantages
because BDR takes care of:
- device mapping
You don't need to worry about a correct 'device.map' file for grub. BDR
will sort out the drive mapping at boot time. That means you can rearrange
your disks or put it into a new machine and the emulated boot drive still
works (and you don't have to adjust your bootloader setup).
- 64 bit sector numbers
The classic partitioning scheme works only up to 2TB (resp. 4TB, but only
with tricks) due to 32 bit sector numbers. BDR works with 64 bit sector
numbers and you can continue using your bootloader with large disks even
if it only supports 32 bit sector numbers. (Your emulated drive will
typically be substantially smaller than 2TB.)
- works with GPT
If you partition with GPT (e.g. because the disk is > 2TB) you can still
use a non-GPT-aware bootloader.
- resizable
You can resize your boot disk any time you want.
- no separate boot partition
If you need a separate boot partition, this may be a way to get rid of it.
- independent of filesystem
As the image file can be on any (noncompressing) filesystem, you're not
dependent on the support of your favorite filesystem in the bootloader.
(E.g. grub needs not follow the latest ext3/4 developments or you can boot
with syslinux but still use jfs for your system partition.)
- RAID/LVM
[* note: not yet *]
Works with raid setups, even if your bootloader does not.
How it works
------------
BDR works in two steps:
1) Create a mapping.
You create an image file, complete with partition table and a partition
with a filesystem. Then run 'bdr' to map the file and store the metadata in
a file 'bdr.map' on the first partition.
You can set the drive geometry, BIOS drive id, and some other flags (e.g.
make the drive read-only).
2) Attach the mapped file to your boot disk.
Once step 1 is done, you install a small bootloader stub into the MBR of
your boot disk (or all disks, if you're not sure which one is the boot
disk) and point it to the image file.
All this small boot program does is to assemble the new boot drive at
startup and hook a driver for it to the BIOS. It then continues booting
from the new drive. This means the image file must have a workable
bootloader setup. See the example below how to do it for grub.
Setup example
-------------
***
A fancy wrapper script is needed. Here is how to do it step by step.
***
1) create a disk image file (e.g. 50MB):
# dd if=/dev/zero bs=1M count=50 of=/boot.img
50+0 records in
50+0 records out
52428800 bytes (52 MB) copied, 0.118283 s, 443 MB/s
2) partition it and add a filesystem (e.g. ext2):
# parted /boot.img mklabel msdos mkpartfs p ext2 0 100% unit s p
Model: (file)
Disk /boot.img: 102400s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 32s 102399s 102368s primary ext2 , , , , , , , , , type=83, ,
*** Note:
The start offset is 32 sectors, in bytes: 32*512 = 16384.
3) map the image file:
# bdr --create-map --bios 0x80 --geo 4,32 /boot.img
mapping info created
*** Note1:
4 heads, 32 sectors/track is the typical parted default geometry.
*** Note2:
0x80 is the first BIOS disk. You can use other values (e.g. 0x83) but remember
to adjust your grub setup accordingly (e.g. hd0 -> hd3).
You can look at the result:
# bdr --verify-map /boot.img
/boot.img: mapping found
id: c078d2fa72bc387e
date: 2/4/2009
bios drive: 0x80
disk size: 102400 sectors
disk geo: chs 800/4/32
flags: +edd, rw
drive: 0 = /dev/sda
sector: 2803723
4) now mount the image:
# mount -oloop,offset=$((32*512)) /boot.img /mnt
*** Note:
We need the offset values from step 2.
You should see just the mapping file:
# ls -l /mnt
total 15
-rw-r--r-- 1 root root 3072 2009-04-02 14:30 bdr.map
drwxr-xr-x 2 root root 12288 2009-04-02 14:29 lost+found
5) copy your boot files to it:
# cp -a /boot/* /mnt
6) to simplify things, remount it to /boot:
# umount /mnt
# mount -oloop,offset=$((32*512)) /boot.img /boot
7) write a new device map
# echo "(hd0) /boot.img" >/boot/grub/device.map
Also, ensure you reference hd0 in /boot/grub/menu.lst. If you have several
disks in your machine, you might need to edit menu.lst a bit.
*** Note:
See Note2 from step 3.
8) setup grub:
# echo "setup (hd0) (hd0,0)" | grub
If things went fine so far /boot.img is now ready to use as disk image. You can
check that the grub setup is ok using hexdump:
# hexdump -C /boot.img | head -30
shows a lot of numbers but you should also see the string 'GRUB' in the
ASCII dump on the right side.
Also,
# qemu -hda /boot.img
should show grub booting.
9) write BDR loader into MBR of your real boot disk:
# bdr --add-to-mbr /dev/sda /boot.img
/boot.img: mapping found
id: c078d2fa72bc387e
date: 2/4/2009
bios drive: 0x80
disk size: 102400 sectors
disk geo: chs 800/4/32
flags: +edd, rw
drive: 0 = /dev/sda
sector: 2803723
/dev/sda: mbr updated
That's it. Next reboot should start grub from the image file.
10) fstab
To get the image file mounted at system startup add a line like
/boot.img /boot auto loop,offset=16384 0 0
to your /etc/fstab.
About
Boot Drive Emulation
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published