本文主要是介绍程序员修电脑必备: 使用Grub2制作一个多系统(WinPE与Linux, Android X86)启动的维护移动硬盘和U盘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
说明
多台计算机安装了不同的系统(Windows, Linux, MacOS), 如果要对系统进行重装或者维护, 每一次都是重新制作启动和维护移动存储设备, 为了节省时间, 考虑制作一个即可启动和维护Windows的也可以启动和安装Linux的多启动移动存储设备. 现代的电脑主板上面的固件(BIOS)可以支持Legacy BIOS启动也可以支持UEFI启动, 下面我们指的是Legacy BIOS, 当然最后也说明了一下制作UEFI启动盘.
这里面使用移动U盘和移动硬盘都测试实践没有问题. 以下是过程.
如果你想制作一个和我这个一样的多系统启动维护移动设备,那么可以看最后的总结部分, 通过几个步骤完成, 所有的文件我都会上传.
作用
多系统启动的移动存储设备可以完成但是不限于下面这些功能
- 维护系统, 例如grub2引导修复, windows启动修复, 系统recovery
- 数据恢复
- 杀毒
- 备份数据
- 装机,系统的备份还原
- (购买电脑时的)硬件检测
- 随身系统
制作环境
因为个人习惯用Linux, 这里用的是Ubuntu 14.04.4 X64, 如果使用Windows, 那么也可以使用grub2 windows版本来制作, 如果是其他Linux Distribution, 那么只要安装了Grub2也可以完成制作.
下面设备是我用的,测试的设备, 具体中, 只要有一个4GB甚至2GB的U盘即可, 如果期望装入很多系统, 那么就需要size大些:
- 移动硬盘500GB, MBR, 分区多个,具体见下文.
- U盘一个, 16GB, MBR, 活动分区为FAT16, 从而可以作为UEFI启动介质.
制作过程
安装Grub2
在Ubuntu 14.04下面安装grub2到移动硬盘或者U盘非常容易, 先确定自己的移动存储设备的节点, 例如下面是我的移动硬盘的设备节点以及分区:
然后具体的设备与分区信息如下:
$ sudo fdisk -l /dev/sdeDisk /dev/sde: 500.1 GB, 500107862016 bytes
64 heads, 32 sectors/track, 476940 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf0b1ebb0Device Boot Start End Blocks Id System
/dev/sde1 * 871911424 976771071 52429824 7 HPFS/NTFS/exFAT
/dev/sde2 16166 871910464 435947149+ f W95 Ext'd (LBA)
/dev/sde5 16198 419762384 209873093+ 7 HPFS/NTFS/exFAT
/dev/sde6 419762448 696257099 138247326 7 HPFS/NTFS/exFAT
/dev/sde7 696257163 871910464 87826651 7 HPFS/NTFS/exFATPartition table entries are not in disk order
可以看到sde1为"活动"分区, 即Boot分区, 然后mount信息如下:
$ mount | grep sde1
/dev/sde1 on /media/hexiongjun/PE type fuseblk (rw,nosuid,nodev,allow_other,default_permissions,blksize=4096)
另外这个sde1 是NTFS分区格式的.
驱动好这些信息后, 我们使用下面命令安装:
sudo grub-install --boot-directory=/media/hexiongjun/PE/grub2 --removable /dev/sde
注意--boot-directory为grub存放的路径, 这个是放在了设备的这个分区的grub2目录下面, 最后一个参数是设备节点路径, 不是分区路径.
如果没有错误,那么会提示:
$ sudo grub-install --boot-directory=/media/hexiongjun/PE/grub2 --removable /dev/sde
Installing for i386-pc platform.
Installation finished. No error reported.
至此, 我们就安装好了grub2到这个移动硬盘中了.
配置
完成了grub2的安装之后,我们需要配置grub2,让其知道该加载什么文件, 当然, 也可以不配置, 然后启动后直接全部手动输入来引导也是可以的.
配置文件放在:
/media/hexiongjun/PE/grub2/grub/grub.cfg
这个其实配置了启动的菜单, 这里面我们的内容如下:
set timeout=10
set default=0menuentry "Ubuntu 14.04.4 X64 Live ISO" {loopback loop /ubuntu-14.04.4-desktop-amd64.isolinux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.4-desktop-amd64.iso splash --initrd (loop)/casper/initrd.lz
}menuentry "Windows 10PE x64 ISO" {set root='(hd0,msdos1)'set g4d_dir="/Grub4dos/"set cfgfile="find --set-root /PE/ConcisePE_Win10x64.iso;map --mem /PE/ConcisePE_Win10x64.iso (0xff);map --hook;chainloader (0xff);boot"linux $g4d_dir/grub.exe --config-file=$cfgfile
}menuentry "WindowsPE UQi ISO" {set root='(hd0,msdos1)'set g4d_dir="/Grub4dos/"set cfgfile="find --set-root /PE/UQi_USBsys_2017.iso;map --mem /PE/UQi_USBsys_2017.iso (0xff);map --hook;chainloader (0xff);boot"linux $g4d_dir/grub.exe --config-file=$cfgfile
}menuentry "AcronisTrueImage2017" {set root='(hd0,msdos1)'set g4d_dir="/Grub4dos/"set cfgfile="find --set-root /PE/AcronisTrueImage2017_NG.iso;map --mem /PE/AcronisTrueImage2017_NG.iso (0xff);map --hook;chainloader (0xff);boot"linux $g4d_dir/grub.exe --config-file=$cfgfile
}menuentry "Porteus 3.2 ISO" {set isofile=/PE/Porteus-3.2-i586-20170206.isosearch --set -f $isofileloopback loop $isofilelinux (loop)/porteus/vmlinuz from=$isofileinitrd (loop)/porteus/initrd.xz
}
这里共有五项启动项目, 分别为2个Linux, 3个PE相关的WindowsOS, 其中PE ISO的启动用到了grub4dos, 本身grub2也可以引导ISO,但是我测试发现使用memdisk的方式在某些机器上面会有问题, 因此干脆直接就用grub4dos吧.
2017/03/06更新 添加Android X86的启动引导:
menuentry "Android-x86 Live" {loopback loop /android_x86.isolinux (loop)/kernel boot=casper iso-scan/filename=/android_x86.iso root=/dev/ram0 androidboot.hardware=android_x86 video=-16 quiet SRC= DATA=initrd (loop)/initrd.img
}
因为用到了grub4dos, 而grub4dos也是bootloader, 因此其实就是grub2--> grub4dos --> PE, 因此我们需要将grub4dos的文件(点击即可下载)放到硬盘中:
$ ls /media/hexiongjun/PE/Grub4dos/
back.jpg font6500.gz grldr grldr4.mbr grldr.mbr grub.exe ipxegrldr menu.lst menu_out.lst message 说明
里面有一个grub.exe, 这个就是grub4dos的引导程序, 你可以认为是kernel/zImage, 或者是认为raw executive file.
这个Grub4dos, 我已经上传, 可以到这里面下载, 如果你需要的话, 下载后解压到移动设备的启动分区即可.
grub.cfg加载的文件
这里面我们全部都是iso文件, 一些位于PE目录下, ubuntu位于设备分区根目录下面:
$ ls /media/hexiongjun/PE/ubuntu-14.04.4-desktop-amd64.iso
/media/hexiongjun/PE/ubuntu-14.04.4-desktop-amd64.iso$ ls /media/hexiongjun/PE/PE/
AcronisTrueImage2017_NG.iso ConcisePE_Win10x64.iso Porteus-3.2-i586-20170206.iso UQi_USBsys_2017.iso
更新grub.cfg后生效配置
直接编辑grub.cfg后是不会生效的,我们还需要使用update-grub2或者grub-mkconfig来使更新了的配置生效, 但是这里我们使用和前面update install一样的命令来更新, 即重新运行前面的命令即可完成更新:
sudo grub-install --boot-directory=/media/hexiongjun/PE/grub2 --removable /dev/sde
Installing for i386-pc platform.
Installation finished. No error reported.
测试
因为实机开机关机慢, 在Linux下面我们直接使用qemu来测试, 例如:
sudo qemu-system-x86_64 -machine accel=kvm:tcg -m 3072 -hda /dev/sde
最后的是设备节点作为hard disk, 中间还有一个-m 3072, 指的是specify memory 3GB, 如果太小,那么grub4dos在加载iso文件到内存的时候会出错.
如果是使用memdisk来加载的话,也会出现问题, 例如下面的加载会出现out of memory:
如果我们选择启动WinPE,那么grub4dos就会加载ISO到memory:
加载完成后, 就可以选择启动, 例如下面是启动了ATI的image:
下面是Porteus Linux:
Grub2的基本语法解释
menuentry
如果要添加一个ISO, 那么我们可以再添加一个menuentry, 然后再次grub2-install即可. 那么下面说明一下menuentry的内容与语法:
menuentry "Ubuntu 14.04.4 X64 Live ISO" {loopback loop /ubuntu-14.04.4-desktop-amd64.isolinux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.4-desktop-amd64.iso splash --initrd (loop)/casper/initrd.lz
}
loopback: 即为blcok device 的loopback , 第一句将iso文件mount 到loopback 设备loop上面
linux: 变量指定要启动的linux kernel, 但是也可以是其他的可以执行的文件, 例如前面提到的grub4dos的grub.exe.
initrd: 即initrd 最小系统, 具体可以看我以前的PPT分享讲解的initramfs与initrd的区别. 可以没有.
linux后还需要指定boot parameters, 即相当于u-boot中的bootargs, 传入到Linux kernel中的cmdline.
也可以指定对应要运行的程序自定义的参数, 例如--config.
设备文件
前面我们看到了loop为一个block loopback设备, 后面的linux与initrd都是从这里面来指定的, 设备文件使用()来表示.
使用ls来查看所有文件, 使用ls带设备来查看某个设备分区:
同时从前面也可以看到, 如果我们需要查看某个设备的UUID是可以通过这个ls来获取的
下面是使用ls来查看文件:
帮助
如何查看某个命令的帮助
要么在线看
https://www.gnu.org/software/grub/manual/grub.html#SEC_Contents
有的命令有-h选项
文档教程
如果期望查看grub2的文档,那么可以参考下面这个文档, 非常详细, 包含安装定制与使用:
Grub2详解教程
如何手动测试
加载grub.cfg文件
手动启动系统与测试
menuentry "Ubuntu 14.04.4 X64 Live ISO" {loopback loop /ubuntu-14.04.4-desktop-amd64.isolinux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=/ubuntu-14.04.4-desktop-amd64.iso splash --initrd (loop)/casper/initrd.lz
}
先使用loopback mount ISO文件
添加UEFI启动
WinPE UEFI
UEFI需要FAT32 FS, 因此使用我们的U盘为例, 如果你有一个WPE ISO支持UEFI启动,那么直接mount ISO, 然后讲里面的内容拷贝到这个FAT32启动分区即可. 例如前面的Concise即支持.
grub2的UEFI启动
grub2的install中有一个UEFI的对应选项, man手册可以找得到.
具体可以参考这篇文章中的示例
或者通过man grub-install , 然后search efi看到对应的选项.
注意事项
WinPE使用memdisk启动问题
网上都是参考这篇文章的说法, 使用memdisk来启动WinPE ISO,但是实际上是可能出现问题的. 尤其是Size较大的Windows 8 PE或者Windows 10 PE.
如果你的WinPE ISO比较大,那么不要使用memdisk的方式来启动, 否则会出现下面这个问题:
就算在Qemu中没有问题, 但是在某些实机上面却会出现问题, 使用grub4dos没有这个问题
Qemu无法启动某些WinPE
可能会出现类似下面这种情况, 其实Windows是启动了, 但是因为qemu的问题, 导致无法正常启动:
这个是因为使用了Qemu qvm的缘故.
对此, 我们可以换成VirtualBox来测试, 具体参考: How to Boot From a USB Flash Drive in VirtualBox
其他启动类制作与辅助工作
BOOTICE
修改与安装bootloader的工具, 包括Legacy BIOS与UEFI, 可以安装不同的Bootloader, 例如Grub4Dos, grub2, MBR等等, 参考: http://wuyou.net/forum.php?mod=viewthread&tid=375848&extra=page%3D1
Easy2Boot
用来快速制作多系统启动U盘,但是需要Format 分区.
YUMI
与Easy2Boot类似.
添加ISO的WinPE镜像启动项
参考下面这个GIF动画, 来源于恋梦PE, 用的是EasyBCD, 这个适用于系统安装完成后, 添加一个PE系统从而方便维护:
参考
How to Create a EFI/UEFI GRUB2 Multiboot USB drive to boot ISO images
Porteus OS
Grub4dos参考下载链接中的说明里面的chm
grub config参考
总结
下面说一下如何制作和测试, 以及使用
- 1. 下载Grub4Dos, 这个链接
- 2. 安装grub2到移动存储设备
- 3. 配置grub.cfg, 可以参考前面的内容
- 4. 再次运行grub-install完成grub.cfg的配置更新
- 5. 使用qemu测试
- 6. 使用实机测试与使用
这篇关于程序员修电脑必备: 使用Grub2制作一个多系统(WinPE与Linux, Android X86)启动的维护移动硬盘和U盘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!