mini linux制作

mini kernel

基础概念
内核编译步骤(下载源码解压)
内核编译步骤(添加硬盘安装grub文件)
内核编译步骤(添加硬盘,复制程序及其依赖的库文件脚本)
内核编译步骤(内核配置,硬件平台驱动选定)
内核编译步骤(内核配置,定义内核)
内核编译步骤(创建init脚本)
内核编译步骤(复制内核)

kernel+busybox

kernel+busybox基础概念
下载busybox源码包及编译依赖的包
完善系统(添加软件应用)
完善系统(修改grub启动项)
完善系统(创建目录)
完善系统(创建inittab)
完善系统(创建系统初始化脚本)
完善系统(设置主机名)
完善系统(设置管理员)
完善系统(创建fstab文件)
完善系统(添加ssh)

启动这个内核
启动这个内核(修改提示符)
启动这个内核(启动ssh)

基础概念




内核编译步骤(下载源码解压)

列出group

安装开发环境
centos6

centos7

下载内核源码

ln -s 软链接(符号链接) -v 显示详细的处理过程
关掉内核所有的功能特性

可以看到有一个.config文件,里面的功能大多数都被-y关掉了,-m的极少

查看系统平台硬件的各种状态信息


注意硬盘接口的类型,这里是虚拟机模拟出来的

内核编译步骤(添加硬盘安装grub文件)

添加一块磁盘为SCSI,用作放置编译好的内核
查看磁盘


n添加一个新分区
p主要(0个主要,0个扩展,4个免费)
w将表写入磁盘并退出
格式化硬盘


mke2fs命令是专门用于管理ext系列文件系统的一个专门的工具。
-t 指定文件系统类型
创建两个目录,用于挂载硬盘

使用 grub-install 命令在要启动的分区中安装 GRUB 相关文件
-root-directory=DIR:DIR 为实际目录,也就是手工指定 GRUB 相关文件的安装目录
cntos7


参考链接:https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/168.html
参考链接:https://www.cnblogs.com/f-ck-need-u/archive/2017/06/29/7094693.html#auto_id_8
创建目录

内核编译步骤(添加硬盘,复制程序及其依赖的库文件脚本)

编写脚本,复制程序及其依赖的库文件脚本

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

target=/mnt/sysroot
表示目标目录

[ -d $target] || mkdir /mnt/sysroot
表示如果目标不存在.就创建,

-d filename 如果 filename为目录,则为真,
|| 否则,执行后面的

read -p "A command:" command
表示read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。
-p参数,允许在read命令行中直接指定一个提示

