自制linux系统

简介:

本实验以centos6为例


系统启动流程说明

-->加载BIOS,通过BIOS程序加载CMOS的信息,并通过CMOS获得硬件信息

-->开机自检POST

-->读取MBR的信息

-->grub引导系统启动

-->开启系统第一个进程init

-->用户登陆

有几点我们需要理解:

1、MBR是磁盘的第一个扇区,512字节,其中前446字节是boot loader引导加载程序,后64字节是分区表,最后2字节是MBR的结束位55aa

系统要启动,就要加载内核、各种驱动,那linux的内核存放在/boot下,驱动文件存放在/lib/modules下,所以启动流程第一步得先进入/boot加载内核文件,

而/boot是一个单独的分区并使用ext4文件系统。也就是说要进入/boot加载内核得先有文件系统驱动,而要安装文件系统驱动得先加载内核。如此进入一个死循环。

但是我们知道,实际情况是linux可以正常启动的,这是什么原因呢?

因为有MBR,MBR中前446字节的boot loader起引导作用,我们称为grub stage1,接着进入stage1.5阶段,此阶段加载的信息在MBR512字节之后的27个扇区。

stage1.5结束后进入stage2阶段,stage2阶段会执行配置文件grub.conf,这份文件内容如下:

1
2
3
4
5
6
7
8
9
10
default=0   // 默认加载的内核、initrd文件,0表示第一个title
timeout=5   // 开机过程中出现的菜单选项超时时间
splashimage=(hd0,0) /grub/splash .xpm.gz   // 启动菜单选项的背景图片
hiddenmenu   // 隐藏菜单的后台执行过程
title CentOS 6 (2.6.32-696.el6.x86_64)   // 名字而已
         root (hd0,0)   // 以第1块磁盘的第1个分区为根,说白了就是 /boot 为根,此处的根为系统启动使用,与启动后的根/两码事
         kernel  /vmlinuz-2 .6.32-696.el6.x86_64 ro root=UUID=f1d8d9f5-4d1a-42e8-8a7f-600f668ce44f rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
         //kernel  以只读方式加载内核,此处的UUID是启动结束后的根/的UUID
         initrd  /initramfs-2 .6.32-696.el6.x86_64.img
         //initrd  其中含有文件系统驱动,这样就可以加载内核文件了

2、启动系统第一个进程/sbin/init,其作用就是部署好软件环境,即主机名称、网络配置、文件系统格式等

