Mini Linux:

启动流程:

参考:https://blog.csdn.net/gatieme/article/details/50914250

https://linux.cn/article-8807-1.html#4_2073

https://www.linuxidc.com/Linux/2015-04/115817.htm

CentOS 6:

POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init

编写服务脚本

upstart配置文件

/etc/init/*.conf(centos6)   /etc/inittab(centos5)

默认运行级别

运行系统初始化脚本:/etc/rc.d/rc.sysinit

/etc/rc.d/rc $runlevel

启动终端,并运行login

启动图形终端

bootloader分类

lilo

grub legacy

grub2

stage1: mbr

stage1_5: filesystem driver

state2:

CentOS 7:

POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/systemd

编写服务脚本

systemd unit文件

# which ls

# which --skip-alias ls    //去掉别名

内核编译:

make menuconfig --> .config

make [-j #]

make modules_install

make install

编译步骤:

bootloader: grub

内核:kernel (非模块方式)

根文件系统:busybox

编译示例: 

参考:https://www.aliyun.com/jiaocheng/133690.html

https://blog.csdn.net/reblue520/article/details/50786092

yum groupinstall "Development Tools" "Server Platform Development" -y       //准备开发环境

# tar xf linux-3.10.67.tar.gz -C /usr/src                                                              //准备内核源码并解压

# ln -sv linux-3.10.67 linux

#cd /usr/src/linux

#make help

这步配置内核的方法有多种、每一个make就是一种方法、我们只在选一种就可以了:
make config:遍历选择所要编译的内核特性
make allyesconfig:配置所有可编译的内核特性
make allnoconfig:并不是所有的都不编译,而是能选的都回答为NO、只有必须的都选择为yes。
make menuconfig:这种就是打开一个文件窗口选择菜单,这个命令需要打开的窗口大于80字符的宽度,打开后就可以在里面选择要编译的项了
下面两个是可以用鼠标点选择的、比较方便哦:
make kconfig(KDE桌面环境下,并且安装了qt开发环境)
make gconfig(Gnome桌面环境,并且安装gtk开发环境)

allnoconfig   - New config where all options are answered with no

# make allnoconfig                                                                                             //把所有可选择的特性全部关掉

会有一个.configure文件

#less .configure                           //文件中带m的可编译的选项都去掉了

#lscpu                                         //编译内核前需要查看电脑的cpu和cpi配置信息

#lspci                                          //尤其要注意硬盘接口类型 LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI

#make menuconfig                    //编译内核

[*] 64-bit kernel                                             //编译为64位内核

[*] Enable loadable module support  --->     //支持模块装载

[*]   Module unloading                          //支持模块卸载

Processor type and features  --->

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

(X) Generic-x86-64                         //选择通用x86-64

[*] Symmetric multi-processing support  //支持堆成多处理器

Bus options (PCI etc.)  --->

[*] PCI support

Device Drivers  --->                                          //装载硬盘驱动 #lspc可以查看

SCSI device support  --->                          //加载底层驱动

<*> SCSI device support                //编译进内核,不要编译成模块

<*> SCSI disk support                    /

[*] Fusion MPT device support  --->        //硬盘驱动

<*> Fusion MPT ScsiHost drivers for SPI x x
<*> Fusion MPT ScsiHost drivers for FC

<*> Fusion MPT ScsiHost drivers for SAS x x
(128) Maximum number of scatter gather entries (16 - 128) (NEW) x x
<*> Fusion MPT misc device (ioctl) driver

[*]   Fusion MPT logging facility

#shutdown -h now

目标磁盘分区

在编译内核之前先添加一块硬盘,把编译的内核放在硬盘里面,

在宿主机上挂一块新磁盘,命名为minilinux,此块磁盘是宿主机上的第二块磁盘,所以这里是/dev/sdb,到时候挂载到目标主机的时候,

因为那里只有这一块磁盘,所以在目标主机上的名称应该是/dev/sda,这个不能搞混了。

首先,我们要在目标磁盘上分两个区,并进行格式化。第一个分区100M,用来装引导程序;第二个分区2G,用来装根文件系统。

然后再进行挂载操作,将/dev/sdb1挂载到/mnt/boot下,将/dev/sdb2挂载到/mnt/sysroot下。

#fdisk /dev/sdb         //一般磁盘有3个分区:boot root swap

n  --> p   --> 1  -->  100M

n  --> p   --> 2  -->  2G --> w

# mke2fs -t ext4 /dev/sdb1      //格式化文件系统

# mke2fs -t ext4 /dev/sdb2      //因为是新硬盘,所以不用partprobe命令重读分区表

# mkdir /mnt/{boot,sysroot}    //建立两个挂载目录

# mount /dev/sdb1 /mnt/boot/

# make -j 4 bzImage                                     //只编译内核文件

安装grub至目标磁盘

一个系统能启动,就需要引导,所以首先要安装一个grub引导程序到我们的新磁盘上。

安装grub引导程序主要有两个命令,一个是grub-install,另一个是setup,这里使用grub-install来安装。

①grub-install会安装grub引导第二阶段的文件②setup不会安装第二阶段的引导程序,是安装引导信息到MBR

注意:--root-directory=后面接的路径应该是boot目录所在的地方,而不是/mnt/boot,因为boot目录在mnt下,目标磁盘是/dev/sdb

# grub-install --root-directory=/mnt /dev/sdb

#mount /dev/sdb2 /mnt/sysroot                  //挂载根文件系统

#cd /usr/src/linux

# cp arch/x86_64/boot/bzImage /mnt/boot/bzImage

#file /mnt/boot/bzImage

#vim /mnt/boot/grub/grub.conf

default=0
timeout=3
title Mini Linux (3.10.67)

root (hd0,0)
kerbel /bzImage ro root=/dev/sda2

#sync

#sync

新建一个虚拟机,把装有编译的内核文件的磁盘当作启动磁盘,提示没有文件系统

文件系统前面已经有了,只是里面没有文件。这里显示无法挂在,是因为内核无法驱动文件系统,

因为#make menuconfig 编译内核没有 添加文件系统模块,只能驱动sd硬件设备,但无法驱动文件系统。

接下来重新编译内核,驱动文件设备:

File systems  --->

<*> Second extended fs support x x
<*> Ext3 journalling file system support x x
<*> The Extended 4 (ext4) filesystem

[ ]   Ext4 POSIX Access Control Lists (NEW)       //文件访问控制列表,这里没有启用

Executable file formats / Emulations  --->                   //可执行文件格式

[*] Kernel support for ELF binaries
[*] Write ELF core dumps with partial segments (NEW)  
<*> Kernel support for scripts starting with #!                //支持shell

# make -j 4 bzImage                                                     //再次编译内核文件

#sync                                                                           //把内存数据同步到磁盘上

#cd /mnt/sysroot

#mkdir -pv etc dev proc sys bin sbin usr/{bin,sbin,lib,lib64} lib64 lib/modules home var/{log,run,lock} tmp mnt media root

#vim bincp.sh

复制程序及其依赖的库文件脚本示例:

#!/bin/bash

#

target=/mnt/sysroot

[ -d $target ] || mkdir /mnt/sysroot

read -p "A command: " command

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 [ "$command" != 'quit' ]; do

if ! which $command &> /dev/null; then

read -p "No such command, enter again: " command

continue

fi

command=$(which --skip-alias $command)

cmnddir=$(dirname $command)

[ -d $target$cmnddir ] || mkdir -p $target$cmnddir

[ -f $target$command ] || cp $command $target$command

libcp $command

read -p "Another command(quit): " command

done

Mini Linux: kernel+busybox

busybox:

静态方式编译,依赖于glibc-static;

编译单个内核模块:

# cd /usr/src/linux

# make M=drivers/net/ethernet/intel/e1000/

# make M=path/to/somedir/

mini Linux制作过程(25/01)的更多相关文章

  1. linux基础之Mini Linux制作

    一.编译一个简单的linux步骤如下: # yum groupinstall ""Development Tools" "Server Platform Dev ...

  2. 制作一个64M的U盘启动盘(mini linux + winpe +dos toolbox)

    制作一个64M的U盘启动盘(mini linux + winpe +dos toolbox) 自己动手定制winpe+各类dos工具箱U盘启动盘+minilinux 由于一个64M老U盘,没什么用,拿 ...

  3. [转]制作一个64M的U盘启动盘(mini linux + winpe +dos toolbox)

    自己动手定制winpe+各类dos工具箱U盘启动盘+minilinux 由于一个64M老U盘,没什么用,拿来发挥余热.如果U盘够大,可以使用功能更强大的mini linux和带更多工具的winpe.这 ...

  4. [PCB制作] 1、记录一个简单的电路板的制作过程——四线二项步进电机驱动模块(L6219)

    前言 现在,很多人手上都有一两个电子设备,但是却很少有人清楚其中比较关键的部分(PCB电路板)是如何制作出来的.我虽然懂点硬件,但是之前设计的简单系统都是自己在万能板上用导线自己焊接的(如下图左),复 ...

  5. 嵌入式Linux启动过程中的问题积累

    嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...

  6. win10 + linux 制作双系统教程(我本身是win10系统)

    1.制作启动U盘 准备工作: .linux镜像 .硬盘空余空间>8G,越大越好 .制作启动U盘的软件 .最好3.0U盘一个>4G 下载启动软件的工具(UItraIOS制作的U盘启动盘无法安 ...

  7. 转-Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=26042   1)BIOS自检2)启动Grub/Lilo3)加 ...

  8. Linux 系统启动过程,Linux 系统目录结构

    一.Linux 系统启动过程 linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立 ...

  9. BabyLinux制作过程详解

    转:http://www.360doc.com/content/05/0915/14/1429_12641.shtml BabyLinux制作过程详解 作者:GuCuiwen email:win2li ...

随机推荐

  1. 机器学习理论基础学习3.4--- Linear classification 线性分类之Gaussian Discriminant Analysis高斯判别模型

    一.什么是高斯判别模型? 二.怎么求解参数?

  2. Linear Regression Using Gradient Descent 代码实现

    参考吴恩达<机器学习>, 进行 Octave, Python(Numpy), C++(Eigen) 的原理实现, 同时用 scikit-learn, TensorFlow, dlib 进行 ...

  3. windows下编译和安装boost库

    boost是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库. 获取方式 boost提供源码形式的安装包,可以从boost官方网站下载,目前最新版本是1.59.0. 本机上正好有boos ...

  4. Matlab中图像处理实例:灰度变换,空域滤波,频域滤波,傅里叶变换的实现

    http://blog.sciencenet.cn/blog-95484-803140.html % %图像灰度变换 % f = imread('E:\2013第一学期课程\媒体计算\实验一\Img\ ...

  5. swoole线程和进程

    pstree -a | grep php |   |       `-php server.php   主进程      |   |           |-php server.php   管理线程 ...

  6. PAT乙级 1024. 科学计数法 (20)(未通过全部测试,得分18)

    1024. 科学计数法 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 HOU, Qiming 科学计数法是科学家用来表示很 ...

  7. nginx安装,反向代理配置

    1.centos 版本 下载最新稳定版 https://www.nginx.com/resources/wiki/start/topics/tutorials/install/# 2.执行语句: ./ ...

  8. VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)

    上一节中鸡啄米讲了CDC类及其屏幕绘图函数,本节的主要内容是GDI对象之画笔CPen. GDI对象 在MFC中,CGdiObject类是GDI对象的基类,通过查阅MSDN我们可以看到,CGdiObje ...

  9. 20155227 2016-2017-2 《Java程序设计》第九周学习总结

    20155227 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是java联 ...

  10. Python: 序列: 过滤序列元素

    问题: 你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列 answer: eg1:列表推导 最简单的过滤序列元素的方法就是使用列表推导.比如:>>> mylist = ...