Wednesday, October 26, 2011

利用grub2直读iso镜像 制作多启动u盘

U盘现在容量越来越大,4-8G的U盘只装一个启动系统太浪费了,这几天看了看利用grub2制作多启动U盘的内容,有点心得,这里大概说说.

原理:
利用grub2可以启动iso文件的方法,可以制作大量的多启动U盘,但是很大部分还不支持,比如常用的debian,centos,等等就不支持,不过我常用的systermrescuecd,archboot,freebsd都支持这种启动方式.


操作过程:

首先把U盘分区,我实验用的U盘有2G容量,为了通用性,我就格式化为fat32格式,这样windows和linux,以及bsd下都可以复制iso,修改grub.cfg文件.

1)分区就使用fdisk

首先你要把u盘的mbr清空,避免以前做的mbr影响将要安装的grub2启动

(X代表你的U盘所在的盘符,比如我的u盘就是/dev/sdb)

$ sudo dd if=/dev/zero of=/dev/sdX bs=512  count=1

$ sudo fdisk -l
$ sudo fdisk /dev/sdX

d删除已有分区,p显示分区情况,m察看fdisk帮助,n新建分区,p为主分区,t转换分区格式,b转换为win95vfat格式,l显示可以转换的分区格式,a激活启动分区,w保存分区情况,q不保存关闭fdisk

2) 安装grub2

这里要注意,安装的grub2最好是32位的,比如systermrescuecd和ubuntu livecd都选用32位的,可以保持兼容性;我这里就走了很多弯路,使用机器arch本身的grub2,导致u盘无法启动的情况,应为我的arch是64位的.

首先挂载你的u盘,如果你使用gnome3,或者其他自动挂载的桌面,你就需要找到你的u盘挂载的地方

$ sudo mount -t vfat /dev/sdb1 /mnt

$ sudo grub-install --no-floppy --force --root-directory=/mnt /dev/sdb1


3) 编辑grub.cfg文件,并添加iso文件

$ sudo mkdir /mnt/iso

把你需要启动的iso镜像放到/mnt/iso目录中就可以了

$ sudo vim /mnt/boot/grub/grub.cfg

下面是我的grub.cfg配置文件,你可以自己根据自己的情况修改
~/grub.cfg.html
set color_normal='light-blue/black'
set color_highlight='light-cyan/blue'

menuentry "System Rescue CD" {
 loopback loop /iso/systemrescuecd-x86-2.3.1.iso
 linux (loop)/isolinux/rescuecd isoloop=/iso/systemrescuecd-x86-2.3.1.iso setkmap=us docache dostartx
 initrd (loop)/isolinux/initram.igz
}

menuentry "Parted Magic Disk Utilities" {
 loopback loop /iso/pmagic-6.2.iso
 linux (loop)/pmagic/bzImage iso_filename=/iso/pmagic-6.2.iso edd=off noapic load_ramdisk=1 prompt_ramdisk=0 rwnomce sleep=10 loglevel=0
 initrd (loop)/pmagic/initramfs
}

menuentry "Ubuntu 11.04" {
 loopback loop /iso/ubuntu-11.04-desktop-i386.iso
 linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/iso/ubuntu-11.04-desktop-i386.iso noeject noprompt --
 initrd (loop)/casper/initrd.lz
}

menuentry "Arch Linux i686" {
 loopback loop /iso/archlinux-2011.10-1-archboot.iso
 linux (loop)/boot/vmlinuz rootdelay=10
 initrd (loop)/boot/initrd.img
}

menuentry "Arch Linux x86_64" {
 loopback loop /iso/archlinux-2011.10-1-archboot.iso
 linux (loop)/boot/vm64 rootdelay=10
 initrd (loop)/boot/initrd64.img
}

menuentry "FreeBSD 8.2 i386" {
 set isofile=/iso/FreeBSD-8.2-RELEASE-i386-disc1.iso
 loopback loop $isofile
 kfreebsd (loop)/boot/kernel/kernel iso-scan/filename=$isofile noeject noprompt splash --
 kfreebsd_module (loop)/boot/mfsroot.gz type=mfs_root
}

menuentry "FreeBSD 8.2 x86_64" {
 set isofile=/iso/FreeBSD-8.2-RELEASE-amd64-disc1.iso
 loopback loop $isofile
 kfreebsd (loop)/boot/kernel/kernel iso-scan/filename=$isofile noeject noprompt splash --
 kfreebsd_module (loop)/boot/mfsroot.gz type=mfs_root
}


参考 :  Restore_Usbstick
       Boot Multiple ISO from USB via Grub2 using Linux
       MultiBootUSB shell
       Installing Grub (2) on a USB flash drive
       Install GRUB2 on USB from Ubuntu Linux

No comments: