主板启动方式
Legacy启动
- 1 BIOS 会从硬盘的 MBR 中加载引导程序(硬盘使用MBR分区表或者混合分区表(Hybrid MBR))
- 2 BIOS 会从bios_grub标志的未格式化分区中加载引导程序(硬盘使用GPT分区格式,并不是所有主板都支持)
UEFI启动
-
1 UEFI 主板会检查 NVRAM 中存储的启动项,如果找到了合适的启动项,UEFI 主板会根据该项来启动系统 (硬盘使用GPT分区表或者混合分区表(Hybrid MBR))
NVRAM中每个启动项都配置了磁盘+分区UUID+文件路径,可以使用efibootmgr来查看和编辑这些启动项,也可以进BIOS配置-
1.1 查看启动项
sudo efibootmgr -v BootCurrent: 0000 Timeout: 1 seconds BootOrder: 0000,0005 #启动项顺序 Boot0000* ubuntu HD(1,GPT,77f07c2f-fa06-4fd3-8372-747a0302b548,0x800,0x219800)/File(\EFI\UBUNTU\SHIMX64.EFI) Boot0005 ubuntu HD(1,GPT,df830439-859e-4de9-a03a-516ae5ee54cf,0x800,0x100000)/File(\EFI\UBUNTU\SHIMX64.EFI)
-
1.2 添加启动项
sudo efibootmgr -c -w -L "启动项名字" -d /dev/nvmeXn1 -p 1 -l \EFI\Boot\bootx64.efi # -d 磁盘 -p 分区编号 -l efi文件路径
-
1.3 删除启动项
sudo efibootmgr -b 000x -B # -b 启动项编号
-
1.4 重新排序启动项
sudo efibootmgr -o 0005,0000
-
-
- 如果在 NVRAM 中没有找到可用的启动项,UEFI 主板会扫描 EFI 系统分区(ESP)来寻找可启动的 EFI 文件(在/EFI/BOOT目录下),并根据这些文件来生成启动菜单 (硬盘使用GPT分区表或者混合分区表(Hybrid MBR))
硬盘分区表格式
- GPT分区表
- 1.1 使用了 GUID(Globally Unique Identifier)来标识分区,每个分区都有一个唯一的 UUID
- 1.2 支持最多 128 个分区条目(GPT64,64位扩展)或者 32 个分区条目(GPT32,32位限制)
- MBR分区表
- 2.1 使用传统的扇区地址来标识分区
- 2.2 最多支持 4 个主分区,或者 3 个主分区和一个扩展分区。每个主分区的大小受到 MBR 分区表的限制,最大为 2TB
- 2.3 存在引导扇区(MBR)存放引导程序,系统启动的时候加载
- 混合分区表(Hybrid MBR)
- 3.1 MBR 分区表中的一个或多个分区会被映射到 GPT 分区表中的相应分区上
- 共同点
- 4.1 分区可以指定文件系统类型格式化,也可以不格式化,ext2,ext3,ext4是linux特有的,ntfs是windows特有的,fat和fat32是linux和windows都有的
- 4.2 分区可以指定标记,举几个例子
- 4.2.1 boot标记的ESP分区是一个特殊的分区,用于存放 UEFI 引导加载程序和相关文件,一般使用fat或fat32格式化
- 4.2.2 bios_grub标记的分区用于存放Legacy启动方式启动GPT分区硬盘的引导文件,必须是未格式化分区
- 4.3 分区可以设置分区名
- 4.4 分区有起始位置和结束位置
GRUB2引导
UEFI启动+GPT分区
- 磁盘分区
-
2.1 创建GPT分区表
sudo parted /dev/nvmeXn1 mklabel gpt
-
2.1 创建磁盘分区
sudo parted /dev/nvmeXn1 mkpart boot fat32 2M 512M #创建esp分区,并格式化为fat32文件格式,生成为/dev/nvmeXn1pY1 sudo parted /dev/nvmeXn1 mkpart swap linux-swap 512M 32.5G # 创建swap分区,生成为/dev/nvmeXn1pY2 sudo swapon /dev/nvmeXn1pY2 #激活swap分区 sudo parted /dev/nvmeXn1 mkpart root ext4 32.5G 350G #创建根目录root分区,生成为/dev/nvmeXn1pY3
-
2.2 挂载分区到指定目录
sudo mount /dev/nvmeXn1pY1 /mnt #挂载分区到/mnt目录下 sudo umount /dev/sda1 #这是一个移动硬盘,只是测试用的,没什么用 sudo mkdir /mnt/disk1 sudo mount /dev/sda1 /mnt/disk1
-
2.3. 开机自动挂载
-
2.3.1 工具生成自动挂载目录
sudo apt install arch-install-scripts #这个工具是arch系统下的,生成的fstab文件可能不能在ubuntu下使用,还是用手动配置吧 genfstab -U /mnt >> /mnt/etc/fstab #生成到/etc/fstab文件中,/mnt或/mnt的子目录如果有挂载分区,都会生成到fstab中
# /etc/fstab文件内容: # /dev/nvme0nXpY1 UUID=DA18-EBFA / vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 1 # /dev/sda1 UUID=89C9-1255 /disk1 exfat rw,relatime,fmask=0022,dmask=0022,iocharset=utf8,errors=remount-ro 0 2 /swap.img none swap defaults 0 0
-
2.3.2 手动配置分区挂载目录,在/etc/fstab添加
/dev/disk/by-uuid/分区uuid 挂载目录 分区文件系统类型 defaults 0 1 ##分区的uuid可以使用sudo blkid -o list或者sudo lsblk -f查看
-
-
2.4 安装GRUB引导
-
2.4.1 在另一块硬盘建立grub,参数为–efi-diretory --boot-directory
sudo mkdir /mnt/boot2 \ sudo grub-install --target=x86_64-efi --efi-directory=/mnt --boot-directory=/mnt/boot2 --bootloader-id=efi2 生成的目录结构: /mnt /boot2 /grub /x86_64-efi : #boot-directory/grub/target模块目录,存放系统启动所需的模块 /EFI /efi2 #efi-directory/EFI/bootloader-id目录 xx.efi :efi文件 grub.cfg:GRUB启动项配置文件 grub.cfg内容: search.fs_uuid DA18-EBFA root #boot-directory所在分区 set prefix=($root)'/boot2/grub' #boot-directory/grub目录 configfile $prefix/grub.cfg #需要手动生成的grub.cfg,文件目录为boot-directory/grub sudo efibootmgr -v #查看nvram启动项,发现多了一条启动项 Boot0006* efi2 HD(1,GPT,df830439-859e-4de9-a03a-516ae5ee54cf,0x800,0x100000)/File(\EFI\efi2\shimx64.efi)
-
2.4.2 在另一块硬盘建立grub,参数为–efi-diretory --boot-directory,使用–removable
sudo mkdir /mnt/boot4 \ sudo grub-install --target=x86_64-efi --efi-directory=/mnt --boot-directory=/mnt/boot4 --bootloader-id=efi4 --removable 生成的目录结构: /mnt /boot4 /grub /x86_64-efi : #boot-directory/grub/target模块目录,存放系统启动所需的模块 /EFI /BOOT xx.efi :efi文件 grub.cfg:GRUB启动项配置文件 grub.cfg内容: search.fs_uuid DA18-EBFA root #boot-directory所在分区 set prefix=($root)'/boot4/grub' #boot-directory/grub目录 configfile $prefix/grub.cfg #需要手动生成的grub.cfg,文件目录为boot-directory/grub sudo efibootmgr -v #查看nvram启动项,发现没有efi4的启动项
-
2.4.3 总结
boot-directory/grub目录下放引导文件: 引导文件包括: 1.x86_64-efi目录下的模块文件 2.grub.cfg文件(这个文件会被efi-directory/bootloader-id目录下的grub.cfg引用) 使用--removable: 1.会在efi-directory/BOOT目录下生成efi文件和grub.cfg文件,bootloader-id失效 2.执行两次grub-install --removable前一次的grub.cfg会被后一次替换掉 3.会在boot-directory/grub目录下生成引导文件 4.引导过程 4.1 执行efi-directory/BOOT目录下的efi文件 4.2 配置模块加载目录为boot-directory/grub/x86_64-efi 4.3 显示efi-directory/BOOT/grub.cfg配置的启动项菜单 不使用--removable: 1.会在efi-directory/bootloader-id目录下生成efi文件和grub.cfg文件 2.会在boot-directory/grub目录下生成引导文件 3.生成一条名称为bootloader-id,文件路径为efi路径的nvram启动项 4.引导过程 4.1 执行efi-directory/bootloader-id目录下的efi文件 4.2 配置模块加载目录为boot-directory/grub/x86_64-efi 4.3 显示efi-directory/boot-directory/grub.cfg配置的启动项菜单 默认值: boot-directory=/boot,bootloader-id=ubuntu
-
-
2.5 配置grub.cfg
efi目录中的grub.cfg引用的grub.cfg还不存在,需要手动生成-
2.5.1. 配置os-prober
sudo apt install os-prober #安装os-prober,用于查找系统并生成启动项 修改配置文件/etc/default/grub GRUB_DISABLE_OS_PROBER=false #false表示启用os-prober true表示禁用os-prober
-
2.5.2 自动生成grub.cfg
sudo grub-mkconfig -o /boot-directory/grub/grub.cfg
-
2.5.3 手动添加启动项
生成的grub.cfg中有一行是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
所以我们只需要在grub.cfg同目录下面创建一个custom.cfg,在里面手动配置启动项就能被加载到
-
2.5.3.1. 配置Linux启动项
if [ "${grub_platform}" == "efi" ]; then menuentry "Ubuntu" { recordfail load_video gfxmode $linux_gfx_mode insmod gzio if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi insmod part_gpt insmod ext2 search --no-floppy --fs-uuid --set=root 分区uuid linux /boot/vmlinuz-6.5.0-28-generic root=UUID=分区uuid ro initrd /boot/initrd.img-6.5.0-28-generic } fi
-
2.5.3.2 配置ubunutu的LiveCD启动项
if [ "${grub_platform}" == "efi" ]; then menuentry "Ubuntu-LiveCD" { search --no-floppy --fs-uuid --set=root 分区uuid set iso_path="/ubuntu-23.10.1-desktop-amd64.iso" loopback loop $iso_path linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$iso_path initrd (loop)/casper/initrd boot } fi
-
2.5.3.3. 配置windows11启动项
if [ "${grub_platform}" == "efi" ]; then menuentry "Windows 11" { insmod part_gpt insmod part_msdos insmod fat insmod chain search --no-floppy --fs-uuid --set=root 分区uuid chainloader /EFI/Microsoft/Boot/bootmgfw.efi } fi
-
2.5.3.4. 配置WinPE启动项
if [ "${grub_platform}" == "efi" ]; then menuentry "Windows PE" { insmod part_gpt insmod part_msdos insmod fat insmod chain search --no-floppy --fs-uuid --set=root 分区uuid chainloader /EFI/boot/peboot.efi } fi
-
2.5.3.5. 配置ArchLinux的LiveCD启动项
if [ "${grub_platform}" == "efi" ]; then menuentry "Arch-LiveCD" { search --no-floppy --fs-uuid --set=root 分区uuid loopback loop /archlinux-2021.11.01-x86_64.iso linux (loop)/arch/boot/x86_64/vmlinuz-linux archisolabel=ARCH_202111 boot=arch iso-scan/filename=/archlinux-2021.11.01-x86_64.iso noprompt noeject initrd (loop)/arch/boot/x86_64/initramfs-linux.img } fi
-
2.5.3.6. 配置其他的grub.cfg
if [ "${grub_platform}" == "efi" ]; then menuentry "Windows PE UEFI" { insmod fat search --no-floppy --fs-uuid --set=root 分区uuid configfile /grub/grub.cfg } fi
-
-
-
2.6 进入rescue急救模式
由于启动项被破坏,导致系统无法启动,可以通过命令手动加载启动项
按c进入急救模式-
2.6.1.查看磁盘和分区
ls #查看所有磁盘和磁盘下的分区 (hd0) (hd0,msdos9) (hd0,msdos8) (hd0,msdos7) (hd0,msdos6) (hd0,msdos5) (hd0,msdos2) (hd0,msdos1)
-
2.6.2.查看目录和文件
ls (hd0,msdos9)/xx #查看分区目录下 cat (hd0,msdos9)/etc/fstab #查看文件内容
-
2.6.3.设置root分区和模块搜索路径
set root=(hd0,msdos9) #设置root分区,之后访问root分区的文件或目录都不需要加(hd0,msdos9)了 ls /xx #查看root分区目录 cat /etc/fstab # 查看文件内容 set prefix=(hd0,msdos9)/boot/grub #设置模块搜索目录,之后既可以使用insmod加载指定的模块了 lsmod fat #加载fat模块
-
2.6.4.系统引导
手动执行grub.cfg文件menuentry中配置的命令就行了
-
-
2.7 grub2主题优化
为了达到炫酷的效果,可以安装一些grub2的主题-
2.7.1 安装主题
git clone https://github.com/vinceliuice/grub2-themes.git \ sudo install.sh -b -t vimix \ #安装fonts,locale,themes目录到/boot/grub目录下 sudo cp -r /boot/grub/themes /boot-directory/grub #复制主题到另一个磁盘的boot目录
-
2.7.2 重新生成grub.cfg
sudo grub-mkconfig -o /boot-directory/grub/grub.cfg #重新生成grub.cfg,这时grub.cfg的界面就包含主题了 #但是grub.cfg文件中引入的主题文件都是来自另一个磁盘的,我们需要手动修改grub.cfg中对这些主题文件的引用,都改成当前磁盘中的文件,这样就不依赖于另一个磁盘,即使另一个磁盘不在,也能正常展示主题了
-
LEGACY启动+MBR分区硬盘
-
创建MBR分区表
sudo parted /dev/nvmeXn1 mklabel msdos
-
安装引导代码到引导扇区(MBR)
sudo grub-install /dev/nvmeXn1 # nvmeXn1是磁盘,安装引导代码到磁盘的引导扇区(MBR)
LEGACY启动+GPT分区硬盘
首先主板必须支持从bios_grub分区启动,或者把分区方式改成Hybrid MBR,否则无法引导
-
创建GPT分区表
sudo parted /dev/nvmeXn1 mklabel gpt
-
系统分区
sudo fdisk /dev/nvmeXn1 #创建一个bios_grub分区 n 2048 4095 sudo parted /dev/nvmeXn1pY set 1 bios_grub on #设置分区标志为bios_grub,这个分区不能格式化
-
安装引导文件到bios_grub分区
sudo mount /dev/nvmeXn1pY /mnt sudo grub-install --target=i386-pc /dev/nvmeXn1 --boot-directory=/mnt #安装引导文件到bios_grub分区
UEFI启动+ MBR分区硬盘
首先UEFI 固件必须支持 Legacy BIOS 兼容性模式(CSM),或者把分区改成Hybrid MBR,否则无法引导
其他和LEGACY启动+MBR分区硬盘几乎是一样的