Linux入门攻坚——32、Mini Linux制作

news2024/11/16 23:44:42

制作一个mini linux,需要对linux的启动流程很熟悉,这里又一次学习Linux的启动过程。

启动流程:
CentOS 6 / 5:
    POST -->BootSequence(BIOS) --> BootLoader --> kernel (ramdisk) --> rootfs --> /sbin/init
        然后就涉及编写服务脚本(centos5/6),或这编写upstart配置文件(centos6)
    对于ramdisk,是用于提供设备驱动的,主要是根文件系统的设备驱动,如果根文件系统所在设备的驱动编译进内核了,那么就不需要加载ramdisk了,凡是编译进内核的驱动,都可以直接使用其设备。而一般的,设备驱动不会直接编译进内核,主要是控制内核的大小,否则内核会很大。设备驱动编译成模块,按需加载。 
    对于/sbin/init,CentOS5是读取/etc/inittab配置文件,执行其中的配置,而CentOS6则是读取/etc/init/*.conf配置文件,执行其中的配置。这些配置文件要完成的功能:
    - 确定默认执行级别
    - 运行系统初始化脚本:/etc/rc.d/rc.sysinit
    - /etc/rc.d/rc $runlevel  
    - 启动终端,并运行login
    - 启动图形终端(运行级别5)
CentOS 7
    POST -->BootSequence(BIOS) --> BootLoader -->kernel (ramdisk) -->rootfs --> /sbin/systemd
         编写服务脚本
         systemd unit文件

总体来说,一个最基本的linux系统,就是引导设备上的MBR中的bootloader装载linux内核,然后切换根文件系统,最后启动init(或systemd)。

bootloader:    lilo、grub legacy、grub2
grub:stage1:mbr
           stage1_5:filesystem driver
           stage2:grub的各项加载选项等。

内核编译:
    make menuconfig   --> .config     (主要生成.config文件)
    make [ -j # ]            
    make modules_install    (安装模块)
    make install

Mini Linux制作步骤:
    bootloader:grub安装
    内核:  kernel(非模块方式,所有驱动编译进内核)  
    根文件系统:busybox  (模拟实现用户空间中的各种程序)

1、环境配置,编译内核需要安装“Development Tools”和“Server Platform Development”软件包组
2、下载内核源代码:www.kernel.org,测试下载了linux-4.19.321.tar.xz。
3、解压缩,tar xf linux-4.19.321.tar.xz -C /usr/src
      创建解压后目录的链接文件: ln -sv linux-4.19.321 linux

4、内核的配置,一般在安装完成的机器上都有,如:/boot/config-2.6.32-754.el6.x86_64,因为这里是测试做一个最精简的linux,一切由自己手动配置。
首先把内核可选择的特性全部关闭掉: make allnoconfig   

执行完毕后,会在当前目录下生成.config文件

要编译内核,需要提前了解硬件特性,如cpu、pci,尤其要注意硬盘接口

然后执行make menuconfig,对内核特性进行配置

64-bit kernel要选择,要编译成64位的内核系统;
Enable loadable module support 要选择,支持模块动态加载特性,进入子菜单:

Module unloading选上,支持模块动态卸载。
Processor type and features --->选择处理器型号、特性,即支持的CPU型号,进入子菜单

进入Processor family(Generic-x86-64)--->

Generic-x86-64,通用x86-64CPU,不知道的情况下,可以选择这一项

回退上级菜单,选择Symmetric multi-processing support ,CPU对称多处理器的支持(多核处理器)
然后是总线的配置,Bus options (PCI etc.)  ---> ,对PCI的配置,进入子菜单:

PCI support选中,会多出很多选项,默认就可以。

 Device Drivers  --->   设备驱动的配置,主要是硬盘驱动的配置

lspci命令查看我们的存储设备,是:SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01)
选择:Fusion MPT device support  --->  的子菜单中对应我们自己的硬盘设备,但是子菜单中没有列出来:

因为是SCSI总线,先要启用SCSI特性,所以选择:  SCSI device support  ----   这一项启用,但是这一项进去全是空的:

需要返回上一级,选择:Enable the block layer  ----  ,然后下面的scsi特性才能出来。

不做选择,采用默认。然后回到Device Drivers  --->菜单,此时SCSI device support  --->  下显示:
选择: SCSI device support  ,会列出很多选项:

选择:SCSI disk support,退出,再次进行硬盘驱动的选择:

选择: Fusion MPT ScsiHost drivers for SPI 这一项。为了保证编译后运行正常,,将Fusion的其他三项都选上。
以上配置完后,就可以进行编译。
5、执行编译:make -j 4 bzImage ,编译成bz格式的内核。运行中,提示gcc版本过低,网上查询需要gcc4.8以上,而CentOS6是gcc4.4,所以下载低版本内核试一下:linux-3.19.tar.xz

其menuconfig配置项有所不同:

总的配置就是:先配置内核是64位的,然后配置动态加载模块支持,在其子菜单下选择可以动态卸载,其后配置块设备支持,再配置CPU,支持多核和选择CPU类型,再配置总线选项,配置PCI支持选项,最后设备驱动配置,先配置SCSI设备,支持SCSI disk,即scsi磁盘,然后是硬盘设备配置,这里是Fusion MPT device。这样一个最基本的Linux内核就算配置完成。

执行编译:make -j 4 bzImage 最后的结果显示如下:

生成的内核位置:arch/x86/boot/bzImage

6、配置新linux的安装位置,需要新增一块硬盘,将自定义的Mini Linux安装在这块硬盘上:
关闭当前系统,进行虚拟机设置:

添加后两块磁盘。启动系统。

7、查看磁盘信息,对磁盘进行分区和格式化
查看磁盘:fdisk -l /dev/sdb

对磁盘进行分区,对一个基本Linux,分区一般最少3个:boot分区,根(/)分区和swap分区,对于最精简的linux,swap可以不使用,所以,指定boot和根/分区就可以了。


进行分区格式化:mke2fs -t ext4 /dev/sdb1   、  mke2fs -t ext4 /dev/sdb2

8、挂载创建的分区到当前系统上。
mkdir /mnt/{boot,sysroot}
mount /dev/sdb1 /mnt/boot/

9、安装grub:grub-install --root-directory=/mnt  /dev/sdb

这里要注意的关键点是参数--root-directory=/mnt,而不是/mnt/boot,原因在Linux入门攻坚——16、Linux系统启动流程中分析过。

至此,grub安装完成,下一步复制内核。一般的内核都是/boot/vmlinuz-文件,我们的内核在上一步已经编译完成并生成,即/usr/src/linux/arch/x86/boot/bzImage,将其拷贝到要制作的mini linux的/boot下:cp /usr/src/linux/arch/x86/boot/bzImage /mnt/boot/bzImage

有了内核,还要编辑grub的启动配置菜单,创建/mnt/boot/grub/grub.conf:

关键点是这里的root(hd0,0)和root=/dev/sda2,在当前的机器上,我们的mini linux是安装在第二块硬盘上的,应该是hd1,0 和/dev/sdb2,为何改为了hd0和sda2呢?这是因为mini linux单独运行时,就是单独在第二块硬盘上,此时对mini linux只有一块硬盘,相应的系统就应该识别成第一块硬盘,即hd0,0和/dev/sda2

10、测试启动Mini Linux:
将编译机器关闭,在vmware中新建虚拟机:

启动新建的虚拟机:

启动后,就是一个光标在黑屏上闪烁,于是再下了一个linux-3.10.67版本,重新制作内核,再次运行:

提示没有加载根文件系统。设备已经能够识别了,即sda1和sda2,其上有文件系统(通俗讲就是已经格式化了),只是其上没有对应文件,这里提示不能挂载,是内核驱动不了文件系统。内核中没有添加文件系统模块,需要重新编译内核,使其能够驱动文件系统。设备驱动了,文件系统不能驱动。

11、重新编译内核,添加文件系统驱动。make menuconfig,进入File systems --->选项中


至少保证我们使用的文件系统ext4被选择。然后配置可执行文件格式:Executable file formats / Emulations  --->  

支持ELF和#!,即bash,配置好后重新编译:
编译后,重新将生成的内核bzImage拷贝到sdb1,即/mnt/boot上,关闭本机,重新启动Mini Linux:

此时显示ext文件系统已经可用,最后是init没有发现。

12、提供一个真正的根文件系统:
启动内核,挂载文件系统后,内核是如何加载init的?查看内核的源代码:init/main.c

可以看到,init的加载,内核依次找的位置为/sbin/init、  /etc/init、  /bin/init 、 /bin/sh,所以,只要存在/bin目录其下有sh,系统就能跑起来。

首先,完成一下根文件系统,现在看所谓根文件系统,就是在根文件系统所在分区下创建对应的文件目录结构:

然后将程序或命令拷贝到对应目录中,不但要拷贝程序文件,还要拷贝命令程序依赖的库文件,于是编写一个拷贝命令程序的脚本文件:

#!/bin/bash
#
target=/mnt/sysroot
[ -d $target ] || mkdir /mnt/sysroot

read -p "A Command:" cmd

libcp() {
    for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do
        libdir=$(dirname $lib)
        [ -d $target$libdir ] || mkdir -p $target$libdir
        [ -f $target$lib ] || cp $lib $target$lib
    done
}

while [ "$cmd" != "quit" ]; do
    if ! which $cmd &> /dev/null; then
        read -p "No such command,enter again:" cmd
        continue
    fi
    cmd=$(which --skip-alias $cmd)
    cmddir=$(dirname $cmd)

    [ -d $target$cmddir ] || mkdir -p $target$cmddir
    [ -f $target$cmd ] || cp $cmd $target$cmd
    libcp $cmd
    read -p "Another command(quit):" cmd
done

代码实现的功能,就是在当前系统中,先测试给定的命令是否存在,如果存在,将此命令以及此命令依赖的库文件对等的拷贝到新系统的对应位置,如/bin/ls拷贝到/mnt/sysroot/bin/ls

可以测试一下:chroot  /mnt/sysroot/ /bin/bash,将target作为根目录(运行其中的 /bin/sh )

chroot命令 用来在指定的根目录下运行指令。chroot,即 change root directory (更改root 目录)。在 linux 系统中,系统默认的目录结构都是以 / ,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为 / 位置。
在经过 chroot 命令之后,系统读取到的目录和文件将不在是旧系统根下的而是新根下(即被指定的新的位置)的目录结构和文件,因此它带来的好处大致有以下3个:
1. 增加了系统的安全性,限制了用户的权力:
    在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。这个一般是在登录 (login) 前使用 chroot,以此达到用户不能访问一些特定的文件。
2. 建立一个与原系统隔离的系统目录结构,方便用户的开发:
    使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。
3.  切换系统的根目录位置,引导 Linux 系统启动以及急救系统等:
    chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init。另外,当系统出现一些问题时,我们也可以使用 chroot 来切换到一个临时的系统。

13、在重新启动Mini Linux前,修改grub.conf,明确告知内核init的具体位置:

重新启动Mini Linux,启动后:

键入回车键无反映,其他按键也没反映,问题是在编译内核时,键盘驱动没有配置上,也就是没有键盘驱动程序,无法使用键盘。于是要重新配置内核选项,将键盘等基本设备的驱动编译进内核。
make menuconfig  ,选择Device Drivers  ---> 菜单下的 Input device support  --->   :

选择: Keyboards  --->,将其选中,还可进入子菜单,选择详细键盘型号,默认AT标准键盘就可以。  

要支持鼠标,选中:Mouse interface 选项,然后是Mice选项,其下有详细鼠标类型,对于vmware虚拟机,模拟出来的鼠标是usb口的鼠标,所以还要配置usb的驱动:在Device Drivers  --->下有USB support  --->选项,选中,然后进入下一级选具体usb类型,先看本机的USB类型:

为了以防万一,将各个版本的都选上:

Mice子菜单在配置USB选项前后:

配置好后,再次编译:make -j 4  bzImage
14、再次重启Mini Linux:

可以看到,bash启动了。可以运行内置命令了。但是,正常的Linux启动的是init,可以编写一个init脚本,来模拟init:

添加一些工具程序:

需要修改grub.conf,将init=/bin/bash去掉,或改为init=/sbin/init,或者不修改,在启动时使用e选项,进行手动修改。再次启动时又出现了错误,init启动不成功,有关键的一步没有做,就是编写的/sbin/init没有赋予执行权限,chmod +x /mnt/sysroot/sbin/init,然后再次启动:

此时,init运行成功。但是在/dev下,没有相关设备,要挂载sda1到/boot下,找不到设备

对于/dev下的设备,是由udev发现并创建的,我们内核中没有编译udev。

15、重新配置内核配置选项,将udev编译进内核:make menuconfig,
Device Drivers  --->下的Generic Driver Options  ---> 选项下

此时/dev下内核识别出的设备都显示出来。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL——数据类型(二)

目录 一、日期与时间类型 1.1 date 1.2 datetime 1.3 timestamp 二、枚举和联合 2.1 enum 2.2 set 2.2.1 set 的插入 2.2.2 set 的查找 思维导图可以参考如下链接: 数据类型.xmind 夜夜亮晶晶/MySQL - Gitee.com 一、日期与时间类型 1.1 date 日期 yyy…

2024 年最佳 Chrome 验证码扩展,解决 reCAPTCHA 问题

验证码,特别是 reCAPTCHA,已成为在线安全的不可或缺的一部分。虽然它们在区分人类和机器人方面起着至关重要的作用,但它们也可能成为合法用户和从事网络自动化的企业的主要障碍。无论您是试图简化在线体验的个人,还是依赖自动化工…

easy-es动态索引支持

背景 很多项目目前都引入了es,由于es弥补了mysql存储及搜索查询的局限性,随着技术的不断迭代,原生的es客户端使用比较繁琐不直观,上手代价有点大,所以easy-es框架就面世了,学习成本很低,有空大…

Ubuntu下安装最新版本Apache2文件服务器

文章目录 1.最新版本Apache2安装2. Apache2配置2.1 端口配置2.2 创建软连接,生成文件服务2.3 隐藏Apache2服务版本号2.4 添加用户,设置Apache2文件服务密码2.5 重启Apache2服务3. 执行后效果 1.最新版本Apache2安装 注意:安装最新版本必须升级Ubuntu为20…

Linux 中System V IPC的共享内存

1. 概念介绍 System V IPC(Inter-Process Communication)是一组在UNIX系统中用于进程间通信的机制,包括共享内存、消息队列和信号量。这些机制由System V内核提供,并且它们的存在不依赖于创建它们的进程,而是由内核管…

JSON数组

数组作为JSON对象 ["Google","Runoob","Taobao"] JSON数组在中括号中书写。 中括号[]保存的数组是值(value)的有序集合。一个数组以左中括号[开始,右中括号]结束,值之间使用逗号,分隔…

【第28章】Spring Cloud之Sentinel注解支持

文章目录 前言一、注解埋点支持二、SentinelResource 注解三、实战1. 准备2. 纯资源定义3. 添加资源配置 四、熔断(fallback)1. 业务代码1.1 Controller1.2 Service1.3 ServiceImpl 2. 熔断配置3. 熔断测试 总结 前言 上一章我们已经完成了对Sentinel的适配工作,这…

物联网架构

1 三层架构 三层架构就像我们拿着一个设备,通过网络直接连接到服务器获取结果,步骤简单。 举个例子:智能家居的温度监控系统 1. 感知层(设备与传感器) 在智能家居系统中,温度传感器被安装在家里的各个房间…

数据结构C //线性表(顺序表)ADT结构及相关函数

数据结构(C语言版)严蔚敏 吴伟民 线性表(顺序表)ADT结构及相关函数 环境:Linux Ubuntu(云服务器) 工具:vim 代码块(头文件,函数文件,主文件&am…

JVM字节码与局部变量表

文章目录 局部变量表javap字节码指令分类 指令指令数据类型前缀加载和存储指令加载常量算术指令其他指令 字节码示例说明 局部变量表 每个线程的帧栈是独立的,每个线程中的方法调用会产生栈帧,栈帧中保存着方法执行的信息,例如局部变量表。 …

Alinx MPSoC驱动开发第11章异步IO实验按下按键报IO Possibile后结束进程

实验现象 使用Alinux官方提供的驱动和应用程序代码,petalinux工程基于自身需要进行了一定的修改(主要是SD卡根文件系统)。在把petalinux工程编译后打包的boot.scr、BOOT.BIN、image.ub放入FAT分区,把驱动程序与应用程序放在NFS共享…

万界星空科技电池MES具体功能及解决方案

电池的生产工艺具有高度的复杂性和精细度。从原材料的准备、电池的组装到最终的测试与包装,每一道工序都需要严格控制,以确保产品的质量和性能。 万界星空科技在电池MES(制造执行系统)领域提供了全面的解决方案,这些解…

JavaWeb项目打包、部署至Tomcat并启动的全程指南(图文详解)

前言 我们想要部署一个javaWeb项目到tomcat上,需要了解一些概念 什么是tomcat? Tomcat 是 Apache 软件基金会(Apache Software Foundation)下的一个开源项目,主要用于实现 Java Servlet、JavaServer Pages(…

在 PyCharm 中配置 Anaconda 环境

1. 安装 Anaconda 如果尚未安装 Anaconda,你可以从 Anaconda 官方网站 下载或者从清华镜像网站下载并安装适合你操作系统的版本。 2. 创建 Anaconda 虚拟环境 打开 Anaconda Prompt(Windows)或终端(macOS/Linux)。 …

EmguCV学习笔记 VB.Net 11.6 图像分割

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

如何升级用 Helm 安装的极狐GitLab Runner?

本分分享如何对 Helm 安装的 Runner 进行升级。整个过程分为三步:1、确定 Runner 最新版本或者想要升级的版本是否存在;2、用 Helm upgrade 命令进行升级;3、升级确认。 极狐GitLab 为 GitLab 的中国发行版,中文版本对中国用户更…

【西电电装实习】6. 手装无人机的蓝牙断连debug

文章目录 前言零、闪灯状态零零、翻滚角,俯仰角,偏航角一、问题描述二、现象解释三、解决方案参考文献 前言 在 西电无人机电装实习 时遇到的问题使用蓝牙芯片 CH582F。沁恒的蓝牙芯片CH582F是一款集成了BLE(Bluetooth Low Energy&#xff0…

华为初级认证HCIA怎么样?

想在网络技术领域实现职业突破吗?华为HCIA初级认证是专为网络领域的新手与初学者设计的一项入门级认证。它旨在评估并确认个人对网络基本原理和技术知识的扎实掌握,是步入华为认证体系大门的基石。 一、华为HCIA 初级认证概述 华为初级认证网络工程师&am…

分类预测|基于黑翅鸢优化核极限学习机的数据分类预测Matlab程序BKA-KELM 多特征输入多类别输出 含基础KELM

分类预测|基于黑翅鸢优化核极限学习机的数据分类预测Matlab程序BKA-KELM 多特征输入多类别输出 含基础KELM 文章目录 一、基本原理BKA-HKELM 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 BKA-HKELM 分类预测原理和流程 1. 黑翅鸢优化…

最好用的翻译器:什么是DeepL?如何订阅支付DeepL,订阅DeepL Pro以及申请DeepL API?

DeepL目前最好用的翻译软件,如果是学习翻译的同学或者海外客户翻译,一定不能错过,用它来处理文件,论文等翻译是最好不过了的!!! AI翻译技术的飞速发展正在颠覆我们的沟通方式,打破语…