程序员修电脑必备: 使用Grub2制作一个多系统(WinPE与Linux, Android X86)启动的维护移动硬盘和U盘

说明

多台计算机安装了不同的系统(Windows, Linux, MacOS), 如果要对系统进行重装或者维护, 每一次都是重新制作启动和维护移动存储设备, 为了节省时间, 考虑制作一个即可启动和维护Windows的也可以启动和安装Linux的多启动移动存储设备. 现代的电脑主板上面的固件(BIOS)可以支持Legacy BIOS启动也可以支持UEFI启动, 下面我们指的是Legacy BIOS, 当然最后也说明了一下制作UEFI启动盘.

这里面使用移动U盘和移动硬盘都测试实践没有问题. 以下是过程.

如果你想制作一个和我这个一样的多系统启动维护移动设备,那么可以看最后的总结部分, 通过几个步骤完成, 所有的文件我都会上传. 


作用

多系统启动的移动存储设备可以完成但是不限于下面这些功能

  1. 维护系统, 例如grub2引导修复, windows启动修复, 系统recovery
  2. 数据恢复
  3. 杀毒
  4. 备份数据
  5. 装机,系统的备份还原
  6. (购买电脑时的)硬件检测
  7. 随身系统


制作环境

因为个人习惯用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/sde

Disk /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: 0xf0b1ebb0

   Device 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/exFAT

Partition 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=0

menuentry "Ubuntu 14.04.4 X64 Live ISO" {
    loopback loop /ubuntu-14.04.4-desktop-amd64.iso
    linux (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.iso
    search --set -f $isofile
    loopback loop $isofile
    linux (loop)/porteus/vmlinuz from=$isofile
    initrd (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.iso
    linux (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:

如果没有什么问题,那么就会出现grub中的配置的boot menu:


如果我们选择启动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.iso
    linux (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详解教程

如何手动测试

使用Qemu来启动设备, 并测试grub2,以及确定我们写的grub.cfg是很有必要的, 例如通过选择menuentry但是无法启动, 但是却找不到原因, 那么我们就可以通过手动来输入menuentry来一步步确定问题出现在哪里.
要手动测试, 那么就需要进入到Grub2的命令行模式, 这个和其他Bootloader的cmdline模式类似, 例如在UBoot中启动前的bootdelay时间内敲下Space按键(hotkey), 可以进入到cmdline中, 而Grub2中这个按键是c, 因此要调试,那么在grub运行后, 输入c即可进入到上面图中类似的cmdline中.

加载grub.cfg文件

grub2使用命令configfile加载配置文件,  我们使用:
configfile /Path/To/grub.cfg 
那么就可以加载这个配置, 如果是我们前面的grub.cfg, 那么就会出现菜单, 并根据timeout 与 default选项选择某个menuentry, 并倒计时. 

手动启动系统与测试

每一个menuentry可能都是由下面三个部分组成:
linux, initrd, 参数.
每一个menuentry的执行过程如下:
执行menuentry{}中的内容, 然后再运行boot命令, 例如下面这个:
menuentry "Ubuntu 14.04.4 X64 Live ISO" {
    loopback loop /ubuntu-14.04.4-desktop-amd64.iso
    linux (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文件
linux变量指定为后面的vmlinuz.efi, 后面的从boot=casper开始到这行结束都是cmdline或者选项
initrd变量指定了initrd文件
最后grub调用boot命令, boot命令根据linux与initrd等变量启动对应的可执行文件, 最后这一步boot属于是hidden operation, 并没有在menuentry中.


添加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. 使用实机测试与使用


  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值