一个普通技术宅的点点滴滴

0%

学习总结第三十四天——记一次USB启动盘的制作

由于最近突然有换系统的想法,于是打算直接做一个启动盘以应付将来的各种装机需求,说起来简单做起来难,在几天摸爬滚打后终于完成了,在这里记录一下过程供参考。


初拟需求

当然是越大越全越好啊,手头有一个32G的U盘,理论上应该能够装挺多系统的,会用到的都塞进去最好,下面是可能会用到的系统

  • Win系
    • Windows XP (给各种可能遇到的老的电脑装机)
    • Win 7 x64(给可能遇到兼容性问题的电脑装机)
    • Win 10 x64(新电脑装机)
  • Linux系
    • Arch Linux (即将给我的电脑换上的系统)
    • CentOS (学习服务器运维可能会装到)
    • Ubuntu (Linux新手必备)
    • Kali Linux (安全工具可能用到,最好直接是Live CD)

思路

首先排除目前市面上常见的各种XX装机盘制作工具,这种工具制作出来的质量不说,里面有没有挂恶意程序也是未知的,所以一切最好采用开源工具和官方原版镜像制作。初拟采用grub2装入u盘做引导,然后提供选项进行选择进入。利用grub2的iso载入能力,将不同的镜像放到iso/目录里面。

操作与重改需求

操作过程中,发现grub对于win系没法直接载入iso,因为实质上grub是将kernel内核读入内存以后,再对内核传递参数告诉后面应该从iso去读。但是win毕竟不是linux,目前网上的解决方案里面要么只能支持老版本的winNT,要么需要将整个iso先读入内存,这对小内存机器极不友好。同时,Debian对于读入iso引导的方式支持性也很差。并且Cent OS完整版占用太大,对于兼容性好的FAT32放不下。

解决方案:因为不常用去掉CentOS和Debian系的Kali,win可以采用分区+合盘的方案,将U盘借助工具分区为主分区(FAT32)和win分区(NTFS),将win镜像解压到win分区里,并且将几个win的wim文件参照网上的教程合并为一个esd文件。xp的安装方式也和win7以后不一样,所以排除。
这时还剩下的系统有:

  • Win系
    • Windows XP
    • Win 7 x64
    • Win 10 x64
  • Linux系
    • Arch Linux
    • CentOS
    • Ubuntu
    • Kali Linux

实际制作:
首先将U盘分区,然后将grub安装到u盘上

sudo mkdir /mnt/usb
sudo mount /dev/sdY /mnt/usb #挂载U盘
sudo grub-install --target=i386-pc --boot-directory=/mnt/usb/boot --recheck /dev/sdY #安装BIOS支持
sudo grub-insatall --target=x86_64-efi --efi-directory=/mnt/usb --boot-directory=/mnt/usb/boot #安装UEFI支持

然后是grub.cfg配置文件

#加载模块
insmod cat
insmod gzio
insmod ext2
insmod ntfs
insmod font
insmod fat
insmod part_msdos
insmod loopback
insmod iso9660
if [ ${grub_platform} == 'efi' ]
then
insmod efi_gop
insmod efi_uga
else
insmod vbe
fi
insmod font
insmod search_fs_uuid

set default=0   #默认选项
set timeout=30   #默认等待时间

#加载字体

if loadfont ${prefix}/fonts/unicode.pf2
then
insmod gfxterm
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm
fi

#设置语言
set locale_dir=${prefix}/locale
set lang=zh_CN

#设置背景图片
set root='hd0,1'
insmod jpeg
background_image /boot/grub/images/anime1.jpg
#设置未选中项颜色
set menu_color_normal=white/black
#设置选中项颜色
set menu_color_highlight=cyan/black
# ------------------------------------------------------------------------

#搜索根目录下有iso的磁盘设定为root分区
search --set -f /iso

#set root=(hd0,2)

menuentry "安装WINDOWS" {
search --set -f /bootmgr#搜索根目录下有bootmgr的磁盘设定为root分区
if [ ${grub_platform} == 'efi' ]#efi采用链式引导
then
insmod chain
#echo "it's efi"
chainloader /efi/boot/bootx64.efi
else#传统BIOS采用ntldr引导
insmod ntldr
#echo "it's not efi"
ntldr /bootmgr
fi
}

menuentry "安装Arch linux x86_64 2017.10.01" {
set iso_path=/iso/archlinux-2017.10.01-x86_64.iso
loopback loop ${iso_path}
linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201710 img_dev=/dev/disk/by-label/ISOTOOLS img_loop=$iso_path iso_path=$iso_path earlymodules=loop
initrd (loop)/arch/boot/x86_64/archiso.img
}


menuentry "安装ubuntu-16.04.2-desktop-amd64" {
set iso_path=/iso/ubuntu-16.04.2-desktop-amd64.iso
loopback loop ${iso_path}
linux (loop)/casper/vmlinuz.efi boot=casper initrd=/casper/initrd.lz iso-scan/filename=${iso_path} quiet noeject noprompt splash --
initrd (loop)/casper/initrd.lz
}

menuentry "重启"{
echo "Rebooting...."
reboot
}

menuentry "关机"{
  echo "Shuting down...."
  halt
}

再将相关的iso放在主分区的/iso文件夹中,并将windows合盘后的镜像写入次分区。
制作大成功!