制作一个USB 多启动盘(MBR)

来源:互联网 发布:ubuntu 16.04 安装 编辑:程序博客网 时间:2024/05/18 01:42

晚上无聊的时间做的,下班回来太累不想写代码,又没事可做,就把自己U 盘搞了一下做成了一个多启动盘。用起来算是蛮方便的吧,除去系统所占用的空间,其他的可以随便放文件啦什么的,省得dd 镜像到U 盘,dd 的镜像不一定能用不说,还带来诸多不便。

分区方案

分区方案大约是下面的样子:
这里写图片描述
根据个人爱好我是分了一个较小的ext4 分区和一个较大的NTFS 分区,前者用来储存/boot 目录,还有一些Linux 下需要保存权限的文件,NTFS 分区存放系统光盘镜像,和一些大块头的文件例如归档和视频。

安装GRUB2

这里使用GRUB2 作为Loader,首先分好区,其中必须要有一个可以保存文件权限的分区(建议ext4)。注意这里使用的是MBR 磁盘格式,如果你的U 盘是GPT 格式,可以直接使用root 权限将/dev/zerodd到你的U 盘设备文件,然后使用cfdisk重新设定磁盘格式为dos。当然GPT 也能用,太麻烦。
分区完毕后建立一个名为/boot的目录。之后使用gurb-install安装GRUB2,假设这里你U 设备文件为/dev/sdb/boot目录所在分区其挂载点为/mnt/usb2

sudo grub-install --target=i386-pc --recheck --boot-directory=/mnt/usb2/boot /dev/sdb

如果没有错误出现,那么就是安装成功了。如果安装出错,检查你的第一个分区是否留出了2048 个扇区,如果没有,那么请重新分区,让第一个分区至少从2048 的扇区号开始。

配置grub.cfg

安装完毕后就是配置了,下面来默认生成一个GRUB2 配置文件

sudo grub-mkconfig -o /mnt/usb2/boot/grub/grub.cfg

然后对这个配置文件进行一些修改,除了/etc/grub.d/00_header/etc/grub.d/41_custom脚本生成的内容之外,其余的全部删除,现在你的GRUB2 配置文件在00_header 之后的部分大约是这个样子:

### BEGIN /etc/grub.d/10_linux ###### END /etc/grub.d/10_linux ###### BEGIN /etc/grub.d/20_linux_xen ###### END /etc/grub.d/20_linux_xen ###### BEGIN /etc/grub.d/30_os-prober ###### END /etc/grub.d/30_os-prober ###### BEGIN /etc/grub.d/40_custom ###### END /etc/grub.d/40_custom ###### BEGIN /etc/grub.d/41_custom ###if [ -f  ${config_directory}/custom.cfg ]; then  source ${config_directory}/custom.cfgelif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then  source $prefix/custom.cfg;fi### END /etc/grub.d/41_custom ###### BEGIN /etc/grub.d/60_memtest86+ ###### END /etc/grub.d/60_memtest86+ ###

然后新建一个配置文件custom.cfg,与grub.cfg同目录,我们的配置将会全部写在这个文件中,以后无论如何重新生成配置文件,我们的配置都将不会被覆盖。

下载镜像

现在最好开始下载这些大块头,等到你配置完毕的时候,这些大家伙差不多也下载完毕了。根据个人喜好,我把这些镜像放到了NTFS 分区的/sysimg目录中。
这里写图片描述
不同的发行版的镜像其内核引导参数都不相同,这里我用的是Arch Linux 的monthly release 镜像,还有Ubuntu Linux 14.04.3 的镜像。
你可以点击超链接获得Arch Linux 和Ubuntu 的可用镜像。

配置custom.cfg

首先我们需要设置镜像文件所在分区的设备号,因为U 盘在不同机器上可能有不同设备号,所以只能通过UUID 来标识设备,至于查看UUID 可以用一条简单的lsblk -f指令得到,这个UUID 一般不会改变,直到你改动了分区表。为了在GRUB2 中使用UUID 寻找设备,需要加载模块search_fs_uuid

insmod search_fs_uuidset uuid=3565C50A2324BC8Cset dev_uuid=/dev/disk/by-uuid/$uuidsearch --no-floppy --set=dev --fs-uuid $uuid

现在我们有了2 个可能用到的变量,dev_uuiddev,分别是镜像所在分区的设备文件和设备号。
然后可以写镜像的引导项了,每个镜像的引导方式可能都不相同,详细的说明请留心官方的说明文档,这里是Arch Linux 和Ubuntu 的menuentry:

# ==============================================================================# Arch Linux# ==============================================================================menuentry "Arch Linux (iso)" --class archlinux --class arch --class gnu-linux {  set label=ARCH_201509  set iso=/sysimg/archlinux/archlinux.iso  loopback loop ($dev)$iso  linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=$label img_dev=$dev_uuid img_loop=$iso earlymodules=loop  initrd (loop)/arch/boot/x86_64/archiso.img}# ==============================================================================# Ubuntu LTS# ==============================================================================menuentry 'Ubuntu (iso)' --class ubuntu --class gnu-linux {  set iso=/sysimg/ubuntu/ubuntu.iso  loopback loop ($dev)$iso    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso    initrd (loop)/casper/initrd.lz}

上面的配置也看出来dev_uuiddev变量的不同。值得一提的是Arch Linux 需要额外指定archisolabel内核参数,这个参数可以通过在Arch Linux 的镜像上使用file指令得到,一个类似的输出如下:

/mnt/usb/sysimg/archlinux/archlinux.iso: DOS/MBR boot sector ISO 9660 CD-ROM filesystem data (DOS/MBR boot sector) 'ARCH_201509' (bootable); partition 2 : ID=0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 172, 63488 sectors

如上,archisolabel的值为ARCH_201509
至此配置已经基本结束,你可以为你的USB 多启动盘增加一些额外的功能,例如内存测试工具和关机重启等小指令,可以如下配置:

# ==============================================================================# Memory Tester# ==============================================================================if [ "${grub_platform}" == "pc" ]; then  menuentry "Memory Tester (memtest86+)" --class memtest86 --class gnu-linux --class tool {    set uuid=27b788f8-8556-4478-885e-40d4b6aa7383    search --no-floppy --set=dev --fs-uuid $uuid    search --fs-uuid --no-floppy --set=root --hint-bios=$dev $uuid    linux16 /boot/memtest86+/memtest.bin  }fi# ==============================================================================# Power# ==============================================================================menuentry "Shutdown" --class gnu-linux --class tool {  halt  echo 'System shut down initiated ...'}menuentry "Reboot" --class gnu-linux --class tool {  reboot  echo 'System rebooting initiated ...'}

注意menuentry "Memory Tester (memtest86+)"中我们重新设置了一个局部的uuiddev变量供第二条search指令的使用,因为我把memtest.bin放到了/boot/memtest86+/目录下,与存放镜像的NTFS 分区不是一个分区。

一个效果

当然你也可以找一些满意的GRUB2 主题随你的U 盘随身携带,只需要修改grub.cfgloadfontset theme字段即可。
效果大约像下面这个样子,这图是qemu 从USB 启动的截图而非真机,当然真机一个样。
这里写图片描述
然后你就可以在不影响U 盘正常使用的情况下带着好几个可启动的系统到处跑了。值得一提的是并不需要安装一个便携式系统例如slaxpuppy,如今的LivdCD 已经足够强大,一般来说救急的话,且不说LiveCD,Arch Linux 安装镜像之类的货色都足够了。

0 0
原创粉丝点击