Linux启动过程与(我的)分区方案

本文写得很简单

这里主讲UEFI模式和GPT(分区类型),就不说传统BIOS模式和MBR(主引导记录,也是分区类型)了,毕竟它俩是旧的技术,而我喜欢新的技术

先说启动过程。可能需要先明白一些概念,如果不懂就…查啊

术语

firmware:固件(也就是固化在硬件里的软件

BIOS:Basic Input/Output System,基本输入输出系统

UEFI:Unified Extensible Firmware Interface,统一可扩展固件接口

GUID:globally unique identifier,全局唯一标识符

GPT:GUID Partition Table,GUID分区表

EFI:Extensible Firmware Interface,可扩展固件接口

ESP:EFI system partition,EFI系统分区

Linux启动过程

UEFI用于替代传统BIOS启动模式,因为比传统的模式少了BIOS自检这一步骤,所以能提高机器启动速度

Linux终端下面使用systemd-analyze plot > plot.svg可以生成一张SVG,里面显示了开机时间的详情。可以看见,UEFI的启动过程是这样的:

plot.svg的截图,系统启动时间一目了然

firmware → loader → kernel → systemd

其中,这里的firmware是UEFI,loader是GRUB,kernel是Linux内核,而systemd是在内核准备完毕后启动的第一个进程,它管理着Linux的所有服务(上图中systemd下方),包括CLI和GUI。systemd在被内核启动后启动其他的服务,直至系统准备完毕

注意,kernel和systemd同属于操作系统

如果是传统的BIOS模式,那在BIOS初始化之后,在启动loader之前还要多一步——BIOS自检

分区方案

首先要知道ESP分区(文件系统类型为EFI System)是个什么东西。ESP通俗地讲就是一个系统引导分区,里面包含已安装系统的引导程序或内核,硬件的驱动等

在讲我的分区方案之前,先来看看女儿Manjaro的一般分区方案

Manjaro一般分区方案中的ESP

安装时选择的自动分区就是一般的分区方案(这里请注意!硬盘已存在另一个系统是不要选择自动分区

输入lsblk命令查看,结果如下

1
2
3
4
5
6
7
8
NAME                                          MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda 8:0 0 32G 0 disk
├─sda1 8:1 0 300M 0 part /boot/efi
├─sda2 8:2 0 25.3G 0 part
│ └─luks-4408d84f-c229-46ad-b2dc-10e3fd7cdeb4 254:0 0 25.3G 0 crypt /
└─sda3 8:3 0 6.5G 0 part
└─luks-27ba88d7-4ab9-4899-83a1-e526a59b8156 254:1 0 6.5G 0 crypt [SWAP]
sr0 11:0 1 1024M 0 rom

可以看见,sda1分区就是ESP分区,而sda2是根分区

P.S. ESP分区要作为第一个分区

由此可得,Manjaro把ESP分区挂载到/boot/efi目录了。我们都知道/boot是操作系统的内核目录,ls -al /boot命令查看,结果如下

1
2
3
4
5
6
7
8
9
10
11
total 45812
drwxr-xr-x 5 root root 4096 9月 12 23:24 .
drwxr-xr-x 17 root root 4096 9月 12 23:23 ..
drwxr-xr-x 3 root root 4096 1月 1 1970 efi
drwxr-xr-x 5 root root 4096 9月 12 23:25 grub
-rw-r--r-- 1 root root 29679415 9月 12 23:24 initramfs-4.14-x86_64-fallback.img
-rw-r--r-- 1 root root 10607618 9月 12 23:23 initramfs-4.14-x86_64.img
-rw-r--r-- 1 root root 1747456 8月 8 15:47 intel-ucode.img
-rw-r--r-- 1 root root 22 8月 18 21:17 linux414-x86_64.kver
drwxr-xr-x 2 root root 4096 8月 18 23:04 memtest86+
-rw-r--r-- 1 root root 4843280 8月 18 21:17 vmlinuz-4.14-x86_64

ls -al /boot/efi/EFI/结果如下

1
2
3
4
5
total 16
drwxr-xr-x 4 root root 4096 9月 13 07:25 .
drwxr-xr-x 3 root root 4096 1月 1 1970 ..
drwxr-xr-x 2 root root 4096 9月 13 07:25 boot
drwxr-xr-x 2 root root 4096 9月 13 07:25 Manjaro

常见的分区方案中的ESP

在很多教程中,ESP都被直接挂载到/boot了,内核也放在这里,这样在命令行下安装Linux时比较方便,操作也简单

但是,作为一个有洁癖的人(还是强迫症?),这样不符合我的原则

我的分区方案

起初装Arch的时候,我用引导程序的并不是以GRUB为主,而是rEFInd(虽然现在只用GRUB…),在网上搜教程的时候找到了这个帖子,来看图

ESP结构最紧要整整齐齐

看到没,这才是更完美的分区方案,ESP分区的位置这样最合适不过了

具体结构看终端运行命令的结果。先说明,目前本子里有,256G固态+1T机械双硬盘,Arch Linux+Windows 10双系统,Arch里有默认和LTS双内核,其中ESP分区和双系统在固态硬盘(Arch占空间略多),/home分区(500G)和Windows的D盘和E盘在机械硬盘

P.S. 没有分配swap,因为服务器才需要,而我用作桌面

lsblk命令:

1
2
3
4
5
6
7
8
9
10
11
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 500G 0 part /home
├─sda2 8:2 0 200G 0 part
└─sda3 8:3 0 231.5G 0 part
nvme0n1 259:0 0 238.5G 0 disk
├─nvme0n1p1 259:1 0 512M 0 part /esp
├─nvme0n1p2 259:2 0 137G 0 part /
├─nvme0n1p3 259:3 0 16M 0 part
├─nvme0n1p4 259:4 0 100.1G 0 part
└─nvme0n1p5 259:5 0 912M 0 part

ls -al /boot命令:

1
2
3
4
5
6
7
8
9
10
11
total 85564
drwxr-xr-x 3 root root 4096 Jan 24 17:01 .
drwxr-xr-x 18 root root 4096 Dec 31 23:27 ..
drwxr-xr-x 6 root root 4096 Dec 23 08:53 grub
-rwxr-xr-x 1 root root 29097639 Jan 24 17:05 initramfs-linux-fallback.img
-rwxr-xr-x 1 root root 7757765 Jan 24 17:05 initramfs-linux.img
-rwxr-xr-x 1 root root 29517204 Jan 24 17:05 initramfs-linux-lts-fallback.img
-rwxr-xr-x 1 root root 7810297 Jan 24 17:05 initramfs-linux-lts.img
-rwxr-xr-x 1 root root 1747456 Aug 25 16:35 intel-ucode.img
-rwxr-xr-x 1 root root 5851008 Jan 17 06:38 vmlinuz-linux
-rwxr-xr-x 1 root root 5814144 Jan 17 14:35 vmlinuz-linux-lts

ls -al /esp/EFI/命令:

1
2
3
4
5
6
7
8
total 28
drwxr-xr-x 7 root root 4096 Sep 1 06:44 .
drwxr-xr-x 3 root root 4096 Jan 1 1970 ..
drwxr-xr-x 3 root root 4096 Jan 24 17:01 Arch
drwxr-xr-x 2 root root 4096 Aug 31 20:11 Boot
drwxr-xr-x 2 root root 4096 Sep 1 06:44 GRUB
drwxr-xr-x 5 root root 4096 Sep 1 06:15 HP
drwxr-xr-x 4 root root 4096 Aug 31 19:26 Microsoft

df -h命令:

1
2
3
4
5
6
7
8
9
10
Filesystem      Size  Used Avail Use% Mounted on
dev 3.9G 0 3.9G 0% /dev
run 3.9G 1.4M 3.9G 1% /run
/dev/nvme0n1p2 134G 38G 90G 30% /
tmpfs 3.9G 30M 3.9G 1% /dev/shm
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
tmpfs 3.9G 26M 3.9G 1% /tmp
/dev/nvme0n1p1 511M 140M 372M 28% /esp
/dev/sda1 492G 172G 296G 37% /home
tmpfs 787M 32K 787M 1% /run/user/1000

这种结构在WiKi里也有详细介绍,现在总结一下我的分区方案挂载与安装grub时的操作

挂载:

如果固态硬盘不支持nvme协议,请把nvme0n1p1换成sda1,依次推类

1
2
3
4
5
6
7
8
mount /dev/nvme0n1p2 /mnt
mkdir /mnt/esp
mount /dev/nvme0n1p1 /mnt/esp
mkdir -p /mnt/esp/EFI/Arch
mkdir /mnt/boot
mount -B /mnt/esp/EFI/Arch /mnt/boot
mkdir /mnt/home
mount /dev/sda1 /mnt/home

文字描述就是

  1. 挂载nvme0n1p2根分区到临时根目录/mnt
  2. 在根目录下创建esp目录
  3. nvme0n1p1即ESP分区挂载到esp目录
  4. 递归创建Arch目录(在ESP分区,或esp目录下
  5. 创建boot目录
  6. 挂载子目录Arch到boot目录(所以加了-B选项
  7. 创建home目录
  8. 挂载sda1即home分区到home目录

安装grub:

1
2
grub-install --target=x86_64-efi --efi-directory=/esp --bootloader-id=GRUB
grub-mkconfig -o /boot/grub/grub.cfg

注意上面--efi-directory的参数,和所生成配置文件的目录

至于ESP分区的大小,上面可以看见,我是分了512M的,要知道我可是装了双系统且Linux装了双内核并有两个grub主题,再看看已用的空间占比,仅28%,而已

目录树形结构

最后分别是Arch和Manjaro的相关目录树形结构,空行表示中间删掉了大部分不关紧要的,不删会很长很长

Arch的

tree /esp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/esp
└── EFI
├── Arch
│   ├── grub
│   │   ├── fonts
│   │   │   └── unicode.pf2
│   │   ├── grub.cfg
│   │   ├── grubenv
│   │   ├── locale
│   │   │   ├── ast.mo
│   │   │   ├── ca.mo

│   │   │   ├── vi.mo
│   │   │   ├── zh_CN.mo
│   │   │   └── zh_TW.mo
│   │   ├── themes
│   │   │   ├── arch-leap
│   │   │   │   ├── archlogo.png

│   │   │   │   ├── theme.txt
│   │   │   │   └── TRADEMARKS
│   │   │   └── starfield
│   │   │   ├── blob_w.png

│   │   │   ├── terminal_box_w.png
│   │   │   └── theme.txt
│   │   ├── unicode.pf2
│   │   └── x86_64-efi
│   │   ├── acpi.mod

│   │   └── zfs.mod
│   ├── initramfs-linux-fallback.img
│   ├── initramfs-linux.img
│   ├── initramfs-linux-lts-fallback.img
│   ├── initramfs-linux-lts.img
│   ├── intel-ucode.img
│   ├── vmlinuz-linux
│   └── vmlinuz-linux-lts
├── Boot
│   └── bootx64.efi
├── GRUB
│   └── grubx64.efi
├── HP
│   ├── BIOS
│   │   ├── Current
│   │   │   ├── 0820D.bin
│   │   │   └── 0820D.sig
│   │   ├── New
│   │   │   └── 0820D.s12
│   │   └── Previous
│   ├── BIOSUpdate
│   │   ├── BiosMgmt32.efi

│   │   └── HpBiosUpdate.sig
│   └── DEVFW
│   ├── Current
│   ├── New
│   └── Previous
└── Microsoft
├── Boot
│   ├── BCD

│   │   └── memtest.efi.mui
│   └── zh-TW
│   ├── bootmgfw.efi.mui
│   ├── bootmgr.efi.mui
│   └── memtest.efi.mui
└── Recovery
├── BCD
├── BCD.LOG
├── BCD.LOG1
└── BCD.LOG2

63 directories, 539 files

Manjaro的

tree /boot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/boot/
├── efi
│   └── EFI
│   ├── boot
│   │   └── bootx64.efi
│   └── Manjaro
│   └── grubx64.efi
├── grub
│   ├── fonts
│   │   └── unicode.pf2
│   ├── grub.cfg
│   ├── grubenv
│   ├── themes
│   │   └── starfield
│   │   ├── blob_w.png
│   │   ├── boot_menu_c.png

│   │   ├── terminal_box_w.png
│   │   └── theme.txt
│   └── x86_64-efi
│   ├── acpi.mod

│   └── zfs.mod
├── initramfs-4.14-x86_64-fallback.img
├── initramfs-4.14-x86_64.img
├── intel-ucode.img
├── linux414-x86_64.kver
├── memtest86+
│   └── memtest.bin
└── vmlinuz-4.14-x86_64

10 directories, 313 files

参见

  1. 【图片】KISS: Arch EFISTUB ( 不使用GRUB,直接用主板作为引导器 )【archlinux吧】_百度贴吧
  2. EFI system partition - ArchWiki