使用grub2制作U盘引导iso
- grub2基础教程-修订版: http://forum.ubuntu.org.cn/viewtopic.php?t=290405
- 现代 64 位操作系统开发(一):Cmake 构建、UEFI 启动、GRUB 引导、frame buffer 文字绘制:https://zhuanlan.zhihu.com/p/669481626
创建U盘多引导ISO
- Update:2017-06-17
创建U盘分区
-
将U盘分为两个分区:
- sdb1:用于放数据(NTFS),使用剩余空间(Windows只能识别到U盘上的第一个分区)。
-
sdb2:用于引导(FAT32),设置boot标志,安装grub,放置用于启动文件,约2GB(grub/winpe/CDlinux/linuxmint),若加上win7安装包,约需6GB。
# 分区 fdisk -l /dev/sdb Device Boot Start End Blocks Id System /dev/sdb1 1 1614 12964423+ 7 HPFS/NTFS /dev/sdb2 * 1615 1881 2144677+ b W95 FAT32 # 格式化 mkdosfs -F32 -v -n "uboot" /dev/sdb2 mkntfs -Q -v -L "udata" /dev/sdb1
安装grub2到U盘
-
安装grub2
# 如果使用了错误的参数,会出现"Installation is impossible. Aborting"错误。 # 将/dev/sdb替换为你实际的U盘分区 mkdir /media/uboot && mount /dev/sdb2 /media/uboot # 旧版本grub使用:--root-directory=/media/USB,如:Ubuntu 10.04,grub-install (GNU GRUB 1.98-1ubuntu13) grub-install --force --no-floppy --root-directory=/media/uboot /dev/sdb # 新版本grub使用:--boot-directory=/media/USB/boot #grub-install --force --no-floppy --boot-directory=/media/uboot/boot --target=i386-pc --recheck /dev/sdb grub-install --force --no-floppy --boot-directory=/media/uboot/boot /dev/sdb # 增加unicode、ascii支持(可选) cp /usr/share/grub/{unicode.pf2,ascii.pf2} /media/uboot/boot/grub/ # 使用grub-mkconfig可自动生成grub.cfg,并添加硬盘上的引导信息 # grub-mkconfig -o /media/uboot/boot/grub/grub.cfg # GRUB_PREFIX="/media/uboot/boot/grub" grub-mkconfig -o /mnt/uboot/boot/grub/grub.cfg
拷贝所需文件
- 将memdisk拷贝到U盘:/boot/grub/目录中。
- 将grub4dos拷贝到U盘:/boot/目录中。
- 将firadisk.ima、lmt7.iso等拷贝到U盘/iso目录。
-
其它的软件安装包可拷贝到U盘第二个分区中,便于后续维护更新。
. |-- boot | |-- grub | `-- grub4dos |-- iso | |-- CDlinux_mini-0.9.7.1.iso | |-- Deepin_Windows_PE_4.2_Build_100910.iso | |-- firadisk.ima | |-- linuxmint-17.2-cinnamon-32bit.iso | `-- lmt7.iso `-- tools |-- BOOTICEx86v133.exe |-- DiskGenius.exe |-- NTPWEDIT.exe `-- WIN$MAN.EXE df -h Filesystem Size Used Avail Use% Mounted on /dev/sdb2 2.0G 1.8G 283M 87% /media/uboot
配置grub.cfg
#加载模块 insmod cat insmod gzio insmod ext2 insmod ntfs #insmod ntldr insmod font insmod fat insmod part_msdos insmod loopback insmod iso9660 set default=0 #这里是默认选项,0就是第一个 set timeout=5 #这里是默认等待时间 #设置显示情况,包括中文字体 #这里是设置字体文件,也就是前面我们拷贝的unicode.pf2 loadfont /boot/grub/unicode.pf2 # 这些是图形化设置的,加上更漂亮 # ------------------------------------------------------------------------ #set gfxmode=800x600 #设置分辨率 #set gfxpayload=keep #这一句不太清除,网上没有找到相关资料,加上保险 #insmod gfxterm #启用gfxterm模块,分辨率什么的,都靠它 #insmod vbe #加载vbe模块 #terminal_output gfxterm #将终端设置为gfxterm模式,也就是使上面的分辨率什么的生效 #以下是设置背景图片 #set root='hd0,msdos1' #insmod jpeg #开启jpeg模块 #background_image /boot/images/nature.jpg #指定背景图片的路径 #set menu_color_normal=white/black #菜单中未选中项目的字体颜色 #set menu_color_highlight=cyan/black #选中项目的字体颜色 # ------------------------------------------------------------------------ #搜索ISO目录下有iso的硬盘设定为root分区,也可以改为在U盘根目录下放置的文件,但注意这个文件其他硬盘的根目录不能有 #search --set -f /iso/CDlinux_mini-0.9.7.1.iso menuentry "WinPE--LMT(grub4dos)" { set iso_path=/iso/lmt7.iso search --set -f ${iso_path} set g4d_dir="/boot/grub4dos" set cfgfile="find --set-root ${iso_path};map --mem ${iso_path} (0xff);map --hook;chainloader (0xff);boot" echo 'Loading ISO via grub4dos...' linux $g4d_dir/grub.exe --config-file=$cfgfile } menuentry "WinPE--LMT(memdisk)" { set iso_path=/iso/lmt7.iso search --set -f ${iso_path} echo 'Loading Memdisk...' linux16 /boot/grub/memdisk iso raw echo 'Loading ISO...' initrd16 ${iso_path} } menuentry "WinPE--Deepin WinPE 4.2(grub4dos)" { set iso_path=/iso/Deepin_Windows_PE_4.2_Build_100910.iso search --set -f ${iso_path} set g4d_dir="/boot/grub4dos" set cfgfile="find --set-root ${iso_path};map --mem ${iso_path} (0xff);map --hook;chainloader (0xff);boot" echo 'Loading ISO via grub4dos...' linux $g4d_dir/grub.exe --config-file=$cfgfile } menuentry "WinPE--Deepin WinPE 4.2(grub4dos+firadisk)" { set iso_path=/iso/Deepin_Windows_PE_4.2_Build_100910.iso set firadisk=/iso/firadisk.ima search --set -f ${iso_path} set g4d_dir="/boot/grub4dos" set cfgfile="find --set-root ${iso_path};map --mem ${firadisk} (fd0);map --mem ${iso_path} (0xff);map --hook;chainloader (0xff);boot" echo 'Loading ISO via grub4dos...' linux $g4d_dir/grub.exe --config-file=$cfgfile } menuentry "WinPE--Deepin WinPE 4.2(memdisk)" { set iso_path=/iso/Deepin_Windows_PE_4.2_Build_100910.iso search --set -f ${iso_path} echo 'Loading Memdisk...' linux16 /boot/grub/memdisk iso raw echo 'Loading ISO...' initrd16 ${iso_path} } menuentry "CDlinux (console only)" { set gfxpayload=1280x1024x32,1024x768x32,800x600x32,800x600x16,800x600,640x480 set iso_path=/iso/CDlinux_mini-0.9.7.1.iso loopback loop ${iso_path} linux (loop)/CDlinux/bzImage iso-scan/filename=${iso_path} quiet CDL_LANG=en_US.UTF-8 initrd (loop)/CDlinux/initrd } menuentry "Linux Mint 17.2 ISO" { set iso_path=/iso/linuxmint-17.2-cinnamon-32bit.iso loopback loop ${iso_path} linux (loop)/casper/vmlinuz file=/cdrom/preseed/linuxmint.seed boot=casper initrd=/casper/initrd.lz iso-scan/filename=${iso_path} noeject noprompt splash -- initrd (loop)/casper/initrd.lz } menuentry 'BOOT HDisk'{ insmod ntfs search --set -f /bootmgr chainloader +1 } menuentry "Reboot" --class windows --class os { reboot } #menuentry 'CentOS Linux 7 1503 Live' { # set iso_name=CentOS-7-livecd-x86_64 # set iso_path=/iso/CentOS-7-x86_64-LiveCD-1503.iso # loopback loop ${iso_path} # linux (loop)/isolinux/vmlinuz0 iso-scan/filename=${iso_path} root=live:CDLABEL=${iso_name} rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0 # initrd (loop)/isolinux/initrd0.img #} #menuentry 'Fedora LiveCD' { # set iso_name=Fedora-Live-Desktop-i686-20-1 # set iso_path=/iso/Fedora-Live-Desktop-i686-20-1.iso # loopback loop ${iso_path} # linux (loop)/isolinux/vmlinuz0 iso-scan/filename=${iso_path} root=live:CDLABEL=${iso_name} rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0 # initrd (loop)/isolinux/initrd0.img #} #menuentry 'Fedora LiveCD X86_64' { # set iso_name=Fedora-Live-Desktop-x86_64-20-1 # set iso_path=/iso/Fedora-Live-Desktop-x86_64-20-1.iso # loopback loop ${iso_path} # linux (loop)/isolinux/vmlinuz0 iso-scan/filename=${iso_path} root=live:CDLABEL=${iso_name} rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0 # initrd (loop)/isolinux/initrd0.img #} #menuentry "Install Ubuntu Server 12.04" { # set isofile="/iso/ubuntu-12.04-server-amd64.iso" # loopback loop $isofile # set gfxpayload=keep # linux (loop)/install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed iso-scan/filename=$isofile quiet -- # initrd (loop)/install/initrd.gz #} #menuentry "Install Ubuntu Server 14.04" { # set isofile="/iso/ubuntu-14.04.1-server-amd64.iso" # loopback loop $isofile # set gfxpayload=keep # linux (loop)/install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed iso-scan/filename=$isofile quiet -- # initrd (loop)/install/initrd.gz #}
历史资料
U盘安装grub2
- 原文: Boot Multiple ISO from USB via Grub2 using Linux: http://www.pendrivelinux.com/boot-multiple-iso-from-usb-via-grub2-using-linux/
- 使用fidsk在U盘上创建分区
-
将创建的分区格式化为Fat32
mkfs.vfat -F 32 -n MULTIBOOT /dev/sdx1
-
安装grub2到U盘
# 旧版本grub使用:--root-directory=/mnt/USB (如:Ubuntu 10.04) # 新版本grub使用:--boot-directory=/mnt/USB/boot # 如果使用了错误的参数,会出现"Installation is impossible. Aborting"错误。 # 将/dev/sdb替换为你实际的U盘分区 mkdir /mnt/uboot && mount /dev/sdb2 /mnt/uboot #grub-install --force --no-floppy --boot-directory=/mnt/uboot/boot --target=i386-pc --recheck /dev/sdb grub-install --force --no-floppy --boot-directory=/mnt/uboot/boot /dev/sdb # 增加unicode、ascii支持(可选) cp /usr/share/grub/{unicode.pf2,ascii.pf2} /mnt/uboot/boot/grub/ # 使用grub-mkconfig可自动生成grub.cfg,并添加硬盘上的引导信息 # grub-mkconfig -o /mnt/uboot/boot/grub/grub.cfg # GRUB_PREFIX="/mnt/uboot/boot/grub" grub-mkconfig -o /mnt/uboot/boot/grub/grub.cfg
grub.cfg
pendrivelinux范例
# This grub.cfg file was created by Lance http://www.pendrivelinux.com # Suggested Entries and the suggestor, if available, will also be noted. # http://pendrivelinux.com/downloads/multibootlinux/grub.cfg set timeout=10 set default=0 menuentry "Ubuntu Desktop ISO" { loopback loop /ubuntu.iso linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/ubuntu.iso noeject noprompt splash -- initrd (loop)/casper/initrd.lz } # http://www.linuxmint.com # http://mirrors.ustc.edu.cn/linuxmint-cd/stable/ # ftp://ftp.heanet.ie/pub/linuxmint.com/stable/15/linuxmint-15-cinnamon-dvd-32bit.iso menuentry "Linux Mint ISO" { loopback loop /linuxmint.iso linux (loop)/casper/vmlinuz file=/cdrom/preseed/mint.seed boot=casper initrd=/casper/initrd.lz iso-scan/filename=/linuxmint.iso noeject noprompt splash -- initrd (loop)/casper/initrd.lz } menuentry "DBAN ISO" { loopback loop /dban.iso linux (loop)/DBAN.BZI nuke="dwipe" iso-scan/filename=/dban.iso silent -- } menuentry "Tinycore ISO" { loopback loop /tinycore.iso linux (loop)/boot/bzImage -- initrd (loop)/boot/tinycore.gz } menuentry "Memtest 86+" { linux16 /memtest86+.bin } menuentry "SystemRescueCd" { loopback loop /systemrescuecd.iso linux (loop)/isolinux/rescuecd isoloop=/systemrescuecd.iso setkmap=us docache dostartx initrd (loop)/isolinux/initram.igz }
Adding an Unlisted ISO: To try ISO Files that are not yet listed, use the existing menuentry examples in /boot/grub/grub.cfg and append any options normally found in the distributions syslinux.cfg file on the "append" line to the "linux" line of the menu entry.
多引导配置范例
# http://www.cnblogs.com/eshizhan/archive/2012/04/24/2467632.html set timeout=10 set default=0 menuentry "SystemRescueCd-x86-3.7.1.iso" { set isofile="/boot/iso/systemrescuecd-x86-3.7.1.iso" if cpuid; then set cputype="64"; else set cputype="32"; fi loopback loop $isofile linux (loop)/isolinux/rescue$cputype isoloop=$isofile setkmap=us initrd (loop)/isolinux/initram.igz } menuentry "WinPE-2009.iso" { set g4d_dir="/boot/grub4dos" set cfgfile="find --set-root /boot/iso/winpe-2009.iso;map --mem /boot/iso/winpe-2009.iso (0xff);map --hook;chainloader (0xff);boot" linux $g4d_dir/grub.exe --config-file=$cfgfile } menuentry "wowpc.iso" { set g4d_dir="/boot/grub4dos" set cfgfile="find --set-root /boot/iso/wowpc.iso;map --mem /boot/iso/wowpc.iso (0xff);map --hook;chainloader (0xff);boot" linux $g4d_dir/grub.exe --config-file=$cfgfile } menuentry "Archlinux-2012.09.07-dual.iso" { set isofile="/boot/iso/archlinux-2012.09.07-dual.iso" set dev_label="MULTIBOOT" if cpuid; then set cputype="x86_64"; else set cputype="i686"; fi loopback loop $isofile linux (loop)/arch/boot/$cputype/vmlinuz archisolabel=ARCH_201209 img_dev=/dev/disk/by-label/$dev_label img_loop=$isofile initrd (loop)/arch/boot/$cputype/archiso.img } menuentry "SliTaz-4.0-grub.iso" { set isofile="/boot/iso/slitaz-4.0-grub.iso" loopback loop $isofile linux (loop)/boot/bzImage rw root=/dev/null gfxpayload=vga=normal autologin lang=en kmap=us initrd (loop)/boot/rootfs.gz } menuentry "TinyCore-current.iso" { set isofile="/boot/iso/tinycore-current.iso" loopback loop $isofile linux (loop)/boot/vmlinuz quiet cde iso=/mnt/sdb1$isofile initrd (loop)/boot/core.gz } menuentry "XiaoPan-0.4.6.1.iso" { set isofile="/boot/iso/xiaopan-0.4.6.1.iso" loopback loop $isofile linux (loop)/boot/vmlinuz loglevel=3 cde waitusb=3 iso=/mnt/sdb1$isofile mydata=xiaopan restore=sdb1/boot/iso tz=CST-8 showapps lang=en_US.utf8 initrd (loop)/boot/core.gz } menuentry "GRUB4DOS" { set g4d_dir="/boot/grub4dos" linux $g4d_dir/grub.exe --config-file=$g4d_dir/menu.lst }
我的grub.cfg
#加载模块 insmod cat insmod gzio insmod ext2 insmod ntfs #insmod ntldr insmod font insmod fat insmod part_msdos insmod loopback insmod iso9660 set default=0 #这里是默认选项,0就是第一个 set timeout=5 #这里是默认等待时间 #设置显示情况,包括中文字体 #这里是设置字体文件,也就是前面我们拷贝的unicode.pf2 loadfont /boot/grub/unicode.pf2 # 这些是图形化设置的,加上更漂亮 # ------------------------------------------------------------------------ #set gfxmode=800x600 #设置分辨率 #set gfxpayload=keep #这一句不太清除,网上没有找到相关资料,加上保险 #insmod gfxterm #启用gfxterm模块,分辨率什么的,都靠它 #insmod vbe #加载vbe模块 #terminal_output gfxterm #将终端设置为gfxterm模式,也就是使上面的分辨率什么的生效 #以下是设置背景图片 #set root='hd0,msdos1' #insmod jpeg #开启jpeg模块 #background_image /boot/images/nature.jpg #指定背景图片的路径 #set menu_color_normal=white/black #菜单中未选中项目的字体颜色 #set menu_color_highlight=cyan/black #选中项目的字体颜色 # ------------------------------------------------------------------------ #搜索ISO目录下有iso的硬盘设定为root分区,也可以改为在U盘根目录下放置的文件,但注意这个文件其他硬盘的根目录不能有 #search --set -f /iso/CDlinux_mini-0.9.7.1.iso menuentry "WinPE--LMT(grub4dos)" { set iso_path=/iso/lmt7.iso search --set -f ${iso_path} set g4d_dir="/boot/grub4dos" set cfgfile="find --set-root ${iso_path};map --mem ${iso_path} (0xff);map --hook;chainloader (0xff);boot" echo 'Loading ISO via grub4dos...' linux $g4d_dir/grub.exe --config-file=$cfgfile } menuentry "WinPE--LMT(memdisk)" { set iso_path=/iso/lmt7.iso search --set -f ${iso_path} echo 'Loading Memdisk...' linux16 /boot/grub/memdisk iso raw echo 'Loading ISO...' initrd16 ${iso_path} } menuentry "WinPE--Deepin WinPE 4.2(grub4dos)" { set iso_path=/iso/Deepin_Windows_PE_4.2_Build_100910.iso search --set -f ${iso_path} set g4d_dir="/boot/grub4dos" set cfgfile="find --set-root ${iso_path};map --mem ${iso_path} (0xff);map --hook;chainloader (0xff);boot" echo 'Loading ISO via grub4dos...' linux $g4d_dir/grub.exe --config-file=$cfgfile } menuentry "WinPE--Deepin WinPE 4.2(grub4dos+firadisk)" { set iso_path=/iso/Deepin_Windows_PE_4.2_Build_100910.iso set firadisk=/iso/firadisk.ima search --set -f ${iso_path} set g4d_dir="/boot/grub4dos" set cfgfile="find --set-root ${iso_path};map --mem ${firadisk} (fd0);map --mem ${iso_path} (0xff);map --hook;chainloader (0xff);boot" echo 'Loading ISO via grub4dos...' linux $g4d_dir/grub.exe --config-file=$cfgfile } menuentry "WinPE--Deepin WinPE 4.2(memdisk)" { set iso_path=/iso/Deepin_Windows_PE_4.2_Build_100910.iso search --set -f ${iso_path} echo 'Loading Memdisk...' linux16 /boot/grub/memdisk iso raw echo 'Loading ISO...' initrd16 ${iso_path} } menuentry "CDlinux (console only)" { set gfxpayload=1280x1024x32,1024x768x32,800x600x32,800x600x16,800x600,640x480 set iso_path=/iso/CDlinux_mini-0.9.7.1.iso loopback loop ${iso_path} linux (loop)/CDlinux/bzImage iso-scan/filename=${iso_path} quiet CDL_LANG=en_US.UTF-8 initrd (loop)/CDlinux/initrd } menuentry "Linux Mint 17.2 ISO" { set iso_path=/iso/linuxmint-17.2-cinnamon-32bit.iso loopback loop ${iso_path} linux (loop)/casper/vmlinuz file=/cdrom/preseed/linuxmint.seed boot=casper initrd=/casper/initrd.lz iso-scan/filename=${iso_path} noeject noprompt splash -- initrd (loop)/casper/initrd.lz } menuentry 'CentOS Linux 7 1503 Live' { set iso_name=CentOS-7-livecd-x86_64 set iso_path=/iso/CentOS-7-x86_64-LiveCD-1503.iso loopback loop ${iso_path} linux (loop)/isolinux/vmlinuz0 iso-scan/filename=${iso_path} root=live:CDLABEL=${iso_name} rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0 initrd (loop)/isolinux/initrd0.img } menuentry 'BOOT HDisk'{ insmod ntfs search --set -f /bootmgr chainloader +1 } menuentry "Reboot" --class windows --class os { reboot } #menuentry 'Fedora LiveCD' { # set iso_name=Fedora-Live-Desktop-i686-20-1 # set iso_path=/iso/Fedora-Live-Desktop-i686-20-1.iso # loopback loop ${iso_path} # linux (loop)/isolinux/vmlinuz0 iso-scan/filename=${iso_path} root=live:CDLABEL=${iso_name} rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0 # initrd (loop)/isolinux/initrd0.img #} #menuentry 'Fedora LiveCD X86_64' { # set iso_name=Fedora-Live-Desktop-x86_64-20-1 # set iso_path=/iso/Fedora-Live-Desktop-x86_64-20-1.iso # loopback loop ${iso_path} # linux (loop)/isolinux/vmlinuz0 iso-scan/filename=${iso_path} root=live:CDLABEL=${iso_name} rootfstype=auto ro rd.live.image quiet rhgb rd.luks=0 rd.md=0 rd.dm=0 # initrd (loop)/isolinux/initrd0.img #} #menuentry "Install Ubuntu Server 12.04" { # set isofile="/iso/ubuntu-12.04-server-amd64.iso" # loopback loop $isofile # set gfxpayload=keep # linux (loop)/install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed iso-scan/filename=$isofile quiet -- # initrd (loop)/install/initrd.gz #} #menuentry "Install Ubuntu Server 14.04" { # set isofile="/iso/ubuntu-14.04.1-server-amd64.iso" # loopback loop $isofile # set gfxpayload=keep # linux (loop)/install/vmlinuz file=/cdrom/preseed/ubuntu-server.seed iso-scan/filename=$isofile quiet -- # initrd (loop)/install/initrd.gz #}
U盘启动WinPE
GRUB2->grub4dos方式
通过grub4dos提供的map功能引导WinPE.iso。
menuentry "[iso] -- WinPE(g4d)" { set g4d_dir="/boot/grub4dos" set cfgfile="find --set-root /boot/iso/winpe.iso;map --mem /boot/iso/winpe.iso (0xff);map --hook;chainloader (0xff);boot" linux $g4d_dir/grub.exe --config-file=$cfgfile } menuentry "[iso] -- WinPE(g4d)" --class windows --class os { set cfgfile="map /image/winpe.iso (hd32) || map --mem /image/winpe.iso (hd32); map --hook; chainloader (hd32); rootnoverify (hd32)" linux16 /grub4dos/grub.exe --config-file=$cfgfile initrd16 /image/winpe.iso
grub2+syslinux/memdisk
- syslinux: https://www.kernel.org/pub/linux/utils/boot/syslinux/
- memdisk说明: http://www.syslinux.org/wiki/index.php/MEMDISK
- GRUB2引导Windows PE等ISO文件的办法: http://www.librehat.com/grub2-boot-windows-pe-and-otheriso-file/
首先下载最新版的Syslinux,解开压缩包,memdisk文件夹下面有一个memdisk文件(没有任何扩展名),把memdisk文件复制到U盘boot文件夹下。
GRUB2的memdisk是用来读取core.img的。和syslinux的MEMDISK完全不同……详见: http://wiki.xtronics.com/index.php/Grub2_howto
借助MEMDISK(几十KB的文件),GRUB2就能加载几乎任意的镜像文件(ISO、IMG等)了,相当于是「虚拟光驱」的作用?不过引导速度比GRUB4DOS稍微慢一点。
关键就是memdisk后面的raw参数
menuentry 'Boot Windows 8 PE ISO'{ set root='(hd0,msdos1)' echo 'Loading Memdisk...' # 不需要insmod memdisk,因为用的是Syslinux的MEMDISK而不是GRUB2的memdisk模块。 #insmod memdisk linux16 /boot/memdisk iso raw echo 'Loading ISO...' initrd16 /boot/Win8PE.iso } menuentry '[iso] -- /WinPE(memdisk) ' { #insmod memdisk insmod fat set root='hd0,msdos1' linux16 /boot/memdisk iso raw initrd16 /winpe.iso
ntldr方式
- 打造自己的多功能USB启动盘——grub2引导WinPE、Archlinux安装镜像和Ubuntu liveCD:http://blog.chinaunix.net/uid-14735472-id-4210990.html
- U盘上建立WXPE目录,将WinPE文件放置入内:
目前网络上的WinPE到处都是,各种版本其实都差不多,主要需要如下5个文件:
LDRXPE NTCOM PE SETUPLDR.BIN WINPE.IS_
大致过程是:LDRXPE调用NTCOM和SETUPLDR.BIN读取PE找到WINPE.IS_镜像,加载WinPE。
-
修改grub.cfg,加入winpe引导项:
menuentry 'LDRXPE for WinCE'{ insmod part_msdos insmod fat set root='hd0,msdos1' # 说明:此处的696C-0B1C为U盘分区uuid,其实这一句也可以不要,因为上面已经set root了,主要为了双保险。 search --no-floppy --fs-uuid --set=root 696C-0B1C # 这里的关键是:ntldr /WXPE/LDRXPE,而不是chainloader或者linux,我用后者尝试了一周都不得成功,最后才发现了可以直接用ntldr命令,强大啊!! ntldr /WXPE/LDRXPE }
编译syslinux
-
在Ubuntu环境中,打开终端,执行以下sudo命令,安装必须的软件:
sudo apt-get install mktemp perl install nasm sudo apt-get install mingw32 mingw32-binutils mingw32-runtime sudo apt-get install git-core
- 下载Syslinux 源包:
-
编译
cd syslinux-6.03 make
测试编译报错,以后再来查找原因。
工具下载
- grub4dos:
- memdisk_4.02: memdisk_4.02
- memdisk_5.10: memdisk_5.10
-
firadisk.ima: firadisk.ima
- Grub4DOS仿真盘驱动--FiraDisk&WinVBlock:可以支持grub4dos map--mem出来的光驱,软驱,硬盘,支持多个虚拟驱动器。并从仿真盘启动。
- 现在支持grub4dos map(非载入内存方式)出来的硬盘,并从仿真硬盘启动。
- Firadisk、WinVBlock驱动的最新版本支持 map(非载入内存方式)出来的光驱,并从仿真光驱启动。
-
Bootice:
- BOOTICE 是一个启动相关的维护的小工具,主要用于安装、修复、备份和恢复磁盘或磁盘镜像(.IMG;.IMA;.VHD)的 MBR(Master Boot Record)或分区上的 PBR(Partition Boot Record),以及对 Windows Vista/7/2008 启动配置文件 BCD 的编辑功能。此外还具有磁盘分区管理,对可移动磁盘的重新分区和格式化功能。
- 可用于将grub4dos引起安装到U盘。
在boot.ini中添加grub4dos
WinXP
- 把grub4dos的grldr,menu.lst拷贝到C:\,在/boot/imgs目录中放入firadisk.img和各种不解开的PE的ISO文件。
-
C:\boot.ini里面最后加上一句:
C:\GRLDR=GRUB4DOS
,配合grub4dos的menu.lst菜单就能够引导PE。
Win7
- Windows 7上使用Grub4DOS:
Windows7上使用Grub4DOS有两种方法实现(除了直接将Grub安装至MBR):
- 通过创建boot.ini添加启动启动项。
- 通过windows 7的BOOTMGR启动管理器添加启动项。
-
通过boot.ini添加启动项
- 拷贝grldr、grldr.mbr、menu.lst到系统盘根目录;
-
在系统盘根目录创建boot.ini文件,添加如下内容("Grub4Dos"要加引号),就可以加载grub4dos。
[boot loader] [operating systems] c:grldr.mbr="Grub4Dos"
-
通过win7的BOOTMGR启动管理器添加启动项
- 注意:所有BCDEDIT的命令操作都必须以管理员身份运行。
-
使用BCDEdit备份与恢复启动选项
# 为了避免误操作,最好先对BCD进行备份。使用下面的命令进行备份和恢复。 bcdedit /export "D:BCD-Backup" # 将BCD备份到"D:BCD-Backup"目录。 bcdedit /import "D:BCD-Backup" # 恢复之前的BCD备份。
- 将grub4dos的三个文件复制到C盘根目录下;
-
添加BOOTMGR启动菜单:以管理员身份运行下面的批处理命令。
@echo off cls echo. echo 必须以管理员运行 echo. pause set title=Windows 7添加Grub4DOS启动菜单 set vid= bcdedit /create /d "%title%" /application bootsector >vid.ini for,/f,"tokens=2 delims={",%%i,In (vid.ini) Do ( set vida=%%i ) for,/f,"tokens=1 delims=}",%%i,In ("%vida%") Do ( set vid={%%i} ) echo %title% created as %vid% bcdedit /set %vid% device partition=c: >nul bcdedit /set %vid% path grldr.mbr >nul bcdedit /displayorder %vid% /addlast >nul echo. pause bcdedit /enum pause :exit
- 附:BCDEdit命令的常见用法
使用bcdedit
或bcdedit /enum all
来查看系统中硬盘或分区的GUID 标识,例如{dc0a0dea-4a4e-11df-900b-d0c518f1f5f1}。其中{legacy}表示上一代操作系统,{current} 表示当前启动硬盘上的操作系统(Windows 7),下面均以{GUID}表示。
BCDEdit修改启动选项的常用命令格式:
命令 | 说明 |
---|---|
bcdedit 或 bcdedit /enum all | 查看系统中硬盘或分区的GUID 标识 |
bcdedit /set {GUID} Description "Windows XP Professional SP3" | 修改{GUID}在启动菜单中的显示内容 |
bcdedit /default {GUID} | 设置指定GUID上的操作系统为默认启动的系统 |
bcdedit /timeout 3 | 将默认的启动菜单显示时间更改为3秒 |
bcdedit /displayorder {current} {legacy} | 将首先显示默认启动的Windows 7,然后再显示Windows XP, |
bcdedit /delete {GUID} | 删除GUID上的启动菜单 |
-
grub4dos:menu.lst菜单参考
-
原文:用grub4dos引导ISO,不解开ISO利用grub4dos磁盘仿真来引导WINPE启动: http://blog.sina.com.cn/s/blog_4ad042e50102e8sv.html
#menu.lst采用utf-8编码 #font (bd)/boot/grub/unifont.hex #graphicsmode -1 color white/blue blue/yellow light-red/blue 10 foreground FFFFFF background 0000AD timeout 3 default 0 title tongyong WINPE by Uepon (TonPE.iso) map --mem (bd)/boot/imgs/firadisk.img (fd0) map --mem (bd)/boot/imgs/TonPE.iso (0xff) #map --e820cycles=1 map --hook chainloader (0xff) title tongyong WINPE by Uepon (TonPE_net.iso+firadisk) map --mem (bd)/boot/imgs/TonPE_net.iso (0xff) #map --e820cycles=1 map --hook chainloader (0xff) title Sky123_Mini_PE by Chinanet (Sky123_Mini_PE.iso+winvblock) #map --mem (bd)/boot/imgs/firadisk.img (fd0) map --mem (bd)/boot/imgs/Sky123_Mini_PE.iso (0xff) #map --e820cycles=2 map --hook chainloader (0xff) title WINPE by lrbin50 (PE20090727_net.iso+firadisk) map --mem (bd)/boot/imgs/PE20090727_net.iso (0xff) map --hook chainloader (0xff) title WINPE by xuxinhero (PE20100528_net.iso+winvblock) map --mem (bd)/boot/imgs/PE20100528_net.iso (0xff) map --hook chainloader (0xff) title WINPE by diy_xxq (20101220_net.iso+winvblock) map --mem (bd)/boot/imgs/20101220_net.iso (0xff) map --hook chainloader (0xff) title WINPE by uepon (TonPE_V3.3.iso+firadisk) map --mem (bd)/boot/imgs/TonPE_V3.3.iso (0xff) map --hook chainloader (0xff) title ghost by doshome map --mem (bd)/boot/imgs/ghost.img (fd0) map --hook chainloader (fd0)+1 root (fd0) title run mem automenu by sratlf command run --mem --show.iso title run fira automenu by sratlf command run --mem --fira --show.iso title Boot from pxelinux pxe keep chainloader --raw (bd)/pxelinux.0 #chainloader --force (bd)/pxelinux.0 title WINPE (startrom.0) pxe keep chainloader --force (bd)/startrom.0 title boot from hard disk checkrange 0x80 read 0x8280 && map (hd1) (hd0) checkrange 0x80 read 0x8280 && map --hook chainloader (hd0)+1 title boot Windows by zhaohj find --set-root --devices=h /ntldr || find --set-root --devices=h /bootmgr map () (hd0) map (hd0) () map --rehook find --set-root --devices=h /ntldr || find --set-root --devices=h /bootmgr #rootnoverify (hd0,0) chainloader /ntldr || chainloader /bootmgr title plpbt.bin kernel (bd)/boot/grub/plpbt.bin title command line commandline title reboot reboot title halt halt
-
原文:用grub4dos引导ISO,不解开ISO利用grub4dos磁盘仿真来引导WINPE启动: http://blog.sina.com.cn/s/blog_4ad042e50102e8sv.html