22 定制自己的 Linux 系统
22.1 基本介绍
通过裁剪现有 Linux 系统(CentOS7.6),创建属于自己的 min Linux 小系统,可以加深我们对 linux 的理解。老韩利用 centos7.6,搭建一个小小 linux 系统, 很有趣。
22.2 基本原理
启动流程介绍:
制作 Linux 小系统之前,再了解一下 Linux 的启动流程:
- 首先 Linux 要通过自检,检查硬件设备有没有故障
- 如果有多块启动盘的话,需要在 BIOS 中选择启动磁盘
- 启动 MBR 中的 bootloader 引导程序
- 加载内核文件
- 执行所有进程的父进程、老祖宗 systemd
- 欢迎界面
在 Linux 的启动流程中,加载内核文件时关键文件:
1)kernel 文件: vmlinuz-3.10.0-957.el7.x86_64
2)initrd 文件: initramfs-3.10.0-957.el7.x86_64.img
22.3 制作 min linux 思路分析
在现有的 Linux 系统(centos7.6)上加一块硬盘/dev/sdb,在硬盘上分两个分区,一个是/boot,一个是/,并将其格式化。需要明确的是,现在加的这个硬盘在现有的 Linux 系统中是/dev/sdb,但是,当我们把东西全部设置好时,要把这个硬盘拔除,放在新系统上,此时,就是/dev/sda
在/dev/sdb 硬盘上,将其打造成独立的 Linux 系统,里面的所有文件是需要拷贝进去的
作为能独立运行的 Linux 系统,内核是一定不能少,要把内核文件和 initramfs 文件也一起拷到/dev/sdb 上
以上步骤完成,我们的自制 Linux 就完成, 创建一个新的 linux 虚拟机,将其硬盘指向我们创建的硬盘,启动即可
示意图
22.4 操作步骤
操作步骤
- 首先,我们在现有的linux添加一块大小为20G的硬盘
点击完成,就OK了, 可以使用 lsblk 查看,需要重启
- 添加完成后,点击确定,然后启动现有的linux(centos7.6)。 通过fdisk来给我们的/dev/sdb进行分区
1 [root@localhost ~]# fdisk /dev/sdb
2 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
3 Building a new DOS disklabel with disk identifier 0x4fde4cd0.
4 Changes will remain in memory only, until you decide to write them.
5 After that, of course, the previous content won't be recoverable.
6
7
8 Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
9
10
11 WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
12 switch off the mode (command 'c') and change display units to
13 sectors (command 'u').
14 15 16 Command (m for help): n
17 Command action
18 e extended
19 p primary partition (1-4)
20 p
21 Partition number (1-4): 1
22 First cylinder (1-2610, default 1):
23 Using default value 1
24 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): ***\*+\*******\*5\*******\*00M\****
25
26
27 Command (m for help): n
28 Command action29 e extended
30 p primary partition (1-4)
31 p
32 Partition number (1-4): 2
33 First cylinder (15-2610, default 15):
34 Using default value 15
35 Last cylinder, +cylinders or +size{K,M,G} (15-2610, default 2610):
36 Using default value 261037 #查看分区38 Command (m for help): p
39
40
41 Disk /dev/sdb: 21.5 GB, 21474836480 bytes
42 255 heads, 63 sectors/track, 2610 cylinders
43 Units = cylinders of 16065 * 512 = 8225280 bytes
44 Sector size (logical/physical): 512 bytes / 512 bytes
45 I/O size (minimum/optimal): 512 bytes / 512 bytes
46 Disk identifier: 0x4fde4cd0
47
48
49 Device Boot Start End Blocks Id System
50 /dev/sdb1 1 14 112423+ 83 Linux
51 /dev/sdb2 15 2610 20852370 83 Linux
52 #保存并退出
53 Command (m for help): w
54 The partition table has been altered!
- 接下来,我们对/dev/sdb的分区进行格式化
[root@localhost ~]# mkfs.ext4 /dev/sdb1
[root@localhost ~]# mkfs.ext4 /dev/sdb2
- 创建目录,并挂载新的磁盘
#mkdir -p /mnt/boot /mnt/sysroot
#mount /dev/sdb1 /mnt/boot
#mount /dev/sdb2 /mnt/sysroot/
- 安装grub, 内核文件拷贝至目标磁盘
#grub2-install --root-directory=/mnt /dev/sdb
#我们可以来看一下二进制确认我们是否安装成功
#hexdump -C -n 512 /dev/sdb
#cp -rf /boot/* /mnt/boot/
- 修改 grub2/grub.cfg 文件, 标红的部分 是需要使用 指令来查看的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSRjCOhS-1659016464934)(…/…/…/Pictures/Linux/wps8.jpg)] 在grub.cfg文件中 , 红色部分用 上面 sdb1 的 UUID替换,蓝色部分用 sdb2的UUID来替换, 紫色部分是添加的,表示selinux给关掉,同时设定一下init,告诉内核不要再去找这个程序了,不然开机的时候会出现错误的
- 创建目标主机根文件系统
#mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
- 拷贝需要的bash(也可以拷贝你需要的指令)和库文件给新的系统使用
#cp /lib64/. /mnt/sysroot/lib64/
#cp /bin/bash /mnt/sysroot/bin/
- 现在我们就可以创建一个新的虚拟机,然后将默认分配的硬盘 移除掉,指向我们刚刚创建的磁盘即可.
这时,很多指令都不能使用,比如 ls , reboot 等,可以将需要的指令拷贝到对应的目录即可
如果要拷贝指令,*重新进入到原来的 linux系统拷贝相应的指令即可*,比较将 /bin/ls 拷贝到 /mnt/sysroot/bin 将/sbin/reboot 拷贝到 /mnt/sysroot/sbin
root@hspedu100 ~]# mount /dev/sdb2 /mnt/sysroot/
[root@hspedu100 ~]# cp /bin/ls /mnt/sysroot/bin/
[root@hspedu100 ~]# cp /bin/systemctl /mnt/sysroot/bin/
[root@hspedu100 ~]# cp /sbin/reboot /mnt/sysroot/sbin/
- 再重新启动新的min linux系统,就可以使用 ls , reboot 指令了
23 Linux 内核源码介绍&内核升级
23.1 为什么要阅读linux 内核?
爱好,就是喜欢 linux(黑客精神)
想深入理解 linux 底层运行机制,对操作系统有深入理解
阅读 Linux 内核,你会对整个计算机体系有一个更深刻的认识。作为开发者,不管你从事的是驱动开发,应用开发还是后台开发,你都需要了解操作系统内核的运行机制,这样才能写出更好的代码。
作为开发人员不应该只局限在自己的领域,你设计的模块看起来小,但是你不了解进程的调用机制,你不知道进程为什么会阻塞、就绪、执行几个状态。那么很难写出优质的代码。
找工作面试的需要
作为有追求的程序员,还是应该深入的了解一个操作系统的底层机制,(比如 linux/unix) 最好是源码级别的,这样你写多线程高并发程序,包括架构,优化,算法等,高度不一样的,当然老韩也不是要求小伙伴儿把一个非常庞大的 Linux 内核每一行都读懂。我觉得。你至少能看几个核心的模块。
23.2 linux0.01 内核源码
23.2.1 基本介绍
Linux 的内核源代码可以从网上下载, 解压缩后文件一般也都位于 linux 目录下。内核源代码有很多版本,可以从
linux0.01 内核入手,总共的代码 1w 行左右, 最新版本 5.9.8 总共代码超过 700w 行,非常庞大.
内核地址:https://www.kernel.org/
很多人害怕读 Linux 内核,Linux 内核这样大而复杂的系统代码,阅读起来确实有很多困难,但是也不象想象的那么高不可攀。老韩建议可以从 linux0.01 入手。
23.2.2 linux0.01 内核源码目录&阅读
阅读内核源码技巧
linux0.01 的阅读需要懂 c 语言
阅读源码前,应知道 Linux 内核源码的整体分布情况。现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux 内核源码的各个目录大致与此相对应.
在阅读方法或顺序上,有纵向与横向之分。所谓纵向就是顺着程序的执行顺序逐步进行;所谓横向,就是按模块进行。它们经常结合在一起进行。
对于 Linux 启动的代码可顺着 Linux 的启动顺序一步步来阅读;对于像内存管理部分,可以单独拿出来进行阅读分析。实际上这是一个反复的过程,不可能读一遍就理解
linux 内核源码阅读&目录介绍&main.c 说明
23.3 linux 内核最新版和内核升级
23.3.1 内核地址:https?/www.kernel.org/ 查看
23.3.2 下载&解压最新版
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.8.16.tar.gz tar -zxvf linux-5.8.16.tar.gz
23.3.3 linux 内核升级应用实例
将 Centos 系统从 7.6 内核升级到 7.8 版本内核(兼容性问题)
23.3.4 具体步骤
uname -a // 查看当前的内核版本
yum info kernel -q //检测内核版本,显示可以升级的内核yum update kernel //升级内核
yum list kernel -q //查看已经安装的内核