自制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,这份文件内容如下:

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的设置

-->界面运行设置

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

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

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

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

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

fdisk /dev/sdb

创建文件系统,以ext4为例

mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2

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

步骤2、挂载boot

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

步骤3、安装grub

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

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

步骤4、复制内核、initramfs

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

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

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

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

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

创建目录并挂载根

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

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

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

#! /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

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

启动后的界面如下:

时间: 2024-12-10 03:32:30

自制linux系统的相关文章

关于 开机启动加密破坏修复 自制linux系统

开机破坏并且修复之      自制linux系统            CentOS 6启动流程:POST --> Boot Sequence(BIOS) --> Boot Loader -->Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别--> 系统初始化脚本rc.sysinit --&g

手把手带你自制Linux系统之二 简易Linux制作

手把手带你自制Linux系统之二 简易Linux制作 本文利用CentOS5.5自带内核制作一个Mini Linux. 打开准备工作中创建的CentOS,为另一个虚拟机MiniLinux添加一个最小Linux所需要的文件. 1. 创建分区 为准备好的磁盘创建两个主分区,大小分别为20M和512M. 使用fdisk命令创建分区详细过程: fdisk /dev/hda 创建第一个20M分区依次输入: n --> p --> 1 --> <Enter> --> +20M 这几

自制linux系统——打造属于自己的linux系统

很多时候我们直接使用别人帮我们打包好的一个linux系统,总感觉某些工具或者命令多余或者效果不好,那我们是否可以自制一个比较符合自己需求的linux系统出来了,答案是肯定的,而且实现这个目标也并困难,需要的时间也不会太长.接下来就给大家分享如何自制的过程. 环境需求: 1.Vmware虚拟机 2.Centos6.8光盘镜像IS0文件 3.Vmware上安装一份Centos6.8的操作系统 第一步:装载一块新硬盘到虚拟机的Centos6.8系统上,并保证系统正常读取 [[email protect

模拟自制linux系统

(1) 新建硬盘对其分区 硬盘文件名CentOS 6.9-0.vmk (2)识别新加硬盘,记录设备名sdb (3)对其新建硬盘sdb分区(fdisk /dev/sdb),至少有根以及boot分区 (4)对分区创建文件系统 设备sdb分区如下sdb1作为boot分区 sdb2作为根所在分区 [[email protected] ~]# mkfs.ext4 /dev/sdb1 [[email protected] ~]# mkfs.ext4 /dev/sdb2 (5)创建一级目录,并挂载 注:新建s

制作busybox完成自制Linux系统及远程登录和nginx安装测试

前言系统定制在前面的博文中我们就有谈到过了,不过那个裁减制作有简单了点,只是能让系统跑起来而,没有太多的功能,也没的用户登录入口,而这里我们将详细和深入的来谈谈Linux系统的详细定制过程和实现用户例如.远程登录和Nginx安装过程.一步一步从头开始定制属于我们自己的系统. 正文首先我们先来简单的介绍一下我们这里定制属于自己的Linux系统的基本元素,其中一些相关的信息也可以参考我前面写过的博文 一个定制的linux内核+一个定制的busybox就可以定制一个小型的Linux操作系统了,安装Dr

Linux内核+Busybox自制linux系统

实验环境 1.centos7图形化界面安装 2.busybox:busybox-1.30.0.tar.bz2 官网 https://busybox.net 下载地址:https://busybox.net/downloads/busybox-1.30.0.tar.bz2 3.一块新添加的硬盘 Busybox 是一个开源项目,遵循GPL v2协议.Busybox将众多的UNIX命令集合进一个 很小的可执行程序中,其中包括了三百多个最常用Linux命令和工具 一.编译安装busybox [[emai

Linux还是亲生的好,实战自制Linux操作系统

实战自制Linux操作系统 本文主要通过裁剪现有Linux系统,打造一个属于自己的Linux小系统,让其能够装载网卡驱动,并配置IP地址,实现网络功能. 自制linux系统 步骤概述: 1.新建一个硬盘2.在该新硬盘上新建两个分区,一个当boot分区,一个当/分区3.格式化并且挂载两个分区4.安装grub至目标磁盘5.为grub提供配置文件6.复制内核文件和initrd文件7.创建目标主机根文件系统8.移植bash命令和其库文件到根文件系统9.装载模块,实现网络功能10.启动测试 特别提醒 如果

linux系统下文件压缩与归档

不管是普通使用linux系统,还是做为一名运维人员,掌握文件的压缩与归档都是有必要的,在linux系统上压缩与归档的工具是比较多的,今天我就带大家了解一些比较常见的压缩与归档工具. 一.compress/uncompress  默认会删除原文件 compress [-dfvcVr] [-b maxbits] [file ...]  -d: 解压缩,相当于uncompress  -c: 结果输出至标准输出,不删除原文件  -v: 显示详情  uncompress 解压缩  zcat 不解压缩的前提

实战自制Linux操作系统

          实战自制Linux操作系统 自制linux系统 步骤概述: 1.新建一个硬盘2.在该新硬盘上新建两个分区,一个当boot分区,一个当/分区3.格式化并且挂载两个分区4.安装grub至目标磁盘5.为grub提供配置文件6.复制内核文件和initrd文件7.创建目标主机根文件系统8.移植bash命令和其库文件到根文件系统9.装载模块,实现网络功能10.启动测试 具体操作步骤如下: 1)为CentOS 6系统添加一块新的硬盘,然后启动,演示如下: 2)查看新添加的硬盘,并为添加好的