晚上无聊的时间做的,下班回来太累不想写代码,又没事可做,就把自己U 盘搞了一下做成了一个多启动盘。用起来算是蛮方便的吧,除去系统所占用的空间,其他的可以随便放文件啦什么的,省得dd 镜像到U 盘,dd 的镜像不一定能用不说,还带来诸多不便。
分区方案
分区方案大约是下面的样子:
根据个人爱好我是分了一个较小的ext4 分区和一个较大的NTFS 分区,前者用来储存/boot 目录,还有一些Linux 下需要保存权限的文件,NTFS 分区存放系统光盘镜像,和一些大块头的文件例如归档和视频。
安装GRUB2
这里使用GRUB2 作为Loader,首先分好区,其中必须要有一个可以保存文件权限的分区(建议ext4)。注意这里使用的是MBR 磁盘格式,如果你的U 盘是GPT 格式,可以直接使用root 权限将/dev/zero
dd到你的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.cfg
elif [ -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_uuid
set uuid=3565C50A2324BC8C
set dev_uuid=/dev/disk/by-uuid/$uuid
search --no-floppy --set=dev --fs-uuid $uuid
现在我们有了2 个可能用到的变量,dev_uuid
和dev
,分别是镜像所在分区的设备文件和设备号。
然后可以写镜像的引导项了,每个镜像的引导方式可能都不相同,详细的说明请留心官方的说明文档,这里是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_uuid
和dev
变量的不同。值得一提的是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+)"
中我们重新设置了一个局部的uuid
和dev
变量供第二条search
指令的使用,因为我把memtest.bin
放到了/boot/memtest86+/
目录下,与存放镜像的NTFS 分区不是一个分区。
一个效果
当然你也可以找一些满意的GRUB2 主题随你的U 盘随身携带,只需要修改grub.cfg
的loadfont
和set theme
字段即可。
效果大约像下面这个样子,这图是qemu 从USB 启动的截图而非真机,当然真机一个样。
然后你就可以在不影响U 盘正常使用的情况下带着好几个可启动的系统到处跑了。值得一提的是并不需要安装一个便携式系统例如slax
和puppy
,如今的LivdCD 已经足够强大,一般来说救急的话,且不说LiveCD,Arch Linux 安装镜像之类的货色都足够了。