而实现这些功能,主要是由/etc/inittab和/etc/init.d/*.conf这些文件完成的(centos6版本)。centos5版本的这些功能全在/etcinittab这一个文件上。

其大致含义如下:

-->默认的runlevel,用户登陆系统默认的级别

  • 0:关机

  • 1:单用户模式

  • 2:多用户模式,有些网络功能不支持

  • 3:完全多用户模式,字符界面

  • 4:预留

  • 5:图形界面(默认runlevel)

  • 6:重启

-->执行系统软件运行环境的脚本/etc/rc.d/rc.sysinit

其作用就是准备好系统的运行环境,如挂载文件系统、swap、时钟、加载外设驱动、激活sysctl.conf文件设置内核参数

-->7个不同runlevel,启动可非启动服务脚本的路径

-->断电和恢复供电的处理

-->终端tty的设置

-->界面运行设置

这些步骤完成了,用户就可以登陆使用系统了;


我们做个实验,加深下理解

自制linux系统

准备:一块新的磁盘、一台装好系统的机器和一台没有系统的机器。可以在虚拟机上完成本实验

步骤1、在本机对新磁盘建分区、文件系统

创建2个必要的分区 /dev/sdb1对应boot,/dev/sdb2对应/

1
fdisk  /dev/sdb

创建文件系统,以ext4为例

1
2
mkfs.ext4  /dev/sdb1
mkfs.ext4  /dev/sdb2

blkid 命令可以检查文件系统信息

步骤2、挂载boot

1
2
3
mkdir  /mnt/boot
挂载目录必须为boot,因为grub的stage2会专门找到boot目录
mount  /dev/sdb1  /mnt/boot/

步骤3、安装grub

1
2
grub- install   --root-directory= /mnt  /dev/sdb
stage1安装在 /dev/sdb 磁盘上,stage2安装在 /mnt/boot 目录下

此时/mnt/boot里面会有用于grub的stage2阶段的目录

步骤4、复制内核、initramfs

1
2
cp  /boot/vmlinuz-2 .6.32-696.el6.x86_64   /mnt/boot/
cp  /boot/initramfs-2 .6.32-696.el6.x86_64.img   /mnt/boot/

步骤5、编辑grub.conf

wKiom1mrt1igRzJCAADB7jU3gOY086.png

图中的内容上文基本都介绍过,本实验中root=/dev/sda2,因为这块磁盘是要作为另一台机器的启动磁盘自然是sdba2了

selinux=0,因为selinux可能会影响本实验效果,所以开始就将其关闭

init=/bin/bash,我们使用bash作为第一个启动进程

步骤6、挂载根/,并初始化

创建目录并挂载根

1
2
3
mkdir /mnt/root
mount /dev/sdb2 /mnt/root/
mkdir /mnt/root/{etc,lib,sbin,tmp, var ,sys,proc,dev,}   //创建root下对应的目录

运行下述脚本,其作用是复制命令文件与库文件到根目录下(/mnt/root),前提是需要我们输入常用的命令

我们输入的命令就是自制的linux系统支持的命令

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
#! /bin/bash
title () {
         export CMD
         read -t  30  -p  "input an exec cmd or press 'quit': "  CMD
         if  "$CMD"  "quit"  ];then
                 exit
         else
                 is_exec
         fi
         title
}
#判断输入的是可执行文件
is_exec () {
         if  `which $CMD &> /dev/ null ` ;then
                 copy_cmdfile
                 copy_libfile
                 echo  "--->done"
         else
                 echo  "not a command"
                 exit
         fi
}
#拷贝命令文件
copy_cmdfile () {
         EXEC_CMD=`which $CMD`
         if  [ ! -e /mnt/root$EXEC_CMD ];then
                 cp  --parents $EXEC_CMD /mnt/root
         fi
unset EXEC_CMD
}
#拷贝命令文件对应的库文件
copy_libfile () {
         ldd `which $CMD` | grep -o   "/.*[0-9] "  while  read line ; do
                 if  [ ! -e /mnt/root$line  ];then
                         cp  --parents $line  /mnt/root/
                 fi
         done
unset line
}
 
title

至此实验结束,然后关机,取出磁盘,装到另一台没有系统的主机上,启动即可

启动后的界面如下:

wKioL1mrvSPR2pX8AABQCDCv_zk773.png



本文转自  a_pan  51CTO博客,原文链接:http://blog.51cto.com/panpangao/1962313



相关文章
|
4天前
|
Ubuntu 安全 Linux
《Linux 简易速速上手小册》第1章: Linux 系统基础(2024 最新版)
《Linux 简易速速上手小册》第1章: Linux 系统基础(2024 最新版)
36 1
|
11天前
|
资源调度 JavaScript 搜索推荐
Linux系统之部署envlinks极简个人导航页
【4月更文挑战第11天】Linux系统之部署envlinks极简个人导航页
52 2
|
13天前
|
缓存 Linux 测试技术
安装【银河麒麟V10】linux系统--并挂载镜像
安装【银河麒麟V10】linux系统--并挂载镜像
69 0
|
13天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
28 0
|
20天前
|
存储 前端开发 Linux
Linux系统之部署ToDoList任务管理工具
【4月更文挑战第1天】Linux系统之部署ToDoList任务管理工具
63 1
|
22天前
|
存储 传感器 运维
linux系统资源统计工具
【4月更文挑战第1天】Linux系统监控工具如dstat、htop、glances、vmstat、top、iostat、mpstat、sar和atop,用于跟踪CPU、内存、磁盘I/O、网络和进程性能。这些工具提供实时、交互式和历史数据分析,助力管理员优化系统性能和故障排查。例如,dstat是vmstat等工具的增强版,htop提供彩色界面的进程管理,而atop则结合了多种功能并记录历史数据。
28 5
linux系统资源统计工具
|
11天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
31 6
|
21天前
|
Ubuntu 架构师 Java
Linux系统常用命令非常详细建议收藏
Linux系统常用命令非常详细建议收藏
49 0
|
2天前
|
Linux Perl
Linux系统替换字符串常用命令
请注意,`sed`命令可以非常强大,可以根据不同的需求使用不同的选项和正则表达式来进行更复杂的字符串替换操作。
16 0
|
7天前
|
运维 网络协议 Unix
18.系统知识-Linux常用命令
18.系统知识-Linux常用命令