libcp() {
for lib in $(ldd $1 | grep -o "[[:space:]]*/lib[[:space:]]*");do
libcp() 创建一个函数,复制一个命令的库文件路径
对$1命令做ldd命令取出命令库文件路径,保存在lib变量中,do开始循环,复制库文件
grep -o -o代表的是只输出匹配的选项
$0 就是你写的shell脚本本身的名字,$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的shell脚本传的第二个参数


libdir=$(dirname $lib)
取出lib变量中文件的目录,保存在libdir中
[ -d $target$libdir ] || mkdir -p $target$libdir
判断$target目录下是否有$libdir中的目录,是否存在 如果不存在,就创建在$target下创建$libdir
[ -f $target$lib ] || cp $lib $target$lib
done
判断$target下是否有$lib目录存在,|| 如果不存在,cp $lib到$target下仍然保存为$lib,done结束

while [ "$command" != 'quit' ]; do
while循环 如果$command,!=不等于quit do就进入循环

if ! which $command &> /dev/null; then
如果which $command你给的命令不存在 &>送给/dev/null; then执行后面的命令
read -p "No such command, enter again:" command
重新读取,仍然保存在command中
continue
continue语句的作用是跳过本次循环体中余下尚未执行的语句,立即进行下一次的循环条件判定,可以理解为仅结束本次循环。

command=$(which --skip-alias $command)
(which --skip-alias $command) 表示程序绝对路径

赋值进command当中,覆盖之前的变量

cmnddir=$(dirname $command)dirname 返回路径中的目录部分

赋值进cmnddir当中

[ -d $target$comnddir ] || mkdir -p $target$cmnddir
[ -f $target$command ] || cp $command $target$command
libcp $command
调用libcp把$command传递给他
-f filename 如果 filename为常规文件,则为真
read -p "Another command(quit):" command
继续复制





内核编译步骤(内核配置,硬件平台驱动选定)

make menuconfig'需要ncurses库

编译内核前先做一些配置,选择一些特性

64-bit kernel 64位内核
Enable loadable odule support 支持模块装载 Module unloading 支持模块卸载

Processor type and features 选择与当前cpu平台,所兼容的接口类型 Syanetric nulti-processing support cpu多核心支持 Processor fanily (Generic-x86-64) 处理器平台,通用x86_64位的 Generic-x86-64 通用x86_64位的


File systens 文件系统

可以支持多种,文件系统,一般来说其实只选择支持exit4就可以了The Extended(ext4) filesysten

Executable file fornats / Enulations 可执行文件格式

Kernel support for ELF binaries 对ELF二进制文件的内核支持
Write ELF core dunps with partial segments (NEW) 编写带有部分段的ELF核心转储(新)
Kernel support for scripts starting vith !# 对以!#开头的脚本的内核支持

Bus options (PCI etc。)pci总线

启用pci总线

Device Drivers 装载硬盘驱动

SCSI device support 启动底层硬盘驱动,否则pci接口驱动无法启动

SCSI disk support SCSI设备支持 SCSI disk support SCSI磁盘支持


Input device support 输入设备的驱动的支持

Keyhoards 键盘

AT keyboard (HEW)标准键盘

Mice 鼠标,如果是usb接口的,还需要加载usb驱动

USB support USB支持

主机usb

Enable USB persist by default(NEW) 主机usb设备
EHCI HCD (USB 2.0) support usb2.0驱动
xHCI HCD (USB 3.0) support usb3.0驱动
OHCI HCD support usb1.1驱动
UHCI HCD (most Intel and VIA) support usb1.1驱动

Generic Driver Options 通用驱动程序选项

Maintain a devtnpfs filesysten to lount at /dev 把内核所识别的所有设备文件,通通导出到/dev目录下,把文件输出出来

硬盘接口类型

Fusion IPT device support(HEW) 启动Fusion-MPT,pci接口支持

Fusion IPT ScsiHost drivers for SPI,如果不确定可以把,FC,SAS都编译进内核 Fusion IPT nisc device (ioctl) dri ver Fusion-MPT,MPT设备 Fusion IPT logging facility 日志,这个没有必要

Networking support 网络支持

Networking options 联网选项

TCP/IP networking TCP/IP网络
IP: multicasting IP:多播
IP: advanced router IP:高级路由器
IP: kernel level autoconfiguration IP:内核级自动配置

网络功能驱动
Device Drivers 设备驱动程序

Network device support 网络设备支持(网络设备驱动)

Ethernet driver support(NEW) 以太网驱动程序支持(新)

设备上硬件时英特尔的设备,关闭所有只保留,英特尔驱动,*编译进内核

设备上硬件时英特尔的设备,关闭所有只保留,英特尔驱动,M编译为模块

make bzImage,可以去除之前编译进内核的网络功能

找到英特尔网络模块

查看这个驱动有没有依赖的其他模块,如果有一并复制


编译模块

seve 保存

内核编译步骤(内核配置,定义内核)

只编译内核文件,编译内核需要bc命令

bc 命令是任意精度计算器语言,通常在linux下当计算器用

make 关键字
-j 指定几个内核
4 4个内核
bzImage 表示只编译bz2压缩格式的内核

sync 表示把内存中的数据同步到磁盘中
System is 1645 kB 表示只有1.6M大小编译
后内核所在路径,复制到指定的磁盘目录

内核编译步骤(创建init脚本)

#!/bin/bash
#
echo -e 	Welcone to 33[32mMini33[Om Linux   #Welcone颜色控制  	打印一个制表符
mount -n -t proc proc /proc #挂载proc目录
mount -n -t sysfs sysfs /sys #挂载到sys目录下
mount -n -o remount, rw /dev/sda2  / #把/dev/sda2,以读写方式挂载之根上
/bin/bash #在执行一下bash

-n, --no-mtab,
不将挂载信息写入 /etc/mtab ,当此 /etc 位于只读文件系统上的时候,通常就需要使用它```。
-t, --types vfstype
指定要挂载的文件系统类型。可以使用逗号分割多种类型。当前可用的类型有(实际情况取决于内核的配置):
-o<选项> 指定加载文件系统时的选项。有些选项也可在/etc/fstab中使用。这些选项包括:


添加权限

内核编译步骤(复制内核)


硬件驱动信息已经编译进内核,直接配置grup配置文件,加载内核


default=0 默认启动第一个系统
tineout=3 等待超时时间3秒
hiddenmenu # 隐藏菜单,若要显式,在启动时按下ESC
title Mini Linux (3.10.67)定义操作系统的说明信
root (hd0,0) root (hd0,0)定义grub识别的根
kernel /bzInage ro root=/dev/sda2 kernel定义内核文件的路径和启动参数,ro表示只读,指定根文件系统所在的分区

kernel+busybox基础概念

下载busybox源码包及编译依赖的包


Busybox功能选择

Busybox Settings Busybox设定

Build Options 制作编译构建选项

Build BusyBox as a static binary (no shared libs) 将BusyBox构建为静态二进制文件(无共享库,不使用共享库

Installation Options (ake install“ behavior) 安装时的选项(执行“安装”行为)


What kind of applet links to install (as soft-links) 要安装哪种小程序链接(作为软链接)这是默认项,各种应用程序都表现为符号链接就是这个定义的,把BusyBox符号链接成哪个命令的名字,他就能模拟哪个命令的工作行为
(./_install) BusyBox installation prefix (HEW) 安装在哪个目录下,./表示安装在编译的当前目录下
as soft-links 作为软链接
as hard-links 作为硬链接

Busybox编译

完善系统(添加软件应用)

删除这些之前创建的目录

复制Busybox创建的链接文件

如果mount命令无法使用,手动复制mount命令
重命名Busybox链接的mount

复制mount命令

cp -a 保留原文件属性的前提下复制文件

删除linuxrc文件,这个文件是提供init的,Busybox提供init文件

完善系统(修改grub启动项)

修改grub启动项

完善系统(创建目录)

创建目录

完善系统(创建inittab)

创建inittab

::sysinit:/etc/rc. d/rc.sysinit  
console::respawn:-/bin/sh
tty1::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r 

这是init文件冒号隔开的四个字段,第一个字段id,用来唯一标识这个行为,第二个字段表示运行级别,第三个字段表示要执行的行为,第四个字段是一个应用程序

tty1 虚拟终端,askfirst表示默认不打开虚拟终端,需要启动终端敲回车就可以了,如果需要运行/bin/sh
sysinit这是一个系统初始化系统,去读取/etc/rc. d/rc. sysinit
ctrlaltdel 如果用户同时按下ctrl+alt+del这个组合键,直接执行/sbin/reboot重启系统
shutdown 如果用户执行shutdown操作,就执行/bin/umount -a -r先去卸载所有文件系统
respawn:当process终止后马上启动一个新的,/sbin/getty这是一个串行终端,9600工作速率每秒钟可以传递的字节数,指明启动在tty1上

完善系统(创建系统初始化脚本)




insnod /lib/modules/e1000.ko
设置启动加载模块
ifconfig etho 172. 16. 100. 20 up ifconfig lo 127.0. 0.1 up
设置ip地址,启动网卡
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
判断有没有这个文件,如果有执行这个文件
[ -z '$HOSTNAME' -o '$HOSTNAME' == '(none)'] && HOSTNAME='localhost'
如果这个$HOSTNAME变量值为空,-o或者$HOSTNAME等于(none),如果有的话,这两项符合条件 &&执行把他的主机名定义为
hostname $HOSTNAME
hostname命令设置主机名$HOSTNAME

完善系统(设置主机名)


完善系统(设置管理员)





复制当前主机系统的root密码

如果这个sha512密码解析不了换成md5的

替换掉

覆盖到相对路径下的shadow文件中,并修改权限

完善系统(创建fstab文件)


完善系统(添加ssh)

修改issus,系统启动打印信息


下载dropbear,编译./config默认安装在/usr/local目录下

还可以选择选项,在编译

直接make编译安装


复制程序目录

创建远程pts文件,并挂载一个伪文件系统


mode=620表示访问这个文件的权限
创建密钥文件


看一下名字是否对


错了就改一下

创建安全shells


创建解析文件


passwd: files files表示etc/passwd,后面一样
hosts: files dns 表示先找/etc/hosts,后找dns

cp -d -d:若源文件为连接文件杜属性,则复制连接文件属性而非文件本身

启动这个内核

选在这个磁盘作为启动盘,启动mini linux

密码也可以使用

所有的文件系统都被挂载了,有三个虚拟终端也是可以使用的
网卡也是可执行的
*编译进内核的

M编译为模块的,使用insmod命令需要手动装载一下模块

启动这个内核(修改提示符)



exit重新登陆

启动这个内核(启动ssh)

添加变量


exit重新登陆

启动dropbear

dropbear -F -E 在前台启动dropbear
查看监听的端口

pts没有挂载成功,手动挂载一下,可能之前的/dev/pts文件没有创建

远程登陆成功,但是命令没找到

定义全局配置文件


成功

原文地址:https://www.cnblogs.com/hao-ran/p/11927938.html